/ Hex Artifact Content
Login

Artifact 90fc1b15d5e69316ffb979a11052ba6743e9b556:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 20 20    ROLLBACK.**   
02d0: 20 20 50 52 41 47 4d 41 0a 2a 2a 0a 2a 2a 20 24    PRAGMA.**.** $
02e0: 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20 31 2e  Id: build.c,v 1.
02f0: 31 34 38 20 32 30 30 33 2f 30 34 2f 32 31 20 31  148 2003/04/21 1
0300: 38 3a 34 38 3a 34 36 20 64 72 68 20 45 78 70 20  8:48:46 drh Exp 
0310: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
0320: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0330: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a  lude <ctype.h>..
0340: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0350: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
0360: 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74 61 74  n a new SQL stat
0370: 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e 6e 69  ement is beginni
0380: 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61 72 73  ng to.** be pars
0390: 65 64 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  ed.  Check to se
03a0: 65 20 69 66 20 74 68 65 20 73 63 68 65 6d 61 20  e if the schema 
03b0: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
03c0: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
03d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 53 51  read from the SQ
03e0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 61 6e 64 20  LITE_MASTER and 
03f0: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54  SQLITE_TEMP_MAST
0400: 45 52 20 74 61 62 6c 65 73 2e 0a 2a 2a 20 49 66  ER tables..** If
0410: 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 72   it does, then r
0420: 65 61 64 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ead it..*/.void 
0430: 73 71 6c 69 74 65 42 65 67 69 6e 50 61 72 73 65  sqliteBeginParse
0440: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0450: 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29  int explainFlag)
0460: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  {.  sqlite *db =
0470: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
0480: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0490: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
04a0: 69 66 28 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  if((db->flags & 
04b0: 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a  SQLITE_Initializ
04c0: 65 64 29 3d 3d 30 20 26 26 20 70 50 61 72 73 65  ed)==0 && pParse
04d0: 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29 7b  ->initFlag==0 ){
04e0: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
04f0: 6c 69 74 65 49 6e 69 74 28 64 62 2c 20 26 70 50  liteInit(db, &pP
0500: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  arse->zErrMsg);.
0510: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
0520: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
0530: 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
0540: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
0550: 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rr++;.    }.  }.
0560: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
0570: 20 61 20 66 61 6b 65 20 63 61 6c 6c 62 61 63 6b   a fake callback
0580: 20 70 72 6f 63 65 64 75 72 65 20 75 73 65 64 20   procedure used 
0590: 77 68 65 6e 20 73 71 6c 69 74 65 5f 65 78 65 63  when sqlite_exec
05a0: 28 29 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  () is.** invoked
05b0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 61 6c   with a NULL cal
05c0: 6c 62 61 63 6b 20 70 6f 69 6e 74 65 72 2e 20 20  lback pointer.  
05d0: 49 66 20 77 65 20 70 61 73 73 20 61 20 4e 55 4c  If we pass a NUL
05e0: 4c 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 70 6f  L callback.** po
05f0: 69 6e 74 65 72 20 69 6e 74 6f 20 73 71 6c 69 74  inter into sqlit
0600: 65 56 64 62 65 45 78 65 63 28 29 20 69 74 20 77  eVdbeExec() it w
0610: 69 6c 6c 20 72 65 74 75 72 6e 20 61 74 20 65 76  ill return at ev
0620: 65 72 79 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  ery OP_Callback,
0630: 0a 2a 2a 20 77 68 69 63 68 20 77 65 20 64 6f 20  .** which we do 
0640: 6e 6f 74 20 77 61 6e 74 20 69 74 20 74 6f 20 64  not want it to d
0650: 6f 2e 20 20 53 6f 20 77 65 20 73 75 62 73 74 69  o.  So we substi
0660: 74 75 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  tute a pointer t
0670: 6f 20 74 68 69 73 0a 2a 2a 20 70 72 6f 63 65 64  o this.** proced
0680: 75 72 65 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ure in place of 
0690: 74 68 65 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  the NULL..*/.sta
06a0: 74 69 63 20 69 6e 74 20 66 61 6b 65 43 61 6c 6c  tic int fakeCall
06b0: 62 61 63 6b 28 76 6f 69 64 20 2a 4e 6f 74 55 73  back(void *NotUs
06c0: 65 64 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20  ed, int n, char 
06d0: 2a 2a 61 7a 31 2c 20 63 68 61 72 20 2a 2a 61 7a  **az1, char **az
06e0: 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  2){.  return 0;.
06f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
0700: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
0710: 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53  after a single S
0720: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  QL statement has
0730: 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20   been.** parsed 
0740: 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 20 65  and we want to e
0750: 78 65 63 75 74 65 20 74 68 65 20 56 44 42 45 20  xecute the VDBE 
0760: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
0770: 74 20 0a 2a 2a 20 74 68 61 74 20 73 74 61 74 65  t .** that state
0780: 6d 65 6e 74 2e 20 20 50 72 69 6f 72 20 61 63 74  ment.  Prior act
0790: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 73 68 6f  ion routines sho
07a0: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
07b0: 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20  .** constructed 
07c0: 56 44 42 45 20 63 6f 64 65 20 74 6f 20 64 6f 20  VDBE code to do 
07d0: 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 65 20  the work of the 
07e0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
07f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
0800: 75 73 74 20 68 61 73 20 74 6f 20 65 78 65 63 75  ust has to execu
0810: 74 65 20 74 68 65 20 56 44 42 45 20 63 6f 64 65  te the VDBE code
0820: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
0830: 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  t if an error oc
0840: 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74  curred, it might
0850: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
0860: 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64  t.** no VDBE cod
0870: 65 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e  e was generated.
0880: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45  .*/.void sqliteE
0890: 78 65 63 28 50 61 72 73 65 20 2a 70 50 61 72 73  xec(Parse *pPars
08a0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
08b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
08c0: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
08d0: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
08e0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
08f0: 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63    int (*xCallbac
0900: 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61  k)(void*,int,cha
0910: 72 2a 2a 2c 63 68 61 72 2a 2a 29 3b 0a 0a 20 20  r**,char**);..  
0920: 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  if( sqlite_mallo
0930: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
0940: 6e 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b 20 3d  n;.  xCallback =
0950: 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61   pParse->xCallba
0960: 63 6b 3b 0a 20 20 69 66 28 20 78 43 61 6c 6c 62  ck;.  if( xCallb
0970: 61 63 6b 3d 3d 30 20 26 26 20 70 50 61 72 73 65  ack==0 && pParse
0980: 2d 3e 75 73 65 43 61 6c 6c 62 61 63 6b 20 29 20  ->useCallback ) 
0990: 78 43 61 6c 6c 62 61 63 6b 20 3d 20 66 61 6b 65  xCallback = fake
09a0: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 69 66 28 20  Callback;.  if( 
09b0: 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  v && pParse->nEr
09c0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45  r==0 ){.    FILE
09d0: 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66   *trace = (db->f
09e0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
09f0: 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74  beTrace)!=0 ? st
0a00: 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71  dout : 0;.    sq
0a10: 6c 69 74 65 56 64 62 65 54 72 61 63 65 28 76 2c  liteVdbeTrace(v,
0a20: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c   trace);.    sql
0a30: 69 74 65 56 64 62 65 4d 61 6b 65 52 65 61 64 79  iteVdbeMakeReady
0a40: 28 76 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70  (v, xCallback, p
0a50: 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 70 50 61  Parse->pArg, pPa
0a60: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20  rse->explain);. 
0a70: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 75     if( pParse->u
0a80: 73 65 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  seCallback ){.  
0a90: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
0aa0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  explain ){.     
0ab0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 56 64     rc = sqliteVd
0ac0: 62 65 4c 69 73 74 28 76 29 3b 0a 20 20 20 20 20  beList(v);.     
0ad0: 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b     db->next_cook
0ae0: 69 65 20 3d 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  ie = db->aDb[0].
0af0: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20  schema_cookie;. 
0b00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0b10: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 45 78      sqliteVdbeEx
0b20: 65 63 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ec(v);.      }. 
0b30: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
0b40: 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 76 2c 20  VdbeFinalize(v, 
0b50: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
0b60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
0b70: 29 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b  ) pParse->nErr++
0b80: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
0b90: 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20 20 20  pVdbe = 0;.     
0ba0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
0bb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
0bc0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
0bd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
0be0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 70    pParse->rc = p
0bf0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 3f 20 53 51  Parse->nErr ? SQ
0c00: 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c  LITE_ERROR : SQL
0c10: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
0c20: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e      pParse->colN
0c30: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 20  amesSet = 0;.   
0c40: 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56   pParse->schemaV
0c50: 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20 20 7d  erified = 0;.  }
0c60: 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
0c70: 3e 75 73 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 20  >useCallback==0 
0c80: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  ){.    pParse->r
0c90: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
0ca0: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
0cb0: 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72  nTab = 0;.  pPar
0cc0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20  se->nMem = 0;.  
0cd0: 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30  pParse->nSet = 0
0ce0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67  ;.  pParse->nAgg
0cf0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
0d00: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
0d10: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
0d20: 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a  at describes .**
0d30: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
0d40: 74 61 62 61 73 65 20 74 61 62 6c 65 20 67 69 76  tabase table giv
0d50: 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  en the name.** o
0d60: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
0d70: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
0d80: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
0d90: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 74 61 69  tabase.** contai
0da0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
0db0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
0dc0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
0dd0: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
0de0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a  LocateTable()..*
0df0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 46  /.Table *sqliteF
0e00: 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 20  indTable(sqlite 
0e10: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
0e20: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
0e30: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
0e40: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
0e50: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
0e60: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
0e70: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
0e80: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
0e90: 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  ;   /* Search TE
0ea0: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
0eb0: 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62  /.    if( zDatab
0ec0: 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65  ase!=0 && sqlite
0ed0: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
0ee0: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  e, db->aDb[j].zN
0ef0: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
0f00: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48  .    p = sqliteH
0f10: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
0f20: 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  [j].tblHash, zNa
0f30: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
0f40: 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20  )+1);.    if( p 
0f50: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
0f60: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
0f70: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
0f80: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
0f90: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
0fa0: 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72  .** a particular
0fb0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
0fc0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a  given the name.*
0fd0: 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  * of that table 
0fe0: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
0ff0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1000: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
1010: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
1020: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
1030: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
1040: 0a 2a 2a 20 49 66 20 70 50 61 72 73 65 2d 3e 75  .** If pParse->u
1050: 73 65 44 62 20 69 73 20 6e 6f 74 20 6e 65 67 61  seDb is not nega
1060: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 74  tive, then the t
1070: 61 62 6c 65 20 6d 75 73 74 20 62 65 0a 2a 2a 20  able must be.** 
1080: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 61 74 20  located in that 
1090: 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 61 20  database.  If a 
10a0: 64 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61  different databa
10b0: 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  se is specified,
10c0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  .** an error mes
10d0: 73 61 67 65 20 69 73 20 67 65 6e 65 72 61 74 65  sage is generate
10e0: 64 20 69 6e 74 6f 20 70 50 61 72 73 65 2d 3e 7a  d into pParse->z
10f0: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 54 61 62 6c 65  ErrMsg..*/.Table
1100: 20 2a 73 71 6c 69 74 65 4c 6f 63 61 74 65 54 61   *sqliteLocateTa
1110: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1120: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1130: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
1140: 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 73 71 6c   *zDbase){.  sql
1150: 69 74 65 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  ite *db;.  const
1160: 20 63 68 61 72 20 2a 7a 55 73 65 3b 0a 20 20 54   char *zUse;.  T
1170: 61 62 6c 65 20 2a 70 3b 0a 20 20 64 62 20 3d 20  able *p;.  db = 
1180: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1190: 28 20 70 50 61 72 73 65 2d 3e 75 73 65 44 62 3c  ( pParse->useDb<
11a0: 30 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  0 ){.    p = sql
11b0: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
11c0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b   zName, zDbase);
11d0: 0a 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 61  .  }else {.    a
11e0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 75  ssert( pParse->u
11f0: 73 65 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  seDb<db->nDb );.
1200: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1210: 61 44 62 5b 70 50 61 72 73 65 2d 3e 75 73 65 44  aDb[pParse->useD
1220: 62 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20 20  b].pBt!=0 );.   
1230: 20 7a 55 73 65 20 3d 20 64 62 2d 3e 61 44 62 5b   zUse = db->aDb[
1240: 70 50 61 72 73 65 2d 3e 75 73 65 44 62 5d 2e 7a  pParse->useDb].z
1250: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 7a 44  Name;.    if( zD
1260: 62 61 73 65 20 26 26 20 70 50 61 72 73 65 2d 3e  base && pParse->
1270: 75 73 65 44 62 21 3d 31 20 26 26 20 73 71 6c 69  useDb!=1 && sqli
1280: 74 65 53 74 72 49 43 6d 70 28 7a 44 62 61 73 65  teStrICmp(zDbase
1290: 2c 20 7a 55 73 65 29 21 3d 30 20 29 7b 0a 20 20  , zUse)!=0 ){.  
12a0: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
12b0: 73 67 28 70 50 61 72 73 65 2c 22 63 61 6e 6e 6f  sg(pParse,"canno
12c0: 74 20 75 73 65 20 64 61 74 61 62 61 73 65 20 25  t use database %
12d0: 73 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78  s in this contex
12e0: 74 22 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 20  t", zDbase);.   
12f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1300: 20 7d 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74   }.    p = sqlit
1310: 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
1320: 4e 61 6d 65 2c 20 7a 55 73 65 29 3b 0a 20 20 20  Name, zUse);.   
1330: 20 69 66 28 20 70 3d 3d 30 20 26 26 20 70 50 61   if( p==0 && pPa
1340: 72 73 65 2d 3e 75 73 65 44 62 3d 3d 31 20 26 26  rse->useDb==1 &&
1350: 20 7a 44 62 61 73 65 3d 3d 30 20 29 7b 0a 20 20   zDbase==0 ){.  
1360: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 46 69      p = sqliteFi
1370: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
1380: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
1390: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
13a0: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
13b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72  .      sqliteErr
13c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
13d0: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
13e0: 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e  .%s", zDbase, zN
13f0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
1400: 69 66 28 20 28 70 50 61 72 73 65 2d 3e 75 73 65  if( (pParse->use
1410: 44 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  Db==0 || pParse-
1420: 3e 75 73 65 44 62 3e 3d 32 29 20 0a 20 20 20 20  >useDb>=2) .    
1430: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
1440: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62  liteFindTable(db
1450: 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29  , zName, 0)!=0 )
1460: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 72  {.      sqliteEr
1470: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1480: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 69 73 20  table \"%s\" is 
1490: 6e 6f 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  not in database 
14a0: 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
14b0: 20 20 7a 4e 61 6d 65 2c 20 7a 55 73 65 29 3b 0a    zName, zUse);.
14c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14d0: 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
14e0: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
14f0: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61   table: %s", zNa
1500: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
1510: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1520: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
1530: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
1540: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
1550: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
1560: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
1570: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
1580: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
1590: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
15a0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
15b0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
15c0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
15d0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49   not found..*/.I
15e0: 6e 64 65 78 20 2a 73 71 6c 69 74 65 46 69 6e 64  ndex *sqliteFind
15f0: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
1600: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1610: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
1620: 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  *zDb){.  Index *
1630: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
1640: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
1650: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1660: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
1670: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
1680: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
1690: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
16a0: 7a 44 62 20 26 26 20 73 71 6c 69 74 65 53 74 72  zDb && sqliteStr
16b0: 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44  ICmp(zDb, db->aD
16c0: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
16d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20  ntinue;.    p = 
16e0: 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26  sqliteHashFind(&
16f0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78 48 61  db->aDb[j].idxHa
1700: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  sh, zName, strle
1710: 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  n(zName)+1);.   
1720: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
1730: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
1740: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
1750: 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20  the given index 
1760: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68  from the index h
1770: 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66  ash table, and f
1780: 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72  ree.** its memor
1790: 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a  y structures..**
17a0: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73  .** The index is
17b0: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
17c0: 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68 20  e database hash 
17d0: 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74  tables but.** it
17e0: 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64   is not unlinked
17f0: 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20   from the Table 
1800: 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e  that it indexes.
1810: 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72  .** Unlinking fr
1820: 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73  om the Table mus
1830: 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65  t be done by the
1840: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1850: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1860: 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e  d sqliteDeleteIn
1870: 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  dex(sqlite *db, 
1880: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64  Index *p){.  Ind
1890: 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61 73 73  ex *pOld;..  ass
18a0: 65 72 74 28 20 64 62 21 3d 30 20 26 26 20 70 2d  ert( db!=0 && p-
18b0: 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  >zName!=0 );.  p
18c0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Old = sqliteHash
18d0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
18e0: 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c  p->iDb].idxHash,
18f0: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1910: 20 20 20 20 20 73 74 72 6c 65 6e 28 70 2d 3e 7a       strlen(p->z
1920: 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69  Name)+1, 0);.  i
1930: 66 28 20 70 4f 6c 64 21 3d 30 20 26 26 20 70 4f  f( pOld!=0 && pO
1940: 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20 73 71 6c  ld!=p ){.    sql
1950: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
1960: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69  b->aDb[p->iDb].i
1970: 64 78 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e  dxHash, pOld->zN
1980: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
1990: 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e            strlen
19a0: 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  (pOld->zName)+1,
19b0: 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20 73 71   pOld);.  }.  sq
19c0: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a  liteFree(p);.}..
19d0: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
19e0: 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f   given index fro
19f0: 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65  m its table, the
1a00: 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68 65 20  n remove.** the 
1a10: 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69  index from the i
1a20: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
1a30: 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d 65 6d  and free its mem
1a40: 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ory.** structure
1a50: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1a60: 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  eUnlinkAndDelete
1a70: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
1a80: 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
1a90: 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  {.  if( pIndex->
1aa0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d  pTable->pIndex==
1ab0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 70 49  pIndex ){.    pI
1ac0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
1ad0: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
1ae0: 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
1af0: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
1b00: 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70   for(p=pIndex->p
1b10: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
1b20: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
1b30: 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  ndex; p=p->pNext
1b40: 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 20 26 26  ){}.    if( p &&
1b50: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
1b60: 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e  x ){.      p->pN
1b70: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
1b80: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ext;.    }.  }. 
1b90: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
1ba0: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
1bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
1bc0: 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ll schema inform
1bd0: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69  ation from the i
1be0: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
1bf0: 62 6c 65 73 20 6f 66 0a 2a 2a 20 64 61 74 61 62  bles of.** datab
1c00: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
1c10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1c20: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61   called to recla
1c30: 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66  im memory.** bef
1c40: 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ore the connecti
1c50: 6f 6e 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69  on closes.  It i
1c60: 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75  s also called du
1c70: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ring a rollback.
1c80: 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72 65  ** if there were
1c90: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
1ca0: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
1cb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
1cc0: 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73   iDb<=0 then res
1cd0: 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  et the internal 
1ce0: 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f  schema tables fo
1cf0: 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
1d00: 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62  * files.  If iDb
1d10: 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74 20 74  >=2 then reset t
1d20: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
1d30: 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a  ma for only the.
1d40: 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69  ** single file i
1d50: 6e 64 69 63 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69  ndicates..*/.voi
1d60: 64 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74  d sqliteResetInt
1d70: 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69  ernalSchema(sqli
1d80: 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  te *db, int iDb)
1d90: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45  {.  HashElem *pE
1da0: 6c 65 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70  lem;.  Hash temp
1db0: 31 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b  1;.  Hash temp2;
1dc0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20  .  int i, j;..  
1dd0: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
1de0: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
1df0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
1e00: 7e 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69  ~SQLITE_Initiali
1e10: 7a 65 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62  zed;.  for(i=iDb
1e20: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
1e30: 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  ){.    Db *pDb =
1e40: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
1e50: 20 20 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e 74    temp1 = pDb->t
1e60: 62 6c 48 61 73 68 3b 0a 20 20 20 20 74 65 6d 70  blHash;.    temp
1e70: 32 20 3d 20 70 44 62 2d 3e 74 72 69 67 48 61 73  2 = pDb->trigHas
1e80: 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73  h;.    sqliteHas
1e90: 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 72 69 67  hInit(&pDb->trig
1ea0: 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53  Hash, SQLITE_HAS
1eb0: 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20  H_STRING, 0);.  
1ec0: 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61    sqliteHashClea
1ed0: 72 28 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a  r(&pDb->aFKey);.
1ee0: 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c      sqliteHashCl
1ef0: 65 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61 73  ear(&pDb->idxHas
1f00: 68 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65  h);.    for(pEle
1f10: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
1f20: 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d  t(&temp2); pElem
1f30: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
1f40: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
1f50: 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 70        Trigger *p
1f60: 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
1f70: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
1f80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c  .      sqliteDel
1f90: 65 74 65 54 72 69 67 67 65 72 28 70 54 72 69 67  eteTrigger(pTrig
1fa0: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
1fb0: 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28  sqliteHashClear(
1fc0: 26 74 65 6d 70 32 29 3b 0a 20 20 20 20 73 71 6c  &temp2);.    sql
1fd0: 69 74 65 48 61 73 68 49 6e 69 74 28 26 70 44 62  iteHashInit(&pDb
1fe0: 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54  ->tblHash, SQLIT
1ff0: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
2000: 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  );.    for(pElem
2010: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
2020: 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b  (&temp1); pElem;
2030: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2040: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
2050: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
2060: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
2070: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
2080: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
2090: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
20a0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73   }.    sqliteHas
20b0: 68 43 6c 65 61 72 28 26 74 65 6d 70 31 29 3b 0a  hClear(&temp1);.
20c0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 66      db->aDb[i].f
20d0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
20e0: 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 20  Initialized;.   
20f0: 20 69 66 28 20 69 44 62 3e 30 20 29 20 72 65 74   if( iDb>0 ) ret
2100: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
2110: 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64  t( iDb==0 );.  d
2120: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
2130: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
2140: 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  s;..  /* If one 
2150: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61  or more of the a
2160: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
2170: 65 20 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e  e files has been
2180: 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68   closed,.  ** th
2190: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e 20 66  en remove then f
21a0: 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72  rom the auxiliar
21b0: 79 20 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e  y database list.
21c0: 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20    We take the.  
21d0: 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  ** opportunity t
21e0: 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65 20 73  o do this here s
21f0: 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75 73  ince we have jus
2200: 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66  t deleted all of
2210: 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61   the.  ** schema
2220: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
2230: 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f   therefore do no
2240: 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61  t have to make a
2250: 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  ny changes.  ** 
2260: 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20  to any of those 
2270: 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
2280: 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e  or(i=j=2; i<db->
2290: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
22a0: 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  f( db->aDb[i].pB
22b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
22c0: 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62  liteFree(db->aDb
22d0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
22e0: 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61    db->aDb[i].zNa
22f0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  me = 0;.      co
2300: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
2310: 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20    if( j<i ){.   
2320: 20 20 20 64 62 2d 3e 61 44 62 5b 6a 2b 2b 5d 20     db->aDb[j++] 
2330: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20  = db->aDb[i];.  
2340: 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74    }.  }.  memset
2350: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c  (&db->aDb[j], 0,
2360: 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a   (db->nDb-j)*siz
2370: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29  eof(db->aDb[j]))
2380: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  ;.  db->nDb = j;
2390: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
23a0: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
23b0: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
23c0: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
23d0: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
23e0: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
23f0: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
2400: 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29  iteFree(db->aDb)
2410: 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20  ;.    db->aDb = 
2420: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20  db->aDbStatic;. 
2430: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2440: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2450: 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  ed whenever a ro
2460: 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20  llback occurs.  
2470: 49 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a  If there were.**
2480: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
2490: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
24a0: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20  action, then we 
24b0: 68 61 76 65 20 74 6f 20 72 65 73 65 74 20 74 68  have to reset th
24c0: 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61  e.** internal ha
24d0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65  sh tables and re
24e0: 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64  load them from d
24f0: 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  isk..*/.void sql
2500: 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72  iteRollbackInter
2510: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
2520: 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  e *db){.  if( db
2530: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2540: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
2550: 7b 0a 20 20 20 20 73 71 6c 69 74 65 52 65 73 65  {.    sqliteRese
2560: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
2570: 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, 0);.  }.}../
2580: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2590: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
25a0: 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73   a commit occurs
25b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25c0: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
25d0: 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62  anges(sqlite *db
25e0: 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  ){.  db->aDb[0].
25f0: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20  schema_cookie = 
2600: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3b  db->next_cookie;
2610: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
2620: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
2630: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
2640: 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72  Remove the memor
2650: 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  y data structure
2660: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2670: 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54  h the given.** T
2680: 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65  able.  No change
2690: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69  s are made to di
26a0: 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  sk by this routi
26b0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
26c0: 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65  outine just dele
26d0: 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72  tes the data str
26e0: 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73  ucture.  It does
26f0: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74   not unlink.** t
2700: 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74  he table data st
2710: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
2720: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f   hash table.  No
2730: 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65  r does it remove
2740: 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  .** foreign keys
2750: 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
2760: 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  .aFKey hash tabl
2770: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
2780: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
2790: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
27a0: 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  the indices and 
27b0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
27c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a  ociated with .**
27d0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
27e0: 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * Indices associ
27f0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
2800: 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64  ble are unlinked
2810: 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a   from the "db".*
2820: 2a 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  * data structure
2830: 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49   if db!=NULL.  I
2840: 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69  f db==NULL, indi
2850: 63 65 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a  ces attached to.
2860: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  ** the table are
2870: 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74   deleted, but it
2880: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 65 79   is assumed they
2890: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
28a0: 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a  en.** unlinked..
28b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 65  */.void sqliteDe
28c0: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
28d0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
28e0: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
28f0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
2900: 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a  *pNext;.  FKey *
2910: 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65  pFKey, *pNextFKe
2920: 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65  y;..  if( pTable
2930: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
2940: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69   /* Delete all i
2950: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
2960: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
2970: 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  e.  */.  for(pIn
2980: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
2990: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
29a0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
29b0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
29c0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
29d0: 72 74 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d  rt( pIndex->iDb=
29e0: 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20  =pTable->iDb || 
29f0: 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20  (pTable->iDb==0 
2a00: 26 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d  && pIndex->iDb==
2a10: 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  1) );.    sqlite
2a20: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
2a30: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  pIndex);.  }..  
2a40: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f  /* Delete all fo
2a50: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
2a60: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
2a70: 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73  table.  The keys
2a80: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
2a90: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75  e already been u
2aa0: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
2ab0: 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20   db->aFKey hash 
2ac0: 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f  table .  */.  fo
2ad0: 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e  r(pFKey=pTable->
2ae0: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46  pFKey; pFKey; pF
2af0: 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a  Key=pNextFKey){.
2b00: 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20      pNextFKey = 
2b10: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
2b20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
2b30: 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44  able->iDb<db->nD
2b40: 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
2b50: 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28   sqliteHashFind(
2b60: 26 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d  &db->aDb[pTable-
2b70: 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20  >iDb].aFKey,.   
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a          pFKey->z
2ba0: 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  To, strlen(pFKey
2bb0: 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79  ->zTo)+1)!=pFKey
2bc0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   );.    sqliteFr
2bd0: 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a  ee(pFKey);.  }..
2be0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
2bf0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
2c00: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 66  itself..  */.  f
2c10: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
2c20: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
2c30: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
2c40: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ble->aCol[i].zNa
2c50: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
2c60: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
2c70: 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  [i].zDflt);.    
2c80: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
2c90: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  e->aCol[i].zType
2ca0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
2cb0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  ree(pTable->zNam
2cc0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
2cd0: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a  (pTable->aCol);.
2ce0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
2cf0: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
2d00: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  lect);.  sqliteF
2d10: 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  ree(pTable);.}..
2d20: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
2d30: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f   given table fro
2d40: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
2d50: 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65  s and the delete
2d60: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74   the.** table st
2d70: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c  ructure with all
2d80: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
2d90: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a   foreign keys..*
2da0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2db0: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
2dc0: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20  eteTable(sqlite 
2dd0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a  *db, Table *p){.
2de0: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
2df0: 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32   FKey *pF1, *pF2
2e00: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 69  ;.  int i = p->i
2e10: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  Db;.  assert( db
2e20: 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  !=0 );.  pOld = 
2e30: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
2e40: 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74 62 6c  (&db->aDb[i].tbl
2e50: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
2e60: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29  strlen(p->zName)
2e70: 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  +1, 0);.  assert
2e80: 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c  ( pOld==0 || pOl
2e90: 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72 28 70 46  d==p );.  for(pF
2ea0: 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b  1=p->pFKey; pF1;
2eb0: 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46   pF1=pF1->pNextF
2ec0: 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54  rom){.    int nT
2ed0: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e  o = strlen(pF1->
2ee0: 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 70 46  zTo) + 1;.    pF
2ef0: 32 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69  2 = sqliteHashFi
2f00: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 61  nd(&db->aDb[i].a
2f10: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
2f20: 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 46  nTo);.    if( pF
2f30: 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20 20  2==pF1 ){.      
2f40: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
2f50: 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 61 46 4b  (&db->aDb[i].aFK
2f60: 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54  ey, pF1->zTo, nT
2f70: 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29  o, pF1->pNextTo)
2f80: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f90: 20 20 20 77 68 69 6c 65 28 20 70 46 32 20 26 26     while( pF2 &&
2fa0: 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70   pF2->pNextTo!=p
2fb0: 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70  F1 ){ pF2=pF2->p
2fc0: 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20  NextTo; }.      
2fd0: 69 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20  if( pF2 ){.     
2fe0: 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20     pF2->pNextTo 
2ff0: 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a  = pF1->pNextTo;.
3000: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3010: 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65  }.  sqliteDelete
3020: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  Table(db, p);.}.
3030: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
3040: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 75   the name of a u
3050: 73 65 72 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ser table or ind
3060: 65 78 20 66 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e  ex from a token.
3070: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
3080: 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 69 73  hold the name is
3090: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
30a0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
30b0: 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72 65  d must.** be fre
30c0: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
30d0: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  g function..*/.c
30e0: 68 61 72 20 2a 73 71 6c 69 74 65 54 61 62 6c 65  har *sqliteTable
30f0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f  NameFromToken(To
3100: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
3110: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c  har *zName = sql
3120: 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65  iteStrNDup(pName
3130: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
3140: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
3150: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
3160: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
3170: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
3180: 6f 20 6f 70 65 6e 20 74 68 65 20 61 70 70 72 6f  o open the appro
3190: 70 72 69 61 74 65 20 6d 61 73 74 65 72 20 74 61  priate master ta
31a0: 62 6c 65 2e 20 20 54 68 65 20 74 61 62 6c 65 0a  ble.  The table.
31b0: 2a 2a 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ** opened will b
31c0: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
31d0: 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 74  for persistent t
31e0: 61 62 6c 65 73 20 61 6e 64 20 0a 2a 2a 20 53 51  ables and .** SQ
31f0: 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52  LITE_TEMP_MASTER
3200: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74   for temporary t
3210: 61 62 6c 65 73 2e 20 20 54 68 65 20 74 61 62 6c  ables.  The tabl
3220: 65 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  e is opened.** o
3230: 6e 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76  n cursor 0..*/.v
3240: 6f 69 64 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61  oid sqliteOpenMa
3250: 73 74 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a  sterTable(Vdbe *
3260: 76 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a  v, int isTemp){.
3270: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3280: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
3290: 20 69 73 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73   isTemp, 0);.  s
32a0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
32b0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
32c0: 30 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 2);.}../*.** 
32d0: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
32e0: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
32f0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
3300: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
3310: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
3320: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
3330: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
3340: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
3350: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
3360: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
3370: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
3380: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
3390: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
33a0: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
33b0: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
33c0: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
33d0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
33e0: 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65  e.** pStart toke
33f0: 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20  n is the CREATE 
3400: 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65  and pName is the
3410: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
3420: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
3430: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
3440: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
3450: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
3460: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
3470: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
3480: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
3490: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
34a0: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
34b0: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
34c0: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
34d0: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
34e0: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
34f0: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
3500: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
3510: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
3520: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
3530: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
3540: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
3550: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
3560: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
3570: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
3580: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
3590: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
35a0: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
35b0: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
35c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
35d0: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
35e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
35f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
3600: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
3610: 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20 72 6f  iteEndTable() ro
3620: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
3630: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
3640: 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  he construction 
3650: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
3660: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64   record..*/.void
3670: 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c   sqliteStartTabl
3680: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
3690: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
36a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
36b0: 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a  en *pStart,   /*
36c0: 20 54 68 65 20 22 43 52 45 41 54 45 22 20 74 6f   The "CREATE" to
36d0: 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ken */.  Token *
36e0: 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d  pName,    /* Nam
36f0: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 76 69  e of table or vi
3700: 65 77 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ew to create */.
3710: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
3720: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
3730: 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62  is is a TEMP tab
3740: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  le */.  int isVi
3750: 65 77 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ew       /* True
3760: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
3770: 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  EW */.){.  Table
3780: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65   *pTable;.  Inde
3790: 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20  x *pIdx;.  char 
37a0: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  *zName;.  sqlite
37b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
37c0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
37d0: 69 6e 74 20 69 44 62 3b 0a 0a 20 20 70 50 61 72  int iDb;..  pPar
37e0: 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 20  se->sFirstToken 
37f0: 3d 20 2a 70 53 74 61 72 74 3b 0a 20 20 7a 4e 61  = *pStart;.  zNa
3800: 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  me = sqliteTable
3810: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
3820: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
3830: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
3840: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 44 62   if( pParse->iDb
3850: 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31  ==1 ) isTemp = 1
3860: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3870: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
3880: 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69  ION.  assert( (i
3890: 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65  sTemp & 1)==isTe
38a0: 6d 70 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  mp );.  if( sqli
38b0: 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
38c0: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
38d0: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
38e0: 69 73 54 65 6d 70 29 2c 20 30 29 20 29 7b 0a 20  isTemp), 0) ){. 
38f0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
3900: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
3910: 3b 0a 20 20 7d 0a 20 20 7b 0a 20 20 20 20 69 6e  ;.  }.  {.    in
3920: 74 20 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  t code;.    if( 
3930: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
3940: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
3950: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
3960: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
3970: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
3980: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
3990: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
39a0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
39b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
39c0: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
39d0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
39e0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
39f0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
3a00: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
3a10: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
3a20: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
3a30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
3a40: 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
3a50: 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65  rse, code, zName
3a60: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  , 0) ){.      sq
3a70: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
3a80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
3a90: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
3aa0: 20 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74   ..  /* Before t
3ab0: 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65 20  rying to create 
3ac0: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
3ad0: 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  e, make sure the
3ae0: 20 42 74 72 65 65 20 66 6f 72 0a 20 20 2a 2a 20   Btree for.  ** 
3af0: 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61 72  holding temporar
3b00: 79 20 74 61 62 6c 65 73 20 69 73 20 6f 70 65 6e  y tables is open
3b10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54  ..  */.  if( isT
3b20: 65 6d 70 20 26 26 20 64 62 2d 3e 61 44 62 5b 31  emp && db->aDb[1
3b30: 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61  ].pBt==0 && !pPa
3b40: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
3b50: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
3b60: 69 74 65 42 74 72 65 65 46 61 63 74 6f 72 79 28  iteBtreeFactory(
3b70: 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41  db, 0, 0, MAX_PA
3b80: 47 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d  GES, &db->aDb[1]
3b90: 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72  .pBt);.    if( r
3ba0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
3bb0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
3bc0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
3bd0: 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20  ErrMsg, "unable 
3be0: 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
3bf0: 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
3c00: 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
3c10: 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
3c20: 72 79 20 74 61 62 6c 65 73 22 2c 20 30 29 3b 0a  ry tables", 0);.
3c30: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
3c40: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  rr++;.      retu
3c50: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
3c60: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
3c70: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a  LITE_InTrans ){.
3c80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
3c90: 65 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  eBtreeBeginTrans
3ca0: 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29  (db->aDb[1].pBt)
3cb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
3cc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3cd0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
3ce0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
3cf0: 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20  ErrMsg, "unable 
3d00: 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c  to get a write l
3d10: 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20  ock on ".       
3d20: 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72     "the temporar
3d30: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22  y database file"
3d40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
3d50: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
3d60: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
3d70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3d80: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
3d90: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
3da0: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
3db0: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
3dc0: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
3dd0: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  or table name.  
3de0: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
3df0: 65 73 73 61 67 65 20 69 66 20 69 74 20 64 6f 65  essage if it doe
3e00: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  s..  **.  ** If 
3e10: 77 65 20 61 72 65 20 72 65 2d 72 65 61 64 69 6e  we are re-readin
3e20: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
3e30: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
3e40: 65 20 6f 66 20 61 20 73 63 68 65 6d 61 0a 20 20  e of a schema.  
3e50: 2a 2a 20 63 68 61 6e 67 65 20 61 6e 64 20 61 20  ** change and a 
3e60: 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61  new permanent ta
3e70: 62 6c 65 20 69 73 20 66 6f 75 6e 64 20 77 68 6f  ble is found who
3e80: 73 65 20 6e 61 6d 65 20 63 6f 6c 6c 69 64 65 73  se name collides
3e90: 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 78   with.  ** an ex
3ea0: 69 73 74 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  isting temporary
3eb0: 20 74 61 62 6c 65 2c 20 74 68 61 74 20 69 73 20   table, that is 
3ec0: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  not an error..  
3ed0: 2a 2f 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  */.  pTable = sq
3ee0: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62  liteFindTable(db
3ef0: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69  , zName, 0);.  i
3f00: 44 62 20 3d 20 69 73 54 65 6d 70 20 3f 20 31 20  Db = isTemp ? 1 
3f10: 3a 20 70 50 61 72 73 65 2d 3e 69 44 62 3b 0a 20  : pParse->iDb;. 
3f20: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 26   if( pTable!=0 &
3f30: 26 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d  & (pTable->iDb==
3f40: 69 44 62 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e  iDb || !pParse->
3f50: 69 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20 20 20  initFlag) ){.   
3f60: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
3f70: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3f80: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 30 2c  sg, "table ", 0,
3f90: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
3fa0: 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20 22 20 61  ->n,.        " a
3fb0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
3fc0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
3fd0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
3fe0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
3ff0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
4000: 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d 20  }.  if( (pIdx = 
4010: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
4020: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d  db, zName, 0))!=
4030: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 28  0 &&.          (
4040: 70 49 64 78 2d 3e 69 44 62 3d 3d 30 20 7c 7c 20  pIdx->iDb==0 || 
4050: 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61  !pParse->initFla
4060: 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g) ){.    sqlite
4070: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
4080: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68 65  e->zErrMsg, "the
4090: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
40a0: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 22 2c 20   index named ", 
40b0: 0a 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30  .       zName, 0
40c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
40d0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50  e(zName);.    pP
40e0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
40f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
4100: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d  pTable = sqliteM
4110: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61  alloc( sizeof(Ta
4120: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
4130: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  able==0 ){.    s
4140: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
4150: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
4160: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
4170: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
4180: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
4190: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
41a0: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  0;.  pTable->iPK
41b0: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
41c0: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  e->pIndex = 0;. 
41d0: 20 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d 20 69   pTable->iDb = i
41e0: 44 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  Db;.  if( pParse
41f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71  ->pNewTable ) sq
4200: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
4210: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  db, pParse->pNew
4220: 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65  Table);.  pParse
4230: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54  ->pNewTable = pT
4240: 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  able;..  /* Begi
4250: 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  n generating the
4260: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
4270: 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65  insert the table
4280: 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a   record into.  *
4290: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  * the SQLITE_MAS
42a0: 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65  TER table.  Note
42b0: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
42c0: 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61  hat we must go a
42d0: 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c  head.  ** and al
42e0: 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72  locate the recor
42f0: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
4300: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77   table entry now
4310: 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20  .  Before any.  
4320: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
4330: 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64  r UNIQUE keyword
4340: 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54  s are parsed.  T
4350: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69  hose keywords wi
4360: 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e  ll cause.  ** in
4370: 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61  dices to be crea
4380: 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ted and the tabl
4390: 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f  e record must co
43a0: 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20  me before the . 
43b0: 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65   ** indices.  He
43c0: 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20  nce, the record 
43d0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
43e0: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c  able must be all
43f0: 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e  ocated.  ** now.
4400: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
4410: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26  rse->initFlag &&
4420: 20 28 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56   (v = sqliteGetV
4430: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
4440: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67  ){.    sqliteBeg
4450: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
4460: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 73 54 65  (pParse, 0, isTe
4470: 6d 70 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73  mp);.    if( !is
4480: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Temp ){.      sq
4490: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
44a0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
44b0: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29  >file_format, 0)
44c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
44d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
44e0: 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 31 29 3b 0a  tCookie, 0, 1);.
44f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4500: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
4510: 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  v, isTemp);.    
4520: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4530: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
4540: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
4550: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4560: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
4570: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4580: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
4590: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
45a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
45b0: 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29  PutIntKey, 0, 0)
45c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
45d0: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
45e0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
45f0: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
4600: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
4610: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
4620: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
4630: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
4640: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
4650: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
4660: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
4670: 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65  sqliteStartTable
4680: 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a  () gets called.*
4690: 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74  * first to get t
46a0: 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68  hings going.  Th
46b0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
46c0: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61  is called for ea
46d0: 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  ch.** column..*/
46e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43  .void sqliteAddC
46f0: 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61  olumn(Parse *pPa
4700: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
4710: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
4720: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
4730: 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e  *z = 0;.  Column
4740: 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70   *pCol;.  if( (p
4750: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
4760: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
4770: 6e 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53  n;.  sqliteSetNS
4780: 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d 65 2d  tring(&z, pName-
4790: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29  >z, pName->n, 0)
47a0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
47b0: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 44  eturn;.  sqliteD
47c0: 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72  equote(z);.  for
47d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
47e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
47f0: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20  qliteStrICmp(z, 
4800: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
4810: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
4820: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
4830: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
4840: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
4850: 6e 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c 20 30 29  n name: ", z, 0)
4860: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
4870: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71  nErr++;.      sq
4880: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
4890: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
48a0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
48b0: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
48c0: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
48d0: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
48e0: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e  liteRealloc( p->
48f0: 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38  aCol, (p->nCol+8
4900: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
4910: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
4920: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
4930: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61  .    p->aCol = a
4940: 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20  New;.  }.  pCol 
4950: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
4960: 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  ol];.  memset(pC
4970: 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  ol, 0, sizeof(p-
4980: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  >aCol[0]));.  pC
4990: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20  ol->zName = z;. 
49a0: 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72   pCol->sortOrder
49b0: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d   = SQLITE_SO_NUM
49c0: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d  ;.  p->nCol++;.}
49d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
49e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
49f0: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
4a00: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
4a10: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
4a20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
4a30: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
4a40: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
4a50: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
4a60: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
4a70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
4a80: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
4a90: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
4aa0: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
4ab0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
4ac0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4ad0: 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  eAddNotNull(Pars
4ae0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
4af0: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
4b00: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
4b10: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
4b20: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
4b30: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
4b40: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
4b50: 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69  i>=0 ) p->aCol[i
4b60: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72  ].notNull = onEr
4b70: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ror;.}../*.** Th
4b80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4b90: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
4ba0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
4bb0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
4bc0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
4bd0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
4be0: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
4bf0: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
4c00: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
4c10: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
4c20: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
4c30: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
4c40: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
4c50: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
4c60: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
4c70: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
4c80: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
4c90: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
4ca0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
4cb0: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
4cc0: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
4cd0: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
4ce0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
4cf0: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
4d00: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
4d10: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  */ .void sqliteA
4d20: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72  ddColumnType(Par
4d30: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
4d40: 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e  n *pFirst, Token
4d50: 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c   *pLast){.  Tabl
4d60: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  e *p;.  int i, j
4d70: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61  ;.  int n;.  cha
4d80: 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f  r *z, **pz;.  Co
4d90: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66  lumn *pCol;.  if
4da0: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
4db0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
4dc0: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
4dd0: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c  nCol-1;.  if( i<
4de0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43  0 ) return;.  pC
4df0: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d  ol = &p->aCol[i]
4e00: 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e  ;.  pz = &pCol->
4e10: 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61  zType;.  n = pLa
4e20: 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c 61  st->n + Addr(pLa
4e30: 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 46  st->z) - Addr(pF
4e40: 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69  irst->z);.  sqli
4e50: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
4e60: 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30   pFirst->z, n, 0
4e70: 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20  );.  z = *pz;.  
4e80: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
4e90: 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  n;.  for(i=j=0; 
4ea0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
4eb0: 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20  int c = z[i];.  
4ec0: 20 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29    if( isspace(c)
4ed0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4ee0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d   z[j++] = c;.  }
4ef0: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 69  .  z[j] = 0;.  i
4f00: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
4f10: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
4f20: 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f  .    pCol->sortO
4f30: 72 64 65 72 20 3d 20 73 71 6c 69 74 65 43 6f 6c  rder = sqliteCol
4f40: 6c 61 74 65 54 79 70 65 28 7a 2c 20 6e 29 3b 0a  lateType(z, n);.
4f50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f    }else{.    pCo
4f60: 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 53  l->sortOrder = S
4f70: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20  QLITE_SO_NUM;.  
4f80: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67  }.}../*.** The g
4f90: 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68  iven token is th
4fa0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
4fb0: 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c  for the last col
4fc0: 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20  umn added to.** 
4fd0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
4fe0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
4ff0: 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e  uction.  If "min
5000: 75 73 46 6c 61 67 22 20 69 73 20 74 72 75 65 2c  usFlag" is true,
5010: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
5020: 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73   value token was
5030: 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
5040: 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a  inus sign..**.**
5050: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5060: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
5070: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
5080: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
5090: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
50a0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
50b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
50c0: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
50d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
50e0: 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20  oken *pVal, int 
50f0: 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54 61  minusFlag){.  Ta
5100: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
5110: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20  .  char **pz;.  
5120: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
5130: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
5140: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
5150: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
5160: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
5170: 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d  pz = &p->aCol[i]
5180: 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69  .zDflt;.  if( mi
5190: 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  nusFlag ){.    s
51a0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
51b0: 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c  pz, "-", 1, pVal
51c0: 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29  ->z, pVal->n, 0)
51d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
51e0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
51f0: 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61  pz, pVal->z, pVa
5200: 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  l->n, 0);.  }.  
5210: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70  sqliteDequote(*p
5220: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  z);.}../*.** Des
5230: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
5240: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
5250: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
5260: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
5270: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
5280: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
5290: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
52a0: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
52b0: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
52c0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
52d0: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
52e0: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
52f0: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
5300: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
5310: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
5320: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
5330: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
5340: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
5350: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
5360: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
5370: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
5380: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
5390: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
53a0: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
53b0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
53c0: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
53d0: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
53e0: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
53f0: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
5400: 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20 28  s the row id.  (
5410: 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f  Exception:.** Fo
5420: 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
5430: 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
5440: 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c 20  lder databases, 
5450: 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a  do not do this.*
5460: 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * if the file fo
5470: 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d  rmat version num
5480: 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
5490: 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54 61   1.)  Set the Ta
54a0: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
54b0: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
54c0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
54d0: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
54e0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
54f0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
5500: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
5510: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
5520: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
5530: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
5540: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
5550: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
5560: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
5570: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
5580: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
5590: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
55a0: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
55b0: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
55c0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
55d0: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
55e0: 74 65 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  teAddPrimaryKey(
55f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
5600: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  dList *pList, in
5610: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
5620: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
5630: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
5640: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30   char *zType = 0
5650: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d  ;.  int iCol = -
5660: 31 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  1;.  if( pTab==0
5670: 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f   ) goto primary_
5680: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20  key_exit;.  if( 
5690: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
56a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
56b0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
56c0: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
56d0: 20 5c 22 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   \"", pTab->zNam
56e0: 65 2c 20 0a 20 20 20 20 20 20 20 20 22 5c 22 20  e, .        "\" 
56f0: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
5700: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
5710: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
5720: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
5730: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
5740: 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68  t;.  }.  pTab->h
5750: 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  asPrimKey = 1;. 
5760: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
5770: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62  .    iCol = pTab
5780: 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 7d 65  ->nCol - 1;.  }e
5790: 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  lse if( pList->n
57a0: 49 64 3d 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72  Id==1 ){.    for
57b0: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
57c0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
57d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
57e0: 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74  iteStrICmp(pList
57f0: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[0].zName, pT
5800: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
5810: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
5820: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
5830: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
5840: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  l<pTab->nCol ){.
5850: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
5860: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
5870: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  pe;.  }.  if( pP
5880: 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66  arse->db->file_f
5890: 6f 72 6d 61 74 3e 3d 31 20 26 26 20 0a 20 20 20  ormat>=1 && .   
58a0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 26 26          zType &&
58b0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
58c0: 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29  Type, "INTEGER")
58d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ==0 ){.    pTab-
58e0: 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20  >iPKey = iCol;. 
58f0: 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66     pTab->keyConf
5900: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65   = onError;.  }e
5910: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 43  lse{.    sqliteC
5920: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
5930: 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  e, 0, 0, pList, 
5940: 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20 30  onError, 0, 0, 0
5950: 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30  );.    pList = 0
5960: 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b  ;.  }..primary_k
5970: 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ey_exit:.  sqlit
5980: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  eIdListDelete(pL
5990: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
59a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
59b0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
59c0: 63 6f 6c 6c 61 74 69 6e 67 20 74 79 70 65 20 67  collating type g
59d0: 69 76 65 6e 20 61 20 74 79 70 65 20 6e 61 6d 65  iven a type name
59e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
59f0: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 65  ation type is te
5a00: 78 74 20 28 53 51 4c 49 54 45 5f 53 4f 5f 54 45  xt (SQLITE_SO_TE
5a10: 58 54 29 20 69 66 20 74 68 65 20 74 79 70 65 0a  XT) if the type.
5a20: 2a 2a 20 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73  ** name contains
5a30: 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 73   the character s
5a40: 74 72 65 61 6d 20 22 74 65 78 74 22 20 6f 72 20  tream "text" or 
5a50: 22 62 6c 6f 62 22 20 6f 72 0a 2a 2a 20 22 63 6c  "blob" or.** "cl
5a60: 6f 62 22 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ob".  Any other 
5a70: 74 79 70 65 20 6e 61 6d 65 20 69 73 20 63 6f 6c  type name is col
5a80: 6c 61 74 65 64 20 61 73 20 6e 75 6d 65 72 69 63  lated as numeric
5a90: 0a 2a 2a 20 28 53 51 4c 49 54 45 5f 53 4f 5f 4e  .** (SQLITE_SO_N
5aa0: 55 4d 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  UM)..*/.int sqli
5ab0: 74 65 43 6f 6c 6c 61 74 65 54 79 70 65 28 63 6f  teCollateType(co
5ac0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
5ad0: 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 69   int nType){.  i
5ae0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5af0: 20 69 3c 6e 54 79 70 65 2d 31 3b 20 69 2b 2b 29   i<nType-1; i++)
5b00: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 7a 54  {.    switch( zT
5b10: 79 70 65 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  ype[i] ){.      
5b20: 63 61 73 65 20 27 62 27 3a 0a 20 20 20 20 20 20  case 'b':.      
5b30: 63 61 73 65 20 27 42 27 3a 20 7b 0a 20 20 20 20  case 'B': {.    
5b40: 20 20 20 20 69 66 28 20 69 3c 6e 54 79 70 65 2d      if( i<nType-
5b50: 33 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e 49  3 && sqliteStrNI
5b60: 43 6d 70 28 26 7a 54 79 70 65 5b 69 5d 2c 22 62  Cmp(&zType[i],"b
5b70: 6c 6f 62 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20  lob",4)==0 ){.  
5b80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
5b90: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20  QLITE_SO_TEXT;. 
5ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5bc0: 20 20 20 20 20 20 63 61 73 65 20 27 63 27 3a 0a        case 'c':.
5bd0: 20 20 20 20 20 20 63 61 73 65 20 27 43 27 3a 20        case 'C': 
5be0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  {.        if( i<
5bf0: 6e 54 79 70 65 2d 33 20 26 26 20 28 73 71 6c 69  nType-3 && (sqli
5c00: 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70  teStrNICmp(&zTyp
5c10: 65 5b 69 5d 2c 22 63 68 61 72 22 2c 34 29 3d 3d  e[i],"char",4)==
5c20: 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  0 ||.           
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c40: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26  sqliteStrNICmp(&
5c50: 7a 54 79 70 65 5b 69 5d 2c 22 63 6c 6f 62 22 2c  zType[i],"clob",
5c60: 34 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 29  4)==0).        )
5c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
5c80: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  rn SQLITE_SO_TEX
5c90: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
5ca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5cb0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27    }.      case '
5cc0: 78 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27  x':.      case '
5cd0: 58 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  X': {.        if
5ce0: 28 20 69 3e 3d 32 20 26 26 20 73 71 6c 69 74 65  ( i>=2 && sqlite
5cf0: 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b  StrNICmp(&zType[
5d00: 69 2d 32 5d 2c 22 74 65 78 74 22 2c 34 29 3d 3d  i-2],"text",4)==
5d10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
5d20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
5d30: 54 45 58 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  TEXT;.        }.
5d40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5d50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
5d60: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
5d70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5d80: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5d90: 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b  n SQLITE_SO_NUM;
5da0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
5db0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5dc0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
5dd0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
5de0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
5df0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5e00: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 43  statement.  A "C
5e10: 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20 68  OLLATE" clause h
5e20: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
5e30: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
5e40: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
5e50: 74 68 65 20 43 6f 6c 75 6d 6e 2e 73 6f 72 74 4f  the Column.sortO
5e60: 72 64 65 72 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  rder on.** the c
5e70: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
5e80: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
5e90: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
5ea0: 74 65 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  teAddCollateType
5eb0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5ec0: 69 6e 74 20 63 6f 6c 6c 54 79 70 65 29 7b 0a 20  int collType){. 
5ed0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
5ee0: 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70   i;.  if( (p = p
5ef0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5f00: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
5f10: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
5f20: 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e    if( i>=0 ) p->
5f30: 61 43 6f 6c 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  aCol[i].sortOrde
5f40: 72 20 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a 7d 0a  r = collType;.}.
5f50: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20 77  ./*.** Come up w
5f60: 69 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d  ith a new random
5f70: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
5f80: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 4d  chema cookie.  M
5f90: 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65 20  ake sure.** the 
5fa0: 6e 65 77 20 76 61 6c 75 65 20 69 73 20 64 69 66  new value is dif
5fb0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
5fc0: 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  old..**.** The s
5fd0: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20  chema cookie is 
5fe0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
5ff0: 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  e when the schem
6000: 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74  a for the.** dat
6010: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
6020: 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d  After each schem
6030: 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f  a change, the co
6040: 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68  okie value.** ch
6050: 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70  anges.  When a p
6060: 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61  rocess first rea
6070: 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74  ds the schema it
6080: 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20   records the.** 
6090: 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66  cookie.  Thereaf
60a0: 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74  ter, whenever it
60b0: 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20   goes to access 
60c0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a  the database,.**
60d0: 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63   it checks the c
60e0: 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75  ookie to make su
60f0: 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  re the schema ha
6100: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a  s not changed.**
6110: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
6120: 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  st read..**.** T
6130: 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20  his plan is not 
6140: 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65  completely bulle
6150: 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20  t-proof.  It is 
6160: 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  possible for.** 
6170: 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68  the schema to ch
6180: 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69  ange multiple ti
6190: 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20  mes and for the 
61a0: 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20  cookie to be.** 
61b0: 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f  set back to prio
61c0: 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63  r value.  But sc
61d0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65  hema changes are
61e0: 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61   infrequent.** a
61f0: 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  nd the probabili
6200: 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68  ty of hitting th
6210: 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61  e same cookie va
6220: 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31  lue is only.** 1
6230: 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e   chance in 2^32.
6240: 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20    So we're safe 
6250: 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20  enough..*/.void 
6260: 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b  sqliteChangeCook
6270: 69 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 56  ie(sqlite *db, V
6280: 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 64  dbe *v){.  if( d
6290: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3d 3d  b->next_cookie==
62a0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68 65 6d  db->aDb[0].schem
62b0: 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20  a_cookie ){.    
62c0: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20  db->next_cookie 
62d0: 3d 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 63 68  = db->aDb[0].sch
62e0: 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b 20 73 71 6c  ema_cookie + sql
62f0: 69 74 65 52 61 6e 64 6f 6d 42 79 74 65 28 29 20  iteRandomByte() 
6300: 2b 20 31 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  + 1;.    db->fla
6310: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
6320: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20  ernChanges;.    
6330: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6340: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
6350: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20  b->next_cookie, 
6360: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
6370: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
6380: 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 30 29 3b 0a  tCookie, 0, 0);.
6390: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61    }.}../*.** Mea
63a0: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
63b0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
63c0: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
63d0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
63e0: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
63f0: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
6400: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
6410: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
6420: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
6430: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
6440: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
6450: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
6460: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
6470: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64  nt n;.  int need
6480: 51 75 6f 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72  Quote = 0;.  for
6490: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
64a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
64b0: 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65  ='\'' ){ n++; ne
64c0: 65 64 51 75 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d  edQuote=1; }.  }
64d0: 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 6e 65  .  return n + ne
64e0: 65 64 51 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a  edQuote*2;.}../*
64f0: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65  .** Write an ide
6500: 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65  ntifier onto the
6510: 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65   end of the give
6520: 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a  n string.  Add.*
6530: 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  * quote characte
6540: 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f  rs as needed..*/
6550: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65  .static void ide
6560: 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69  ntPut(char *z, i
6570: 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a  nt *pIdx, char *
6580: 7a 49 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69  zIdent){.  int i
6590: 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a  , j, needQuote;.
65a0: 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66    i = *pIdx;.  f
65b0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
65c0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
65d0: 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74   !isalnum(zIdent
65e0: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
65f0: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
6600: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
6610: 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20  =  zIdent[j]!=0 
6620: 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e  || isdigit(zIden
6630: 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20  t[0]).          
6640: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
6650: 65 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  eKeywordCode(zId
6660: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a  ent, j)!=TK_ID;.
6670: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
6680: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[i++] = '\'';
6690: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
66a0: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
66b0: 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74   z[i++] = zIdent
66c0: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64  [j];.    if( zId
66d0: 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a  ent[j]=='\'' ) z
66e0: 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [i++] = '\'';.  
66f0: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
6700: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27  e ) z[i++] = '\'
6710: 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20  ';.  z[i] = 0;. 
6720: 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f   *pIdx = i;.}../
6730: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
6740: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6750: 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61  tement appropria
6760: 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
6770: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f  .** table.  Memo
6780: 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74  ry to hold the t
6790: 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  ext of the state
67a0: 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64  ment is obtained
67b0: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  .** from sqliteM
67c0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
67d0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
67e0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
67f0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
6800: 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74  r *createTableSt
6810: 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  mt(Table *p){.  
6820: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
6830: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
6840: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
6850: 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30  , *zEnd;.  n = 0
6860: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
6870: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
6880: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
6890: 74 68 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  th(p->aCol[i].zN
68a0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  ame);.  }.  n +=
68b0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
68c0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
68d0: 34 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d  40 ){.    zSep =
68e0: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
68f0: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
6900: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
6910: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
6920: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
6930: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
6940: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
6950: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
6960: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
6970: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
6980: 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d   );.  if( zStmt=
6990: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
69a0: 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c 20 70   strcpy(zStmt, p
69b0: 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43 52 45 41  ->iDb==1 ? "CREA
69c0: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22 20  TE TEMP TABLE " 
69d0: 3a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  : "CREATE TABLE 
69e0: 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e  ");.  k = strlen
69f0: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
6a00: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
6a10: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d  ->zName);.  zStm
6a20: 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20  t[k++] = '(';.  
6a30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
6a40: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  ol; i++){.    st
6a50: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
6a60: 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  zSep);.    k += 
6a70: 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d  strlen(&zStmt[k]
6a80: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53  );.    zSep = zS
6a90: 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75  ep2;.    identPu
6aa0: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
6ab0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[i].zName);.
6ac0: 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53    }.  strcpy(&zS
6ad0: 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20  tmt[k], zEnd);. 
6ae0: 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d   return zStmt;.}
6af0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6b00: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
6b10: 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e  o report the fin
6b20: 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d  al ")" that term
6b30: 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41  inates.** a CREA
6b40: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6b50: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  nt..**.** The ta
6b60: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
6b70: 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20  at other action 
6b80: 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65  routines have be
6b90: 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69  en building.** i
6ba0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
6bb0: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
6bc0: 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f  les, assuming no
6bd0: 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20   errors have.** 
6be0: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  occurred..**.** 
6bf0: 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  An entry for the
6c00: 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69   table is made i
6c10: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  n the master tab
6c20: 6c 65 20 6f 6e 20 64 69 73 6b 2c 0a 2a 2a 20 75  le on disk,.** u
6c30: 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 20  nless this is a 
6c40: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
6c50: 6f 72 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2e 20  or initFlag==1. 
6c60: 20 57 68 65 6e 20 69 6e 69 74 46 6c 61 67 3d 3d   When initFlag==
6c70: 31 2c 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  1,.** it means w
6c80: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
6c90: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
6ca0: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
6cb0: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
6cc0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
6cd0: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
6ce0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
6cf0: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
6d00: 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73  ently changes, s
6d10: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
6d20: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
6d30: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
6d40: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
6d50: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
6d60: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
6d70: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
6d80: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
6d90: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
6da0: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
6db0: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
6dc0: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
6dd0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
6de0: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
6df0: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
6e00: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
6e10: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
6e20: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
6e30: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
6e40: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
6e50: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
6e60: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
6e70: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
6e80: 65 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20  eEndTable(Parse 
6e90: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
6ea0: 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70 53  pEnd, Select *pS
6eb0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
6ec0: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  *p;.  sqlite *db
6ed0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
6ee0: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
6ef0: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
6f00: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
6f10: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
6f20: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
6f30: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
6f40: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
6f50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
6f60: 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
6f70: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72   is generated fr
6f80: 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20 74 68 65  om a SELECT, the
6f90: 6e 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 0a  n construct the.
6fa0: 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 63 6f 6c    ** list of col
6fb0: 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 74 65 78  umns and the tex
6fc0: 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  t of the table..
6fd0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65    */.  if( pSele
6fe0: 63 74 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  ct ){.    Table 
6ff0: 2a 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74  *pSelTab = sqlit
7000: 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  eResultSetOfSele
7010: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
7020: 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20  elect);.    if( 
7030: 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
7040: 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  urn;.    assert(
7050: 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
7060: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
7070: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
7080: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
7090: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65  b->aCol;.    pSe
70a0: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
70b0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
70c0: 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  l = 0;.    sqlit
70d0: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  eDeleteTable(0, 
70e0: 70 53 65 6c 54 61 62 29 3b 0a 20 20 7d 0a 0a 20  pSelTab);.  }.. 
70f0: 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46   /* If the initF
7100: 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65 61 6e  lag is 1 it mean
7110: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
7120: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
7130: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
7140: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
7150: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
7160: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
7170: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
7180: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
7190: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
71a0: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
71b0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
71c0: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
71d0: 68 65 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e  he pParse->newTn
71e0: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
71f0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
7200: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
7210: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
7220: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
7230: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
7240: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69   if( pParse->ini
7250: 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 70 2d 3e  tFlag ){.    p->
7260: 74 6e 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tnum = pParse->n
7270: 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  ewTnum;.  }..  /
7280: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
7290: 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
72a0: 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20  te a record for 
72b0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20  the new table.  
72c0: 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  ** in the SQLITE
72d0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
72e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
72f0: 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  The record numbe
7300: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e  r.  ** for the n
7310: 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73  ew table entry s
7320: 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
7330: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   on the stack.. 
7340: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
7350: 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20   is a TEMPORARY 
7360: 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65  table, write the
7370: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
7380: 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66  auxiliary.  ** f
7390: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
73a0: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
73b0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
73c0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
73d0: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
73e0: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
73f0: 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  *v;..    v = sql
7400: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
7410: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
7420: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
7430: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
7440: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
7450: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
7460: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7470: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
7480: 74 65 54 61 62 6c 65 2c 20 30 2c 20 70 2d 3e 69  teTable, 0, p->i
7490: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
74a0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
74b0: 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 26 70 2d   -1, (char *)&p-
74c0: 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45  >tnum, P3_POINTE
74d0: 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  R);.    }else{. 
74e0: 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a       /* A view *
74f0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  /.      sqliteVd
7500: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
7510: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
7520: 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20    }.    p->tnum 
7530: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  = 0;.    sqliteV
7540: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
7550: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
7560: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7570: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
7580: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
7590: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
75a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
75b0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 74  angeP3(v, -1, "t
75c0: 61 62 6c 65 22 2c 20 50 33 5f 53 54 41 54 49 43  able", P3_STATIC
75d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
75e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
75f0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 76  angeP3(v, -1, "v
7600: 69 65 77 22 2c 20 50 33 5f 53 54 41 54 49 43 29  iew", P3_STATIC)
7610: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7620: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7630: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
7640: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
7650: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
7660: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
7670: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  IC);.    sqliteV
7680: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
7690: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
76a0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
76b0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a  geP3(v, -1, p->z
76c0: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
76d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
76e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
76f0: 20 34 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   4, 0);.    sqli
7700: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7710: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
7720: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
7730: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
7740: 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  z = createTableS
7750: 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 6e 20  tmt(p);.      n 
7760: 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20  = z ? strlen(z) 
7770: 3a 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  : 0;.      sqlit
7780: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
7790: 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20   -1, z, n);.    
77a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
77b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
77c0: 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d    assert( pEnd!=
77d0: 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41  0 );.      n = A
77e0: 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41  ddr(pEnd->z) - A
77f0: 64 64 72 28 70 50 61 72 73 65 2d 3e 73 46 69 72  ddr(pParse->sFir
7800: 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a  stToken.z) + 1;.
7810: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7820: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
7830: 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f  pParse->sFirstTo
7840: 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d  ken.z, n);.    }
7850: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
7860: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
7870: 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20  ecord, 5, 0);.  
7880: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7890: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
78a0: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  y, 0, 0);.    if
78b0: 28 20 21 70 2d 3e 69 44 62 20 29 7b 0a 20 20 20  ( !p->iDb ){.   
78c0: 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43     sqliteChangeC
78d0: 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20  ookie(db, v);.  
78e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
78f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
7900: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
7910: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
7920: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7930: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
7940: 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a  er, p->iDb, 0);.
7950: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7960: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
7970: 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Write, 1, 0);.  
7980: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
7990: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
79a0: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
79b0: 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61   pSelect, SRT_Ta
79c0: 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29  ble, 1, 0, 0, 0)
79d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
79e0: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
79f0: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
7a00: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
7a10: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
7a20: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
7a30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
7a40: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
7a50: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
7a60: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ==0 && pParse->n
7a70: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61  Err==0 ){.    Ta
7a80: 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46  ble *pOld;.    F
7a90: 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 20 20  Key *pFKey;.    
7aa0: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73  pOld = sqliteHas
7ab0: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
7ac0: 5b 70 2d 3e 69 44 62 5d 2e 74 62 6c 48 61 73 68  [p->iDb].tblHash
7ad0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
7af0: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
7b00: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b  p->zName)+1, p);
7b10: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
7b20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7b30: 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
7b40: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
7b50: 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
7b60: 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
7b70: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7b80: 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70  .    for(pFKey=p
7b90: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
7ba0: 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65  pFKey=pFKey->pNe
7bb0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69  xtFrom){.      i
7bc0: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
7bd0: 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b  pFKey->zTo) + 1;
7be0: 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  .      pFKey->pN
7bf0: 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 48 61  extTo = sqliteHa
7c00: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
7c10: 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70  p->iDb].aFKey, p
7c20: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b  FKey->zTo, nTo);
7c30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73  .      sqliteHas
7c40: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
7c50: 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20  [p->iDb].aFKey, 
7c60: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  pFKey->zTo, nTo,
7c70: 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20   pFKey);.    }. 
7c80: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
7c90: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
7ca0: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
7cb0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
7cc0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
7cd0: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
7ce0: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
7cf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
7d00: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
7d10: 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76   a new VIEW.*/.v
7d20: 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65  oid sqliteCreate
7d30: 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
7d40: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
7d50: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
7d60: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
7d70: 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
7d80: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
7d90: 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
7da0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
7db0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
7dc0: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
7dd0: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
7de0: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
7df0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
7e00: 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54  t,   /* A SELECT
7e10: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
7e20: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
7e30: 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  new view */.  in
7e40: 74 20 69 73 54 65 6d 70 20 20 20 20 20 20 20 20  t isTemp        
7e50: 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54   /* TRUE for a T
7e60: 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f  EMPORARY view */
7e70: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
7e80: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
7e90: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
7ea0: 6e 20 73 45 6e 64 3b 0a 0a 20 20 73 71 6c 69 74  n sEnd;..  sqlit
7eb0: 65 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  eStartTable(pPar
7ec0: 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d  se, pBegin, pNam
7ed0: 65 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20  e, isTemp, 1);. 
7ee0: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
7ef0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
7f00: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
7f10: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
7f20: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
7f30: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
7f40: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
7f50: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
7f60: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
7f70: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
7f80: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
7f90: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
7fa0: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
7fb0: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
7fc0: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
7fd0: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
7fe0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
7ff0: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
8000: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
8010: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
8020: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
8030: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
8040: 6e 74 20 73 71 6c 69 74 65 5f 65 78 65 63 28 29  nt sqlite_exec()
8050: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
8060: 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
8070: 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44   = sqliteSelectD
8080: 75 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  up(pSelect);.  s
8090: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
80a0: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  e(pSelect);.  if
80b0: 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  ( !pParse->initF
80c0: 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  lag ){.    sqlit
80d0: 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  eViewGetColumnNa
80e0: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
80f0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
8100: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
8110: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
8120: 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e  ement.  Make sEn
8130: 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20  d point to.  ** 
8140: 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20  the end..  */.  
8150: 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73  sEnd = pParse->s
8160: 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28  LastToken;.  if(
8170: 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26   sEnd.z[0]!=0 &&
8180: 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20   sEnd.z[0]!=';' 
8190: 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d  ){.    sEnd.z +=
81a0: 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73   sEnd.n;.  }.  s
81b0: 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d  End.n = 0;.  n =
81c0: 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d   ((int)sEnd.z) -
81d0: 20 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b   (int)pBegin->z;
81e0: 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a  .  z = pBegin->z
81f0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  ;.  while( n>0 &
8200: 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c  & (z[n-1]==';' |
8210: 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  | isspace(z[n-1]
8220: 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73  )) ){ n--; }.  s
8230: 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b  End.z = &z[n-1];
8240: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a  .  sEnd.n = 1;..
8250: 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 45    /* Use sqliteE
8260: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
8270: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
8280: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
8290: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
82a0: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
82b0: 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65   &sEnd, 0);.  re
82c0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
82d0: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
82e0: 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61  re pTable is rea
82f0: 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c  lly a VIEW.  Fil
8300: 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  l in the names o
8310: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73  f.** the columns
8320: 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20   of the view in 
8330: 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63  the pTable struc
8340: 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68  ture.  Return th
8350: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
8360: 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
8370: 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76  ror is seen leav
8380: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
8390: 67 65 20 69 6e 20 70 50 61 72 65 2d 3e 7a 45 72  ge in pPare->zEr
83a0: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
83b0: 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  iteViewGetColumn
83c0: 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
83d0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
83e0: 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  le){.  ExprList 
83f0: 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63  *pEList;.  Selec
8400: 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65  t *pSel;.  Table
8410: 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74   *pSelTab;.  int
8420: 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73   nErr = 0;..  as
8430: 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a  sert( pTable );.
8440: 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
8450: 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
8460: 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
8470: 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
8480: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
8490: 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
84a0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
84b0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
84c0: 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
84d0: 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
84e0: 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
84f0: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
8500: 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
8510: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
8520: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
8530: 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
8540: 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
8550: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
8560: 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
8570: 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
8580: 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
8590: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
85a0: 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
85b0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
85c0: 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
85d0: 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
85e0: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
85f0: 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
8600: 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65  Actually, this e
8610: 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70  rror is caught p
8620: 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f  reviously and so
8630: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
8640: 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  est.  ** should 
8650: 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75  always fail.  Bu
8660: 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20  t we will leave 
8670: 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74  it in place just
8680: 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a   to be safe..  *
8690: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
86a0: 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
86b0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
86c0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
86d0: 22 76 69 65 77 20 22 2c 20 70 54 61 62 6c 65 2d  "view ", pTable-
86e0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
86f0: 20 22 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79   " is circularly
8700: 20 64 65 66 69 6e 65 64 22 2c 20 30 29 3b 0a 20   defined", 0);. 
8710: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
8720: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  +;.    return 1;
8730: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
8740: 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
8750: 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
8760: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
8770: 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f  able names..  */
8780: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
8790: 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a  e->pSelect ); /*
87a0: 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65   If nCol==0, the
87b0: 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20 62 65  n pTable must be
87c0: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70 53 65   a VIEW */.  pSe
87d0: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  l = pTable->pSel
87e0: 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20  ect;..  /* Note 
87f0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
8800: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
8810: 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20  OfSelect() will 
8820: 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20  expand any.  ** 
8830: 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  "*" elements in 
8840: 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20  this list.  But 
8850: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  we will need to 
8860: 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74  restore the list
8870: 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74  .  ** back to it
8880: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
8890: 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61  guration afterwa
88a0: 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20  rds, so we save 
88b0: 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74  a copy of.  ** t
88c0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70  he original in p
88d0: 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45  EList..  */.  pE
88e0: 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c  List = pSel->pEL
88f0: 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c  ist;.  pSel->pEL
8900: 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ist = sqliteExpr
8910: 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74 29 3b  ListDup(pEList);
8920: 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c  .  if( pSel->pEL
8930: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53  ist==0 ){.    pS
8940: 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  el->pEList = pEL
8950: 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ist;.    return 
8960: 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61  1;  /* Malloc fa
8970: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  iled */.  }.  pT
8980: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
8990: 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c  .  pSelTab = sql
89a0: 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65  iteResultSetOfSe
89b0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
89c0: 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53 65  pSel);.  if( pSe
89d0: 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  lTab ){.    asse
89e0: 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
89f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c  ==0 );.    pTabl
8a00: 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
8a10: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61  b->nCol;.    pTa
8a20: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
8a30: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70  Tab->aCol;.    p
8a40: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
8a50: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61  ;.    pSelTab->a
8a60: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Col = 0;.    sql
8a70: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
8a80: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
8a90: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
8aa0: 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 66 6c 61  pTable->iDb].fla
8ab0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 55 6e 72  gs |= SQLITE_Unr
8ac0: 65 73 65 74 56 69 65 77 73 3b 0a 20 20 7d 65 6c  esetViews;.  }el
8ad0: 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  se{.    pTable->
8ae0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45  nCol = 0;.    nE
8af0: 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rr++;.  }.  sqli
8b00: 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70  teSelectUnbind(p
8b10: 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 45 78  Sel);.  sqliteEx
8b20: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65  prListDelete(pSe
8b30: 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 53  l->pEList);.  pS
8b40: 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  el->pEList = pEL
8b50: 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45  ist;.  return nE
8b60: 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rr;  .}../*.** C
8b70: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
8b80: 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 56  names from the V
8b90: 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a 2a  IEW pTable..**.*
8ba0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8bb0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
8bc0: 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61 62 6c  r any other tabl
8bd0: 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d 6f 64  e or view is mod
8be0: 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76 69  ified..** The vi
8bf0: 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74  ew passed into t
8c00: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
8c10: 74 20 64 65 70 65 6e 64 20 64 69 72 65 63 74 6c  t depend directl
8c20: 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 0a  y or indirectly.
8c30: 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66 69  ** on the modifi
8c40: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 74 61  ed or deleted ta
8c50: 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64 20 74  ble so we need t
8c60: 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c 64 20  o clear the old 
8c70: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73 20  column.** names 
8c80: 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
8c90: 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64 2e  l be recomputed.
8ca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8cb0: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 43  sqliteViewResetC
8cc0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65  olumnNames(Table
8cd0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
8ce0: 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65   i;.  if( pTable
8cf0: 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 70  ==0 || pTable->p
8d00: 53 65 6c 65 63 74 3d 3d 30 20 29 20 72 65 74 75  Select==0 ) retu
8d10: 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  rn;.  if( pTable
8d20: 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  ->nCol==0 ) retu
8d30: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
8d40: 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
8d50: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
8d60: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
8d70: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
8d80: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
8d90: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74  e->aCol[i].zDflt
8da0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
8db0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
8dc0: 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20  ].zType);.  }.  
8dd0: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
8de0: 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62  e->aCol);.  pTab
8df0: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
8e00: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
8e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
8e20: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
8e30: 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
8e40: 57 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  W..*/.static voi
8e50: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
8e60: 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 2c  tAll(sqlite *db,
8e70: 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73   int idx){.  Has
8e80: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20  hElem *i;.  if( 
8e90: 28 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 66 6c  (db->aDb[idx].fl
8ea0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 55 6e 72  ags & SQLITE_Unr
8eb0: 65 73 65 74 56 69 65 77 73 29 3d 3d 30 20 29 20  esetViews)==0 ) 
8ec0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
8ed0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
8ee0: 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62  &db->aDb[idx].tb
8ef0: 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c  lHash); i; i=sql
8f00: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
8f10: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
8f20: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
8f30: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
8f40: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
8f50: 20 20 20 20 20 73 71 6c 69 74 65 56 69 65 77 52       sqliteViewR
8f60: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
8f70: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
8f80: 0a 20 20 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  .  db->aDb[idx].
8f90: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
8fa0: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 7d  _UnresetViews;.}
8fb0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
8fc0: 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61  token, look up a
8fd0: 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 61 74   table with that
8fe0: 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66   name.  If not f
8ff0: 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61  ound, leave.** a
9000: 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20  n error for the 
9010: 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20 61  parser to find a
9020: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
9030: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
9040: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50  TableFromToken(P
9050: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
9060: 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68  ken *pTok){.  ch
9070: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62  ar *zName;.  Tab
9080: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d  le *pTab;.  zNam
9090: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  e = sqliteTableN
90a0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
90b0: 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  k);.  if( zName=
90c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
90d0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69   pTab = sqliteFi
90e0: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
90f0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  db, zName, 0);. 
9100: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
9110: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  e);.  if( pTab==
9120: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
9130: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
9140: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
9150: 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30  such table: ", 0
9160: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 2d  , .        pTok-
9170: 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b  >z, pTok->n, 0);
9180: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
9190: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
91a0: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
91b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
91c0: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
91d0: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
91e0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
91f0: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
9200: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
9210: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
9220: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
9230: 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  eDropTable(Parse
9240: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
9250: 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69  *pName, int isVi
9260: 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ew){.  Table *pT
9270: 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b  able;.  Vdbe *v;
9280: 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 73  .  int base;.  s
9290: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
92a0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
92b0: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
92c0: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
92d0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
92e0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c   return;.  pTabl
92f0: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 46  e = sqliteTableF
9300: 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  romToken(pParse,
9310: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70   pName);.  if( p
9320: 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72  Table==0 ) retur
9330: 6e 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62 6c  n;.  iDb = pTabl
9340: 65 2d 3e 69 44 62 3b 0a 23 69 66 6e 64 65 66 20  e->iDb;.#ifndef 
9350: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
9360: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
9370: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
9380: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
9390: 45 4c 45 54 45 2c 20 53 43 48 45 4d 41 5f 54 41  ELETE, SCHEMA_TA
93a0: 42 4c 45 28 70 54 61 62 6c 65 2d 3e 69 44 62 29  BLE(pTable->iDb)
93b0: 2c 30 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ,0)){.    return
93c0: 3b 0a 20 20 7d 0a 20 20 7b 0a 20 20 20 20 69 6e  ;.  }.  {.    in
93d0: 74 20 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  t code;.    if( 
93e0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
93f0: 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20  if( iDb==1 ){.  
9400: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
9410: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
9420: 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
9430: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
9440: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
9450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
9460: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69  lse{.      if( i
9470: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
9480: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
9490: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
94a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
94b0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
94c0: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
94d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
94e0: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
94f0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
9500: 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  e, pTable->zName
9510: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  , 0) ){.      re
9520: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
9530: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
9540: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
9550: 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 6c  TE_DELETE, pTabl
9560: 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a  e->zName, 0) ){.
9570: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
9580: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
9590: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 72 65 61   if( pTable->rea
95a0: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
95b0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
95c0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
95d0: 74 61 62 6c 65 20 22 2c 20 70 54 61 62 6c 65 2d  table ", pTable-
95e0: 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  >zName, .       
95f0: 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  " may not be dro
9600: 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70  pped", 0);.    p
9610: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
9620: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
9630: 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
9640: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d  Table->pSelect==
9650: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
9660: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
9670: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73 65 20  ->zErrMsg, "use 
9680: 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
9690: 6c 65 74 65 20 74 61 62 6c 65 20 22 2c 0a 20 20  lete table ",.  
96a0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d      pTable->zNam
96b0: 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  e, 0);.    pPars
96c0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
96d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
96e0: 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
96f0: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  le->pSelect ){. 
9700: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
9710: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
9720: 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50 20 56  Msg, "use DROP V
9730: 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
9740: 65 77 20 22 2c 0a 20 20 20 20 20 20 70 54 61 62  ew ",.      pTab
9750: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  le->zName, 0);. 
9760: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
9770: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
9780: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
9790: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
97a0: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
97b0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
97c0: 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
97d0: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
97e0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
97f0: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
9800: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 72  static VdbeOp dr
9810: 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20  opTable[] = {.  
9820: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
9830: 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c       0, ADDR(8),
9840: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
9850: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20  _String,     0, 
9860: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
9870: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
9880: 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20  _MemStore,   1, 
9890: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  1,        0},.  
98a0: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64      { OP_MemLoad
98b0: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
98c0: 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
98d0: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
98e0: 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
98f0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
9900: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Ne,         0, 
9910: 41 44 44 52 28 37 29 2c 20 20 30 7d 2c 0a 20 20  ADDR(7),  0},.  
9920: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
9930: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
9940: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
9950: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
9960: 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a  ADDR(3),  0}, /*
9970: 20 37 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20   7 */.    };.   
9980: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9990: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
99a0: 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 42  ger;.    sqliteB
99b0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
99c0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54  on(pParse, 0, pT
99d0: 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20  able->iDb);.    
99e0: 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72  sqliteOpenMaster
99f0: 54 61 62 6c 65 28 76 2c 20 70 54 61 62 6c 65 2d  Table(v, pTable-
9a00: 3e 69 44 62 29 3b 0a 20 20 20 20 2f 2a 20 44 72  >iDb);.    /* Dr
9a10: 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  op all triggers 
9a20: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
9a30: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
9a40: 64 72 6f 70 70 65 64 20 2a 2f 0a 20 20 20 20 70  dropped */.    p
9a50: 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c 65  Trigger = pTable
9a60: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
9a70: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
9a80: 29 7b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74  ){.      SrcList
9a90: 20 2a 70 4e 6d 3b 0a 20 20 20 20 20 20 61 73 73   *pNm;.      ass
9aa0: 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69  ert( pTrigger->i
9ab0: 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20  Db==pTable->iDb 
9ac0: 29 3b 0a 20 20 20 20 20 20 70 4e 6d 20 3d 20 73  );.      pNm = s
9ad0: 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65  qliteSrcListAppe
9ae0: 6e 64 28 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  nd(0, 0, 0);.   
9af0: 20 20 20 70 4e 6d 2d 3e 61 5b 30 5d 2e 7a 4e 61     pNm->a[0].zNa
9b00: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
9b10: 70 28 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65  p(pTrigger->name
9b20: 29 3b 0a 20 20 20 20 20 20 70 4e 6d 2d 3e 61 5b  );.      pNm->a[
9b30: 30 5d 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  0].zDatabase = s
9b40: 71 6c 69 74 65 53 74 72 44 75 70 28 64 62 2d 3e  qliteStrDup(db->
9b50: 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d  aDb[pTable->iDb]
9b60: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  .zName);.      s
9b70: 71 6c 69 74 65 44 72 6f 70 54 72 69 67 67 65 72  qliteDropTrigger
9b80: 28 70 50 61 72 73 65 2c 20 70 4e 6d 2c 20 31 29  (pParse, pNm, 1)
9b90: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
9ba0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
9bb0: 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20         pTrigger 
9bc0: 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
9bd0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
9be0: 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
9bf0: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67   = pTable->pTrig
9c00: 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ger;.      }.   
9c10: 20 7d 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71   }.    base = sq
9c20: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
9c30: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64  t(v, ArraySize(d
9c40: 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54  ropTable), dropT
9c50: 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  able);.    sqlit
9c60: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
9c70: 20 62 61 73 65 2b 31 2c 20 70 54 61 62 6c 65 2d   base+1, pTable-
9c80: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
9c90: 69 66 28 20 21 70 54 61 62 6c 65 2d 3e 69 44 62  if( !pTable->iDb
9ca0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9cb0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
9cc0: 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   v);.    }.    s
9cd0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
9ce0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
9cf0: 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69  );.    if( !isVi
9d00: 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ew ){.      sqli
9d10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
9d20: 50 5f 44 65 73 74 72 6f 79 2c 20 70 54 61 62 6c  P_Destroy, pTabl
9d30: 65 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d  e->tnum, pTable-
9d40: 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  >iDb);.      for
9d50: 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e 70 49  (pIdx=pTable->pI
9d60: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
9d70: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
9d80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
9d90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
9da0: 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  troy, pIdx->tnum
9db0: 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a  , pTable->iDb);.
9dc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9dd0: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
9de0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
9df0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
9e00: 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ete the in-memor
9e10: 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  y description of
9e20: 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a   the table..  **
9e30: 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
9e40: 20 69 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   if the SQL stat
9e50: 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69 74 68  ement began with
9e60: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79   the EXPLAIN key
9e70: 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  word,.  ** then 
9e80: 6e 6f 20 63 68 61 6e 67 65 73 20 73 68 6f 75 6c  no changes shoul
9e90: 64 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  d be made..  */.
9ea0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
9eb0: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71  xplain ){.    sq
9ec0: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
9ed0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
9ee0: 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  ble);.    db->fl
9ef0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
9f00: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
9f10: 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  .  sqliteViewRes
9f20: 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a  etAll(db, iDb);.
9f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9f40: 75 74 69 6e 65 20 63 6f 6e 73 74 72 75 63 74 73  utine constructs
9f50: 20 61 20 50 33 20 73 74 72 69 6e 67 20 73 75 69   a P3 string sui
9f60: 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 4f 50 5f  table for an OP_
9f70: 4d 61 6b 65 49 64 78 4b 65 79 0a 2a 2a 20 6f 70  MakeIdxKey.** op
9f80: 63 6f 64 65 20 61 6e 64 20 61 64 64 73 20 74 68  code and adds th
9f90: 61 74 20 50 33 20 73 74 72 69 6e 67 20 74 6f 20  at P3 string to 
9fa0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
9fb0: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
9fc0: 75 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  uction.** in the
9fd0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
9fe0: 2e 20 20 54 68 65 20 50 33 20 73 74 72 69 6e 67  .  The P3 string
9ff0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
a000: 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 0a  ingle character.
a010: 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ** for each colu
a020: 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  mn in the index 
a030: 70 49 64 78 20 6f 66 20 74 61 62 6c 65 20 70 54  pIdx of table pT
a040: 61 62 2e 20 20 49 66 20 74 68 65 20 63 6f 6c 75  ab.  If the colu
a050: 6d 6e 20 75 73 65 73 0a 2a 2a 20 61 20 6e 75 6d  mn uses.** a num
a060: 65 72 69 63 20 73 6f 72 74 20 6f 72 64 65 72 2c  eric sort order,
a070: 20 74 68 65 6e 20 74 68 65 20 50 33 20 73 74 72   then the P3 str
a080: 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 63 6f  ing character co
a090: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0a 2a  rresponding to.*
a0a0: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73  * that column is
a0b0: 20 27 6e 27 2e 20 20 49 66 20 74 68 65 20 63 6f   'n'.  If the co
a0c0: 6c 75 6d 6e 20 75 73 65 73 20 61 20 74 65 78 74  lumn uses a text
a0d0: 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74 68 65   sort order, the
a0e0: 6e 20 74 68 65 0a 2a 2a 20 50 33 20 73 74 72 69  n the.** P3 stri
a0f0: 6e 67 20 69 73 20 27 74 27 2e 20 20 53 65 65 20  ng is 't'.  See 
a100: 74 68 65 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65  the OP_MakeIdxKe
a110: 79 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e  y opcode documen
a120: 74 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 64  tation for.** ad
a130: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
a140: 74 69 6f 6e 2e 20 20 53 65 65 20 61 6c 73 6f 20  tion.  See also 
a150: 74 68 65 20 73 71 6c 69 74 65 41 64 64 4b 65 79  the sqliteAddKey
a160: 54 79 70 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a  Type() routine..
a170: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
a180: 64 49 64 78 4b 65 79 54 79 70 65 28 56 64 62 65  dIdxKeyType(Vdbe
a190: 20 2a 76 2c 20 49 6e 64 65 78 20 2a 70 49 64 78   *v, Index *pIdx
a1a0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  ){.  char *zType
a1b0: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
a1c0: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61  .  int i, n;.  a
a1d0: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 26  ssert( pIdx!=0 &
a1e0: 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 21 3d  & pIdx->pTable!=
a1f0: 30 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  0 );.  pTab = pI
a200: 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 6e 20  dx->pTable;.  n 
a210: 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
a220: 0a 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  .  zType = sqlit
a230: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 2b 31 20  eMallocRaw( n+1 
a240: 29 3b 0a 20 20 69 66 28 20 7a 54 79 70 65 3d 3d  );.  if( zType==
a250: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
a260: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
a270: 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
a280: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
a290: 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
a2a0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
a2b0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
a2c0: 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f    if( (pTab->aCo
a2d0: 6c 5b 69 43 6f 6c 5d 2e 73 6f 72 74 4f 72 64 65  l[iCol].sortOrde
a2e0: 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59  r & SQLITE_SO_TY
a2f0: 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f  PEMASK)==SQLITE_
a300: 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  SO_TEXT ){.     
a310: 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 74 27 3b   zType[i] = 't';
a320: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a330: 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 6e 27    zType[i] = 'n'
a340: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 54  ;.    }.  }.  zT
a350: 79 70 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 71  ype[n] = 0;.  sq
a360: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
a370: 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c 20 6e  (v, -1, zType, n
a380: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
a390: 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zType);.}../*.**
a3a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a3b0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
a3c0: 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
a3d0: 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
a3e0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
a3f0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
a400: 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
a410: 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
a420: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
a430: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
a440: 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
a450: 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
a460: 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
a470: 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
a480: 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
a490: 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
a4a0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
a4b0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
a4c0: 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f  erred to.  pToCo
a4d0: 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  l is a list of t
a4e0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68  ables in the oth
a4f0: 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20  er.** pTo table 
a500: 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
a510: 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20   key points to. 
a520: 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
a530: 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
a540: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
a550: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
a560: 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
a570: 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
a580: 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
a590: 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
a5a0: 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
a5b0: 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
a5c0: 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
a5d0: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
a5e0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
a5f0: 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
a600: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
a610: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
a620: 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46  ield.  The new F
a630: 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69  Key.** is not li
a640: 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46  nked into db->aF
a650: 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Key at this poin
a660: 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  t - that does no
a670: 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69  t happen.** unti
a680: 6c 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65  l sqliteEndTable
a690: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ()..**.** The fo
a6a0: 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
a6b0: 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
a6c0: 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
a6d0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
a6e0: 20 74 6f 20 73 71 6c 69 74 65 44 65 66 65 72 46   to sqliteDeferF
a6f0: 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
a700: 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
a710: 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
a720: 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65 46  id sqliteCreateF
a730: 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
a740: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
a750: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
a760: 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69 73 74  text */.  IdList
a770: 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 20 20 2f   *pFromCol,    /
a780: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
a790: 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
a7a0: 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
a7b0: 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
a7c0: 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
a7d0: 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
a7e0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64 4c 69   table */.  IdLi
a7f0: 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 20  st *pToCol,     
a800: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
a810: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
a820: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
a830: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
a840: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
a850: 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
a860: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  {.  Table *p = p
a870: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a880: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
a890: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
a8a0: 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ol;.  char *z;. 
a8b0: 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
a8c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
a8d0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
a8e0: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
a8f0: 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  r ) goto fk_end;
a900: 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
a910: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
a920: 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
a930: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
a940: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
a950: 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
a960: 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 31 20 29  pToCol->nId!=1 )
a970: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
a980: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
a990: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 66 6f 72 65  ->zErrMsg, "fore
a9a0: 69 67 6e 20 6b 65 79 20 6f 6e 20 22 2c 20 2d 31  ign key on ", -1
a9b0: 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
a9c0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
a9d0: 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 22 20  -1, .         " 
a9e0: 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
a9f0: 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
aa00: 20 6f 66 20 74 61 62 6c 65 20 22 2c 20 2d 31 2c   of table ", -1,
aa10: 0a 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 7a  .         pTo->z
aa20: 2c 20 70 54 6f 2d 3e 6e 2c 20 30 29 3b 0a 20 20  , pTo->n, 0);.  
aa30: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
aa40: 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ++;.      goto f
aa50: 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
aa60: 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
aa70: 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
aa80: 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 70 46   pToCol->nId!=pF
aa90: 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b 0a 20  romCol->nId ){. 
aaa0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
aab0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
aac0: 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 6e  Msg, .        "n
aad0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
aae0: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
aaf0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
ab00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
ab10: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
ab20: 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
ab30: 64 20 74 61 62 6c 65 22 2c 20 30 29 3b 0a 20 20  d table", 0);.  
ab40: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
ab50: 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
ab60: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
ab70: 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
ab80: 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  >nId;.  }.  nByt
ab90: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
aba0: 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66  y) + nCol*sizeof
abb0: 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
abc0: 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
abd0: 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
abe0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
abf0: 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  oCol->nId; i++){
ac00: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
ac10: 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61  strlen(pToCol->a
ac20: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
ac30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
ac40: 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  y = sqliteMalloc
ac50: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
ac60: 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f   pFKey==0 ) goto
ac70: 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79   fk_end;.  pFKey
ac80: 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70  ->pFrom = p;.  p
ac90: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20  FKey->pNextFrom 
aca0: 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20  = p->pFKey;.  z 
acb0: 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b  = (char*)&pFKey[
acc0: 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f  1];.  pFKey->aCo
acd0: 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c  l = (struct sCol
ace0: 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73  Map*)z;.  z += s
acf0: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f  izeof(struct sCo
ad00: 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46  lMap)*nCol;.  pF
ad10: 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20  Key->zTo = z;.  
ad20: 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a  memcpy(z, pTo->z
ad30: 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  , pTo->n);.  z[p
ad40: 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20  To->n] = 0;.  z 
ad50: 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
ad60: 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
ad70: 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c  0;.  pFKey->nCol
ad80: 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70   = nCol;.  if( p
ad90: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
ada0: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d    pFKey->aCol[0]
adb0: 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c  .iFrom = p->nCol
adc0: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
add0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
ade0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
adf0: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
ae00: 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a  =0; j<p->nCol; j
ae10: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
ae20: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70   sqliteStrICmp(p
ae30: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
ae40: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
ae50: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
ae60: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
ae70: 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
ae80: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
ae90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
aea0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
aeb0: 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
aec0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
aed0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
aee0: 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e 20 63  rMsg, "unknown c
aef0: 6f 6c 75 6d 6e 20 5c 22 22 2c 20 0a 20 20 20 20  olumn \"", .    
af00: 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e        pFromCol->
af10: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 22 5c 22 20  a[i].zName, "\" 
af20: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
af30: 65 66 69 6e 69 74 69 6f 6e 22 2c 20 30 29 3b 0a  efinition", 0);.
af40: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
af50: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
af60: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
af70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
af80: 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
af90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
afa0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
afb0: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70  int n = strlen(p
afc0: 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
afd0: 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
afe0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
aff0: 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
b000: 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
b010: 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
b020: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
b030: 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
b040: 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
b050: 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
b060: 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e  pFKey->deleteCon
b070: 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66  f = flags & 0xff
b080: 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74  ;.  pFKey->updat
b090: 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  eConf = (flags >
b0a0: 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20  > 8 ) & 0xff;.  
b0b0: 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e  pFKey->insertCon
b0c0: 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36  f = (flags >> 16
b0d0: 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a   ) & 0xff;..  /*
b0e0: 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
b0f0: 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
b100: 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
b110: 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
b120: 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
b130: 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
b140: 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  nd:.  sqliteFree
b150: 28 70 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74  (pFKey);.  sqlit
b160: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 46  eIdListDelete(pF
b170: 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  romCol);.  sqlit
b180: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 54  eIdListDelete(pT
b190: 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
b1a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
b1b0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
b1c0: 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
b1d0: 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
b1e0: 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
b1f0: 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
b200: 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
b210: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
b220: 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
b230: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
b240: 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
b250: 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
b260: 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
b270: 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
b280: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
b290: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
b2a0: 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
b2b0: 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
b2c0: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
b2d0: 76 6f 69 64 20 73 71 6c 69 74 65 44 65 66 65 72  void sqliteDefer
b2e0: 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65  ForeignKey(Parse
b2f0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73   *pParse, int is
b300: 44 65 66 65 72 72 65 64 29 7b 0a 20 20 54 61 62  Deferred){.  Tab
b310: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79  le *pTab;.  FKey
b320: 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28   *pFKey;.  if( (
b330: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
b340: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20  NewTable)==0 || 
b350: 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70  (pFKey = pTab->p
b360: 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72  FKey)==0 ) retur
b370: 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65  n;.  pFKey->isDe
b380: 66 65 72 72 65 64 20 3d 20 69 73 44 65 66 65 72  ferred = isDefer
b390: 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  red;.}../*.** Cr
b3a0: 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
b3b0: 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
b3c0: 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74 68  e.  pIndex is th
b3d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
b3e0: 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62  dex .** and pTab
b3f0: 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  le is the name o
b400: 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
b410: 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
b420: 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
b430: 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
b440: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
b450: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
b460: 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
b470: 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
b480: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
b490: 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
b4a0: 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
b4b0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b4c0: 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
b4d0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
b4e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b4f0: 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
b500: 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
b510: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
b520: 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
b530: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
b540: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
b550: 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
b560: 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
b570: 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
b580: 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
b590: 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
b5a0: 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
b5b0: 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
b5c0: 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
b5d0: 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
b5e0: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
b5f0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
b600: 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ion.  .*/.void s
b610: 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78  qliteCreateIndex
b620: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b630: 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f  e,   /* All info
b640: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
b650: 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
b660: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f  ken *pName,    /
b670: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
b680: 64 65 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  dex.  May be NUL
b690: 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  L */.  SrcList *
b6a0: 70 54 61 62 6c 65 2c 20 2f 2a 20 4e 61 6d 65 20  pTable, /* Name 
b6b0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
b6c0: 69 6e 64 65 78 2e 20 20 55 73 65 20 70 50 61 72  index.  Use pPar
b6d0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
b6e0: 20 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a   0 */.  IdList *
b6f0: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
b700: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
b710: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
b720: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
b730: 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
b740: 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
b750: 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
b760: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
b770: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
b780: 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
b790: 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20  orary index */. 
b7a0: 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
b7b0: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
b7c0: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
b7d0: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
b7e0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
b7f0: 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20  Token *pEnd     
b800: 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
b810: 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
b820: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
b830: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  nt */.){.  Table
b840: 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54   *pTab;     /* T
b850: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
b860: 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
b870: 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20  Index;   /* The 
b880: 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
b890: 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
b8a0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
b8b0: 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75  i, j;.  Token nu
b8c0: 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  llId;           
b8d0: 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20    /* Fake token 
b8e0: 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20  for an empty ID 
b8f0: 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  list */.  sqlite
b900: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b910: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
b920: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
b930: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
b940: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
b950: 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20  e_index;..  /*. 
b960: 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
b970: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
b980: 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
b990: 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
b9a0: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
b9b0: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
b9c0: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21    assert( pName!
b9d0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
b9e0: 28 20 70 54 61 62 6c 65 2d 3e 6e 53 72 63 3d 3d  ( pTable->nSrc==
b9f0: 31 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  1 );.    pTab = 
ba00: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 4c 6f   sqliteSrcListLo
ba10: 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61  okup(pParse, pTa
ba20: 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
ba30: 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
ba40: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
ba50: 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  =  pParse->pNewT
ba60: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
ba70: 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
ba80: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
ba90: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
baa0: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  ;.  if( pTab->re
bab0: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
bac0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
bad0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
bae0: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e  "table ", pTab->
baf0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 22 20 6d  zName,.      " m
bb00: 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
bb10: 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  d", 0);.    pPar
bb20: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
bb30: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
bb40: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
bb50: 28 20 21 69 73 54 65 6d 70 20 26 26 20 70 54 61  ( !isTemp && pTa
bb60: 62 2d 3e 69 44 62 3e 3d 32 20 26 26 20 70 50 61  b->iDb>=2 && pPa
bb70: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30  rse->initFlag==0
bb80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
bb90: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
bba0: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
bbb0: 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   ", pTab->zName,
bbc0: 20 0a 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f   .      " may no
bbd0: 74 20 68 61 76 65 20 6e 6f 6e 2d 74 65 6d 70 6f  t have non-tempo
bbe0: 72 61 72 79 20 69 6e 64 69 63 65 73 20 61 64 64  rary indices add
bbf0: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
bc00: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
bc10: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
bc20: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
bc30: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
bc40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
bc50: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
bc60: 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69 65 77 73  >zErrMsg, "views
bc70: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
bc80: 78 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  xed", 0);.    pP
bc90: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
bca0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
bcb0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
bcc0: 69 66 28 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31  if( pTab->iDb==1
bcd0: 20 29 7b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d   ){.    isTemp =
bce0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   1;.  }..  /*.  
bcf0: 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
bd00: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
bd10: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
bd20: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
bd30: 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
bd40: 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
bd50: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
bd60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
bd70: 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
bd80: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
bd90: 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
bda0: 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
bdb0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
bdc0: 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
bdd0: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
bde0: 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
bdf0: 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
be00: 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
be10: 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
be20: 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
be30: 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
be40: 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
be50: 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
be60: 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
be70: 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
be80: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
be90: 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
bea0: 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
beb0: 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
bec0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
bed0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
bee0: 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
bef0: 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
bf00: 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
bf10: 69 66 28 20 70 4e 61 6d 65 20 26 26 20 21 70 50  if( pName && !pP
bf20: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
bf30: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53  {.    Index *pIS
bf40: 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41  ameName;    /* A
bf50: 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74  nother index wit
bf60: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
bf70: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
bf80: 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
bf90: 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d  A table with sam
bfa0: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e  e name as the in
bfb0: 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65  dex */.    zName
bfc0: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
bfd0: 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  (pName->z, pName
bfe0: 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ->n);.    if( zN
bff0: 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
c000: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
c010: 0a 20 20 20 20 69 66 28 20 28 70 49 53 61 6d 65  .    if( (pISame
c020: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e  Name = sqliteFin
c030: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
c040: 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 0))!=0 ){.    
c050: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
c060: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
c070: 73 67 2c 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e  sg, "index ", zN
c080: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 22  ame, .         "
c090: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
c0a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
c0b0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
c0c0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
c0d0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
c0e0: 20 20 20 20 69 66 28 20 28 70 54 53 61 6d 65 4e      if( (pTSameN
c0f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ame = sqliteFind
c100: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
c110: 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   0))!=0 ){.     
c120: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
c130: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
c140: 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  g, "there is alr
c150: 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
c160: 65 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  ed ",.         z
c170: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
c180: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
c190: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
c1a0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
c1b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
c1c0: 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pName==0 ){.    
c1d0: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
c1e0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
c1f0: 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
c200: 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
c210: 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
c220: 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
c230: 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
c240: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
c250: 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e  "%d)",n);.    zN
c260: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
c270: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  iteSetString(&zN
c280: 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e  ame, "(", pTab->
c290: 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64  zName, " autoind
c2a0: 65 78 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  ex ", zBuf, 0);.
c2b0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
c2c0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
c2d0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 65 6c  ate_index;.  }el
c2e0: 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  se{.    zName = 
c2f0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
c300: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
c310: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  );.  }..  /* Che
c320: 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
c330: 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
c340: 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
c350: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c360: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
c370: 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d 70    assert( isTemp
c380: 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31  ==0 || isTemp==1
c390: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
c3a0: 61 62 2d 3e 69 44 62 3d 3d 70 50 61 72 73 65 2d  ab->iDb==pParse-
c3b0: 3e 69 44 62 20 7c 7c 20 69 73 54 65 6d 70 3d 3d  >iDb || isTemp==
c3c0: 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  1 );.  if( sqlit
c3d0: 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  eAuthCheck(pPars
c3e0: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
c3f0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
c400: 73 54 65 6d 70 29 2c 20 30 29 20 29 7b 0a 20 20  sTemp), 0) ){.  
c410: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
c420: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
c430: 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
c440: 45 5f 49 4e 44 45 58 3b 0a 20 20 69 66 28 20 69  E_INDEX;.  if( i
c450: 73 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c 49  sTemp ) i = SQLI
c460: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
c470: 4e 44 45 58 3b 0a 20 20 69 66 28 20 73 71 6c 69  NDEX;.  if( sqli
c480: 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
c490: 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54  se, i, zName, pT
c4a0: 61 62 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  ab->zName) ){.  
c4b0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
c4c0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
c4d0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
c4e0: 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
c4f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
c500: 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
c510: 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
c520: 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
c530: 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
c540: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
c550: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
c560: 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
c570: 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
c580: 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
c590: 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
c5a0: 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64  =0 ){.    nullId
c5b0: 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .z = pTab->aCol[
c5c0: 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
c5d0: 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  ame;.    nullId.
c5e0: 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49  n = strlen(nullI
c5f0: 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
c600: 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70  = sqliteIdListAp
c610: 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49 64 29  pend(0, &nullId)
c620: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
c630: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
c640: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
c650: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
c660: 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
c670: 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
c680: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
c690: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
c6a0: 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e  (Index) + strlen
c6b0: 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20  (zName) + 1 +.  
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74        sizeof(int
c6e0: 29 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29 3b 0a  )*pList->nId );.
c6f0: 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
c700: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
c710: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64  te_index;.  pInd
c720: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  ex->aiColumn = (
c730: 69 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d 3b  int*)&pIndex[1];
c740: 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
c750: 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65   = (char*)&pInde
c760: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73  x->aiColumn[pLis
c770: 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70  t->nId];.  strcp
c780: 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
c790: 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65   zName);.  pInde
c7a0: 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
c7b0: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
c7c0: 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64  umn = pList->nId
c7d0: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
c7e0: 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  ror = onError;. 
c7f0: 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
c800: 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20  ex = pName==0;. 
c810: 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69   pIndex->iDb = i
c820: 73 54 65 6d 70 20 3f 20 31 20 3a 20 70 50 61 72  sTemp ? 1 : pPar
c830: 73 65 2d 3e 69 44 62 3b 0a 0a 20 20 2f 2a 20 53  se->iDb;..  /* S
c840: 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
c850: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
c860: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
c870: 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
c880: 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
c890: 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
c8a0: 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
c8b0: 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
c8c0: 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
c8d0: 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
c8e0: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
c8f0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
c900: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  d; i++){.    for
c910: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
c920: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
c930: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
c940: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
c950: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
c960: 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  j].zName)==0 ) b
c970: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
c980: 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
c990: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
c9a0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
c9b0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
c9c0: 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  ble ", pTab->zNa
c9d0: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20 68  me, .        " h
c9e0: 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
c9f0: 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  ed ", pList->a[i
ca00: 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ].zName, 0);.   
ca10: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
ca20: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  +;.      sqliteF
ca30: 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree(pIndex);.   
ca40: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
ca50: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
ca60: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
ca70: 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
ca80: 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
ca90: 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
caa0: 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
cab0: 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
cac0: 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
cad0: 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
cae0: 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69  tures. .  */.  i
caf0: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
cb00: 61 69 6e 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ain ){.    Index
cb10: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
cb20: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
cb30: 62 2d 3e 61 44 62 5b 69 73 54 65 6d 70 5d 2e 69  b->aDb[isTemp].i
cb40: 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb60: 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
cb70: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
cb80: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  , pIndex);.    i
cb90: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73  f( p ){.      as
cba0: 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
cbb0: 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
cbc0: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
cbd0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  /.      sqliteFr
cbe0: 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ee(pIndex);.    
cbf0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
cc00: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
cc10: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
cc20: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
cc30: 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  anges;.  }..  /*
cc40: 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
cc50: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
cc60: 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
cc70: 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
cc80: 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
cc90: 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
cca0: 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
ccb0: 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
ccc0: 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
ccd0: 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
cce0: 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
ccf0: 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
cd00: 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a  n of UPDATE.  **
cd10: 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a   and INSERT..  *
cd20: 2f 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21  /.  if( onError!
cd30: 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
cd40: 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
cd50: 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
cd60: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
cd70: 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
cd80: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
cd90: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
cda0: 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
cdb0: 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  = pIndex;.  }els
cdc0: 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  e{.    Index *pO
cdd0: 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
cde0: 64 65 78 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  dex;.    while( 
cdf0: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
ce00: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
ce10: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
ce20: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 70 4f 74  ace ){.      pOt
ce30: 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
ce40: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
ce50: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
ce60: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
ce70: 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
ce80: 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  = pIndex;.  }.. 
ce90: 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46   /* If the initF
cea0: 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65 61 6e  lag is 1 it mean
ceb0: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
cec0: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
ced0: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
cee0: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
cef0: 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20  he disk.  So do 
cf00: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
cf10: 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e   disk.  ** again
cf20: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 74  .  Extract the t
cf30: 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d  able number from
cf40: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 65 77   the pParse->new
cf50: 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20 2a 2f  Tnum field..  */
cf60: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69  .  if( pParse->i
cf70: 6e 69 74 46 6c 61 67 20 26 26 20 70 54 61 62 6c  nitFlag && pTabl
cf80: 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64  e!=0 ){.    pInd
cf90: 65 78 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73  ex->tnum = pPars
cfa0: 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  e->newTnum;.  }.
cfb0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69  .  /* If the ini
cfc0: 74 46 6c 61 67 20 69 73 20 30 20 74 68 65 6e 20  tFlag is 0 then 
cfd0: 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
cfe0: 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
cff0: 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
d000: 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
d010: 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
d020: 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
d030: 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
d040: 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
d050: 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
d060: 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
d070: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30  he initFlag is 0
d080: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66   when the user f
d090: 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52  irst enters a CR
d0a0: 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a  EATE INDEX .  **
d0b0: 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20 69   command.  The i
d0c0: 6e 69 74 46 6c 61 67 20 69 73 20 31 20 77 68 65  nitFlag is 1 whe
d0d0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
d0e0: 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
d0f0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
d100: 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
d110: 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
d120: 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
d130: 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
d140: 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
d150: 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
d160: 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
d170: 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
d180: 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
d190: 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e it..  **.  ** 
d1a0: 49 66 20 70 54 61 62 6c 65 3d 3d 30 20 69 74 20  If pTable==0 it 
d1b0: 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
d1c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
d1d0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
d1e0: 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
d1f0: 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
d200: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
d210: 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
d220: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
d230: 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
d240: 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
d250: 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
d260: 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
d270: 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
d280: 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
d290: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50  */.  else if( pP
d2a0: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d  arse->initFlag==
d2b0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  0 ){.    int n;.
d2c0: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
d2d0: 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b   int lbl1, lbl2;
d2e0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
d2f0: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 76  int addr;..    v
d300: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
d310: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
d320: 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
d330: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
d340: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 21  .    if( pTable!
d350: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
d360: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
d370: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
d380: 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20   isTemp);.      
d390: 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72  sqliteOpenMaster
d3a0: 54 61 62 6c 65 28 76 2c 20 69 73 54 65 6d 70 29  Table(v, isTemp)
d3b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
d3c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d3d0: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30  P_NewRecno, 0, 0
d3e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
d3f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
d400: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
d410: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
d420: 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78  P3(v, -1, "index
d430: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
d440: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d450: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
d460: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
d470: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
d480: 2c 20 2d 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  , -1, pIndex->zN
d490: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
d4a0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
d4b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
d4c0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
d4d0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
d4e0: 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e  (v, -1, pTab->zN
d4f0: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
d500: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
d510: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d520: 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 30  P_CreateIndex, 0
d530: 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73  , isTemp);.    s
d540: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
d550: 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  3(v, addr, (char
d560: 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  *)&pIndex->tnum,
d570: 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20   P3_POINTER);.  
d580: 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
d590: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62   0;.    if( pTab
d5a0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  le ){.      sqli
d5b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d5c0: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
d5d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d5e0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
d5f0: 72 2c 20 69 73 54 65 6d 70 2c 20 30 29 3b 0a 20  r, isTemp, 0);. 
d600: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d610: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
d620: 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  rite, 1, 0);.   
d630: 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71   }.    addr = sq
d640: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d650: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
d660: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  );.    if( pStar
d670: 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20  t && pEnd ){.   
d680: 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64     n = Addr(pEnd
d690: 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 53 74 61  ->z) - Addr(pSta
d6a0: 72 74 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20  rt->z) + 1;.    
d6b0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
d6c0: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 53  geP3(v, addr, pS
d6d0: 74 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20  tart->z, n);.   
d6e0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
d6f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
d700: 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a  eRecord, 5, 0);.
d710: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d720: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74  dOp(v, OP_PutInt
d730: 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Key, 0, 0);.    
d740: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
d750: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d760: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
d770: 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29  r, pTab->iDb, 0)
d780: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d790: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
d7a0: 65 6e 52 65 61 64 2c 20 32 2c 20 70 54 61 62 2d  enRead, 2, pTab-
d7b0: 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73 71  >tnum);.      sq
d7c0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
d7d0: 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e  (v, -1, pTab->zN
d7e0: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
d7f0: 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71  .      lbl2 = sq
d800: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
d810: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
d820: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d830: 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c  P_Rewind, 2, lbl
d840: 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d  2);.      lbl1 =
d850: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d860: 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 32 2c  (v, OP_Recno, 2,
d870: 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
d880: 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43  =0; i<pIndex->nC
d890: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
d8a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d8b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
d8c0: 6e 2c 20 32 2c 20 70 49 6e 64 65 78 2d 3e 61 69  n, 2, pIndex->ai
d8d0: 43 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20  Column[i]);.    
d8e0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d8f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d900: 4d 61 6b 65 49 64 78 4b 65 79 2c 20 70 49 6e 64  MakeIdxKey, pInd
d910: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ex->nColumn, 0);
d920: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 66  .      if( db->f
d930: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20  ile_format>=4 ) 
d940: 73 71 6c 69 74 65 41 64 64 49 64 78 4b 65 79 54  sqliteAddIdxKeyT
d950: 79 70 65 28 76 2c 20 70 49 6e 64 65 78 29 3b 0a  ype(v, pIndex);.
d960: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
d970: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 50  AddOp(v, OP_IdxP
d980: 75 74 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e 6f  ut, 1, pIndex->o
d990: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29  nError!=OE_None)
d9a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d9b0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
d9c0: 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  , "indexed colum
d9d0: 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
d9e0: 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  e", P3_STATIC);.
d9f0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
da00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
da10: 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20  , 2, lbl1);.    
da20: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
da30: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32  lveLabel(v, lbl2
da40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
da50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
da60: 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20  lose, 2, 0);.   
da70: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
da80: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
da90: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 0);.    }.   
daa0: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29   if( pTable!=0 )
dab0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 54  {.      if( !isT
dac0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  emp ){.        s
dad0: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
dae0: 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 20 20  e(db, v);.      
daf0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
db00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
db10: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
db20: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
db30: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
db40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
db50: 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
db60: 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
db70: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
db80: 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44  .  sqliteIdListD
db90: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
dba0: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c  sqliteSrcListDel
dbb0: 65 74 65 28 70 54 61 62 6c 65 29 3b 0a 20 20 73  ete(pTable);.  s
dbc0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
dbd0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
dbe0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
dbf0: 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
dc00: 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
dc10: 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
dc20: 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
dc30: 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
dc40: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
dc50: 69 64 20 73 71 6c 69 74 65 44 72 6f 70 49 6e 64  id sqliteDropInd
dc60: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
dc70: 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
dc80: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
dc90: 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ex;.  Vdbe *v;. 
dca0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
dcb0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
dcc0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
dcd0: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
dce0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
dcf0: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
dd00: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 49  >nSrc==1 );.  pI
dd10: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 46 69 6e  ndex = sqliteFin
dd20: 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65  dIndex(db, pName
dd30: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
dd40: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
dd50: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ase);.  if( pInd
dd60: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex==0 ){.    sql
dd70: 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
dd80: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
dd90: 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
dda0: 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
ddb0: 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
ddc0: 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
ddd0: 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20  autoIndex ){.   
dde0: 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28   sqliteErrorMsg(
ddf0: 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
de00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
de10: 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
de20: 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
de30: 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
de40: 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
de50: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
de60: 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
de70: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62   if( pIndex->iDb
de80: 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >1 ){.    sqlite
de90: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
dea0: 20 22 63 61 6e 6e 6f 74 20 61 6c 74 65 72 20 73   "cannot alter s
deb0: 63 68 65 6d 61 20 6f 66 20 61 74 74 61 63 68 65  chema of attache
dec0: 64 20 22 0a 20 20 20 20 20 20 20 22 64 61 74 61  d ".       "data
ded0: 62 61 73 65 73 22 2c 20 30 29 3b 0a 20 20 20 20  bases", 0);.    
dee0: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
def0: 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  ndex;.  }.#ifnde
df00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
df10: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
df20: 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
df30: 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
df40: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
df50: 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
df60: 6c 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  le;.    if( sqli
df70: 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
df80: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
df90: 45 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  E, SCHEMA_TABLE(
dfa0: 70 49 6e 64 65 78 2d 3e 69 44 62 29 2c 20 30 29  pIndex->iDb), 0)
dfb0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
dfc0: 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
dfd0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
dfe0: 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65  ndex->iDb ) code
dff0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
e000: 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
e010: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
e020: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
e030: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
e040: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a  pTab->zName) ){.
e050: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
e060: 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
e070: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
e080: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
e090: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
e0a0: 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
e0b0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
e0c0: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
e0d0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
e0e0: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74   if( v ){.    st
e0f0: 61 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70  atic VdbeOp drop
e100: 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  Index[] = {.    
e110: 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
e120: 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30     0, ADDR(9), 0
e130: 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  }, .      { OP_S
e140: 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c  tring,     0, 0,
e150: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20         0}, /* 1 
e160: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65  */.      { OP_Me
e170: 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20  mStore,   1, 1, 
e180: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
e190: 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20  { OP_MemLoad,   
e1a0: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   1, 0,       0},
e1b0: 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 3 */.      {
e1c0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
e1d0: 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a  0, 1,       0},.
e1e0: 20 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20        { OP_Eq,  
e1f0: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38         0, ADDR(8
e200: 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
e210: 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c  P_Next,       0,
e220: 20 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20   ADDR(3), 0},.  
e230: 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20      { OP_Goto,  
e240: 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c       0, ADDR(9),
e250: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
e260: 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30  Delete,     0, 0
e270: 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38  ,       0}, /* 8
e280: 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   */.    };.    i
e290: 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20 20 73 71  nt base;..    sq
e2a0: 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
e2b0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
e2c0: 30 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  0, pIndex->iDb);
e2d0: 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d  .    sqliteOpenM
e2e0: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 49  asterTable(v, pI
e2f0: 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  ndex->iDb);.    
e300: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62  base = sqliteVdb
e310: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
e320: 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65  raySize(dropInde
e330: 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a  x), dropIndex);.
e340: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
e350: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31  angeP3(v, base+1
e360: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
e370: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e   0);.    if( pIn
e380: 64 65 78 2d 3e 69 44 62 3d 3d 30 20 29 7b 0a 20  dex->iDb==0 ){. 
e390: 20 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67       sqliteChang
e3a0: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a  eCookie(db, v);.
e3b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e3c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e3d0: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
e3e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
e3f0: 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  p(v, OP_Destroy,
e400: 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 70   pIndex->tnum, p
e410: 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
e420: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
e430: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
e440: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
e450: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
e460: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
e470: 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  this index..  */
e480: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
e490: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73  explain ){.    s
e4a0: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
e4b0: 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49  leteIndex(db, pI
e4c0: 6e 64 65 78 29 3b 0a 20 20 20 20 64 62 2d 3e 66  ndex);.    db->f
e4d0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
e4e0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
e4f0: 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  }..exit_drop_ind
e500: 65 78 3a 0a 20 20 73 71 6c 69 74 65 53 72 63 4c  ex:.  sqliteSrcL
e510: 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29  istDelete(pName)
e520: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
e530: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
e540: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
e550: 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
e560: 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
e570: 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
e580: 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
e590: 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
e5a0: 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
e5b0: 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
e5c0: 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e  qliteIdListAppen
e5d0: 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  d(IdList *pList,
e5e0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
e5f0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
e600: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
e610: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
e620: 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
e630: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
e640: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
e650: 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 49    if( (pList->nI
e660: 64 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  d & 7)==0 ){.   
e670: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
e680: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20  tem *a;.    a = 
e690: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
e6a0: 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d 3e  ist->a, (pList->
e6b0: 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c  nId+8)*sizeof(pL
e6c0: 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
e6d0: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
e6e0: 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74      sqliteIdList
e6f0: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
e700: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
e710: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
e720: 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d  a = a;.  }.  mem
e730: 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
e740: 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69  ist->nId], 0, si
e750: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
e760: 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e  ));.  if( pToken
e770: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
e780: 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  z = &pList->a[pL
e790: 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b  ist->nId].zName;
e7a0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
e7b0: 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e  tring(pz, pToken
e7c0: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20  ->z, pToken->n, 
e7d0: 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d  0);.    if( *pz=
e7e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
e7f0: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
e800: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
e810: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
e820: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  {.      sqliteDe
e830: 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20  quote(*pz);.    
e840: 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e  }.  }.  pList->n
e850: 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70  Id++;.  return p
e860: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
e870: 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
e880: 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
e890: 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
e8a0: 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
e8b0: 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
e8c0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
e8d0: 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
e8e0: 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
e8f0: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e   pToken is NULL.
e900: 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63  .**.** A new Src
e910: 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
e920: 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
e930: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a  loc() fails..**.
e940: 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
e950: 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
e960: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
e970: 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
e980: 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
e990: 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
e9a0: 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
e9b0: 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
e9c0: 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
e9d0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
e9e0: 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
e9f0: 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
ea00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
ea10: 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
ea20: 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
ea30: 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
ea40: 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
ea50: 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
ea60: 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
ea70: 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
ea80: 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
ea90: 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
eaa0: 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
eab0: 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
eac0: 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
ead0: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
eae0: 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
eaf0: 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
eb00: 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
eb10: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
eb20: 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
eb30: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
eb40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 72          sqliteSr
eb50: 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c  cListAppend(A,B,
eb60: 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
eb70: 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
eb80: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
eb90: 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
eba0: 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
ebb0: 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
ebc0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
ebd0: 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e  liteSrcListAppen
ebe0: 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  d(A,B,C);.**.** 
ebf0: 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61  Then C is the ta
ec00: 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69  ble name and B i
ec10: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  s the database n
ec20: 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ame..*/.SrcList 
ec30: 2a 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70  *sqliteSrcListAp
ec40: 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c  pend(SrcList *pL
ec50: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62  ist, Token *pTab
ec60: 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  le, Token *pData
ec70: 62 61 73 65 29 7b 0a 20 20 69 66 28 20 70 4c 69  base){.  if( pLi
ec80: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
ec90: 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
eca0: 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73  c( sizeof(SrcLis
ecb0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
ecc0: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
ecd0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4c  0;.  }.  if( (pL
ece0: 69 73 74 2d 3e 6e 53 72 63 20 26 20 37 29 3d 3d  ist->nSrc & 7)==
ecf0: 31 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  1 ){.    SrcList
ed00: 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77   *pNew;.    pNew
ed10: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
ed20: 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20  (pList,.        
ed30: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
ed40: 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e  List) + (pList->
ed50: 6e 53 72 63 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nSrc+8)*sizeof(p
ed60: 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  List->a[0]) );. 
ed70: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
ed80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 72  {.      sqliteSr
ed90: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  cListDelete(pLis
eda0: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
edb0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
edc0: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
edd0: 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
ede0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c  >a[pList->nSrc],
edf0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
ee00: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
ee10: 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61  pDatabase && pDa
ee20: 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a  tabase->z==0 ){.
ee30: 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
ee40: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61  0;.  }.  if( pDa
ee50: 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65  tabase && pTable
ee60: 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
ee70: 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65  Temp = pDatabase
ee80: 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  ;.    pDatabase 
ee90: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54  = pTable;.    pT
eea0: 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20  able = pTemp;.  
eeb0: 7d 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20 29  }.  if( pTable )
eec0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20  {.    char **pz 
eed0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
eee0: 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d 65 3b 0a  t->nSrc].zName;.
eef0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
ef00: 72 69 6e 67 28 70 7a 2c 20 70 54 61 62 6c 65 2d  ring(pz, pTable-
ef10: 3e 7a 2c 20 70 54 61 62 6c 65 2d 3e 6e 2c 20 30  >z, pTable->n, 0
ef20: 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d  );.    if( *pz==
ef30: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
ef40: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  eSrcListDelete(p
ef50: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
ef60: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
ef70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65  {.      sqliteDe
ef80: 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20  quote(*pz);.    
ef90: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  }.  }.  if( pDat
efa0: 61 62 61 73 65 20 29 7b 0a 20 20 20 20 63 68 61  abase ){.    cha
efb0: 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d  r **pz = &pList-
efc0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e  >a[pList->nSrc].
efd0: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 73  zDatabase;.    s
efe0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
eff0: 70 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 7a  pz, pDatabase->z
f000: 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 6e 2c 20  , pDatabase->n, 
f010: 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d  0);.    if( *pz=
f020: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f030: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
f040: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
f050: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
f060: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44  e{.      sqliteD
f070: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20  equote(*pz);.   
f080: 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e   }.  }.  pList->
f090: 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  nSrc++;.  return
f0a0: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
f0b0: 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f   Add an alias to
f0c0: 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69   the last identi
f0d0: 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65  fier on the give
f0e0: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73  n identifier lis
f0f0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
f100: 65 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73  eSrcListAddAlias
f110: 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c  (SrcList *pList,
f120: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
f130: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20  .  if( pList && 
f140: 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b  pList->nSrc>0 ){
f150: 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69  .    int i = pLi
f160: 73 74 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20  st->nSrc - 1;.  
f170: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
f180: 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ng(&pList->a[i].
f190: 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e  zAlias, pToken->
f1a0: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29  z, pToken->n, 0)
f1b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75  ;.    sqliteDequ
f1c0: 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ote(pList->a[i].
f1d0: 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  zAlias);.  }.}..
f1e0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
f1f0: 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
f200: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
f210: 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  te(IdList *pList
f220: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
f230: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
f240: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
f250: 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
f260: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
f270: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
f280: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
f290: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
f2a0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
f2b0: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
f2c0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
f2d0: 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
f2e0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
f2f0: 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
f300: 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
f310: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
f320: 65 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  eIdListIndex(IdL
f330: 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
f340: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
f350: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
f360: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
f370: 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
f380: 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
f390: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
f3a0: 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  teStrICmp(pList-
f3b0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  >a[i].zName, zNa
f3c0: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
f3d0: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
f3e0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  -1;.}../*.** Del
f3f0: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
f400: 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
f410: 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
f420: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
f430: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
f440: 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  e(SrcList *pList
f450: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
f460: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
f470: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
f480: 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
f490: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
f4a0: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
f4b0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
f4c0: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
f4d0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
f4e0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
f4f0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
f500: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
f510: 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70  ->a[i].pTab && p
f520: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d  List->a[i].pTab-
f530: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
f540: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
f550: 74 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74  teTable(0, pList
f560: 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20  ->a[i].pTab);.  
f570: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 53 65    }.    sqliteSe
f580: 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74  lectDelete(pList
f590: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
f5a0: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44  .    sqliteExprD
f5b0: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
f5c0: 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ].pOn);.    sqli
f5d0: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
f5e0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e  List->a[i].pUsin
f5f0: 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
f600: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
f610: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  /*.** Begin a tr
f620: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
f630: 64 20 73 71 6c 69 74 65 42 65 67 69 6e 54 72 61  d sqliteBeginTra
f640: 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
f650: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
f660: 72 6f 72 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  ror){.  sqlite *
f670: 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
f680: 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
f690: 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
f6a0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
f6b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
f6c0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
f6d0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
f6e0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
f6f0: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
f700: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
f710: 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
f720: 20 22 42 45 47 49 4e 22 2c 20 30 29 20 29 20 72   "BEGIN", 0) ) r
f730: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d  eturn;.  if( db-
f740: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
f750: 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 73  InTrans ){.    s
f760: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
f770: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 73 74  arse, "cannot st
f780: 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
f790: 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  n within a trans
f7a0: 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  action");.    re
f7b0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
f7c0: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
f7d0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
f7e0: 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73   0);.  db->flags
f7f0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 54 72 61   |= SQLITE_InTra
f800: 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f  ns;.  db->onErro
f810: 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  r = onError;.}..
f820: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74  /*.** Commit a t
f830: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
f840: 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54  id sqliteCommitT
f850: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
f860: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
f870: 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  ite *db;..  if( 
f880: 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
f890: 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
f8a0: 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
f8b0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
f8c0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
f8d0: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
f8e0: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
f8f0: 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
f900: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
f910: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
f920: 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
f930: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  0) ) return;.  i
f940: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
f950: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
f960: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
f970: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f980: 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20   "cannot commit 
f990: 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e  - no transaction
f9a0: 20 69 73 20 61 63 74 69 76 65 22 29 3b 0a 20 20   is active");.  
f9b0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
f9c0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
f9d0: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20  LITE_InTrans;.  
f9e0: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
f9f0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
fa00: 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d  .  db->onError =
fa10: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a   OE_Default;.}..
fa20: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
fa30: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
fa40: 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62  void sqliteRollb
fa50: 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ackTransaction(P
fa60: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
fa70: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56   sqlite *db;.  V
fa80: 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
fa90: 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
faa0: 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
fab0: 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
fac0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
fad0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
fae0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
faf0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
fb00: 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 41  n;.  if( sqliteA
fb10: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
fb20: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
fb30: 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c  ION, "ROLLBACK",
fb40: 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   0) ) return;.  
fb50: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
fb60: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
fb70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
fb80: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
fb90: 2c 20 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61  , "cannot rollba
fba0: 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  ck - no transact
fbb0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 3b  ion is active");
fbc0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 0a 20 20  .    return; .  
fbd0: 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  }.  v = sqliteGe
fbe0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
fbf0: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
fc00: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fc10: 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c   OP_Rollback, 0,
fc20: 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66   0);.  }.  db->f
fc30: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
fc40: 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f  InTrans;.  db->o
fc50: 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61  nError = OE_Defa
fc60: 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ult;.}../*.** Ge
fc70: 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
fc80: 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66   that will verif
fc90: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
fca0: 6b 69 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 6e  kie for all.** n
fcb0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
fcc0: 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  les..*/.void sql
fcd0: 69 74 65 43 6f 64 65 56 65 72 69 66 79 53 63 68  iteCodeVerifySch
fce0: 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
fcf0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  e){.  int i;.  s
fd00: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
fd10: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
fd20: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
fd30: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  e(pParse);.  for
fd40: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
fd50: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
fd60: 3d 3d 31 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 69  ==1 || db->aDb[i
fd70: 5d 2e 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69  ].pBt==0 ) conti
fd80: 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  nue;.    sqliteV
fd90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56  dbeAddOp(v, OP_V
fda0: 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 2c 20  erifyCookie, i, 
fdb0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 63 68 65 6d  db->aDb[i].schem
fdc0: 61 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 20  a_cookie);.  }. 
fdd0: 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56   pParse->schemaV
fde0: 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 7d 0a 0a  erified = 1;.}..
fdf0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
fe00: 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
fe10: 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
fe20: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
fe30: 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
fe40: 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
fe50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
fe60: 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
fe70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
fe80: 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
fe90: 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
fea0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
feb0: 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
fec0: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
fed0: 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
fee0: 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
fef0: 20 69 66 20 74 68 65 20 73 65 74 43 68 65 63 6b   if the setCheck
ff00: 70 6f 69 6e 74 20 70 61 72 61 6d 65 74 65 72 20  point parameter 
ff10: 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
ff20: 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
ff30: 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
ff40: 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
ff50: 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
ff60: 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
ff70: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
ff80: 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
ff90: 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
ffa0: 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
ffb0: 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
ffc0: 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
ffd0: 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
ffe0: 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
fff0: 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
10000 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
10010 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
10020 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
10030 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
10040 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
10050 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
10060 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
10070 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
10080 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
10090 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54   be set..**.** T
100a0 68 65 20 74 65 6d 70 4f 6e 6c 79 20 66 6c 61 67  he tempOnly flag
100b0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
100c0 6f 6e 6c 79 20 74 65 6d 70 6f 72 61 72 79 20 74  only temporary t
100d0 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 63 68  ables will be ch
100e0 61 6e 67 65 64 0a 2a 2a 20 64 75 72 69 6e 67 20  anged.** during 
100f0 74 68 69 73 20 77 72 69 74 65 20 6f 70 65 72 61  this write opera
10100 74 69 6f 6e 2e 20 20 54 68 65 20 70 72 69 6d 61  tion.  The prima
10110 72 79 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ry database tabl
10120 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 77 72 69 74  e is not.** writ
10130 65 2d 6c 6f 63 6b 65 64 2e 20 20 4f 6e 6c 79 20  e-locked.  Only 
10140 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61  the temporary da
10150 74 61 62 61 73 65 20 66 69 6c 65 20 67 65 74 73  tabase file gets
10160 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a   a write lock..*
10170 2a 20 4f 74 68 65 72 20 70 72 6f 63 65 73 73 65  * Other processe
10180 73 20 63 61 6e 20 63 6f 6e 74 69 6e 75 65 20 74  s can continue t
10190 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
101a0 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74 61  the primary data
101b0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  base file..*/.vo
101c0 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72  id sqliteBeginWr
101d0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
101e0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
101f0 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69  setCheckpoint, i
10200 6e 74 20 74 65 6d 70 4f 6e 6c 79 29 7b 0a 20 20  nt tempOnly){.  
10210 56 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73  Vdbe *v;.  v = s
10220 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
10230 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
10240 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
10250 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
10260 63 6b 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  ck ) return; /* 
10270 69 66 20 74 68 69 73 20 69 73 20 69 6e 20 61 20  if this is in a 
10280 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 69 66 28  trigger */.  if(
10290 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
102a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
102b0 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
102c0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
102d0 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
102e0 6e 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  n, 1, 0);.    if
102f0 28 20 21 74 65 6d 70 4f 6e 6c 79 20 29 7b 0a 20  ( !tempOnly ){. 
10300 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
10310 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
10320 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Parse->db;.     
10330 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
10340 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
10350 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  on, 0, 0);.     
10360 20 66 6f 72 28 69 3d 32 3b 20 69 3c 64 62 2d 3e   for(i=2; i<db->
10370 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
10380 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
10390 5d 2e 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69  ].pBt==0 ) conti
103a0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
103b0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
103c0 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
103d0 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  i, 0);.      }. 
103e0 20 20 20 20 20 73 71 6c 69 74 65 43 6f 64 65 56       sqliteCodeV
103f0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
10400 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  se);.    }.  }el
10410 73 65 20 69 66 28 20 73 65 74 43 68 65 63 6b 70  se if( setCheckp
10420 6f 69 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  oint ){.    sqli
10430 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
10440 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 30 2c  P_Checkpoint, 0,
10450 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
10460 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
10470 68 65 63 6b 70 6f 69 6e 74 2c 20 31 2c 20 30 29  heckpoint, 1, 0)
10480 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
10490 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
104a0 74 20 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f  t concludes an o
104b0 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 6d 61  peration that ma
104c0 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 0a 2a  y have changed.*
104d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  * the database. 
104e0 20 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70 61   This is a compa
104f0 6e 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f  nion function to
10500 20 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61   BeginWriteOpera
10510 74 69 6f 6e 28 29 2e 0a 2a 2a 20 49 66 20 61 20  tion()..** If a 
10520 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
10530 73 74 61 72 74 65 64 2c 20 74 68 65 6e 20 63 6f  started, then co
10540 6d 6d 69 74 20 69 74 2e 20 20 49 66 20 61 20 63  mmit it.  If a c
10550 68 65 63 6b 70 6f 69 6e 74 20 77 61 73 0a 2a 2a  heckpoint was.**
10560 20 73 74 61 72 74 65 64 20 74 68 65 6e 20 63 6f   started then co
10570 6d 6d 69 74 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f  mmit that..*/.vo
10580 69 64 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74  id sqliteEndWrit
10590 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
105a0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
105b0 65 20 2a 76 3b 0a 20 20 69 66 28 20 70 50 61 72  e *v;.  if( pPar
105c0 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 20  se->trigStack ) 
105d0 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68  return; /* if th
105e0 69 73 20 69 73 20 69 6e 20 61 20 74 72 69 67 67  is is in a trigg
105f0 65 72 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  er */.  v = sqli
10600 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
10610 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
10620 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
10630 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
10640 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
10650 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 4e 6f   ){.    /* Do No
10660 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65  thing */.  }else
10670 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
10680 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d  AddOp(v, OP_Comm
10690 69 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 0, 0);.  }.}
106a0 0a                                               .