/ Hex Artifact Content
Login

Artifact 2f791d1d52778b9a2ec251465215ca480a966f36:


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: 32 30 34 20 32 30 30 34 2f 30 35 2f 33 31 20 31  204 2004/05/31 1
0300: 31 3a 35 31 3a 34 35 20 64 61 6e 69 65 6c 6b 31  1:51:45 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 4f 70 65 6e 20 74 68  }../*.** Open th
3040: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
3050: 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20  table stored in 
3060: 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
3070: 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69  iDb for.** writi
3080: 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73  ng. The table is
3090: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75   opened using cu
30a0: 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  rsor 0..*/.void 
30b0: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
30c0: 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20  rTable(Vdbe *v, 
30d0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
30e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
30f0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c  OP_Integer, iDb,
3100: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
3110: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
3120: 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54  enWrite, 0, MAST
3130: 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c 69  ER_ROOT);.  sqli
3140: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3150: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
3160: 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c 69  , 0, 5); /* sqli
3170: 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20  te_master has 5 
3180: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a  columns */.}../*
3190: 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70  .** The token *p
31a0: 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Name contains th
31b0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
31c0: 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61  base (either "ma
31d0: 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22  in" or.** "temp"
31e0: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
31f0: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
3200: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
3210: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64  turns the.** ind
3220: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
3230: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
3240: 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20  aDb[], or -1 if 
3250: 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a  the named db .**
3260: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
3270: 0a 2a 2f 0a 69 6e 74 20 66 69 6e 64 44 62 28 73  .*/.int findDb(s
3280: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
3290: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
32a0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
32b0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
32c0: 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 6e      if( pName->n
32d0: 3d 3d 73 74 72 6c 65 6e 28 64 62 2d 3e 61 44 62  ==strlen(db->aDb
32e0: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 26 26 20 0a 20  [i].zName) && . 
32f0: 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
3300: 33 53 74 72 4e 49 43 6d 70 28 64 62 2d 3e 61 44  3StrNICmp(db->aD
3310: 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  b[i].zName, pNam
3320: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 20  e->z, pName->n) 
3330: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
3340: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  i;.    }.  }.  r
3350: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 69 6e 74  eturn -1;.}..int
3360: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
3370: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
3380: 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a  arse, .  Token *
3390: 70 4e 61 6d 65 31 2c 20 0a 20 20 54 6f 6b 65 6e  pName1, .  Token
33a0: 20 2a 70 4e 61 6d 65 32 2c 20 0a 20 20 54 6f 6b   *pName2, .  Tok
33b0: 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 0a 29 7b 0a  en **pUnqual.){.
33c0: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
33d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
33e0: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e  e->db;..  if( pN
33f0: 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e  ame2 && pName2->
3400: 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  n>0 ){.    asser
3410: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
3420: 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61  y );.    *pUnqua
3430: 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20  l = pName2;.    
3440: 69 44 62 20 3d 20 66 69 6e 64 44 62 28 64 62 2c  iDb = findDb(db,
3450: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
3460: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20  ( iDb<0 ){.     
3470: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3480: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
3490: 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20  n database %T", 
34a0: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70  pName1);.      p
34b0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
34c0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
34d0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
34e0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
34f0: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
3500: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
3510: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
3520: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
3530: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
3540: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
3550: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63  }../*.** Begin c
3560: 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65  onstructing a ne
3570: 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e  w table represen
3580: 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79  tation in memory
3590: 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68  .  This is.** th
35a0: 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72  e first of sever
35b0: 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  al action routin
35c0: 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c  es that get call
35d0: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a  ed in response.*
35e0: 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41  * to a CREATE TA
35f0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
3600: 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74  In particular, t
3610: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3620: 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73  alled.** after s
3630: 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52  eeing tokens "CR
3640: 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45  EATE" and "TABLE
3650: 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  " and the table 
3660: 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53  name.  The.** pS
3670: 74 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68  tart token is th
3680: 65 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61  e CREATE and pNa
3690: 6d 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  me is the table 
36a0: 6e 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d  name.  The isTem
36b0: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
36c0: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
36d0: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
36e0: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
36f0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
3700: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
3710: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
3720: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
3730: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
3740: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
3750: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
3760: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
3770: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
3780: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
3790: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
37a0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
37b0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
37c0: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
37d0: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
37e0: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
37f0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
3800: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
3810: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
3820: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
3830: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
3840: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
3850: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
3860: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
3870: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
3880: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
3890: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
38a0: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
38b0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
38c0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
38d0: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
38e0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
38f0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
3900: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
3910: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3920: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
3930: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
3940: 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20  Start,   /* The 
3950: 22 43 52 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a  "CREATE" token *
3960: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
3970: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
3980: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
3990: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
39a0: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
39b0: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
39c0: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
39d0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
39e0: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
39f0: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
3a00: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
3a10: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
3a20: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 20  */.  int isView 
3a30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3a40: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
3a50: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
3a60: 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65 78 20 2a  Table;.  Index *
3a70: 70 49 64 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  pIdx;.  char *zN
3a80: 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  ame;.  sqlite *d
3a90: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
3aa0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
3ab0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
3ac0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
3ad0: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
3ae0: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
3af0: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
3b00: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
3b10: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
3b20: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f  o create */..  /
3b30: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
3b40: 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61  iew name to crea
3b50: 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  te is passed to 
3b60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
3b70: 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61   tokens.  ** pNa
3b80: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
3b90: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
3ba0: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
3bb0: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
3bc0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  le:.  **.  ** CR
3bd0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
3be0: 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a  yy (...);.  ** .
3bf0: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
3c00: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
3c10: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
3c20: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
3c30: 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65  hand if.  ** the
3c40: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
3c50: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
3c60: 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20  ed, i.e.:.  **. 
3c70: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
3c80: 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a   yyy(...);.  **.
3c90: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
3ca0: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
3cb0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
3cc0: 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  "..  **.  ** The
3cd0: 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73   call below sets
3ce0: 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74   the pName point
3cf0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
3d00: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
3d10: 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29   or.  ** pName2)
3d20: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
3d30: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
3d40: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72  le name. The var
3d50: 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a  iable iDb is.  *
3d60: 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  * set to the ind
3d70: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
3d80: 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  se that the tabl
3d90: 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20  e or view is to 
3da0: 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
3db0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d  in..  */.  iDb =
3dc0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
3dd0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
3de0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
3df0: 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
3e00: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
3e10: 20 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31   isTemp && iDb>1
3e20: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72   ){.    /* If cr
3e30: 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61  eating a temp ta
3e40: 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61  ble, the name ma
3e50: 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69  y not be qualifi
3e60: 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ed */.    sqlite
3e70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3e80: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
3e90: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
3ea0: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
3eb0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3ec0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
3ed0: 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20   }.  if( isTemp 
3ee0: 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50  ) iDb = 1;..  pP
3ef0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
3f00: 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61   = *pName;.  zNa
3f10: 6d 65 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c  me = sqlite3Tabl
3f20: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
3f30: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
3f40: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
3f50: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
3f60: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
3f70: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
3f80: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
3f90: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
3fa0: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
3fb0: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
3fc0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
3fd0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
3fe0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
3ff0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
4000: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
4010: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
4020: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
4030: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
4040: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
4050: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
4060: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
4070: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
4080: 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
4090: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
40a0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
40b0: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
40c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
40d0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
40e0: 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ATE_VIEW;.      
40f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
4100: 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b     if( isTemp ){
4110: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
4120: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
4130: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
4140: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
4150: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
4160: 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ATE_TABLE;.     
4170: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
4180: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
4190: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
41a0: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
41b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
41c0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
41d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
41e0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
41f0: 42 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f  Before trying to
4200: 20 63 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   create a tempor
4210: 61 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20  ary table, make 
4220: 73 75 72 65 20 74 68 65 20 42 74 72 65 65 20 66  sure the Btree f
4230: 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20  or.  ** holding 
4240: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
4250: 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   is open..  */. 
4260: 20 69 66 28 20 69 73 54 65 6d 70 20 26 26 20 64   if( isTemp && d
4270: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30  b->aDb[1].pBt==0
4280: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70   && !pParse->exp
4290: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  lain ){.    int 
42a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
42b0: 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20  eFactory(db, 0, 
42c0: 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64  0, MAX_PAGES, &d
42d0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a  b->aDb[1].pBt);.
42e0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
42f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
4300: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4310: 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
4320: 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
4330: 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20  ry database ".  
4340: 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20        "file for 
4350: 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72  storing temporar
4360: 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  y tables");.    
4370: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
4380: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
4390: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
43a0: 2d 3e 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61  ->flags & !db->a
43b0: 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
43c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
43d0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64  treeBeginTrans(d
43e0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31  b->aDb[1].pBt, 1
43f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
4400: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4420: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
4430: 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77  nable to get a w
4440: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20  rite lock on ". 
4450: 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65           "the te
4460: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
4470: 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20   file");.       
4480: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
4490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
44a0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
44b0: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
44c0: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
44d0: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
44e0: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
44f0: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
4500: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
4510: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
4520: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
4530: 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 70  t does..  */.  p
4540: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
4550: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
4560: 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  me, db->aDb[iDb]
4570: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  .zName);.  if( p
4580: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
4590: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
45a0: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61  rse, "table %T a
45b0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
45c0: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  pName);.    sqli
45d0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
45e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
45f0: 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c   if( (pIdx = sql
4600: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
4610: 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20  , zName, 0))!=0 
4620: 26 26 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  &&.          (pI
4630: 64 78 2d 3e 69 44 62 3d 3d 30 20 7c 7c 20 21 64  dx->iDb==0 || !d
4640: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b  b->init.busy) ){
4650: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4660: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
4670: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
4680: 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73  n index named %s
4690: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  ", zName);.    s
46a0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
46b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
46c0: 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  }.  pTable = sql
46d0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
46e0: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
46f0: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ( pTable==0 ){. 
4700: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
4710: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
4720: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
4730: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
4740: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
4750: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  0;.  pTable->aCo
4760: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
4770: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
4780: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
4790: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44 62  0;.  pTable->iDb
47a0: 20 3d 20 69 44 62 3b 0a 20 20 69 66 28 20 70 50   = iDb;.  if( pP
47b0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
47c0: 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  ) sqlite3DeleteT
47d0: 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d  able(db, pParse-
47e0: 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70  >pNewTable);.  p
47f0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
4800: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
4810: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
4820: 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  g the code that 
4830: 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20  will insert the 
4840: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74  table record int
4850: 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54  o.  ** the SQLIT
4860: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
4870: 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75   Note in particu
4880: 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74  lar that we must
4890: 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61   go ahead.  ** a
48a0: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  nd allocate the 
48b0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
48c0: 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  r the table entr
48d0: 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61  y now.  Before a
48e0: 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  ny.  ** PRIMARY 
48f0: 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65  KEY or UNIQUE ke
4900: 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65  ywords are parse
4910: 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72  d.  Those keywor
4920: 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20  ds will cause.  
4930: 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65  ** indices to be
4940: 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65   created and the
4950: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75   table record mu
4960: 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74  st come before t
4970: 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  he .  ** indices
4980: 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65  .  Hence, the re
4990: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
49a0: 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62  the table must b
49b0: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a  e allocated.  **
49c0: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
49d0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
49e0: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47  && (v = sqlite3G
49f0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
4a00: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4a10: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
4a20: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
4a30: 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69  iDb);.    if( !i
4a40: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f  sTemp ){.      /
4a50: 2a 20 45 76 65 72 79 20 74 69 6d 65 20 61 20 6e  * Every time a n
4a60: 65 77 20 74 61 62 6c 65 20 69 73 20 63 72 65 61  ew table is crea
4a70: 74 65 64 20 74 68 65 20 66 69 6c 65 2d 66 6f 72  ted the file-for
4a80: 6d 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  mat.      ** and
4a90: 20 65 6e 63 6f 64 69 6e 67 20 6d 65 74 61 2d 76   encoding meta-v
4aa0: 61 6c 75 65 73 20 61 72 65 20 73 65 74 20 69 6e  alues are set in
4ab0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
4ac0: 6e 0a 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20  n.      ** case 
4ad0: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
4ae0: 74 20 74 61 62 6c 65 20 63 72 65 61 74 65 64 2e  t table created.
4af0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4b00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4b10: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
4b20: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c  db->file_format,
4b30: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4b40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4b50: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
4b60: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
4b70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4b80: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
4b90: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  enc, 0);.      s
4ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4bb0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
4bc0: 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20 7d 0a   iDb, 4);.    }.
4bd0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
4be0: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44  asterTable(v, iD
4bf0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
4c00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
4c10: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
4c20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4c30: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
4c40: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
4c50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4c60: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
4c70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4c80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
4c90: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
4ca0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
4cb0: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
4cc0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
4cd0: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
4ce0: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
4cf0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
4d00: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
4d10: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
4d20: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
4d30: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
4d40: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
4d50: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
4d60: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
4d70: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
4d80: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
4d90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
4da0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
4db0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
4dc0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
4dd0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
4de0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
4df0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4e00: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
4e10: 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20  z = 0;.  Column 
4e20: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
4e30: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4e40: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4e50: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53  ;.  sqlite3SetNS
4e60: 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d 65 2d  tring(&z, pName-
4e70: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29  >z, pName->n, 0)
4e80: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
4e90: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
4ea0: 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f  Dequote(z);.  fo
4eb0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
4ec0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
4ed0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
4ee0: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
4ef0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
4f00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4f10: 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
4f20: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  te column name: 
4f30: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  %s", z);.      s
4f40: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
4f50: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
4f60: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  }.  }.  if( (p->
4f70: 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29  nCol & 0x7)==0 )
4f80: 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e  {.    Column *aN
4f90: 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73  ew;.    aNew = s
4fa0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d  qliteRealloc( p-
4fb0: 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b  >aCol, (p->nCol+
4fc0: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
4fd0: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
4fe0: 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
4ff0: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  ;.    p->aCol = 
5000: 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  aNew;.  }.  pCol
5010: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
5020: 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Col];.  memset(p
5030: 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Col, 0, sizeof(p
5040: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70  ->aCol[0]));.  p
5050: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a  Col->zName = z;.
5060: 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20   .  /* If there 
5070: 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69  is no type speci
5080: 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61  fied, columns ha
5090: 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61  ve the default a
50a0: 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 55  ffinity.  ** 'NU
50b0: 4d 45 52 49 43 27 2e 20 49 66 20 74 68 65 72 65  MERIC'. If there
50c0: 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69   is a type speci
50d0: 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74  fied, then sqlit
50e0: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
50f0: 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63  ).  ** will be c
5100: 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65  alled next to se
5110: 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  t pCol->affinity
5120: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f   correctly..  */
5130: 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  .  pCol->affinit
5140: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
5150: 55 4d 45 52 49 43 3b 0a 20 20 70 43 6f 6c 2d 3e  UMERIC;.  pCol->
5160: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
5170: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
5180: 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f   p->nCol++;.}../
5190: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
51a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
51b0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
51c0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
51d0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
51e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
51f0: 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55  ment.  A "NOT NU
5200: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  LL" constraint h
5210: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
5220: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
5230: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
5240: 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67  the notNull flag
5250: 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   on.** the colum
5260: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
5270: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
5280: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
5290: 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20  ddNotNull(Parse 
52a0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45  *pParse, int onE
52b0: 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rror){.  Table *
52c0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  p;.  int i;.  if
52d0: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
52e0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
52f0: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
5300: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e  nCol-1;.  if( i>
5310: 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  =0 ) p->aCol[i].
5320: 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f  notNull = onErro
5330: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
5340: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5350: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
5360: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
5370: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
5380: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
5390: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
53a0: 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69  e pFirst token i
53b0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74  s the first.** t
53c0: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75  oken in the sequ
53d0: 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74  ence of tokens t
53e0: 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65  hat describe the
53f0: 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20   type of the.** 
5400: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
5410: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
5420: 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20  ion.   pLast is 
5430: 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a  the last token.*
5440: 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  * in the sequenc
5450: 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66  e.  Use this inf
5460: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73  ormation to cons
5470: 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a  truct a string.*
5480: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  * that contains 
5490: 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20  the typename of 
54a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  the column and s
54b0: 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67  tore that string
54c0: 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f  .** in zType..*/
54d0: 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64   .void sqlite3Ad
54e0: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
54f0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
5500: 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20   *pFirst, Token 
5510: 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65  *pLast){.  Table
5520: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   *p;.  int i, j;
5530: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72  .  int n;.  char
5540: 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c   *z, **pz;.  Col
5550: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
5560: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
5570: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
5580: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
5590: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
55a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
55b0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b  l = &p->aCol[i];
55c0: 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a  .  pz = &pCol->z
55d0: 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73  Type;.  n = pLas
55e0: 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c 61 73  t->n + Addr(pLas
55f0: 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 46 69  t->z) - Addr(pFi
5600: 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74  rst->z);.  sqlit
5610: 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  e3SetNString(pz,
5620: 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30   pFirst->z, n, 0
5630: 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20  );.  z = *pz;.  
5640: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
5650: 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  n;.  for(i=j=0; 
5660: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
5670: 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20  int c = z[i];.  
5680: 20 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29    if( isspace(c)
5690: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
56a0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d   z[j++] = c;.  }
56b0: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 2f 2f 20  .  z[j] = 0;.// 
56c0: 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72   pCol->sortOrder
56d0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 74   = sqlite3Collat
56e0: 65 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 20 20 70  eType(z, n);.  p
56f0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
5700: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
5710: 79 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a  ype(z, n);.}../*
5720: 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f  .** The given to
5730: 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ken is the defau
5740: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
5750: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
5760: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62  ed to.** the tab
5770: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
5780: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
5790: 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22    If "minusFlag"
57a0: 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20   is true, it.** 
57b0: 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20  means the value 
57c0: 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64  token was preced
57d0: 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69  ed by a minus si
57e0: 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gn..**.** This r
57f0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5800: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
5810: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
5820: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
5830: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5840: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
5850: 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  id sqlite3AddDef
5860: 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20  aultValue(Parse 
5870: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
5880: 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46  pVal, int minusF
5890: 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  lag){.  Table *p
58a0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
58b0: 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70  r **pz;.  if( (p
58c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
58d0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
58e0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
58f0: 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20  -1;.  if( i<0 ) 
5900: 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26  return;.  pz = &
5910: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74  p->aCol[i].zDflt
5920: 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61  ;.  if( minusFla
5930: 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
5940: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22  SetNString(pz, "
5950: 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20  -", 1, pVal->z, 
5960: 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d  pVal->n, 0);.  }
5970: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
5980: 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  3SetNString(pz, 
5990: 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e  pVal->z, pVal->n
59a0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
59b0: 74 65 33 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  te3Dequote(*pz);
59c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e  .}../*.** Design
59d0: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
59e0: 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c  KEY for the tabl
59f0: 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c  e.  pList is a l
5a00: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a  ist of names .**
5a10: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
5a20: 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72   form the primar
5a30: 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74  y key.  If pList
5a40: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
5a50: 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
5a60: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
5a70: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
5a80: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
5a90: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20  ..**.** A table 
5aa0: 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74  can have at most
5ab0: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
5ac0: 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
5ad0: 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61  already has.** a
5ae0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e   primary key (an
5af0: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  d this is the se
5b00: 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79  cond primary key
5b10: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  ) then create an
5b20: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
5b30: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
5b40: 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67  KEY is on a sing
5b50: 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20  le column whose 
5b60: 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45  datatype is INTE
5b70: 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20  GER,.** then we 
5b80: 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  will try to use 
5b90: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74  that column as t
5ba0: 68 65 20 72 6f 77 20 69 64 2e 20 20 28 45 78 63  he row id.  (Exc
5bb0: 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62  eption:.** For b
5bc0: 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
5bd0: 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
5be0: 72 20 64 61 74 61 62 61 73 65 73 2c 20 64 6f 20  r databases, do 
5bf0: 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a 2a 20 69  not do this.** i
5c00: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
5c10: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  t version number
5c20: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2e   is less than 1.
5c30: 29 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  )  Set the Table
5c40: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
5c50: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
5c60: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
5c70: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
5c80: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
5c90: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
5ca0: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
5cb0: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
5cc0: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
5cd0: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
5ce0: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
5cf0: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
5d00: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
5d10: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
5d20: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
5d30: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
5d40: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
5d50: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
5d60: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
5d70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5d80: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 50 61  AddPrimaryKey(Pa
5d90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c  rse *pParse, IdL
5da0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20  ist *pList, int 
5db0: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
5dc0: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
5dd0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63  ->pNewTable;.  c
5de0: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
5df0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
5e00: 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   i;.  if( pTab==
5e10: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
5e20: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
5e30: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
5e40: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
5e50: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5e60: 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c   .      "table \
5e70: 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74  "%s\" has more t
5e80: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
5e90: 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  key", pTab->zNam
5ea0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69  e);.    goto pri
5eb0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
5ec0: 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72   }.  pTab->hasPr
5ed0: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28  imKey = 1;.  if(
5ee0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
5ef0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
5f00: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62  ol - 1;.    pTab
5f10: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50  ->aCol[iCol].isP
5f20: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65  rimKey = 1;.  }e
5f30: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
5f40: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
5f50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  i++){.      for(
5f60: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
5f70: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
5f80: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
5f90: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
5fa0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
5fb0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
5fc0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
5fd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5fe0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5ff0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
6000: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61  pTab->nCol ) pTa
6010: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
6020: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20  PrimKey = 1;.   
6030: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74   }.    if( pList
6040: 2d 3e 6e 49 64 3e 31 20 29 20 69 43 6f 6c 20 3d  ->nId>1 ) iCol =
6050: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
6060: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
6070: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
6080: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
6090: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
60a0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
60b0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
60c0: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
60d0: 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ER")==0 ){.    p
60e0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
60f0: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
6100: 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Conf = onError;.
6110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
6120: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
6130: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
6140: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
6150: 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73   0, 0);.    pLis
6160: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
6170: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
6180: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
6190: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65  ete(pList);.  re
61a0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  turn;.}../*.** R
61b0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
61c0: 74 6f 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  to CollSeq given
61d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
61e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
61f0: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c  e..** If the col
6200: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
6210: 64 69 64 20 6e 6f 74 20 70 72 65 76 69 6f 75 73  did not previous
6220: 6c 79 20 65 78 69 73 74 2c 20 63 72 65 61 74 65  ly exist, create
6230: 20 69 74 20 62 75 74 0a 2a 2a 20 61 73 73 69 67   it but.** assig
6240: 6e 20 69 74 20 61 6e 20 4e 55 4c 4c 20 63 6f 6d  n it an NULL com
6250: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
6260: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
6270: 6c 69 74 65 33 43 6f 6c 6c 61 74 65 54 79 70 65  lite3CollateType
6280: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6290: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
62a0: 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20  e, int nType){. 
62b0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
62c0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
62d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 70  pParse->db;..  p
62e0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61  Coll = sqlite3Ha
62f0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c  shFind(&db->aCol
6300: 6c 53 65 71 2c 20 7a 54 79 70 65 2c 20 6e 54 79  lSeq, zType, nTy
6310: 70 65 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  pe);.  if( pColl
6320: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6330: 65 33 43 68 61 6e 67 65 43 6f 6c 6c 61 74 69 6e  e3ChangeCollatin
6340: 67 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 54  gFunction(db, zT
6350: 79 70 65 2c 20 6e 54 79 70 65 2c 20 30 2c 20 30  ype, nType, 0, 0
6360: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  );.    pColl = s
6370: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
6380: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 54  db->aCollSeq, zT
6390: 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 7d  ype, nType);.  }
63a0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
63b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
63c0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
63d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
63e0: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
63f0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
6400: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
6410: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
6420: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
6430: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
6440: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
6450: 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65  zType, int nType
6460: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
6470: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
6480: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
6490: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
64a0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
64b0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
64c0: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 6c 20  return;.  pColl 
64d0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
64e0: 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
64f0: 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a   zType, nType);.
6500: 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
6510: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
6520: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6c 6c 61  lite3ChangeColla
6530: 74 69 6e 67 46 75 6e 63 74 69 6f 6e 28 64 62 2c  tingFunction(db,
6540: 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 2c 20 30   zType, nType, 0
6550: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
6560: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  pColl ){.    p->
6570: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e  aCol[p->nCol-1].
6580: 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20  pColl = pColl;. 
6590: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
65a0: 74 65 20 6f 72 20 6d 6f 64 69 66 79 20 61 20 63  te or modify a c
65b0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
65c0: 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73  e entry in the s
65d0: 71 6c 69 74 65 2e 61 43 6f 6c 6c 53 65 71 0a 2a  qlite.aCollSeq.*
65e0: 2a 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f  * table..**.** O
65f0: 6e 63 65 20 61 6e 20 65 6e 74 72 79 20 69 73 20  nce an entry is 
6600: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c  added to the sql
6610: 69 74 65 2e 61 43 6f 6c 6c 53 65 71 20 74 61 62  ite.aCollSeq tab
6620: 6c 65 2c 20 69 74 20 63 61 6e 20 6e 65 76 65 72  le, it can never
6630: 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20  .** be removed, 
6640: 74 68 6f 75 67 68 20 69 73 20 63 6f 6d 70 61 72  though is compar
6650: 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 72  ison function or
6660: 20 75 73 65 72 20 64 61 74 61 20 63 61 6e 20 62   user data can b
6670: 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  e changed..**.**
6680: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
6690: 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69  r to the collati
66a0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ng function that
66b0: 20 77 61 73 20 63 72 65 61 74 65 64 20 6f 72 20   was created or 
66c0: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 43 6f 6c  modified..*/.Col
66d0: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 43 68 61  lSeq *sqlite3Cha
66e0: 6e 67 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  ngeCollatingFunc
66f0: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 20 2a  tion(.  sqlite *
6700: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
6710: 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 74 6f  /* Database into
6720: 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65 72 74   which to insert
6730: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 2a   the collation *
6740: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6750: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e  zName,      /* N
6760: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61  ame of the colla
6770: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  tion */.  int nN
6780: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
6790: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
67a0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
67b0: 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 55  me */.  void *pU
67c0: 73 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ser,            
67d0: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
67e0: 74 20 74 6f 20 78 43 6d 70 20 2a 2f 0a 20 20 69  t to xCmp */.  i
67f0: 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 2a  nt (*xCmp)(void*
6800: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
6810: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
6820: 29 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20  ) /* Comparison 
6830: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
6840: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
6850: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
6860: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
6870: 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
6880: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , nName);.  if( 
6890: 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pColl==0 ){.    
68a0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61  pColl = sqliteMa
68b0: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
68c0: 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20  *pColl) + nName 
68d0: 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 1 );.    if( p
68e0: 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Coll==0 ){.     
68f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
6900: 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  .    pColl->zNam
6910: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c  e = (char*)&pCol
6920: 6c 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  l[1];.    memcpy
6930: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  (pColl->zName, z
6940: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a  Name, nName+1);.
6950: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
6960: 6e 73 65 72 74 28 26 64 62 2d 3e 61 43 6f 6c 6c  nsert(&db->aColl
6970: 53 65 71 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  Seq, pColl->zNam
6980: 65 2c 20 6e 4e 61 6d 65 2c 20 70 43 6f 6c 6c 29  e, nName, pColl)
6990: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c 2d 3e 70  ;.  }.  pColl->p
69a0: 55 73 65 72 20 3d 20 70 55 73 65 72 3b 0a 20 20  User = pUser;.  
69b0: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43  pColl->xCmp = xC
69c0: 6d 70 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 6f  mp;.  return pCo
69d0: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  ll;.}../*.** Sca
69e0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  n the column typ
69f0: 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65  e name zType (le
6a00: 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20  ngth nType) and 
6a10: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73  return the.** as
6a20: 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74  sociated affinit
6a30: 79 20 74 79 70 65 2e 0a 2a 2f 0a 63 68 61 72 20  y type..*/.char 
6a40: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
6a50: 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
6a60: 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65  zType, int nType
6a70: 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 69 3b 0a 20  ){.  int n, i;. 
6a80: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
6a90: 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 62 3b 20  nst char *zSub; 
6aa0: 20 2f 2a 20 4b 65 79 77 6f 72 64 73 20 73 75 62   /* Keywords sub
6ab0: 73 74 72 69 6e 67 20 74 6f 20 73 65 61 72 63 68  string to search
6ac0: 20 66 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20   for */.    int 
6ad0: 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 2f  nSub;          /
6ae0: 2a 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53 75 62  * length of zSub
6af0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66   */.    char aff
6b00: 69 6e 69 74 79 3b 20 20 20 20 20 2f 2a 20 41 66  inity;     /* Af
6b10: 66 69 6e 69 74 79 20 74 6f 20 72 65 74 75 72 6e  finity to return
6b20: 20 69 66 20 69 74 20 6d 61 74 63 68 65 73 20 2a   if it matches *
6b30: 2f 0a 20 20 7d 20 73 75 62 73 74 72 69 6e 67 73  /.  } substrings
6b40: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 49 4e 54  [] = {.    {"INT
6b50: 22 2c 20 20 33 2c 20 53 51 4c 49 54 45 5f 41 46  ",  3, SQLITE_AF
6b60: 46 5f 49 4e 54 45 47 45 52 7d 2c 0a 20 20 20 20  F_INTEGER},.    
6b70: 7b 22 43 48 41 52 22 2c 20 34 2c 20 53 51 4c 49  {"CHAR", 4, SQLI
6b80: 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20  TE_AFF_TEXT},.  
6b90: 20 20 7b 22 43 4c 4f 42 22 2c 20 34 2c 20 53 51    {"CLOB", 4, SQ
6ba0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a  LITE_AFF_TEXT},.
6bb0: 20 20 20 20 7b 22 54 45 58 54 22 2c 20 34 2c 20      {"TEXT", 4, 
6bc0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d  SQLITE_AFF_TEXT}
6bd0: 2c 0a 20 20 20 20 7b 22 42 4c 4f 42 22 2c 20 34  ,.    {"BLOB", 4
6be0: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
6bf0: 45 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 66 6f 72 28  E},.  };..  for(
6c00: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 73 75  i=0; i<sizeof(su
6c10: 62 73 74 72 69 6e 67 73 29 2f 73 69 7a 65 6f 66  bstrings)/sizeof
6c20: 28 73 75 62 73 74 72 69 6e 67 73 5b 30 5d 29 3b  (substrings[0]);
6c30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63   i++){.    int c
6c40: 31 20 3d 20 73 75 62 73 74 72 69 6e 67 73 5b 69  1 = substrings[i
6c50: 5d 2e 7a 53 75 62 5b 30 5d 3b 0a 20 20 20 20 69  ].zSub[0];.    i
6c60: 6e 74 20 63 32 20 3d 20 74 6f 6c 6f 77 65 72 28  nt c2 = tolower(
6c70: 63 31 29 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  c1);.    int lim
6c80: 69 74 20 3d 20 6e 54 79 70 65 20 2d 20 73 75 62  it = nType - sub
6c90: 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 3b  strings[i].nSub;
6ca0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
6cb0: 2a 7a 20 3d 20 73 75 62 73 74 72 69 6e 67 73 5b  *z = substrings[
6cc0: 69 5d 2e 7a 53 75 62 3b 0a 20 20 20 20 66 6f 72  i].zSub;.    for
6cd0: 28 6e 3d 30 3b 20 6e 3c 3d 6c 69 6d 69 74 3b 20  (n=0; n<=limit; 
6ce0: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  n++){.      int 
6cf0: 63 20 3d 20 7a 54 79 70 65 5b 6e 5d 3b 0a 20 20  c = zType[n];.  
6d00: 20 20 20 20 69 66 28 20 28 63 3d 3d 63 31 20 7c      if( (c==c1 |
6d10: 7c 20 63 3d 3d 63 32 29 0a 20 20 20 20 20 20 20  | c==c2).       
6d20: 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
6d30: 74 65 33 53 74 72 4e 49 43 6d 70 28 26 7a 54 79  te3StrNICmp(&zTy
6d40: 70 65 5b 6e 5d 2c 20 7a 2c 20 73 75 62 73 74 72  pe[n], z, substr
6d50: 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 29 20 29 7b  ings[i].nSub) ){
6d60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6d70: 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 61 66  substrings[i].af
6d80: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a  finity;.      }.
6d90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6da0: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  rn SQLITE_AFF_NU
6db0: 4d 45 52 49 43 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  MERIC;.}../*.** 
6dc0: 43 6f 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e  Come up with a n
6dd0: 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  ew random value 
6de0: 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 63  for the schema c
6df0: 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72  ookie.  Make sur
6e00: 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c  e.** the new val
6e10: 75 65 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ue is different 
6e20: 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a  from the old..**
6e30: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
6e40: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
6e50: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
6e60: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
6e70: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
6e80: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
6e90: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
6ea0: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
6eb0: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
6ec0: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
6ed0: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
6ee0: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
6ef0: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
6f00: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
6f10: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
6f20: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
6f30: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
6f40: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
6f50: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
6f60: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
6f70: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
6f80: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
6f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
6fa0: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
6fb0: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
6fc0: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
6fd0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
6fe0: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
6ff0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
7000: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
7010: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
7020: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
7030: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
7040: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
7050: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
7060: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
7070: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
7080: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
7090: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
70a0: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
70b0: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
70c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
70d0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c  ChangeCookie(sql
70e0: 69 74 65 20 2a 64 62 2c 20 56 64 62 65 20 2a 76  ite *db, Vdbe *v
70f0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 75 6e  , int iDb){.  un
7100: 73 69 67 6e 65 64 20 63 68 61 72 20 72 3b 0a 20  signed char r;. 
7110: 20 69 6e 74 20 2a 70 53 63 68 65 6d 61 43 6f 6f   int *pSchemaCoo
7120: 6b 69 65 20 3d 20 26 28 64 62 2d 3e 61 44 62 5b  kie = &(db->aDb[
7130: 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  iDb].schema_cook
7140: 69 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 52  ie);..  sqlite3R
7150: 61 6e 64 6f 6d 6e 65 73 73 28 31 2c 20 26 72 29  andomness(1, &r)
7160: 3b 0a 20 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b  ;.  *pSchemaCook
7170: 69 65 20 3d 20 2a 70 53 63 68 65 6d 61 43 6f 6f  ie = *pSchemaCoo
7180: 6b 69 65 20 2b 20 72 20 2b 20 31 3b 0a 20 20 64  kie + r + 1;.  d
7190: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
71a0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
71b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
71c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
71d0: 65 72 2c 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b  er, *pSchemaCook
71e0: 69 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ie, 0);.  sqlite
71f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
7200: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
7210: 20 30 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 64 62   0);./*.  if( db
7220: 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64  ->next_cookie==d
7230: 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d 61  b->aDb[0].schema
7240: 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 75  _cookie ){.    u
7250: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 72 3b 0a  nsigned char r;.
7260: 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f      sqlite3Rando
7270: 6d 6e 65 73 73 28 31 2c 20 26 72 29 3b 0a 20 20  mness(1, &r);.  
7280: 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69    db->next_cooki
7290: 65 20 3d 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73  e = db->aDb[0].s
72a0: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b 20 72  chema_cookie + r
72b0: 20 2b 20 31 3b 0a 20 20 20 20 64 62 2d 3e 66 6c   + 1;.    db->fl
72c0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
72d0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20  ternChanges;.   
72e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
72f0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
7300: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
7310: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7320: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
7330: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
7340: 20 30 29 3b 0a 20 20 7d 0a 2a 2f 0a 7d 0a 0a 2f   0);.  }.*/.}../
7350: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
7360: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
7370: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
7380: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
7390: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
73a0: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
73b0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
73c0: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
73d0: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
73e0: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
73f0: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74  erminator..*/.st
7400: 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65  atic int identLe
7410: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
7420: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
7430: 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  int needQuote = 
7440: 30 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  0;.  for(n=0; *z
7450: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
7460: 20 69 66 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b   if( *z=='\'' ){
7470: 20 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d   n++; needQuote=
7480: 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  1; }.  }.  retur
7490: 6e 20 6e 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a  n n + needQuote*
74a0: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  2;.}../*.** Writ
74b0: 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  e an identifier 
74c0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
74d0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
74e0: 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20  .  Add.** quote 
74f0: 63 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65  characters as ne
7500: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
7510: 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68  void identPut(ch
7520: 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78  ar *z, int *pIdx
7530: 2c 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b  , char *zIdent){
7540: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
7550: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
7560: 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  Idx;.  for(j=0; 
7570: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
7580: 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75  .    if( !isalnu
7590: 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20  m(zIdent[j]) && 
75a0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29  zIdent[j]!='_' )
75b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65   break;.  }.  ne
75c0: 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e  edQuote =  zIden
75d0: 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67  t[j]!=0 || isdig
75e0: 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20  it(zIdent[0]).  
75f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7600: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
7610: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
7620: 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e  !=TK_ID;.  if( n
7630: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
7640: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28  ] = '\'';.  for(
7650: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
7660: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d  j++){.    z[i++]
7670: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
7680: 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d    if( zIdent[j]=
7690: 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d  ='\'' ) z[i++] =
76a0: 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28   '\'';.  }.  if(
76b0: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
76c0: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b  ++] = '\'';.  z[
76d0: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
76e0: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
76f0: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
7700: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
7710: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
7720: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
7730: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
7740: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
7750: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
7760: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
7770: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
7780: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
7790: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
77a0: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
77b0: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
77c0: 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c  teTableStmt(Tabl
77d0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
77e0: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
77f0: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
7800: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
7810: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
7820: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
7830: 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20   i++){.    n += 
7840: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 61  identLength(p->a
7850: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[i].zName);. 
7860: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
7870: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
7880: 0a 20 20 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20  .  if( n<40 ){. 
7890: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
78a0: 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20    zSep2 = ",";. 
78b0: 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20     zEnd = ")";. 
78c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70   }else{.    zSep
78d0: 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a   = "\n  ";.    z
78e0: 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a  Sep2 = ",\n  ";.
78f0: 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22      zEnd = "\n)"
7900: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20  ;.  }.  n += 35 
7910: 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a  + 6*p->nCol;.  z
7920: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
7930: 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69  locRaw( n );.  i
7940: 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65  f( zStmt==0 ) re
7950: 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79  turn 0;.  strcpy
7960: 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d  (zStmt, p->iDb==
7970: 31 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50  1 ? "CREATE TEMP
7980: 20 54 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41   TABLE " : "CREA
7990: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
79a0: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29   = strlen(zStmt)
79b0: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
79c0: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
79d0: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
79e0: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30  = '(';.  for(i=0
79f0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
7a00: 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a  ){.    strcpy(&z
7a10: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
7a20: 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28      k += strlen(
7a30: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
7a40: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
7a50: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
7a60: 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  , &k, p->aCol[i]
7a70: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
7a80: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
7a90: 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   zEnd);.  return
7aa0: 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zStmt;.}../*.**
7ab0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7ac0: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72   called to repor
7ad0: 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20  t the final ")" 
7ae0: 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a  that terminates.
7af0: 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ** a CREATE TABL
7b00: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
7b10: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72  ** The table str
7b20: 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65  ucture that othe
7b30: 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  r action routine
7b40: 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c  s have been buil
7b50: 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64  ding.** is added
7b60: 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
7b70: 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73   hash tables, as
7b80: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73  suming no errors
7b90: 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65   have.** occurre
7ba0: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72  d..**.** An entr
7bb0: 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  y for the table 
7bc0: 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d  is made in the m
7bd0: 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64  aster table on d
7be0: 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74  isk, unless.** t
7bf0: 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
7c00: 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e  ry table or db->
7c10: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57  init.busy==1.  W
7c20: 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  hen db->init.bus
7c30: 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73  y==1.** it means
7c40: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
7c50: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
7c60: 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20  r table because 
7c70: 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65  we just.** conne
7c80: 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  cted to the data
7c90: 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20  base or because 
7ca0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
7cb0: 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72  r table has.** r
7cc0: 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c  ecently changes,
7cd0: 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f   so the entry fo
7ce0: 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72  r this table alr
7cf0: 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a  eady exists in.*
7d00: 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
7d10: 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64  ter table.  We d
7d20: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72  o not want to cr
7d30: 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a  eate it again..*
7d40: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c  *.** If the pSel
7d50: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ect argument is 
7d60: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  not NULL, it mea
7d70: 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ns that this rou
7d80: 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c  tine.** was call
7d90: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ed to create a t
7da0: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66  able generated f
7db0: 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54  rom a .** "CREAT
7dc0: 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53  E TABLE ... AS S
7dd0: 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65  ELECT ..." state
7de0: 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d  ment.  The colum
7df0: 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  n names of.** th
7e00: 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c  e new table will
7e10: 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c   match the resul
7e20: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
7e30: 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
7e40: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 50 61 72  ite3EndTable(Par
7e50: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
7e60: 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74 20  n *pEnd, Select 
7e70: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
7e80: 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20  le *p;.  sqlite 
7e90: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7ea0: 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d  ;..  if( (pEnd==
7eb0: 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29  0 && pSelect==0)
7ec0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
7ed0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
7ee0: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
7ef0: 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  rn;.  p = pParse
7f00: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
7f10: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
7f20: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  ;..  /* If the t
7f30: 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65  able is generate
7f40: 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c  d from a SELECT,
7f50: 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 20   then construct 
7f60: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66  the.  ** list of
7f70: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
7f80: 20 74 65 78 74 20 6f 66 20 74 68 65 20 74 61 62   text of the tab
7f90: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
7fa0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 54 61  Select ){.    Ta
7fb0: 62 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d 20 73  ble *pSelTab = s
7fc0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
7fd0: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
7fe0: 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  0, pSelect);.   
7ff0: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
8000: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73  ) return;.    as
8010: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
8020: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20   );.    p->nCol 
8030: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
8040: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70  .    p->aCol = p
8050: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
8060: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
8070: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
8080: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
8090: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
80a0: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
80b0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
80c0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
80d0: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
80e0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
80f0: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
8100: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
8110: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
8120: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
8130: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
8140: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
8150: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
8160: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
8170: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
8180: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
8190: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
81a0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
81b0: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
81c0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
81d0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
81e0: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
81f0: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
8200: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
8210: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
8220: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
8230: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
8240: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
8250: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
8260: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
8270: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
8280: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
8290: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
82a0: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
82b0: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65  atabase.  The re
82c0: 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  cord number.  **
82d0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
82e0: 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20  le entry should 
82f0: 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68  already be on th
8300: 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
8310: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
8320: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
8330: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
8340: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
8350: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
8360: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
8370: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
8380: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
8390: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
83a0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
83b0: 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20    Vdbe *v;..    
83c0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
83d0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
83e0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
83f0: 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  n;.    if( p->pS
8400: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
8410: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
8420: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  able */.      sq
8430: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
8440: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20  OP_CreateTable, 
8450: 30 2c 20 70 2d 3e 69 44 62 2c 20 28 63 68 61 72  0, p->iDb, (char
8460: 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50  *)&p->tnum, P3_P
8470: 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65 6c  OINTER);.    }el
8480: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
8490: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  iew */.      sql
84a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
84b0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
84c0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  0);.    }.    p-
84d0: 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 73  >tnum = 0;.    s
84e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
84f0: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
8500: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8510: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
8520: 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 70 53  ng8, 0, 0, p->pS
8530: 65 6c 65 63 74 3d 3d 30 3f 22 74 61 62 6c 65 22  elect==0?"table"
8540: 3a 22 76 69 65 77 22 2c 20 50 33 5f 53 54 41 54  :"view", P3_STAT
8550: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
8560: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
8570: 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e  ring8, 0, 0, p->
8580: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
8590: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
85a0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
85b0: 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  0, p->zName, 0);
85c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
85d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
85e0: 20 34 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   4, 0);.    if( 
85f0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
8600: 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74   char *z = creat
8610: 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20  eTableStmt(p);. 
8620: 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72       n = z ? str
8630: 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20  len(z) : 0;.    
8640: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8650: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
8660: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
8670: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8680: 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b  P3(v, -1, z, n);
8690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
86a0: 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(z);.    }else{
86b0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53  .      if( p->pS
86c0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
86d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
86e0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
86f0: 2c 20 30 2c 20 22 43 52 45 41 54 45 20 56 49 45  , 0, "CREATE VIE
8700: 57 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  W ", P3_STATIC);
8710: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8730: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
8740: 67 38 2c 20 30 2c 20 30 2c 20 22 43 52 45 41 54  g8, 0, 0, "CREAT
8750: 45 20 54 41 42 4c 45 20 22 2c 20 50 33 5f 53 54  E TABLE ", P3_ST
8760: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
8770: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e       assert( pEn
8780: 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20  d!=0 );.      n 
8790: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
87a0: 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73  - Addr(pParse->s
87b0: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  NameToken.z) + 1
87c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
87d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
87e0: 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20  tring8, 0, 0);. 
87f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8800: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
8810: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
8820: 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  en.z, n);.      
8830: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8840: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32  (v, OP_Concat, 2
8850: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
8860: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
8870: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
8880: 20 35 2c 20 30 2c 20 22 74 74 74 69 74 22 2c 20   5, 0, "tttit", 
8890: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
88a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
88b0: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
88c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
88d0: 20 70 2d 3e 69 44 62 21 3d 31 20 29 7b 0a 20 20   p->iDb!=1 ){.  
88e0: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
88f0: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70  eCookie(db, v, p
8900: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20  ->iDb);.    }.  
8910: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8920: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
8930: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
8940: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
8950: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8960: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
8970: 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  p->iDb, 0);.    
8980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8990: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
89a0: 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  te, 1, 0);.     
89b0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
89c0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
89d0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
89e0: 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c  Select, SRT_Tabl
89f0: 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  e, 1, 0, 0, 0, 0
8a00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
8a10: 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72  ite3EndWriteOper
8a20: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
8a30: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
8a40: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
8a50: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
8a60: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
8a70: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
8a80: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
8a90: 69 6e 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  in==0 && pParse-
8aa0: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
8ab0: 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
8ac0: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
8ad0: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
8ae0: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
8af0: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74 62 6c 48  aDb[p->iDb].tblH
8b00: 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b20: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c    p->zName, strl
8b30: 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  en(p->zName)+1, 
8b40: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
8b50: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
8b60: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
8b70: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
8b80: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
8b90: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
8ba0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8bb0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 46 4b 65    }.    for(pFKe
8bc0: 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  y=p->pFKey; pFKe
8bd0: 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e  y; pFKey=pFKey->
8be0: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
8bf0: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
8c00: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b  en(pFKey->zTo) +
8c10: 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d   1;.      pFKey-
8c20: 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74  >pNextTo = sqlit
8c30: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
8c40: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65  aDb[p->iDb].aFKe
8c50: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
8c60: 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  To);.      sqlit
8c70: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
8c80: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46  ->aDb[p->iDb].aF
8c90: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
8ca0: 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20   nTo, pFKey);.  
8cb0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
8cc0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
8cd0: 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b     db->nTable++;
8ce0: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
8cf0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
8d00: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f  hanges;.  }.}../
8d10: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
8d20: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
8d30: 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ne in order to c
8d40: 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57  reate a new VIEW
8d50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8d60: 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
8d70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8d80: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
8d90: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
8da0: 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
8db0: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
8dc0: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
8dd0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
8de0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
8df0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
8e00: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
8e10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
8e20: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
8e30: 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68  Name2,     /* Th
8e40: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
8e50: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
8e60: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c  he view */.  Sel
8e70: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
8e80: 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
8e90: 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
8ea0: 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
8eb0: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
8ec0: 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54  emp         /* T
8ed0: 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
8ee0: 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20  ARY view */.){. 
8ef0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
8f00: 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
8f10: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
8f20: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
8f30: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
8f40: 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 61  e;..  sqlite3Sta
8f50: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
8f60: 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20  pBegin, pName1, 
8f70: 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
8f80: 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  1);.  p = pParse
8f90: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
8fa0: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
8fb0: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
8fc0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
8fd0: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
8fe0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
8ff0: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
9000: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
9010: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
9020: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
9030: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
9040: 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22  Parse, p->iDb, "
9050: 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20  view", pName).  
9060: 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53    && sqlite3FixS
9070: 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65  elect(&sFix, pSe
9080: 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73  lect).  ){.    s
9090: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
90a0: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
90b0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
90c0: 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
90d0: 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c  f the entire SEL
90e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
90f0: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
9100: 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77  iew..  ** This w
9110: 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68  ill force all th
9120: 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76  e Expr.token.z v
9130: 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61  alues to be dyna
9140: 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c  mically.  ** all
9150: 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68  ocated rather th
9160: 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  an point to the 
9170: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77  input string - w
9180: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a  hich means that.
9190: 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70    ** they will p
91a0: 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65  ersist after the
91b0: 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
91c0: 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
91d0: 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  urns..  */.  p->
91e0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
91f0: 33 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65  3SelectDup(pSele
9200: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ct);.  sqlite3Se
9210: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
9220: 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72  ct);.  if( !pPar
9230: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
9240: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
9250: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
9260: 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
9270: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
9280: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
9290: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
92a0: 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
92b0: 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
92c0: 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
92d0: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
92e0: 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  astToken;.  if( 
92f0: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20  sEnd.z[0]!=0 && 
9300: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
9310: 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
9320: 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
9330: 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
9340: 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d 20  ((int)sEnd.z) - 
9350: 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a  (int)pBegin->z;.
9360: 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b    z = pBegin->z;
9370: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
9380: 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c   (z[n-1]==';' ||
9390: 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29   isspace(z[n-1])
93a0: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
93b0: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
93c0: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
93d0: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
93e0: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
93f0: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
9400: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
9410: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
9420: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
9430: 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72  , &sEnd, 0);.  r
9440: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
9450: 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
9460: 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
9470: 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
9480: 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
9490: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
94a0: 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
94b0: 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
94c0: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
94d0: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
94e0: 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
94f0: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
9500: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
9510: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
9520: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
9530: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
9540: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
9550: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
9560: 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69  Table){.  ExprLi
9570: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65  st *pEList;.  Se
9580: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61  lect *pSel;.  Ta
9590: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
95a0: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20  int nErr = 0;.. 
95b0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
95c0: 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  );..  /* A posit
95d0: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
95e0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
95f0: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
9600: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
9610: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
9620: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
9630: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
9640: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
9650: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
9660: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
9670: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
9680: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
9690: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
96a0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
96b0: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
96c0: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
96d0: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
96e0: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
96f0: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
9700: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
9710: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
9720: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
9730: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
9740: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
9750: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
9760: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
9770: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
9780: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
9790: 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  s error is caugh
97a0: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64  t previously and
97b0: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
97c0: 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75  g test.  ** shou
97d0: 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20  ld always fail. 
97e0: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61   But we will lea
97f0: 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a  ve it in place j
9800: 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a  ust to be safe..
9810: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
9820: 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
9830: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9840: 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
9850: 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
9860: 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
9870: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
9880: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
9890: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
98a0: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
98b0: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
98c0: 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
98d0: 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
98e0: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
98f0: 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d  t ); /* If nCol=
9900: 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20  =0, then pTable 
9910: 6d 75 73 74 20 62 65 20 61 20 56 49 45 57 20 2a  must be a VIEW *
9920: 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c  /.  pSel = pTabl
9930: 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  e->pSelect;..  /
9940: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
9950: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
9960: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
9970: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
9980: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
9990: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73  ents in this lis
99a0: 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  t.  But we will 
99b0: 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  need to restore 
99c0: 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61  the list.  ** ba
99d0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
99e0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
99f0: 20 61 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20   afterwards, so 
9a00: 77 65 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f  we save a copy o
9a10: 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69  f.  ** the origi
9a20: 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20  nal in pEList.. 
9a30: 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
9a40: 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  Sel->pEList;.  p
9a50: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sel->pEList = sq
9a60: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
9a70: 28 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20  (pEList);.  if( 
9a80: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20  pSel->pEList==0 
9a90: 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c  ){.    pSel->pEL
9aa0: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
9ab0: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
9ac0: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f  Malloc failed */
9ad0: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  .  }.  pTable->n
9ae0: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c  Col = -1;.  pSel
9af0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
9b00: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
9b10: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
9b20: 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29  .  if( pSelTab )
9b30: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
9b40: 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
9b50: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
9b60: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
9b70: 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  l;.    pTable->a
9b80: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
9b90: 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  Col;.    pSelTab
9ba0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
9bb0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
9bc0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  0;.    sqlite3De
9bd0: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
9be0: 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53 65 74  lTab);.    DbSet
9bf0: 50 72 6f 70 65 72 74 79 28 70 50 61 72 73 65 2d  Property(pParse-
9c00: 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62  >db, pTable->iDb
9c10: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
9c20: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
9c30: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
9c40: 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  0;.    nErr++;. 
9c50: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
9c60: 63 74 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a  ctUnbind(pSel);.
9c70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
9c80: 74 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45  tDelete(pSel->pE
9c90: 4c 69 73 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70  List);.  pSel->p
9ca0: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
9cb0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
9cc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
9cd0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
9ce0: 20 66 72 6f 6d 20 74 68 65 20 56 49 45 57 20 70   from the VIEW p
9cf0: 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Table..**.** Thi
9d00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9d10: 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 79  led whenever any
9d20: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 6f 72 20   other table or 
9d30: 76 69 65 77 20 69 73 20 6d 6f 64 69 66 69 65 64  view is modified
9d40: 2e 0a 2a 2a 20 54 68 65 20 76 69 65 77 20 70 61  ..** The view pa
9d50: 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72  ssed into this r
9d60: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 70  outine might dep
9d70: 65 6e 64 20 64 69 72 65 63 74 6c 79 20 6f 72 20  end directly or 
9d80: 69 6e 64 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e  indirectly.** on
9d90: 20 74 68 65 20 6d 6f 64 69 66 69 65 64 20 6f 72   the modified or
9da0: 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 20 73   deleted table s
9db0: 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6c 65  o we need to cle
9dc0: 61 72 20 74 68 65 20 6f 6c 64 20 63 6f 6c 75 6d  ar the old colum
9dd0: 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73 6f 20 74 68  n.** names so th
9de0: 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  at they will be 
9df0: 72 65 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73  recomputed..*/.s
9e00: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
9e10: 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e  eViewResetColumn
9e20: 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61  Names(Table *pTa
9e30: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
9e40: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9e50: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
9e60: 3d 30 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53  =0 && pTable->pS
9e70: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 66 6f  elect!=0 );.  fo
9e80: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
9e90: 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  le->aCol; i<pTab
9ea0: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
9eb0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  Col++){.    sqli
9ec0: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61  teFree(pCol->zNa
9ed0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
9ee0: 72 65 65 28 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29  ree(pCol->zDflt)
9ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
9f00: 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20  (pCol->zType);. 
9f10: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
9f20: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
9f30: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
9f40: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  0;.  pTable->nCo
9f50: 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l = 0;.}../*.** 
9f60: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
9f70: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
9f80: 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61  y VIEW in databa
9f90: 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  se idx..*/.stati
9fa0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
9fb0: 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65  wResetAll(sqlite
9fc0: 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
9fd0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
9fe0: 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
9ff0: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
a000: 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
a010: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
a020: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
a030: 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62  &db->aDb[idx].tb
a040: 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  lHash); i; i=sql
a050: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
a060: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
a070: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
a080: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
a090: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
a0a0: 20 20 20 20 20 73 71 6c 69 74 65 56 69 65 77 52       sqliteViewR
a0b0: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
a0c0: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
a0d0: 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
a0e0: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
a0f0: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
a100: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74  ./*.** Given a t
a110: 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20  oken, look up a 
a120: 74 61 62 6c 65 20 77 69 74 68 20 74 68 61 74 20  table with that 
a130: 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f  name.  If not fo
a140: 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e  und, leave.** an
a150: 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20 70   error for the p
a160: 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20 61 6e  arser to find an
a170: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
a180: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
a190: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50  TableFromToken(P
a1a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
a1b0: 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68  ken *pTok){.  ch
a1c0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62  ar *zName;.  Tab
a1d0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d  le *pTab;.  zNam
a1e0: 65 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65  e = sqlite3Table
a1f0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
a200: 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ok);.  if( zName
a210: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
a220: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
a230: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
a240: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  ->db, zName, 0);
a250: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
a260: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
a270: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
a280: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a290: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
a2a0: 65 3a 20 25 54 22 2c 20 70 54 6f 6b 29 3b 0a 20  e: %T", pTok);. 
a2b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
a2c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
a2d0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a2e0: 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  d to do the work
a2f0: 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45   of a DROP TABLE
a300: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70   statement..** p
a310: 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  Name is the name
a320: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
a330: 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a   be dropped..*/.
a340: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
a350: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
a360: 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
a370: 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29  ame, int isView)
a380: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
a390: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
a3a0: 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65  t base;.  sqlite
a3b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
a3c0: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
a3d0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
a3e0: 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
a3f0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
a400: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
a410: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  e;.  assert( pNa
a420: 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
a430: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
a440: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
a450: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
a460: 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
a470: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20  ].zDatabase);.. 
a480: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
a490: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
a4a0: 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70 54 61  ble;.  iDb = pTa
a4b0: 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74  b->iDb;.  assert
a4c0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
a4d0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64  db->nDb );.#ifnd
a4e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
a4f0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
a500: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
a510: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a520: 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
a530: 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  LE(pTab->iDb);. 
a540: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a550: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61  Db = db->aDb[pTa
a560: 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  b->iDb].zName;. 
a570: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
a580: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
a590: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
a5a0: 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
a5b0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
a5c0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
a5d0: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
a5e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62  ){.      if( iDb
a5f0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
a600: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
a610: 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
a620: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a630: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
a640: 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
a650: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
a660: 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29      if( iDb==1 )
a670: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
a680: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
a690: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
a6a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
a6b0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
a6c0: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
a6d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
a6e0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
a6f0: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
a700: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
a710: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
a720: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
a730: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
a740: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
a750: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
a760: 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ELETE, pTab->zNa
a770: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
a780: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
a790: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
a7a0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
a7b0: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
a7c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
a7d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
a7e0: 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
a7f0: 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70  t be dropped", p
a800: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
a810: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
a820: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
a830: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
a840: 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
a850: 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
a860: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
a870: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
a880: 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
a890: 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25  o delete table %
a8a0: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
a8b0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
a8c0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
a8d0: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
a8e0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
a8f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
a900: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
a910: 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
a920: 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c  delete view %s",
a930: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
a940: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
a950: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  p_table;.  }..  
a960: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
a970: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
a980: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
a990: 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
a9a0: 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
a9b0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
a9c0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
a9d0: 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ( v ){.    stati
a9e0: 63 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f  c VdbeOpList dro
a9f0: 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20  pTable[] = {.   
aa00: 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
aa10: 20 20 20 20 30 2c 20 41 44 44 52 28 31 30 29 2c      0, ADDR(10),
aa20: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
aa30: 53 74 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20  String8,     0, 
aa40: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
aa50: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
aa60: 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20  _MemStore,   1, 
aa70: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  1,        0},.  
aa80: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64      { OP_MemLoad
aa90: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
aaa0: 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
aab0: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
aac0: 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
aad0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
aae0: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Ne,         0, 
aaf0: 41 44 44 52 28 39 29 2c 20 20 30 7d 2c 0a 20 20  ADDR(9),  0},.  
ab00: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
ab10: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
ab20: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
ab30: 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20  _Rewind,     0, 
ab40: 41 44 44 52 28 31 30 29 2c 20 30 7d 2c 0a 20 20  ADDR(10), 0},.  
ab50: 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20      { OP_Goto,  
ab60: 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c       0, ADDR(3),
ab70: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
ab80: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
ab90: 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a  ADDR(3),  0}, /*
aba0: 20 39 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20   9 */.    };.   
abb0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
abc0: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
abd0: 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
abe0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
abf0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
ac00: 54 61 62 2d 3e 69 44 62 29 3b 0a 0a 20 20 20 20  Tab->iDb);..    
ac10: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
ac20: 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
ac30: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
ac40: 65 69 6e 67 20 64 72 6f 70 70 65 64 20 2a 2f 0a  eing dropped */.
ac50: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
ac60: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20  Tab->pTrigger;. 
ac70: 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67     while( pTrigg
ac80: 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  er ){.      asse
ac90: 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69 44  rt( pTrigger->iD
aca0: 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 7c 7c 20  b==pTab->iDb || 
acb0: 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d 31  pTrigger->iDb==1
acc0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
acd0: 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
ace0: 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
acf0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
ad00: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
ad10: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69 67  ){.        pTrig
ad20: 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
ad30: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
ad40: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69  se{.        pTri
ad50: 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72  gger = pTab->pTr
ad60: 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20  igger;.      }. 
ad70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f     }..    /* Dro
ad80: 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53  p all SQLITE_MAS
ad90: 54 45 52 20 65 6e 74 72 69 65 73 20 74 68 61 74  TER entries that
ada0: 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 74 61   refer to the ta
adb0: 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ble */.    sqlit
adc0: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
add0: 65 28 76 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  e(v, pTab->iDb);
ade0: 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69  .    base = sqli
adf0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
ae00: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72  (v, ArraySize(dr
ae10: 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61  opTable), dropTa
ae20: 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ble);.    sqlite
ae30: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
ae40: 20 62 61 73 65 2b 31 2c 20 70 54 61 62 2d 3e 7a   base+1, pTab->z
ae50: 4e 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  Name, 0);..    /
ae60: 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54  * Drop all SQLIT
ae70: 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 65 6e  E_TEMP_MASTER en
ae80: 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72  tries that refer
ae90: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
aea0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69  .    if( pTab->i
aeb0: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  Db!=1 ){.      s
aec0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
aed0: 54 61 62 6c 65 28 76 2c 20 31 29 3b 0a 20 20 20  Table(v, 1);.   
aee0: 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
aef0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
af00: 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70  , ArraySize(drop
af10: 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c  Table), dropTabl
af20: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
af30: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
af40: 20 62 61 73 65 2b 31 2c 20 70 54 61 62 2d 3e 7a   base+1, pTab->z
af50: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
af60: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69  .    if( pTab->i
af70: 44 62 21 3d 31 20 29 7b 20 20 2f 2a 20 54 65 6d  Db!=1 ){  /* Tem
af80: 70 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e  p database has n
af90: 6f 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  o schema cookie 
afa0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
afb0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
afc0: 20 76 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a   v, pTab->iDb);.
afd0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
afe0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
aff0: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
b000: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
b010: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
b020: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
b030: 65 73 74 72 6f 79 2c 20 70 54 61 62 2d 3e 74 6e  estroy, pTab->tn
b040: 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a  um, pTab->iDb);.
b050: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
b060: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
b070: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
b080: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ext){.        sq
b090: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b0a0: 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49  , OP_Destroy, pI
b0b0: 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e  dx->tnum, pIdx->
b0c0: 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iDb);.      }.  
b0d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
b0e0: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
b0f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20  (pParse);.  }.. 
b100: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69   /* Delete the i
b110: 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70  n-memory descrip
b120: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  tion of the tabl
b130: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63  e..  **.  ** Exc
b140: 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53  eption: if the S
b150: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67  QL statement beg
b160: 61 6e 20 77 69 74 68 20 74 68 65 20 45 58 50 4c  an with the EXPL
b170: 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a  AIN keyword,.  *
b180: 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65  * then no change
b190: 73 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65  s should be made
b1a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
b1b0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
b1c0: 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e  .    sqliteUnlin
b1d0: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
b1e0: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 64  db, pTab);.    d
b1f0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
b200: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
b210: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69  ;.  }.  sqliteVi
b220: 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
b230: 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  Db);..exit_drop_
b240: 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33  table:.  sqlite3
b250: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
b260: 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ame);.}../*.** T
b270: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b280: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
b290: 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65  a new foreign ke
b2a0: 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a  y on the table.*
b2b0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
b2c0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
b2d0: 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d   pFromCol determ
b2e0: 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d  ines which colum
b2f0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ns.** in the cur
b300: 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74  rent table point
b310: 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20   to the foreign 
b320: 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f  key.  If pFromCo
b330: 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  l==0 then.** con
b340: 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20  nect the key to 
b350: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
b360: 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69  inserted.  pTo i
b370: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  s the name of.**
b380: 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
b390: 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20  red to.  pToCol 
b3a0: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62  is a list of tab
b3b0: 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  les in the other
b3c0: 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68  .** pTo table th
b3d0: 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  at the foreign k
b3e0: 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66  ey points to.  f
b3f0: 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c  lags contains al
b400: 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
b410: 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c   about the confl
b420: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
b430: 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66  lgorithms specif
b440: 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  ied.** in the ON
b450: 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41   DELETE, ON UPDA
b460: 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54  TE and ON INSERT
b470: 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
b480: 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72  An FKey structur
b490: 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
b4a0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
b4b0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ble currently.**
b4c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
b4d0: 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73  ion in the pPars
b4e0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65  e->pNewTable fie
b4f0: 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65  ld.  The new FKe
b500: 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b  y.** is not link
b510: 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65  ed into db->aFKe
b520: 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  y at this point 
b530: 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  - that does not 
b540: 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20  happen.** until 
b550: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
b560: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  )..**.** The for
b570: 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20  eign key is set 
b580: 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72  for IMMEDIATE pr
b590: 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62  ocessing.  A sub
b5a0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
b5b0: 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  to sqlite3DeferF
b5c0: 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
b5d0: 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
b5e0: 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
b5f0: 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
b600: 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
b610: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b620: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
b630: 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69 73  ntext */.  IdLis
b640: 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 20 20  t *pFromCol,    
b650: 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
b660: 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
b670: 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
b680: 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
b690: 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
b6a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
b6b0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64 4c  r table */.  IdL
b6c0: 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
b6d0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
b6e0: 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
b6f0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
b700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
b710: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
b720: 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
b730: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
b740: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b750: 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
b760: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
b770: 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
b780: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
b790: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  0;..  assert( pT
b7a0: 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
b7b0: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
b7c0: 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  rr ) goto fk_end
b7d0: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
b7e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
b7f0: 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
b800: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
b810: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
b820: 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26     if( pToCol &&
b830: 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 31 20   pToCol->nId!=1 
b840: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b850: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b860: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
b870: 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
b880: 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
b890: 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
b8a0: 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
b8b0: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
b8c0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
b8d0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
b8e0: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
b8f0: 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
b900: 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
b910: 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 70 46 72  pToCol->nId!=pFr
b920: 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b 0a 20 20  omCol->nId ){.  
b930: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b940: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
b950: 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
b960: 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
b970: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
b980: 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
b990: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
b9a0: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
b9b0: 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
b9c0: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
b9d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
b9e0: 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49  l = pFromCol->nI
b9f0: 64 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  d;.  }.  nByte =
ba00: 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
ba10: 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46  + nCol*sizeof(pF
ba20: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
ba30: 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
ba40: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
ba50: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
ba60: 6c 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  l->nId; i++){.  
ba70: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72      nByte += str
ba80: 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  len(pToCol->a[i]
ba90: 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  .zName) + 1;.   
baa0: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d   }.  }.  pFKey =
bab0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
bac0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
bad0: 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b  Key==0 ) goto fk
bae0: 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70  _end;.  pFKey->p
baf0: 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
bb00: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
bb10: 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
bb20: 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b  char*)&pFKey[1];
bb30: 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d  .  pFKey->aCol =
bb40: 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70   (struct sColMap
bb50: 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65  *)z;.  z += size
bb60: 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  of(struct sColMa
bb70: 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79  p)*nCol;.  pFKey
bb80: 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d  ->zTo = z;.  mem
bb90: 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
bba0: 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
bbb0: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20  >n] = 0;.  z += 
bbc0: 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
bbd0: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a  y->pNextTo = 0;.
bbe0: 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
bbf0: 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
bc00: 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
bc10: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
bc20: 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
bc30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
bc40: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
bc50: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
bc60: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
bc70: 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
bc80: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
bc90: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
bca0: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
bcb0: 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
bcc0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
bcd0: 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
bce0: 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
bcf0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bd00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bd10: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
bd20: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
bd30: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
bd40: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
bd50: 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
bd60: 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
bd70: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
bd80: 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
bd90: 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
bda0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
bdb0: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
bdc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
bdd0: 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
bde0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bdf0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
be00: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
be10: 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
be20: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
be30: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
be40: 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  = z;.      memcp
be50: 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
be60: 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
be70: 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
be80: 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
be90: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
bea0: 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
beb0: 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43    pFKey->deleteC
bec0: 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78  onf = flags & 0x
bed0: 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64  ff;.  pFKey->upd
bee0: 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ateConf = (flags
bef0: 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a   >> 8 ) & 0xff;.
bf00: 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43    pFKey->insertC
bf10: 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
bf20: 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20  16 ) & 0xff;..  
bf30: 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
bf40: 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
bf50: 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
bf60: 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
bf70: 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
bf80: 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
bf90: 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72  _end:.  sqliteFr
bfa0: 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73 71 6c  ee(pFKey);.  sql
bfb0: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
bfc0: 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71  (pFromCol);.  sq
bfd0: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
bfe0: 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  e(pToCol);.}../*
bff0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c000: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
c010: 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
c020: 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
c030: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
c040: 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
c050: 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
c060: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
c070: 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
c080: 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
c090: 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
c0a0: 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
c0b0: 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
c0c0: 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
c0d0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
c0e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
c0f0: 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
c100: 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
c110: 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
c120: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c130: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
c140: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
c150: 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
c160: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
c170: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
c180: 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
c190: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
c1a0: 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
c1b0: 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
c1c0: 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d  return;.  pFKey-
c1d0: 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73  >isDeferred = is
c1e0: 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a  Deferred;.}../*.
c1f0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
c200: 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
c210: 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78 20   table.  pIndex 
c220: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
c230: 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
c240: 20 70 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e   pTable is the n
c250: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
c260: 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
c270: 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
c280: 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
c290: 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
c2a0: 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
c2b0: 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
c2c0: 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
c2d0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
c2e0: 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
c2f0: 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
c300: 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
c310: 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
c320: 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
c330: 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
c340: 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
c350: 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
c360: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
c370: 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
c380: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
c390: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
c3a0: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
c3b0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
c3c0: 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
c3d0: 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
c3e0: 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
c3f0: 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
c400: 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
c410: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
c420: 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
c430: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
c440: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
c450: 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76  truction.  .*/.v
c460: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
c470: 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
c480: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c  *pParse,   /* Al
c490: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
c4a0: 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
c4b0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
c4c0: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
c4d0: 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
c4e0: 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
c4f0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
c500: 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61  ,   /* Second pa
c510: 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
c520: 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
c530: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
c540: 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66  Name, /* Name of
c550: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e   the table to in
c560: 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d  dex. Use pParse-
c570: 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
c580: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c 69  */.  IdList *pLi
c590: 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  st,   /* A list 
c5a0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
c5b0: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
c5c0: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f  t onError,     /
c5d0: 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
c5e0: 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
c5f0: 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
c600: 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
c610: 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54  ,   /* The CREAT
c620: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
c630: 69 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42  ins a CREATE TAB
c640: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  LE statement */.
c650: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20    Token *pEnd   
c660: 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68     /* The ")" th
c670: 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52  at closes the CR
c680: 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
c690: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ment */.){.  Tab
c6a0: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 2f 2a  le *pTab = 0; /*
c6b0: 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   Table to be ind
c6c0: 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  exed */.  Index 
c6d0: 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68  *pIndex;   /* Th
c6e0: 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
c6f0: 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
c700: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *zName = 0;.  in
c710: 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20  t i, j;.  Token 
c720: 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61  nullId;    /* Fa
c730: 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20  ke token for an 
c740: 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f  empty ID list */
c750: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
c760: 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
c770: 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
c780: 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
c790: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20  .  int isTemp;  
c7a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
c7b0: 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65  a temporary inde
c7c0: 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64  x */.  sqlite *d
c7d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c7e0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
c7f0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
c800: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
c810: 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  at is being writ
c820: 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ten */.  Token *
c830: 70 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e  pName = 0; /* Un
c840: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
c850: 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63  f the index to c
c860: 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20  reate */..  if( 
c870: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
c880: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
c890: 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69  ailed ) goto exi
c8a0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c8b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
c8c0: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
c8d0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
c8e0: 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
c8f0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
c900: 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  /.  if( pTblName
c910: 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55  !=0 ){..    /* U
c920: 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20  se the two-part 
c930: 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65  index name to de
c940: 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61  termine the data
c950: 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20  base .    ** to 
c960: 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74  search for the t
c970: 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20  able. 'Fix' the 
c980: 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
c990: 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66  is db.    ** bef
c9a0: 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74  ore looking up t
c9b0: 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
c9c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
c9d0: 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b  me1 && pName2 );
c9e0: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
c9f0: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
ca00: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
ca10: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
ca20: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67     if( iDb<0 ) g
ca30: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
ca40: 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 49  index;..    /* I
ca50: 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
ca60: 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64   was unqualified
ca70: 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74  , check if the t
ca80: 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
ca90: 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e  is a temp table.
caa0: 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20   If so, set the 
cab0: 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20  database to 1.. 
cac0: 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d     */.    pTab =
cad0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
cae0: 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
caf0: 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  blName);.    if(
cb00: 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65   pName2 && pName
cb10: 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20  2->n==0 && pTab 
cb20: 26 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20  && pTab->iDb==1 
cb30: 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20 31  ){.      iDb = 1
cb40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
cb50: 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
cb60: 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
cb70: 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61  Db, "index", pNa
cb80: 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73  me) &&.        s
cb90: 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
cba0: 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65  (&sFix, pTblName
cbb0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
cbc0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
cbd0: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
cbe0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
cbf0: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
cc00: 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30  e, pTblName->a[0
cc10: 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ].zName, .      
cc20: 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d    pTblName->a[0]
cc30: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
cc40: 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74   if( !pTab ) got
cc50: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
cc60: 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
cc70: 20 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20   iDb==pTab->iDb 
cc80: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
cc90: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30  assert( pName==0
cca0: 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20   );.    pTab =  
ccb0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
ccc0: 65 3b 0a 20 20 20 20 69 44 62 20 3d 20 70 54 61  e;.    iDb = pTa
ccd0: 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69  b->iDb;.  }..  i
cce0: 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50  f( pTab==0 || pP
ccf0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
cd00: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
cd10: 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  dex;.  if( pTab-
cd20: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
cd30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
cd40: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
cd50: 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
cd60: 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
cd70: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
cd80: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
cd90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
cda0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
cdb0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
cdc0: 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20  (pParse, "views 
cdd0: 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
cde0: 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
cdf0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
ce00: 3b 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d  ;.  }.  isTemp =
ce10: 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a   pTab->iDb==1;..
ce20: 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
ce30: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
ce40: 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
ce50: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
ce60: 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
ce70: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
ce80: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
ce90: 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
cea0: 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
ceb0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
cec0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
ced0: 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
cee0: 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
cef0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
cf00: 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
cf10: 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
cf20: 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
cf30: 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
cf40: 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
cf50: 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
cf60: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
cf70: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
cf80: 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
cf90: 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
cfa0: 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
cfb0: 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
cfc0: 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
cfd0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
cfe0: 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
cff0: 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
d000: 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
d010: 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
d020: 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
d030: 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
d040: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
d050: 20 26 26 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75   && !db->init.bu
d060: 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
d070: 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20  *pISameName;    
d080: 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78  /* Another index
d090: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
d0a0: 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ame */.    Table
d0b0: 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20   *pTSameName;   
d0c0: 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68   /* A table with
d0d0: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
d0e0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a  e index */.    z
d0f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
d100: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
d110: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66  Name->n);.    if
d120: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
d130: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
d140: 64 65 78 3b 0a 20 20 20 20 69 66 28 20 28 70 49  dex;.    if( (pI
d150: 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74  SameName = sqlit
d160: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
d170: 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69  zName, db->aDb[i
d180: 44 62 5d 2e 7a 4e 61 6d 65 29 29 21 3d 30 20 29  Db].zName))!=0 )
d190: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
d1a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d1b0: 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
d1c0: 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
d1d0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
d1e0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
d1f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
d200: 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c  pTSameName = sql
d210: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
d220: 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20  , zName, 0))!=0 
d230: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d240: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d250: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
d260: 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
d270: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
d280: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
d290: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
d2a0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e  }.  }else if( pN
d2b0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ame==0 ){.    ch
d2c0: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
d2d0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
d2e0: 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
d2f0: 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
d300: 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
d310: 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
d320: 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
d330: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25   sprintf(zBuf,"%
d340: 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d  d)",n);.    zNam
d350: 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
d360: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  e3SetString(&zNa
d370: 6d 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e 7a  me, "(", pTab->z
d380: 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64 65  Name, " autoinde
d390: 78 20 22 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  x ", zBuf, (char
d3a0: 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  *)0);.    if( zN
d3b0: 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
d3c0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
d3d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
d3e0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
d3f0: 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  Dup(pName->z, pN
d400: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7d 0a 0a 20 20  ame->n);.  }..  
d410: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
d420: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
d430: 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
d440: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
d450: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
d460: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f  ATION.  {.    co
d470: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
d480: 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44  db->aDb[pTab->iD
d490: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
d4a0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
d4b0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
d4c0: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
d4d0: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
d4e0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
d4f0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
d500: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
d510: 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
d520: 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
d530: 69 66 28 20 69 73 54 65 6d 70 20 29 20 69 20 3d  if( isTemp ) i =
d540: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
d550: 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
d560: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
d570: 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
d580: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
d590: 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
d5a0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
d5b0: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
d5c0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
d5d0: 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
d5e0: 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
d5f0: 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
d600: 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
d610: 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
d620: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
d630: 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
d640: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
d650: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
d660: 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
d670: 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
d680: 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
d690: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  List==0 ){.    n
d6a0: 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e  ullId.z = pTab->
d6b0: 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d  aCol[pTab->nCol-
d6c0: 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75  1].zName;.    nu
d6d0: 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  llId.n = strlen(
d6e0: 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70  nullId.z);.    p
d6f0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 49 64  List = sqlite3Id
d700: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e  ListAppend(0, &n
d710: 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
d720: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
d730: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
d740: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20  x;.  }..  /* .  
d750: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
d760: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
d770: 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20   .  */.  pIndex 
d780: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
d790: 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
d7a0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
d7b0: 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1 +.            
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
d7d0: 65 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f  eof(int) + sizeo
d7e0: 66 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c 69  f(CollSeq*))*pLi
d7f0: 73 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28  st->nId );.  if(
d800: 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74   pIndex==0 ) got
d810: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
d820: 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  dex;.  pIndex->a
d830: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29  iColumn = (int*)
d840: 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f  &pIndex->keyInfo
d850: 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 49  .aColl[pList->nI
d860: 64 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e  d];.  pIndex->zN
d870: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49  ame = (char*)&pI
d880: 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  ndex->aiColumn[p
d890: 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74  List->nId];.  st
d8a0: 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  rcpy(pIndex->zNa
d8b0: 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49  me, zName);.  pI
d8c0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
d8d0: 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e  Tab;.  pIndex->n
d8e0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e  Column = pList->
d8f0: 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  nId;.  pIndex->o
d900: 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72  nError = onError
d910: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
d920: 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30  Index = pName==0
d930: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20  ;.  pIndex->iDb 
d940: 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61  = iDb;..  /* Sca
d950: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
d960: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
d970: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
d980: 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
d990: 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
d9a0: 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
d9b0: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
d9c0: 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
d9d0: 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
d9e0: 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
d9f0: 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
da00: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
da10: 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a   i++){.    for(j
da20: 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
da30: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
da40: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
da50: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
da60: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  me, pTab->aCol[j
da70: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
da80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
da90: 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
daa0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
dab0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
dac0: 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
dad0: 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
dae0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
daf0: 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73 74 2d  b->zName, pList-
db00: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
db10: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
db20: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f  Index);.      go
db30: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
db40: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
db50: 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
db60: 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 70 49 6e  [i] = j;.    pIn
db70: 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
db80: 6c 6c 5b 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43  ll[i] = pTab->aC
db90: 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 7d  ol[j].pColl;.  }
dba0: 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  .  pIndex->keyIn
dbb0: 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73  fo.nField = pLis
dbc0: 74 2d 3e 6e 49 64 3b 0a 0a 20 20 2f 2a 20 4c 69  t->nId;..  /* Li
dbd0: 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  nk the new Index
dbe0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
dbf0: 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74  s table and to t
dc00: 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e  he other.  ** in
dc10: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
dc20: 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20   structures. .  
dc30: 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  */.  if( !pParse
dc40: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
dc50: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70   Index *p;.    p
dc60: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
dc70: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 49  sert(&db->aDb[pI
dc80: 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61  ndex->iDb].idxHa
dc90: 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sh, .           
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
dcb0: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  ndex->zName, str
dcc0: 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  len(pIndex->zNam
dcd0: 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20  e)+1, pIndex);. 
dce0: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
dcf0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
dd00: 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
dd10: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
dd20: 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ed */.      sqli
dd30: 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a  teFree(pIndex);.
dd40: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
dd50: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
dd60: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67    }.    db->flag
dd70: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
dd80: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a  rnChanges;.  }..
dd90: 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67    /* When adding
dda0: 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65   an index to the
ddb0: 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73   list of indices
ddc0: 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61   for a table, ma
ddd0: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c  ke.  ** sure all
dde0: 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64   indices labeled
ddf0: 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65   OE_Replace come
de00: 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65   after all those
de10: 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45   labeled.  ** OE
de20: 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69  _Ignore.  This i
de30: 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
de40: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
de50: 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a  ation of UPDATE.
de60: 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e    ** and INSERT.
de70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e 45 72  .  */.  if( onEr
de80: 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
de90: 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
dea0: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 54 61  =0.       || pTa
deb0: 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
dec0: 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
ded0: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65  .    pIndex->pNe
dee0: 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
def0: 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  x;.    pTab->pIn
df00: 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
df10: 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78  }else{.    Index
df20: 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
df30: 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77 68 69  >pIndex;.    whi
df40: 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
df50: 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
df60: 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
df70: 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
df80: 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
df90: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
dfa0: 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
dfb0: 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
dfc0: 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e  ;.    pOther->pN
dfd0: 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
dfe0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
dff0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
e000: 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  1 it means we ar
e010: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51  e reading the SQ
e020: 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22  L off the.  ** "
e030: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74  sqlite_master" t
e040: 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b  able on the disk
e050: 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69  .  So do not wri
e060: 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20  te to the disk. 
e070: 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72   ** again.  Extr
e080: 61 63 74 20 74 68 65 20 74 61 62 6c 65 20 6e 75  act the table nu
e090: 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20 64 62  mber from the db
e0a0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
e0b0: 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ield..  */.  if(
e0c0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26   db->init.busy &
e0d0: 26 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  & pTblName!=0 ){
e0e0: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75  .    pIndex->tnu
e0f0: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
e100: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
e110: 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
e120: 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63  busy is 0 then c
e130: 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  reate the index 
e140: 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20  on disk.  This. 
e150: 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69   ** involves wri
e160: 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69  ting the index i
e170: 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74  nto the master t
e180: 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67  able and filling
e190: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
e1a0: 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ex with the curr
e1b0: 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e  ent table conten
e1c0: 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ts..  **.  ** Th
e1d0: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
e1e0: 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73  is 0 when the us
e1f0: 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20  er first enters 
e200: 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a  a CREATE INDEX .
e210: 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64    ** command.  d
e220: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
e230: 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  1 when a databas
e240: 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20  e is opened and 
e250: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44  .  ** CREATE IND
e260: 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  EX statements ar
e270: 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68  e read out of th
e280: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e master table. 
e290: 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74   In.  ** the lat
e2a0: 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64  ter case the ind
e2b0: 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
e2c0: 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68  s on disk, which
e2d0: 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20   is why.  ** we 
e2e0: 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
e2f0: 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a  create it..  **.
e300: 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65    ** If pTblName
e310: 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
e320: 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
e330: 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72  ated as a primar
e340: 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e  y key.  ** or UN
e350: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
e360: 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  of a CREATE TABL
e370: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
e380: 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
e390: 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
e3a0: 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
e3b0: 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
e3c0: 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
e3d0: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
e3e0: 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
e3f0: 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
e400: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
e410: 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  sy==0 ){.    int
e420: 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
e430: 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c  .    int lbl1, l
e440: 62 6c 32 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71  bl2;..    v = sq
e450: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
e460: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
e470: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
e480: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
e490: 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
e4a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e4b0: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
e4c0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
e4d0: 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
e4e0: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
e4f0: 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  le(v, iDb);.    
e500: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
e510: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
e520: 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  Recno, 0, 0);.  
e530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
e540: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
e550: 30 2c 20 30 2c 20 22 69 6e 64 65 78 22 2c 20 50  0, 0, "index", P
e560: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
e570: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
e580: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
e590: 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  0, pIndex->zName
e5a0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
e5b0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53  3VdbeOp3(v, OP_S
e5c0: 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 54  tring8, 0, 0, pT
e5d0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
e5e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
e5f0: 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  3(v, OP_CreateIn
e600: 64 65 78 2c 20 30 2c 20 69 44 62 2c 28 63 68 61  dex, 0, iDb,(cha
e610: 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  r*)&pIndex->tnum
e620: 2c 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20  ,P3_POINTER);.  
e630: 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
e640: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c   0;.    if( pTbl
e650: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
e660: 6c 69 74 65 33 56 64 62 65 43 6f 64 65 28 76 2c  lite3VdbeCode(v,
e670: 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f 44 75  .          OP_Du
e680: 70 2c 20 20 20 20 20 20 20 30 2c 20 20 20 20 20  p,       0,     
e690: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50   0,.          OP
e6a0: 5f 49 6e 74 65 67 65 72 2c 20 20 20 69 44 62 2c  _Integer,   iDb,
e6b0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 29 3b      0,.      0);
e6c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e6d0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
e6e0: 57 72 69 74 65 2c 20 31 2c 20 30 2c 0a 20 20 20  Write, 1, 0,.   
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 20 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78    (char*)&pIndex
e710: 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  ->keyInfo, P3_KE
e720: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a 20 20  YINFO);.    }.  
e730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e740: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
e750: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
e760: 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20   pStart && pEnd 
e770: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e780: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
e790: 2d 31 2c 20 22 43 52 45 41 54 45 20 49 4e 44 45  -1, "CREATE INDE
e7a0: 58 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  X ", P3_STATIC);
e7b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e7c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
e7d0: 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20  ring8, 0, 0);.  
e7e0: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
e7f0: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4e 61  d->z) - Addr(pNa
e800: 6d 65 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20  me->z) + 1;.    
e810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e820: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 4e 61  ngeP3(v, -1, pNa
e830: 6d 65 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  me->z, n);.     
e840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e850: 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20  p(v, OP_Concat, 
e860: 32 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  2, 0);.    }.   
e870: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
e880: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
e890: 2c 20 35 2c 20 30 2c 20 22 74 74 74 69 74 22 2c  , 5, 0, "tttit",
e8a0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
e8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e8c0: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
e8d0: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  y, 0, 0);.    if
e8e0: 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
e8f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e900: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
e910: 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30  er, pTab->iDb, 0
e920: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e930: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e940: 4f 70 65 6e 52 65 61 64 2c 20 32 2c 20 70 54 61  OpenRead, 2, pTa
e950: 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  b->tnum);.      
e960: 2f 2a 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  /* VdbeComment((
e970: 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a  v, "%s", pTab->z
e980: 4e 61 6d 65 29 29 3b 20 2a 2f 0a 20 20 20 20 20  Name)); */.     
e990: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e9a0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
e9b0: 6c 75 6d 6e 73 2c 20 32 2c 20 70 54 61 62 2d 3e  lumns, 2, pTab->
e9c0: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 6c 62 6c  nCol);.      lbl
e9d0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
e9e0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
e9f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ea00: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
ea10: 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20  , 2, lbl2);.    
ea20: 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33    lbl1 = sqlite3
ea30: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
ea40: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
ea50: 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
ea60: 79 28 76 2c 20 70 49 6e 64 65 78 2c 20 32 29 3b  y(v, pIndex, 2);
ea70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ea80: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 50  beOp3(v, OP_IdxP
ea90: 75 74 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e 6f  ut, 1, pIndex->o
eaa0: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c  nError!=OE_None,
eab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eac0: 20 20 20 20 20 20 20 22 69 6e 64 65 78 65 64 20         "indexed 
ead0: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20  columns are not 
eae0: 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54 41 54  unique", P3_STAT
eaf0: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
eb00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
eb10: 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c 31 29  P_Next, 2, lbl1)
eb20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
eb30: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
eb40: 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20  v, lbl2);.      
eb50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
eb60: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c  (v, OP_Close, 2,
eb70: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
eb80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
eb90: 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a  P_Close, 1, 0);.
eba0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
ebb0: 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
ebc0: 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29     if( !isTemp )
ebd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ebe0: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
ebf0: 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , v, iDb);.     
ec00: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
ec10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ec20: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
ec30: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72      sqlite3EndWr
ec40: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
ec50: 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
ec60: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
ec70: 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
ec80: 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
ec90: 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  ex:.  sqlite3IdL
eca0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
ecb0: 3b 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 53 72  ;.  /* sqlite3Sr
ecc0: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61 62  cListDelete(pTab
ecd0: 6c 65 29 3b 20 2a 2f 0a 20 20 73 71 6c 69 74 65  le); */.  sqlite
ece0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72  Free(zName);.  r
ecf0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
ed00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
ed10: 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
ed20: 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
ed30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
ed40: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
ed50: 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
ed60: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
ed70: 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
ed80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
ed90: 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20  cList *pName){. 
eda0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
edb0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
edc0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
edd0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
ede0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
edf0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
ee00: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  ed ) return;.  a
ee10: 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
ee20: 72 63 3d 3d 31 20 29 3b 0a 20 20 70 49 6e 64 65  rc==1 );.  pInde
ee30: 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
ee40: 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e  ndex(db, pName->
ee50: 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
ee60: 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
ee70: 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  e);.  if( pIndex
ee80: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
ee90: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
eea0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
eeb0: 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
eec0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
eed0: 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
eee0: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
eef0: 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
ef00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ef10: 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
ef20: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
ef30: 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
ef40: 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
ef50: 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
ef60: 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
ef70: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
ef80: 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 2f  rop_index;.  }./
ef90: 2a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  *.  if( pIndex->
efa0: 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  iDb>1 ){.    sql
efb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
efc0: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 61 6c 74  rse, "cannot alt
efd0: 65 72 20 73 63 68 65 6d 61 20 6f 66 20 61 74 74  er schema of att
efe0: 61 63 68 65 64 20 22 0a 20 20 20 20 20 20 20 22  ached ".       "
eff0: 64 61 74 61 62 61 73 65 73 22 2c 20 30 29 3b 0a  databases", 0);.
f000: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
f010: 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 2a 2f  op_index;.  }.*/
f020: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f030: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
f040: 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
f050: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
f060: 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
f070: 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
f080: 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
f090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
f0a0: 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d   db->aDb[pIndex-
f0b0: 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >iDb].zName;.   
f0c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
f0d0: 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
f0e0: 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20  (pIndex->iDb);. 
f0f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
f100: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
f110: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
f120: 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
f130: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
f140: 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
f150: 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  }.    if( pIndex
f160: 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  ->iDb ) code = S
f170: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
f180: 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
f190: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
f1a0: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
f1b0: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
f1c0: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
f1d0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
f1e0: 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
f1f0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
f200: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
f210: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
f220: 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
f230: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
f240: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
f250: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f260: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
f270: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69   static VdbeOpLi
f280: 73 74 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d  st dropIndex[] =
f290: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65   {.      { OP_Re
f2a0: 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44  wind,     0, ADD
f2b0: 52 28 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20 20  R(9), 0}, .     
f2c0: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20   { OP_String8,  
f2d0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
f2e0: 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  }, /* 1 */.     
f2f0: 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20   { OP_MemStore, 
f300: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d    1, 1,       0}
f310: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  ,.      { OP_Mem
f320: 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20  Load,    1, 0,  
f330: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f       0}, /* 3 */
f340: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
f350: 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20  mn,     0, 1,   
f360: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
f370: 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30  OP_Eq,         0
f380: 2c 20 41 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20  , ADDR(8), 0},. 
f390: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
f3a0: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29        0, ADDR(3)
f3b0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
f3c0: 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20  _Goto,       0, 
f3d0: 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(9), 0},.   
f3e0: 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20     { OP_Delete, 
f3f0: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
f400: 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20  0}, /* 8 */.    
f410: 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b  };.    int base;
f420: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ..    sqlite3Beg
f430: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
f440: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49 6e 64  (pParse, 0, pInd
f450: 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71  ex->iDb);.    sq
f460: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
f470: 61 62 6c 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e  able(v, pIndex->
f480: 69 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d  iDb);.    base =
f490: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f4a0: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
f4b0: 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c 20 64  ze(dropIndex), d
f4c0: 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  ropIndex);.    s
f4d0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
f4e0: 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 49  P3(v, base+1, pI
f4f0: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
f500: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
f510: 3e 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20  >iDb!=1 ){.     
f520: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
f530: 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 49 6e 64  okie(db, v, pInd
f540: 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 7d 0a  ex->iDb);.    }.
f550: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f560: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
f570: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
f580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f590: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e   OP_Destroy, pIn
f5a0: 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64 65  dex->tnum, pInde
f5b0: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  x->iDb);.    sql
f5c0: 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72  ite3EndWriteOper
f5d0: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
f5e0: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
f5f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65  the in-memory de
f600: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 69  scription of thi
f610: 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20  s index..  */.  
f620: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
f630: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  lain ){.    sqli
f640: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
f650: 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  teIndex(db, pInd
f660: 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  ex);.    db->fla
f670: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
f680: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
f690: 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
f6a0: 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
f6b0: 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b  stDelete(pName);
f6c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
f6d0: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
f6e0: 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
f6f0: 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
f700: 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
f710: 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
f720: 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
f730: 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
f740: 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
f750: 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
f760: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
f770: 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  d(IdList *pList,
f780: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
f790: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
f7a0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
f7b0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
f7c0: 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
f7d0: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
f7e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
f7f0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
f800: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
f810: 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d 3e  st->nId>=pList->
f820: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74  nAlloc ){.    st
f830: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
f840: 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   *a;.    pList->
f850: 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e  nAlloc = pList->
f860: 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20  nAlloc*2 + 5;.  
f870: 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c    a = sqliteReal
f880: 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c  loc(pList->a, pL
f890: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65  ist->nAlloc*size
f8a0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
f8b0: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
f8c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f8d0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
f8e0: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
f8f0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
f900: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
f910: 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74  .  memset(&pList
f920: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c  ->a[pList->nId],
f930: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
f940: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
f950: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68  pToken ){.    ch
f960: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74  ar **pz = &pList
f970: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e  ->a[pList->nId].
f980: 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74  zName;.    sqlit
f990: 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  e3SetNString(pz,
f9a0: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
f9b0: 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69  en->n, 0);.    i
f9c0: 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20  f( *pz==0 ){.   
f9d0: 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
f9e0: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
f9f0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
fa00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fa10: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 2a  sqlite3Dequote(*
fa20: 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pz);.    }.  }. 
fa30: 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20   pList->nId++;. 
fa40: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
fa50: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
fa60: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
fa70: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63  to the given Src
fa80: 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
fa90: 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a  new SrcList if.*
faa0: 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65  * need be.  A ne
fab0: 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74  w entry is creat
fac0: 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ed in the SrcLis
fad0: 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e  t even if pToken
fae0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
faf0: 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73  A new SrcList is
fb00: 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
fb10: 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
fb20: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ails..**.** If p
fb30: 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
fb40: 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
fb50: 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
fb60: 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
fb70: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
fb80: 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
fb90: 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
fba0: 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
fbb0: 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
fbc0: 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
fbd0: 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
fbe0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
fbf0: 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
fc00: 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
fc10: 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
fc20: 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
fc30: 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
fc40: 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
fc50: 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
fc60: 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
fc70: 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
fc80: 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
fc90: 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
fca0: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
fcb0: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
fcc0: 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
fcd0: 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
fce0: 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
fcf0: 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
fd00: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
fd10: 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
fd20: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
fd30: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
fd40: 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a  ppend(A,B,0);.**
fd50: 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20  .** Then B is a 
fd60: 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
fd70: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
fd80: 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e   is unspecified.
fd90: 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c    If called.** l
fda0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
fdb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
fdc0: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42  rcListAppend(A,B
fdd0: 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
fde0: 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
fdf0: 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
fe00: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
fe10: 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
fe20: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
fe30: 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c  (SrcList *pList,
fe40: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
fe50: 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
fe60: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
fe70: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
fe80: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
fe90: 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
fea0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
feb0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
fec0: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
fed0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
fee0: 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69  pList->nSrc>=pLi
fef0: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
ff00: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
ff10: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
ff20: 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65  oc *= 2;.    pNe
ff30: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
ff40: 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20  c(pList,.       
ff50: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
ff60: 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d  pList) + (pList-
ff70: 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  >nAlloc-1)*sizeo
ff80: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
ff90: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
ffa0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
ffb0: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
ffc0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
ffd0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
ffe0: 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a    pList = pNew;.
fff0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c    }.  memset(&pL
10000 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
10010 72 63 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  rc], 0, sizeof(p
10020 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
10030 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
10040 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30   pDatabase->z==0
10050 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73   ){.    pDatabas
10060 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
10070 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 54   pDatabase && pT
10080 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  able ){.    Toke
10090 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
100a0 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
100b0 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
100c0 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
100d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
100e0 6c 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  le ){.    char *
100f0 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  *pz = &pList->a[
10100 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61  pList->nSrc].zNa
10110 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  me;.    sqlite3S
10120 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54  etNString(pz, pT
10130 61 62 6c 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 2d  able->z, pTable-
10140 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  >n, 0);.    if( 
10150 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  *pz==0 ){.      
10160 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
10170 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
10180 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
10190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
101a0 6c 69 74 65 33 44 65 71 75 6f 74 65 28 2a 70 7a  lite3Dequote(*pz
101b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
101c0 66 28 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a  f( pDatabase ){.
101d0 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
101e0 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
101f0 3e 6e 53 72 63 5d 2e 7a 44 61 74 61 62 61 73 65  >nSrc].zDatabase
10200 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
10210 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 44 61 74  NString(pz, pDat
10220 61 62 61 73 65 2d 3e 7a 2c 20 70 44 61 74 61 62  abase->z, pDatab
10230 61 73 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ase->n, 0);.    
10240 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20  if( *pz==0 ){.  
10250 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
10260 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
10270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
10280 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10290 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
102a0 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
102b0 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  .  pList->a[pLis
102c0 74 2d 3e 6e 53 72 63 5d 2e 69 43 75 72 73 6f 72  t->nSrc].iCursor
102d0 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e   = -1;.  pList->
102e0 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  nSrc++;.  return
102f0 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
10300 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73 20   Assign cursors 
10310 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  to all tables in
10320 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f   a SrcList.*/.vo
10330 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
10340 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50  tAssignCursors(P
10350 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
10360 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
10370 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
10380 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
10390 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
103a0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  pList->a[i].iCur
103b0 73 6f 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  sor<0 ){.      p
103c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
103d0 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
103e0 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  b++;.    }.  }.}
103f0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61  ../*.** Add an a
10400 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74  lias to the last
10410 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74   identifier on t
10420 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66  he given identif
10430 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ier list..*/.voi
10440 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
10450 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74  AddAlias(SrcList
10460 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
10470 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70  pToken){.  if( p
10480 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e  List && pList->n
10490 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  Src>0 ){.    int
104a0 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63   i = pList->nSrc
104b0 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   - 1;.    sqlite
104c0 33 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69  3SetNString(&pLi
104d0 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c  st->a[i].zAlias,
104e0 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
104f0 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73  en->n, 0);.    s
10500 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 4c  qlite3Dequote(pL
10510 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
10520 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
10530 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
10540 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10550 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  3IdListDelete(Id
10560 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
10570 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
10580 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
10590 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
105a0 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
105b0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
105c0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
105d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
105e0 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
105f0 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
10600 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
10610 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
10620 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
10630 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
10640 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
10650 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
10660 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
10670 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
10680 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
10690 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
106a0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
106b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
106c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
106d0 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
106e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
106f0 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
10700 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
10710 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
10720 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
10730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
10740 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
10750 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
10760 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
10770 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
10780 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
10790 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
107a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
107b0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
107c0 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
107d0 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
107e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
107f0 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44  e(pList->a[i].zD
10800 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
10810 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
10820 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
10830 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
10840 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b  t->a[i].zAlias);
10850 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
10860 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69  a[i].pTab && pLi
10870 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69  st->a[i].pTab->i
10880 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
10890 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
108a0 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d  eTable(0, pList-
108b0 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20  >a[i].pTab);.   
108c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
108d0 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74  lectDelete(pList
108e0 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
108f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
10900 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b  Delete(pList->a[
10910 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  i].pOn);.    sql
10920 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
10930 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73  (pList->a[i].pUs
10940 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
10950 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
10960 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
10970 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
10980 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
10990 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
109a0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
109b0 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65  lite *db;.  Vdbe
109c0 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
109d0 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
109e0 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
109f0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
10a00 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
10a10 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
10a20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
10a30 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
10a40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
10a50 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
10a60 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
10a70 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
10a80 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
10a90 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
10aa0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
10ab0 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
10ac0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10ad0 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  p(v, OP_AutoComm
10ae0 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  it, 0, 0);.}../*
10af0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61  .** Commit a tra
10b00 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
10b10 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72   sqlite3CommitTr
10b20 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
10b30 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
10b40 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  te *db;.  Vdbe *
10b50 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
10b60 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
10b70 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
10b80 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
10b90 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
10ba0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
10bb0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
10bc0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
10bd0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
10be0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
10bf0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
10c00 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
10c10 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
10c20 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
10c30 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
10c40 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
10c50 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10c60 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
10c70 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
10c80 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   Rollback a tran
10c90 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
10ca0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54  sqlite3RollbackT
10cb0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
10cc0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
10cd0 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
10ce0 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
10cf0 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
10d00 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
10d10 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
10d20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
10d30 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
10d40 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
10d50 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
10d60 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
10d70 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
10d80 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
10d90 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
10da0 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
10db0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
10dc0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10dd0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
10de0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10df0 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
10e00 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
10e10 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
10e20 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  E code that will
10e30 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
10e40 6d 61 20 63 6f 6f 6b 69 65 20 66 6f 72 20 61 6c  ma cookie for al
10e50 6c 0a 2a 2a 20 6e 61 6d 65 64 20 64 61 74 61 62  l.** named datab
10e60 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f  ase files..*/.vo
10e70 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
10e80 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65  rifySchema(Parse
10e90 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
10ea0 62 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  b){.  sqlite *db
10eb0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
10ec0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
10ed0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
10ee0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
10ef0 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
10f00 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
10f10 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
10f20 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
10f30 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20 69 66  ].pBt!=0 );.  if
10f40 28 20 69 44 62 21 3d 31 20 26 26 20 28 69 44 62  ( iDb!=1 && (iDb
10f50 3e 36 33 20 7c 7c 20 21 28 70 50 61 72 73 65 2d  >63 || !(pParse-
10f60 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 28 28  >cookieMask & ((
10f70 75 36 34 29 31 3c 3c 69 44 62 29 29 29 20 29 7b  u64)1<<iDb))) ){
10f80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10f90 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e  AddOp(v, OP_Tran
10fa0 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20 30 29  saction, iDb, 0)
10fb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10fc0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72  eAddOp(v, OP_Ver
10fd0 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  ifyCookie, iDb, 
10fe0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68  db->aDb[iDb].sch
10ff0 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20  ema_cookie);.   
11000 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
11010 61 73 6b 20 7c 3d 20 28 28 75 36 34 29 31 3c 3c  ask |= ((u64)1<<
11020 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iDb);.  }.}../*.
11030 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
11040 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
11050 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
11060 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
11070 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
11080 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
11090 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
110a0 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
110b0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
110c0 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
110d0 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
110e0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
110f0 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
11100 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
11110 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
11120 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
11130 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
11140 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
11150 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
11160 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
11170 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
11180 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
11190 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
111a0 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
111b0 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
111c0 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
111d0 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
111e0 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
111f0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
11200 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
11210 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
11220 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
11230 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
11240 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
11250 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
11260 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
11270 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
11280 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
11290 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
112a0 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
112b0 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
112c0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
112d0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  set..**.** Only 
112e0 64 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64  database iDb and
112f0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
11300 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  se are made writ
11310 61 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c  able by this cal
11320 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c  l..** If iDb==0,
11330 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61   then the main a
11340 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  nd temp database
11350 73 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  s are made writa
11360 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62  ble.   If.** iDb
11370 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  ==1 then only th
11380 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
11390 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
113a0 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e  .  If iDb>1 then
113b0 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65   the.** specifie
113c0 64 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  d auxiliary data
113d0 62 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d  base and the tem
113e0 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d  p database are m
113f0 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ade writable..*/
11400 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
11410 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
11420 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11430 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
11440 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
11450 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
11460 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
11470 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
11480 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
11490 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
114a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
114b0 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
114c0 74 69 6f 6e 2c 20 69 44 62 2c 20 31 29 3b 0a 20  tion, iDb, 1);. 
114d0 20 69 66 28 20 69 44 62 21 3d 31 20 26 26 20 28   if( iDb!=1 && (
114e0 69 44 62 3e 36 33 20 7c 7c 20 21 28 70 50 61 72  iDb>63 || !(pPar
114f0 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26  se->cookieMask &
11500 20 28 28 75 36 34 29 31 3c 3c 69 44 62 29 29 29   ((u64)1<<iDb)))
11510 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11520 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56  dbeAddOp(v, OP_V
11530 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62  erifyCookie, iDb
11540 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73  , db->aDb[iDb].s
11550 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b 0a 20  chema_cookie);. 
11560 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
11570 65 4d 61 73 6b 20 7c 3d 20 28 28 75 36 34 29 31  eMask |= ((u64)1
11580 3c 3c 69 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66  <<iDb);.  }.  if
11590 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 29  ( setStatement )
115a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
115b0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61  eAddOp(v, OP_Sta
115c0 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b  tement, iDb, 0);
115d0 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 21 3d  .  }.  if( iDb!=
115e0 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
115f0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
11600 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53  ion(pParse, setS
11610 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20  tatement, 1);.  
11620 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
11630 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f  ate code that co
11640 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61  ncludes an opera
11650 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61  tion that may ha
11660 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68  ve changed.** th
11670 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
11680 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
11690 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
116a0 74 65 64 2c 20 74 68 65 6e 20 65 6d 69 74 0a 2a  ted, then emit.*
116b0 2a 20 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74 20 74  * an OP_Commit t
116c0 68 61 74 20 77 69 6c 6c 20 63 61 75 73 65 20 74  hat will cause t
116d0 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 62 65  he changes to be
116e0 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
116f0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  sk..**.** Note t
11700 68 61 74 20 63 68 65 63 6b 70 6f 69 6e 74 73 20  hat checkpoints 
11710 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
11720 79 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 20 74  y committed at t
11730 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 73  he end of.** a s
11740 74 61 74 65 6d 65 6e 74 2e 20 20 4e 6f 74 65 20  tatement.  Note 
11750 61 6c 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  also that there 
11760 63 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65 20  can be multiple 
11770 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c  calls to .** sql
11780 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
11790 65 72 61 74 69 6f 6e 28 29 20 62 75 74 20 74 68  eration() but th
117a0 65 72 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ere should only 
117b0 62 65 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 63  be a single.** c
117c0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 6e  all to sqlite3En
117d0 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
117e0 29 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  ) at the conclus
117f0 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
11800 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
11810 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65  lite3EndWriteOpe
11820 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
11830 61 72 73 65 29 7b 0a 20 20 2f 2a 20 44 65 6c 65  arse){.  /* Dele
11840 74 65 20 6d 65 21 20 2a 2f 0a 20 20 72 65 74 75  te me! */.  retu
11850 72 6e 3b 0a 7d 0a                                rn;.}.