/ Hex Artifact Content
Login

Artifact 6694013c86c4c480754f515ddab561302c6e732a:


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 36 20 32 30 30 33 2f 30 34 2f 31 37 20 32  146 2003/04/17 2
0300: 32 3a 35 37 3a 35 33 20 64 72 68 20 45 78 70 20  2:57:53 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 7b  ame);.    }else{
1400: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72  .      sqliteErr
1410: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1420: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
1430: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  ", zName);.    }
1440: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
1450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
1460: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
1470: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
1480: 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61  scribes .** a pa
1490: 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67  rticular index g
14a0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
14b0: 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61   that index.** a
14c0: 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
14d0: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
14e0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e   contains the in
14f0: 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e  dex..** Return N
1500: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
1510: 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
1520: 74 65 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  teFindIndex(sqli
1530: 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  te *db, const ch
1540: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
1550: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49   char *zDb){.  I
1560: 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69  ndex *p = 0;.  i
1570: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1580: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1590: 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69  {.    int j = (i
15a0: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
15b0: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
15c0: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
15d0: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
15e0: 69 74 65 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  iteStrICmp(zDb, 
15f0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
1600: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
1610: 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68    p = sqliteHash
1620: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  Find(&db->aDb[j]
1630: 2e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  .idxHash, zName,
1640: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
1650: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
1660: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
1670: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
1680: 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20  emove the given 
1690: 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69  index from the i
16a0: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c  ndex hash table,
16b0: 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73   and free.** its
16c0: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
16d0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  es..**.** The in
16e0: 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66  dex is removed f
16f0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1700: 20 68 61 73 68 20 74 61 62 6c 65 73 20 62 75 74   hash tables but
1710: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e  .** it is not un
1720: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
1730: 54 61 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e  Table that it in
1740: 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b  dexes..** Unlink
1750: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62  ing from the Tab
1760: 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  le must be done 
1770: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
1780: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
1790: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65  ic void sqliteDe
17a0: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
17b0: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b   *db, Index *p){
17c0: 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a  .  Index *pOld;.
17d0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
17e0: 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20   && p->zName!=0 
17f0: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  );.  pOld = sqli
1800: 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  teHashInsert(&db
1810: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64  ->aDb[p->iDb].id
1820: 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  xHash, p->zName,
1830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1840: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65             strle
1850: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
1860: 29 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d 30  );.  if( pOld!=0
1870: 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20   && pOld!=p ){. 
1880: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
1890: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ert(&db->aDb[p->
18a0: 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f  iDb].idxHash, pO
18b0: 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ld->zName,.     
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61  strlen(pOld->zNa
18e0: 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20  me)+1, pOld);.  
18f0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
1900: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
1910: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64  nk the given ind
1920: 65 78 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c  ex from its tabl
1930: 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a  e, then remove.*
1940: 2a 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d  * the index from
1950: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
1960: 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69  table and free i
1970: 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72  ts memory.** str
1980: 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64  uctures..*/.void
1990: 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64   sqliteUnlinkAnd
19a0: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
19b0: 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  te *db, Index *p
19c0: 49 6e 64 65 78 29 7b 0a 20 20 69 66 28 20 70 49  Index){.  if( pI
19d0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
19e0: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
19f0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62      pIndex->pTab
1a00: 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  le->pIndex = pIn
1a10: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  dex->pNext;.  }e
1a20: 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  lse{.    Index *
1a30: 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 49 6e  p;.    for(p=pIn
1a40: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
1a50: 64 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65  dex; p && p->pNe
1a60: 78 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d  xt!=pIndex; p=p-
1a70: 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69 66  >pNext){}.    if
1a80: 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d  ( p && p->pNext=
1a90: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
1aa0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64   p->pNext = pInd
1ab0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ex->pNext;.    }
1ac0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c  .  }.  sqliteDel
1ad0: 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  eteIndex(db, pIn
1ae0: 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  dex);.}../*.** E
1af0: 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20  rase all schema 
1b00: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
1b10: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
1b20: 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a  ash tables of.**
1b30: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1b40: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
1b50: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
1b60: 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a   reclaim memory.
1b70: 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f  ** before the co
1b80: 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 73 65 73 2e  nnection closes.
1b90: 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c    It is also cal
1ba0: 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  led during a rol
1bb0: 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72  lback.** if ther
1bc0: 65 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68  e were schema ch
1bd0: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
1be0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1bf0: 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68  .** If iDb<=0 th
1c00: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
1c10: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62  ernal schema tab
1c20: 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  les for all data
1c30: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20  base.** files.  
1c40: 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72  If iDb>=2 then r
1c50: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
1c60: 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c  l schema for onl
1c70: 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  y the.** single 
1c80: 66 69 6c 65 20 69 6e 64 69 63 61 74 65 73 2e 0a  file indicates..
1c90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 65  */.void sqliteRe
1ca0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
1cb0: 61 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e  a(sqlite *db, in
1cc0: 74 20 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c  t iDb){.  HashEl
1cd0: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
1ce0: 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20  h temp1;.  Hash 
1cf0: 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20  temp2;.  int i, 
1d00: 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  j;..  assert( iD
1d10: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
1d20: 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  nDb );.  db->fla
1d30: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
1d40: 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72  itialized;.  for
1d50: 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44  (i=iDb; i<db->nD
1d60: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
1d70: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
1d80: 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20  i];.    temp1 = 
1d90: 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  pDb->tblHash;.  
1da0: 20 20 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74    temp2 = pDb->t
1db0: 72 69 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c  rigHash;.    sql
1dc0: 69 74 65 48 61 73 68 49 6e 69 74 28 26 70 44 62  iteHashInit(&pDb
1dd0: 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c 49  ->trigHash, SQLI
1de0: 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  TE_HASH_STRING, 
1df0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48 61  0);.    sqliteHa
1e00: 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 61 46  shClear(&pDb->aF
1e10: 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
1e20: 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e  HashClear(&pDb->
1e30: 69 64 78 48 61 73 68 29 3b 0a 20 20 20 20 66 6f  idxHash);.    fo
1e40: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
1e50: 73 68 46 69 72 73 74 28 26 74 65 6d 70 32 29 3b  shFirst(&temp2);
1e60: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
1e70: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
1e80: 65 6d 29 29 7b 0a 20 20 20 20 20 20 54 72 69 67  em)){.      Trig
1e90: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
1ea0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
1eb0: 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  Elem);.      sql
1ec0: 69 74 65 44 65 6c 65 74 65 54 72 69 67 67 65 72  iteDeleteTrigger
1ed0: 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20  (pTrigger);.    
1ee0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68  }.    sqliteHash
1ef0: 43 6c 65 61 72 28 26 74 65 6d 70 32 29 3b 0a 20  Clear(&temp2);. 
1f00: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69     sqliteHashIni
1f10: 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c  t(&pDb->tblHash,
1f20: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52   SQLITE_HASH_STR
1f30: 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  ING, 0);.    for
1f40: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
1f50: 68 46 69 72 73 74 28 26 74 65 6d 70 31 29 3b 20  hFirst(&temp1); 
1f60: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
1f70: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
1f80: 6d 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  m)){.      Table
1f90: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
1fa0: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
1fb0: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
1fc0: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
1fd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1fe0: 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 65  iteHashClear(&te
1ff0: 6d 70 31 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44  mp1);.    db->aD
2000: 62 5b 69 5d 2e 66 6c 61 67 73 20 26 3d 20 7e 53  b[i].flags &= ~S
2010: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
2020: 64 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30  d;.    if( iDb>0
2030: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
2040: 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20   assert( iDb==0 
2050: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  );.  db->flags &
2060: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
2070: 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49  Changes;..  /* I
2080: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  f one or more of
2090: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
20a0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
20b0: 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20  s been closed,. 
20c0: 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20   ** then remove 
20d0: 74 68 65 6e 20 66 72 6f 6d 20 74 68 65 20 61 75  then from the au
20e0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
20f0: 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20   list.  We take 
2100: 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75  the.  ** opportu
2110: 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20  nity to do this 
2120: 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61  here since we ha
2130: 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  ve just deleted 
2140: 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  all of the.  ** 
2150: 73 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c  schema hash tabl
2160: 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  es and therefore
2170: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
2180: 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73  make any changes
2190: 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20  .  ** to any of 
21a0: 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
21b0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20  */.  for(i=j=2; 
21c0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
21d0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
21e0: 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  [i].pBt==0 ){.  
21f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 64      sqliteFree(d
2200: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29  b->aDb[i].zName)
2210: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ;.      db->aDb[
2220: 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  i].zName = 0;.  
2230: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2240: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20    }.    if( j<i 
2250: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ){.      db->aDb
2260: 5b 6a 2b 2b 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [j++] = db->aDb[
2270: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i];.    }.  }.  
2280: 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b  memset(&db->aDb[
2290: 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d  j], 0, (db->nDb-
22a0: 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44  j)*sizeof(db->aD
22b0: 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44  b[j]));.  db->nD
22c0: 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d  b = j;.  if( db-
22d0: 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61  >nDb<=2 && db->a
22e0: 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db!=db->aDbStati
22f0: 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  c ){.    memcpy(
2300: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64  db->aDbStatic, d
2310: 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66  b->aDb, 2*sizeof
2320: 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20  (db->aDb[0]));. 
2330: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 64 62     sqliteFree(db
2340: 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e  ->aDb);.    db->
2350: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
2360: 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  tic;.  }.}../*.*
2370: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2380: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
2390: 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  r a rollback occ
23a0: 75 72 73 2e 20 20 49 66 20 74 68 65 72 65 20 77  urs.  If there w
23b0: 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68  ere.** schema ch
23c0: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
23d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
23e0: 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  en we have to re
23f0: 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72  set the.** inter
2400: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20  nal hash tables 
2410: 61 6e 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20  and reload them 
2420: 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f  from disk..*/.vo
2430: 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63  id sqliteRollbac
2440: 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  kInternalChanges
2450: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
2460: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
2470: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
2480: 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  nges ){.    sqli
2490: 74 65 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  teResetInternalS
24a0: 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20  chema(db, 0);.  
24b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
24c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
24d0: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
24e0: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
24f0: 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65  sqliteCommitInte
2500: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
2510: 74 65 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 61  te *db){.  db->a
2520: 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  Db[0].schema_coo
2530: 6b 69 65 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63  kie = db->next_c
2540: 6f 6f 6b 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61  ookie;.  db->fla
2550: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
2560: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
2570: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
2580: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
2590: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
25a0: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
25b0: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
25c0: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
25d0: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
25e0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
25f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
2600: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
2610: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
2620: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
2630: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
2640: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
2650: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
2660: 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20  e.  Nor does it 
2670: 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67  remove.** foreig
2680: 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20  n keys from the 
2690: 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73  sqlite.aFKey has
26a0: 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74  h table.  But it
26b0: 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a   does destroy.**
26c0: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
26d0: 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65  es of the indice
26e0: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
26f0: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
2700: 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  th .** the table
2710: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20  ..**.** Indices 
2720: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2730: 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e  the table are un
2740: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
2750: 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72  "db".** data str
2760: 75 63 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55  ucture if db!=NU
2770: 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c  LL.  If db==NULL
2780: 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61 63 68  , indices attach
2790: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62  ed to.** the tab
27a0: 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20  le are deleted, 
27b0: 62 75 74 20 69 74 20 69 73 20 61 73 73 75 6d 65  but it is assume
27c0: 64 20 74 68 65 79 20 68 61 76 65 20 61 6c 72 65  d they have alre
27d0: 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69  ady been.** unli
27e0: 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nked..*/.void sq
27f0: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
2800: 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c  sqlite *db, Tabl
2810: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e  e *pTable){.  in
2820: 74 20 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  t i;.  Index *pI
2830: 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  ndex, *pNext;.  
2840: 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e  FKey *pFKey, *pN
2850: 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20  extFKey;..  if( 
2860: 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75  pTable==0 ) retu
2870: 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  rn;..  /* Delete
2880: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
2890: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
28a0: 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66  s table.  */.  f
28b0: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
28c0: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
28d0: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
28e0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
28f0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
2900: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
2910: 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69  ->iDb==pTable->i
2920: 44 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69  Db || (pTable->i
2930: 44 62 3d 3d 30 20 26 26 20 70 49 6e 64 65 78 2d  Db==0 && pIndex-
2940: 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20  >iDb==1) );.    
2950: 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65  sqliteDeleteInde
2960: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
2970: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
2980: 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  all foreign keys
2990: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
29a0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68   this table.  Th
29b0: 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75  e keys.  ** shou
29c0: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
29d0: 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72  been unlinked fr
29e0: 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79  om the db->aFKey
29f0: 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a   hash table .  *
2a00: 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54  /.  for(pFKey=pT
2a10: 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b  able->pFKey; pFK
2a20: 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46  ey; pFKey=pNextF
2a30: 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46  Key){.    pNextF
2a40: 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65  Key = pFKey->pNe
2a50: 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65  xtFrom;.    asse
2a60: 72 74 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c  rt( pTable->iDb<
2a70: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
2a80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 48 61 73  ssert( sqliteHas
2a90: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70  hFind(&db->aDb[p
2aa0: 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65  Table->iDb].aFKe
2ab0: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
2ad0: 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e  Key->zTo, strlen
2ae0: 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21  (pFKey->zTo)+1)!
2af0: 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71  =pFKey );.    sq
2b00: 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b  liteFree(pFKey);
2b10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
2b20: 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
2b30: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20  cture itself..  
2b40: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2b50: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
2b60: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
2b70: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
2b80: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  i].zName);.    s
2b90: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
2ba0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29  ->aCol[i].zDflt)
2bb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
2bc0: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d  (pTable->aCol[i]
2bd0: 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73  .zType);.  }.  s
2be0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
2bf0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
2c00: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
2c10: 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 53 65  Col);.  sqliteSe
2c20: 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c  lectDelete(pTabl
2c30: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  e->pSelect);.  s
2c40: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
2c50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
2c60: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
2c70: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
2c80: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
2c90: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
2ca0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
2cb0: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
2cc0: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
2cd0: 65 79 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eys..*/.static v
2ce0: 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b  oid sqliteUnlink
2cf0: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
2d00: 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65  qlite *db, Table
2d10: 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70   *p){.  Table *p
2d20: 4f 6c 64 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31  Old;.  FKey *pF1
2d30: 2c 20 2a 70 46 32 3b 0a 20 20 69 6e 74 20 69 20  , *pF2;.  int i 
2d40: 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65  = p->iDb;.  asse
2d50: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 70  rt( db!=0 );.  p
2d60: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Old = sqliteHash
2d70: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
2d80: 69 5d 2e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  i].tblHash, p->z
2d90: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
2da0: 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20  zName)+1, 0);.  
2db0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20  assert( pOld==0 
2dc0: 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20  || pOld==p );.  
2dd0: 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79  for(pF1=p->pFKey
2de0: 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e  ; pF1; pF1=pF1->
2df0: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
2e00: 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e  int nTo = strlen
2e10: 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  (pF1->zTo) + 1;.
2e20: 20 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65      pF2 = sqlite
2e30: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
2e40: 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d  b[i].aFKey, pF1-
2e50: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
2e60: 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a  if( pF2==pF1 ){.
2e70: 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73 68        sqliteHash
2e80: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
2e90: 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a  i].aFKey, pF1->z
2ea0: 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e  To, nTo, pF1->pN
2eb0: 65 78 74 54 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  extTo);.    }els
2ec0: 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e{.      while( 
2ed0: 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65 78  pF2 && pF2->pNex
2ee0: 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32 3d  tTo!=pF1 ){ pF2=
2ef0: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a  pF2->pNextTo; }.
2f00: 20 20 20 20 20 20 69 66 28 20 70 46 32 20 29 7b        if( pF2 ){
2f10: 0a 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70 4e  .        pF2->pN
2f20: 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65  extTo = pF1->pNe
2f30: 78 74 54 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xtTo;.      }.  
2f40: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2f50: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
2f60: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  p);.}../*.** Con
2f70: 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d 65 20  struct the name 
2f80: 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c 65 20  of a user table 
2f90: 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 61 20  or index from a 
2fa0: 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  token..**.** Spa
2fb0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  ce to hold the n
2fc0: 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ame is obtained 
2fd0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
2fe0: 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20  c() and must.** 
2ff0: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
3000: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
3010: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
3020: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
3030: 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  ken(Token *pName
3040: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
3050: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
3060: 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  (pName->z, pName
3070: 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65  ->n);.  sqliteDe
3080: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
3090: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
30a0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
30b0: 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  code to open the
30c0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 73   appropriate mas
30d0: 74 65 72 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ter table.  The 
30e0: 74 61 62 6c 65 0a 2a 2a 20 6f 70 65 6e 65 64 20  table.** opened 
30f0: 77 69 6c 6c 20 62 65 20 53 51 4c 49 54 45 5f 4d  will be SQLITE_M
3100: 41 53 54 45 52 20 66 6f 72 20 70 65 72 73 69 73  ASTER for persis
3110: 74 65 6e 74 20 74 61 62 6c 65 73 20 61 6e 64 20  tent tables and 
3120: 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  .** SQLITE_TEMP_
3130: 4d 41 53 54 45 52 20 66 6f 72 20 74 65 6d 70 6f  MASTER for tempo
3140: 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 54 68  rary tables.  Th
3150: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
3160: 64 0a 2a 2a 20 6f 6e 20 63 75 72 73 6f 72 20 30  d.** on cursor 0
3170: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3180: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
3190: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 73 54  Vdbe *v, int isT
31a0: 65 6d 70 29 7b 0a 20 20 73 71 6c 69 74 65 56 64  emp){.  sqliteVd
31b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
31c0: 74 65 67 65 72 2c 20 69 73 54 65 6d 70 2c 20 30  teger, isTemp, 0
31d0: 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  );.  sqliteVdbeA
31e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
31f0: 72 69 74 65 2c 20 30 2c 20 32 29 3b 0a 7d 0a 0a  rite, 0, 2);.}..
3200: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73  /*.** Begin cons
3210: 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74  tructing a new t
3220: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
3230: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ion in memory.  
3240: 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  This is.** the f
3250: 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20  irst of several 
3260: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
3270: 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20  that get called 
3280: 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74  in response.** t
3290: 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  o a CREATE TABLE
32a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20   statement.  In 
32b0: 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73  particular, this
32c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
32d0: 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69  ed.** after seei
32e0: 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54  ng tokens "CREAT
32f0: 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61  E" and "TABLE" a
3300: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  nd the table nam
3310: 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72  e.  The.** pStar
3320: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43  t token is the C
3330: 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20  REATE and pName 
3340: 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
3350: 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a  e.  The isTemp.*
3360: 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69  * flag is true i
3370: 66 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75  f the table shou
3380: 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ld be stored in 
3390: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
33a0: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
33b0: 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65  nstead of in the
33c0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
33d0: 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ile.  This is no
33e0: 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a  rmally the case.
33f0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d  ** when the "TEM
3400: 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59  P" or "TEMPORARY
3410: 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73  " keyword occurs
3420: 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43   in between.** C
3430: 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e  REATE and TABLE.
3440: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74  .**.** The new t
3450: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69  able record is i
3460: 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70  nitialized and p
3470: 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e  ut in pParse->pN
3480: 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d  ewTable..** As m
3490: 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54  ore of the CREAT
34a0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
34b0: 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64  t is parsed, add
34c0: 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a  itional action.*
34d0: 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  * routines will 
34e0: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64  be called to add
34f0: 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
3500: 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64  n to this record
3510: 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
3520: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
3530: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  BLE statement, t
3540: 68 65 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c  he sqliteEndTabl
3550: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
3560: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
3570: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
3580: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
3590: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
35a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 74 61  /.void sqliteSta
35b0: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
35c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
35d0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
35e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
35f0: 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52 45 41  ,   /* The "CREA
3600: 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54  TE" token */.  T
3610: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
3620: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
3630: 20 6f 72 20 76 69 65 77 20 74 6f 20 63 72 65 61   or view to crea
3640: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  te */.  int isTe
3650: 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp,      /* True
3660: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45   if this is a TE
3670: 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  MP table */.  in
3680: 74 20 69 73 56 69 65 77 20 20 20 20 20 20 20 2f  t isView       /
3690: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
36a0: 73 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20  s a VIEW */.){. 
36b0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
36c0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
36d0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
36e0: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
36f0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
3700: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  *v;.  int iDb;..
3710: 20 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74    pParse->sFirst
3720: 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b  Token = *pStart;
3730: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
3740: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
3750: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
3760: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
3770: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
3780: 65 2d 3e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  e->iDb==1 ) isTe
3790: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
37a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
37b0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
37c0: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
37d0: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 69 66  ==isTemp );.  if
37e0: 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63  ( sqliteAuthChec
37f0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
3800: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
3810: 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30  TABLE(isTemp), 0
3820: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ) ){.    sqliteF
3830: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
3840: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7b 0a  return;.  }.  {.
3850: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
3860: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
3870: 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70        if( isTemp
3880: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
3890: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
38a0: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
38b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
38c0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
38d0: 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20  REATE_VIEW;.    
38e0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
38f0: 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20       if( isTemp 
3900: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
3910: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
3920: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
3930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3940: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
3950: 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20  REATE_TABLE;.   
3960: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
3970: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
3980: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
3990: 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20   zName, 0) ){.  
39a0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
39b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
39c0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  urn;.    }.  }.#
39d0: 65 6e 64 69 66 0a 20 0a 0a 20 20 2f 2a 20 42 65  endif. ..  /* Be
39e0: 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63  fore trying to c
39f0: 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
3a00: 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75  y table, make su
3a10: 72 65 20 74 68 65 20 42 74 72 65 65 20 66 6f 72  re the Btree for
3a20: 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65  .  ** holding te
3a30: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69  mporary tables i
3a40: 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  s open..  */.  i
3a50: 66 28 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d  f( isTemp && db-
3a60: 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26  >aDb[1].pBt==0 &
3a70: 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  & !pParse->expla
3a80: 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  in ){.    int rc
3a90: 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 46 61   = sqliteBtreeFa
3aa0: 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20  ctory(db, 0, 0, 
3ab0: 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e  MAX_PAGES, &db->
3ac0: 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[1].pBt);.   
3ad0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3ae0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
3af0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
3b00: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
3b10: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
3b20: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
3b30: 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
3b40: 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
3b50: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
3b60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
3b70: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
3b80: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
3b90: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
3ba0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
3bb0: 6e 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ns ){.      rc =
3bc0: 20 73 71 6c 69 74 65 42 74 72 65 65 42 65 67 69   sqliteBtreeBegi
3bd0: 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31  nTrans(db->aDb[1
3be0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  ].pBt);.      if
3bf0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3c00: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3c10: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
3c20: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
3c30: 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77  nable to get a w
3c40: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20  rite lock on ". 
3c50: 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65           "the te
3c60: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
3c70: 20 66 69 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20   file", 0);.    
3c80: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
3c90: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ++;.        retu
3ca0: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
3cb0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
3cc0: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
3cd0: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
3ce0: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
3cf0: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
3d00: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
3d10: 61 6d 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ame.  Issue an e
3d20: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20  rror message if 
3d30: 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2a 0a 20 20  it does..  **.  
3d40: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 72 65 2d  ** If we are re-
3d50: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
3d60: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
3d70: 62 65 63 61 75 73 65 20 6f 66 20 61 20 73 63 68  because of a sch
3d80: 65 6d 61 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20  ema.  ** change 
3d90: 61 6e 64 20 61 20 6e 65 77 20 70 65 72 6d 61 6e  and a new perman
3da0: 65 6e 74 20 74 61 62 6c 65 20 69 73 20 66 6f 75  ent table is fou
3db0: 6e 64 20 77 68 6f 73 65 20 6e 61 6d 65 20 63 6f  nd whose name co
3dc0: 6c 6c 69 64 65 73 20 77 69 74 68 0a 20 20 2a 2a  llides with.  **
3dd0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 65 6d   an existing tem
3de0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
3df0: 61 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  at is not an err
3e00: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c  or..  */.  pTabl
3e10: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  e = sqliteFindTa
3e20: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
3e30: 29 3b 0a 20 20 69 44 62 20 3d 20 69 73 54 65 6d  );.  iDb = isTem
3e40: 70 20 3f 20 31 20 3a 20 70 50 61 72 73 65 2d 3e  p ? 1 : pParse->
3e50: 69 44 62 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  iDb;.  if( pTabl
3e60: 65 21 3d 30 20 26 26 20 28 70 54 61 62 6c 65 2d  e!=0 && (pTable-
3e70: 3e 69 44 62 3d 3d 69 44 62 20 7c 7c 20 21 70 50  >iDb==iDb || !pP
3e80: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 29 20  arse->initFlag) 
3e90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
3ea0: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
3eb0: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
3ec0: 20 22 2c 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c   ", 0, pName->z,
3ed0: 20 70 4e 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20   pName->n,.     
3ee0: 20 20 20 22 20 61 6c 72 65 61 64 79 20 65 78 69     " already exi
3ef0: 73 74 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20  sts", 0, 0);.   
3f00: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
3f10: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
3f20: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
3f30: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  rn;.  }.  if( (p
3f40: 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Idx = sqliteFind
3f50: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
3f60: 20 30 29 29 21 3d 30 20 26 26 0a 20 20 20 20 20   0))!=0 &&.     
3f70: 20 20 20 20 20 28 70 49 64 78 2d 3e 69 44 62 3d       (pIdx->iDb=
3f80: 3d 30 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69  =0 || !pParse->i
3f90: 6e 69 74 46 6c 61 67 29 20 29 7b 0a 20 20 20 20  nitFlag) ){.    
3fa0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
3fb0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
3fc0: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
3fd0: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
3fe0: 65 64 20 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e  ed ", .       zN
3ff0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
4000: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
4010: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
4020: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
4030: 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73    }.  pTable = s
4040: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
4050: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
4060: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
4070: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4080: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
4090: 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  rn;.  }.  pTable
40a0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
40b0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
40c0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  = 0;.  pTable->a
40d0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
40e0: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
40f0: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20   pTable->pIndex 
4100: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
4110: 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 66 28 20  Db = iDb;.  if( 
4120: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4130: 65 20 29 20 73 71 6c 69 74 65 44 65 6c 65 74 65  e ) sqliteDelete
4140: 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65  Table(db, pParse
4150: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20  ->pNewTable);.  
4160: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4170: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f  e = pTable;..  /
4180: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
4190: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
41a0: 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65   will insert the
41b0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e   table record in
41c0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  to.  ** the SQLI
41d0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
41e0: 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63    Note in partic
41f0: 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73  ular that we mus
4200: 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20  t go ahead.  ** 
4210: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  and allocate the
4220: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
4230: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  or the table ent
4240: 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20  ry now.  Before 
4250: 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59  any.  ** PRIMARY
4260: 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b   KEY or UNIQUE k
4270: 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73  eywords are pars
4280: 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f  ed.  Those keywo
4290: 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20  rds will cause. 
42a0: 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62   ** indices to b
42b0: 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68  e created and th
42c0: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d  e table record m
42d0: 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20  ust come before 
42e0: 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65  the .  ** indice
42f0: 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72  s.  Hence, the r
4300: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
4310: 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   the table must 
4320: 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a  be allocated.  *
4330: 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  * now..  */.  if
4340: 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  ( !pParse->initF
4350: 6c 61 67 20 26 26 20 28 76 20 3d 20 73 71 6c 69  lag && (v = sqli
4360: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
4370: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
4380: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
4390: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
43a0: 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 69  , isTemp);.    i
43b0: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
43c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
43d0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
43e0: 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  r, db->file_form
43f0: 61 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  at, 0);.      sq
4400: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4410: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30   OP_SetCookie, 0
4420: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
4430: 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72  sqliteOpenMaster
4440: 54 61 62 6c 65 28 76 2c 20 69 73 54 65 6d 70 29  Table(v, isTemp)
4450: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
4460: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
4470: 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ecno, 0, 0);.   
4480: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4490: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
44a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
44b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
44c0: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
44d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
44e0: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
44f0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 0);.  }.}../
4500: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
4510: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
4520: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
4530: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
4540: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
4550: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
4560: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
4570: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
4580: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
4590: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
45a0: 65 6e 74 2e 20 20 73 71 6c 69 74 65 53 74 61 72  ent.  sqliteStar
45b0: 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61  tTable() gets ca
45c0: 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f  lled.** first to
45d0: 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e   get things goin
45e0: 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f  g.  Then this ro
45f0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4600: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75  for each.** colu
4610: 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  mn..*/.void sqli
4620: 74 65 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  teAddColumn(Pars
4630: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
4640: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
4650: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
4660: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
4670: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
4680: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
4690: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
46a0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
46b0: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 7a 2c 20  eSetNString(&z, 
46c0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
46d0: 3e 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a 3d  >n, 0);.  if( z=
46e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
46f0: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 29 3b  qliteDequote(z);
4700: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4710: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
4720: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
4730: 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  mp(z, p->aCol[i]
4740: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
4750: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
4760: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
4770: 72 4d 73 67 2c 20 22 64 75 70 6c 69 63 61 74 65  rMsg, "duplicate
4780: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 22 2c   column name: ",
4790: 20 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50   z, 0);.      pP
47a0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
47b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
47c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
47d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
47e0: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
47f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
4800: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
4810: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
4820: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
4830: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
4840: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
4850: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
4860: 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43  eturn;.    p->aC
4870: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
4880: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
4890: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
48a0: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
48b0: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
48c0: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
48d0: 3d 20 7a 3b 0a 20 20 70 43 6f 6c 2d 3e 73 6f 72  = z;.  pCol->sor
48e0: 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f  tOrder = SQLITE_
48f0: 53 4f 5f 4e 55 4d 3b 0a 20 20 70 2d 3e 6e 43 6f  SO_NUM;.  p->nCo
4900: 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  l++;.}../*.** Th
4910: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4920: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
4930: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
4940: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
4950: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
4960: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
4970: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
4980: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
4990: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
49a0: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
49b0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
49c0: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
49d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
49e0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
49f0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
4a00: 20 73 71 6c 69 74 65 41 64 64 4e 6f 74 4e 75 6c   sqliteAddNotNul
4a10: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
4a20: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
4a30: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
4a40: 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70   i;.  if( (p = p
4a50: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
4a60: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
4a70: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
4a80: 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e    if( i>=0 ) p->
4a90: 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20  aCol[i].notNull 
4aa0: 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  = onError;.}../*
4ab0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4ac0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
4ad0: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
4ae0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
4af0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
4b00: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
4b10: 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74  ent.  The pFirst
4b20: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69   token is the fi
4b30: 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20  rst.** token in 
4b40: 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  the sequence of 
4b50: 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63  tokens that desc
4b60: 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66  ribe the type of
4b70: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63   the.** column c
4b80: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
4b90: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70  onstruction.   p
4ba0: 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74  Last is the last
4bb0: 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65   token.** in the
4bc0: 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20   sequence.  Use 
4bd0: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
4be0: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20   to construct a 
4bf0: 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63  string.** that c
4c00: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65  ontains the type
4c10: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  name of the colu
4c20: 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61  mn and store tha
4c30: 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a  t string.** in z
4c40: 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  Type..*/ .void s
4c50: 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79  qliteAddColumnTy
4c60: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
4c70: 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c  , Token *pFirst,
4c80: 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a   Token *pLast){.
4c90: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
4ca0: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b  t i, j;.  int n;
4cb0: 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a  .  char *z, **pz
4cc0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
4cd0: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
4ce0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
4cf0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
4d00: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
4d10: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
4d20: 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  ;.  pCol = &p->a
4d30: 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26  Col[i];.  pz = &
4d40: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e  pCol->zType;.  n
4d50: 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64   = pLast->n + Ad
4d60: 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41  dr(pLast->z) - A
4d70: 64 64 72 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a  ddr(pFirst->z);.
4d80: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
4d90: 6e 67 28 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a  ng(pz, pFirst->z
4da0: 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a  , n, 0);.  z = *
4db0: 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  pz;.  if( z==0 )
4dc0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4dd0: 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  =j=0; z[i]; i++)
4de0: 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b  {.    int c = z[
4df0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70  i];.    if( issp
4e00: 61 63 65 28 63 29 20 29 20 63 6f 6e 74 69 6e 75  ace(c) ) continu
4e10: 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20  e;.    z[j++] = 
4e20: 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  c;.  }.  z[j] = 
4e30: 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  0;.  if( pParse-
4e40: 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  >db->file_format
4e50: 3e 3d 34 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d  >=4 ){.    pCol-
4e60: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 71 6c  >sortOrder = sql
4e70: 69 74 65 43 6f 6c 6c 61 74 65 54 79 70 65 28 7a  iteCollateType(z
4e80: 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , n);.  }else{. 
4e90: 20 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64     pCol->sortOrd
4ea0: 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e  er = SQLITE_SO_N
4eb0: 55 4d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  UM;.  }.}../*.**
4ec0: 20 54 68 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e   The given token
4ed0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
4ee0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6c 61  value for the la
4ef0: 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
4f00: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
4f10: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
4f20: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49  construction.  I
4f30: 66 20 22 6d 69 6e 75 73 46 6c 61 67 22 20 69 73  f "minusFlag" is
4f40: 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61   true, it.** mea
4f50: 6e 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 6b  ns the value tok
4f60: 65 6e 20 77 61 73 20 70 72 65 63 65 64 65 64 20  en was preceded 
4f70: 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e  by a minus sign.
4f80: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4f90: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
4fa0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
4fb0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
4fc0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
4fd0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
4fe0: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
4ff0: 73 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74  sqliteAddDefault
5000: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
5010: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c  rse, Token *pVal
5020: 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29  , int minusFlag)
5030: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
5040: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a  int i;.  char **
5050: 70 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  pz;.  if( (p = p
5060: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5070: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
5080: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
5090: 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
50a0: 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61  rn;.  pz = &p->a
50b0: 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20  Col[i].zDflt;.  
50c0: 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b  if( minusFlag ){
50d0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
50e0: 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31  tring(pz, "-", 1
50f0: 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d  , pVal->z, pVal-
5100: 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  >n, 0);.  }else{
5110: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
5120: 74 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e  tring(pz, pVal->
5130: 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a  z, pVal->n, 0);.
5140: 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 71 75    }.  sqliteDequ
5150: 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  ote(*pz);.}../*.
5160: 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65  ** Designate the
5170: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72   PRIMARY KEY for
5180: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69   the table.  pLi
5190: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
51a0: 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c  names .** of col
51b0: 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  umns that form t
51c0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  he primary key. 
51d0: 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c   If pList is NUL
51e0: 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d  L, then the.** m
51f0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
5200: 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ed column of the
5210: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72   table is the pr
5220: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
5230: 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76   A table can hav
5240: 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72  e at most one pr
5250: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74  imary key.  If t
5260: 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
5270: 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72   has.** a primar
5280: 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20  y key (and this 
5290: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72  is the second pr
52a0: 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20  imary key) then 
52b0: 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72  create an.** err
52c0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
52d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
52e0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  on a single colu
52f0: 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70  mn whose datatyp
5300: 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a  e is INTEGER,.**
5310: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72   then we will tr
5320: 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f  y to use that co
5330: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 20  lumn as the row 
5340: 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e 3a  id.  (Exception:
5350: 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72 64  .** For backward
5360: 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
5370: 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61 62  with older datab
5380: 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20  ases, do not do 
5390: 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20 66  this.** if the f
53a0: 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73 69  ile format versi
53b0: 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  on number is les
53c0: 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74 20  s than 1.)  Set 
53d0: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
53e0: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
53f0: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
5400: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
5410: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
5420: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
5430: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
5440: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
5450: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
5460: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
5470: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
5480: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
5490: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
54a0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
54b0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
54c0: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
54d0: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
54e0: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
54f0: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
5500: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
5510: 64 20 73 71 6c 69 74 65 41 64 64 50 72 69 6d 61  d sqliteAddPrima
5520: 72 79 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  ryKey(Parse *pPa
5530: 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  rse, IdList *pLi
5540: 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  st, int onError)
5550: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
5560: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
5570: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79  ble;.  char *zTy
5580: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  pe = 0;.  int iC
5590: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70  ol = -1;.  if( p
55a0: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72  Tab==0 ) goto pr
55b0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
55c0: 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50    if( pTab->hasP
55d0: 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  rimKey ){.    sq
55e0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
55f0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
5600: 22 74 61 62 6c 65 20 5c 22 22 2c 20 70 54 61 62  "table \"", pTab
5610: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
5620: 20 20 22 5c 22 20 68 61 73 20 6d 6f 72 65 20 74    "\" has more t
5630: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
5640: 6b 65 79 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  key", 0);.    pP
5650: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
5660: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
5670: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
5680: 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20  Tab->hasPrimKey 
5690: 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 1;.  if( pList
56a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
56b0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
56c0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c  ;.  }else if( pL
56d0: 69 73 74 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a 20  ist->nId==1 ){. 
56e0: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
56f0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
5700: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iCol++){.      i
5710: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
5720: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61  (pList->a[0].zNa
5730: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  me, pTab->aCol[i
5740: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col].zName)==0 )
5750: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5760: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
5770: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
5780: 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  ol ){.    zType 
5790: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
57a0: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20  l].zType;.  }.  
57b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
57c0: 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 31 20 26  file_format>=1 &
57d0: 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a 54  & .           zT
57e0: 79 70 65 20 26 26 20 73 71 6c 69 74 65 53 74 72  ype && sqliteStr
57f0: 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54  ICmp(zType, "INT
5800: 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20  EGER")==0 ){.   
5810: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69   pTab->iPKey = i
5820: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b  Col;.    pTab->k
5830: 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72  eyConf = onError
5840: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
5850: 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78  qliteCreateIndex
5860: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 70  (pParse, 0, 0, p
5870: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
5880: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  , 0, 0);.    pLi
5890: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
58a0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
58b0: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
58c0: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65  ete(pList);.  re
58d0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  turn;.}../*.** R
58e0: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
58f0: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
5900: 74 79 70 65 20 67 69 76 65 6e 20 61 20 74 79 70  type given a typ
5910: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e name..**.** Th
5920: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  e collation type
5930: 20 69 73 20 74 65 78 74 20 28 53 51 4c 49 54 45   is text (SQLITE
5940: 5f 53 4f 5f 54 45 58 54 29 20 69 66 20 74 68 65  _SO_TEXT) if the
5950: 20 74 79 70 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f   type.** name co
5960: 6e 74 61 69 6e 73 20 74 68 65 20 63 68 61 72 61  ntains the chara
5970: 63 74 65 72 20 73 74 72 65 61 6d 20 22 74 65 78  cter stream "tex
5980: 74 22 20 6f 72 20 22 62 6c 6f 62 22 20 6f 72 0a  t" or "blob" or.
5990: 2a 2a 20 22 63 6c 6f 62 22 2e 20 20 41 6e 79 20  ** "clob".  Any 
59a0: 6f 74 68 65 72 20 74 79 70 65 20 6e 61 6d 65 20  other type name 
59b0: 69 73 20 63 6f 6c 6c 61 74 65 64 20 61 73 20 6e  is collated as n
59c0: 75 6d 65 72 69 63 0a 2a 2a 20 28 53 51 4c 49 54  umeric.** (SQLIT
59d0: 45 5f 53 4f 5f 4e 55 4d 29 2e 0a 2a 2f 0a 69 6e  E_SO_NUM)..*/.in
59e0: 74 20 73 71 6c 69 74 65 43 6f 6c 6c 61 74 65 54  t sqliteCollateT
59f0: 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
5a00: 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65  zType, int nType
5a10: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
5a20: 72 28 69 3d 30 3b 20 69 3c 6e 54 79 70 65 2d 31  r(i=0; i<nType-1
5a30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74  ; i++){.    swit
5a40: 63 68 28 20 7a 54 79 70 65 5b 69 5d 20 29 7b 0a  ch( zType[i] ){.
5a50: 20 20 20 20 20 20 63 61 73 65 20 27 62 27 3a 0a        case 'b':.
5a60: 20 20 20 20 20 20 63 61 73 65 20 27 42 27 3a 20        case 'B': 
5a70: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  {.        if( i<
5a80: 6e 54 79 70 65 2d 33 20 26 26 20 73 71 6c 69 74  nType-3 && sqlit
5a90: 65 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65  eStrNICmp(&zType
5aa0: 5b 69 5d 2c 22 62 6c 6f 62 22 2c 34 29 3d 3d 30  [i],"blob",4)==0
5ab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
5ac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54  turn SQLITE_SO_T
5ad0: 45 58 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EXT;.        }. 
5ae0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5af0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5b00: 20 27 63 27 3a 0a 20 20 20 20 20 20 63 61 73 65   'c':.      case
5b10: 20 27 43 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   'C': {.        
5b20: 69 66 28 20 69 3c 6e 54 79 70 65 2d 33 20 26 26  if( i<nType-3 &&
5b30: 20 28 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70   (sqliteStrNICmp
5b40: 28 26 7a 54 79 70 65 5b 69 5d 2c 22 63 68 61 72  (&zType[i],"char
5b50: 22 2c 34 29 3d 3d 30 20 7c 7c 0a 20 20 20 20 20  ",4)==0 ||.     
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b70: 20 20 20 20 20 20 73 71 6c 69 74 65 53 74 72 4e        sqliteStrN
5b80: 49 43 6d 70 28 26 7a 54 79 70 65 5b 69 5d 2c 22  ICmp(&zType[i],"
5b90: 63 6c 6f 62 22 2c 34 29 3d 3d 30 29 0a 20 20 20  clob",4)==0).   
5ba0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
5bb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5bc0: 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 20  SO_TEXT;.       
5bd0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
5be0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5bf0: 63 61 73 65 20 27 78 27 3a 0a 20 20 20 20 20 20  case 'x':.      
5c00: 63 61 73 65 20 27 58 27 3a 20 7b 0a 20 20 20 20  case 'X': {.    
5c10: 20 20 20 20 69 66 28 20 69 3e 3d 32 20 26 26 20      if( i>=2 && 
5c20: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26  sqliteStrNICmp(&
5c30: 7a 54 79 70 65 5b 69 2d 32 5d 2c 22 74 65 78 74  zType[i-2],"text
5c40: 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",4)==0 ){.     
5c50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
5c60: 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20  TE_SO_TEXT;.    
5c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
5c80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5c90: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5ca0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5cb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5cc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53   return SQLITE_S
5cd0: 4f 5f 4e 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  O_NUM;.}../*.** 
5ce0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5cf0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
5d00: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
5d10: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
5d20: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
5d30: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5d40: 20 20 41 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c    A "COLLATE" cl
5d50: 61 75 73 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e  ause has.** been
5d60: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
5d70: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
5d80: 20 73 65 74 73 20 74 68 65 20 43 6f 6c 75 6d 6e   sets the Column
5d90: 2e 73 6f 72 74 4f 72 64 65 72 20 6f 6e 0a 2a 2a  .sortOrder on.**
5da0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
5db0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
5dc0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
5dd0: 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 6c 61  d sqliteAddColla
5de0: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
5df0: 61 72 73 65 2c 20 69 6e 74 20 63 6f 6c 6c 54 79  arse, int collTy
5e00: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
5e10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5e20: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
5e30: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
5e40: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
5e50: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30  ol-1;.  if( i>=0
5e60: 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 73 6f   ) p->aCol[i].so
5e70: 72 74 4f 72 64 65 72 20 3d 20 63 6f 6c 6c 54 79  rtOrder = collTy
5e80: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  pe;.}../*.** Com
5e90: 65 20 75 70 20 77 69 74 68 20 61 20 6e 65 77 20  e up with a new 
5ea0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72  random value for
5eb0: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
5ec0: 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a  ie.  Make sure.*
5ed0: 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  * the new value 
5ee0: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
5ef0: 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a  m the old..**.**
5f00: 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   The schema cook
5f10: 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ie is used to de
5f20: 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65  termine when the
5f30: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a   schema for the.
5f40: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
5f50: 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68  ges.  After each
5f60: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
5f70: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
5f80: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68  .** changes.  Wh
5f90: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72  en a process fir
5fa0: 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68  st reads the sch
5fb0: 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74  ema it records t
5fc0: 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54  he.** cookie.  T
5fd0: 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65  hereafter, whene
5fe0: 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61  ver it goes to a
5ff0: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
6000: 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73  se,.** it checks
6010: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d   the cookie to m
6020: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68  ake sure the sch
6030: 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ema has not chan
6040: 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20  ged.** since it 
6050: 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a  was last read..*
6060: 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69  *.** This plan i
6070: 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
6080: 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20   bullet-proof.  
6090: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
60a0: 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  or.** the schema
60b0: 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69   to change multi
60c0: 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f  ple times and fo
60d0: 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  r the cookie to 
60e0: 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74  be.** set back t
60f0: 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20  o prior value.  
6100: 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67  But schema chang
6110: 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e  es are infrequen
6120: 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f  t.** and the pro
6130: 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74  bability of hitt
6140: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  ing the same coo
6150: 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  kie value is onl
6160: 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e  y.** 1 chance in
6170: 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65   2^32.  So we're
6180: 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f   safe enough..*/
6190: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 68 61 6e  .void sqliteChan
61a0: 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20  geCookie(sqlite 
61b0: 2a 64 62 2c 20 56 64 62 65 20 2a 76 29 7b 0a 20  *db, Vdbe *v){. 
61c0: 20 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f   if( db->next_co
61d0: 6f 6b 69 65 3d 3d 64 62 2d 3e 61 44 62 5b 30 5d  okie==db->aDb[0]
61e0: 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29  .schema_cookie )
61f0: 7b 0a 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63  {.    db->next_c
6200: 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 61 44 62 5b  ookie = db->aDb[
6210: 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  0].schema_cookie
6220: 20 2b 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42   + sqliteRandomB
6230: 79 74 65 28 29 20 2b 20 31 3b 0a 20 20 20 20 64  yte() + 1;.    d
6240: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
6250: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
6260: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
6270: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
6280: 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f  ger, db->next_co
6290: 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  okie, 0);.    sq
62a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
62b0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30   OP_SetCookie, 0
62c0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
62d0: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
62e0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
62f0: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
6300: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
6310: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
6320: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
6330: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
6340: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
6350: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
6360: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
6370: 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  minator..*/.stat
6380: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
6390: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
63a0: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  ){.  int n;.  in
63b0: 74 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 30 3b  t needQuote = 0;
63c0: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
63d0: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
63e0: 66 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e  f( *z=='\'' ){ n
63f0: 2b 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b  ++; needQuote=1;
6400: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6410: 6e 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b  n + needQuote*2;
6420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
6430: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  an identifier on
6440: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
6450: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20  e given string. 
6460: 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68   Add.** quote ch
6470: 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65 64  aracters as need
6480: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
6490: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
64a0: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
64b0: 63 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20  char *zIdent){. 
64c0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51   int i, j, needQ
64d0: 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64  uote;.  i = *pId
64e0: 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  x;.  for(j=0; zI
64f0: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
6500: 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28     if( !isalnum(
6510: 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49  zIdent[j]) && zI
6520: 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62  dent[j]!='_' ) b
6530: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64  reak;.  }.  need
6540: 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b  Quote =  zIdent[
6550: 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74  j]!=0 || isdigit
6560: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
6580: 20 73 71 6c 69 74 65 4b 65 79 77 6f 72 64 43 6f   sqliteKeywordCo
6590: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
65a0: 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64  K_ID;.  if( need
65b0: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
65c0: 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30   '\'';.  for(j=0
65d0: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
65e0: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
65f0: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
6600: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c  f( zIdent[j]=='\
6610: 27 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c  '' ) z[i++] = '\
6620: 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  '';.  }.  if( ne
6630: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
6640: 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20   = '\'';.  z[i] 
6650: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
6660: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
6670: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
6680: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
6690: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
66a0: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
66b0: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
66c0: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
66d0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
66e0: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
66f0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
6700: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
6710: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
6720: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
6730: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
6740: 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a  ableStmt(Table *
6750: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20  p){.  int i, k, 
6760: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  n;.  char *zStmt
6770: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  ;.  char *zSep, 
6780: 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20  *zSep2, *zEnd;. 
6790: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   n = 0;.  for(i=
67a0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
67b0: 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65  +){.    n += ide
67c0: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c  ntLength(p->aCol
67d0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
67e0: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
67f0: 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  th(p->zName);.  
6800: 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20  if( n<40 ){.    
6810: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
6820: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
6830: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
6840: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
6850: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
6860: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
6870: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
6880: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
6890: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
68a0: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
68b0: 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20  Raw( n );.  if( 
68c0: 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  zStmt==0 ) retur
68d0: 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53  n 0;.  strcpy(zS
68e0: 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f  tmt, p->iDb==1 ?
68f0: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
6900: 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45 20  BLE " : "CREATE 
6910: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
6920: 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20  strlen(zStmt);. 
6930: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
6940: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
6950: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
6960: 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  (';.  for(i=0; i
6970: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
6980: 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d      strcpy(&zStm
6990: 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20  t[k], zSep);.   
69a0: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53   k += strlen(&zS
69b0: 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65  tmt[k]);.    zSe
69c0: 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69  p = zSep2;.    i
69d0: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
69e0: 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  k, p->aCol[i].zN
69f0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63  ame);.  }.  strc
6a00: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45  py(&zStmt[k], zE
6a10: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
6a20: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
6a30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
6a40: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
6a50: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
6a60: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
6a70: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6a80: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
6a90: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
6aa0: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
6ab0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
6ac0: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
6ad0: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
6ae0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
6af0: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
6b00: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
6b10: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
6b20: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
6b30: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
6b40: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
6b50: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
6b60: 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69 73  ,.** unless this
6b70: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
6b80: 74 61 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c 61  table or initFla
6b90: 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74  g==1.  When init
6ba0: 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20 6d  Flag==1,.** it m
6bb0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
6bc0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
6bd0: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
6be0: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
6bf0: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
6c00: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
6c10: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
6c20: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
6c30: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
6c40: 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ges, so the entr
6c50: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
6c60: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
6c70: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
6c80: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
6c90: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
6ca0: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
6cb0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
6cc0: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
6cd0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
6ce0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
6cf0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
6d00: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
6d10: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
6d20: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
6d30: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
6d40: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
6d50: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
6d60: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
6d70: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
6d80: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
6d90: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
6da0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
6db0: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
6dc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
6dd0: 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65  oken *pEnd, Sele
6de0: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
6df0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
6e00: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
6e10: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  >db;..  if( (pEn
6e20: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
6e30: 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  =0) || pParse->n
6e40: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
6e50: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
6e60: 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72  turn;.  p = pPar
6e70: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
6e80: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
6e90: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  rn;..  /* If the
6ea0: 20 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61   table is genera
6eb0: 74 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43  ted from a SELEC
6ec0: 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63  T, then construc
6ed0: 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20  t the.  ** list 
6ee0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  of columns and t
6ef0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 74  he text of the t
6f00: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
6f10: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
6f20: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d  Table *pSelTab =
6f30: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
6f40: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
6f50: 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20   0, pSelect);.  
6f60: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
6f70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61   ) return;.    a
6f80: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d  ssert( p->aCol==
6f90: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  0 );.    p->nCol
6fa0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
6fb0: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  ;.    p->aCol = 
6fc0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
6fd0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
6fe0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
6ff0: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
7000: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
7010: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
7020: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
7030: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69   initFlag is 1 i
7040: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
7050: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
7060: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
7070: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
7080: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
7090: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
70a0: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
70b0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
70c0: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
70d0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
70e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
70f0: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
7100: 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73 65 2d  from the pParse-
7110: 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  >newTnum field. 
7120: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
7130: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
7140: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
7150: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
7160: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
7170: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
7180: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
7190: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50 61     p->tnum = pPa
71a0: 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20  rse->newTnum;.  
71b0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
71c0: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
71d0: 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
71e0: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
71f0: 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
7200: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
7210: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
7220: 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64  ase.  The record
7230: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
7240: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65   the new table e
7250: 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65  ntry should alre
7260: 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74  ady be on the st
7270: 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ack..  **.  ** I
7280: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
7290: 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
72a0: 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
72b0: 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
72c0: 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
72d0: 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
72e0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
72f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
7300: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
7310: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
7320: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76   Vdbe *v;..    v
7330: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
7340: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
7350: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
7360: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
7370: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
7380: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
7390: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  le */.      sqli
73a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
73b0: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30  P_CreateTable, 0
73c0: 2c 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20  , p->iDb);.     
73d0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
73e0: 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
73f0: 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f   *)&p->tnum, P3_
7400: 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65  POINTER);.    }e
7410: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
7420: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71  view */.      sq
7430: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7440: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
7450: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  0);.    }.    p-
7460: 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 73  >tnum = 0;.    s
7470: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7480: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
7490: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
74a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
74b0: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ng, 0, 0);.    i
74c0: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
74d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
74e0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
74f0: 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20 50 33 5f  -1, "table", P3_
7500: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 65 6c  STATIC);.    }el
7510: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
7520: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
7530: 2d 31 2c 20 22 76 69 65 77 22 2c 20 50 33 5f 53  -1, "view", P3_S
7540: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  TATIC);.    }.  
7550: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7560: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
7570: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
7580: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
7590: 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50   -1, p->zName, P
75a0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
75b0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
75c0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
75d0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
75e0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
75f0: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  , p->zName, P3_S
7600: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
7610: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7620: 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20 20  P_Dup, 4, 0);.  
7630: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7640: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
7650: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
7660: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
7670: 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65  char *z = create
7680: 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20  TableStmt(p);.  
7690: 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c      n = z ? strl
76a0: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20  en(z) : 0;.     
76b0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
76c0: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29  eP3(v, -1, z, n)
76d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
76e0: 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ee(z);.    }else
76f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
7700: 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20  pEnd!=0 );.     
7710: 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e   n = Addr(pEnd->
7720: 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73 65  z) - Addr(pParse
7730: 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29  ->sFirstToken.z)
7740: 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 1;.      sqli
7750: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
7760: 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46  , -1, pParse->sF
7770: 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b  irstToken.z, n);
7780: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7790: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
77a0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20  _MakeRecord, 5, 
77b0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
77c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
77d0: 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a  tIntKey, 0, 0);.
77e0: 20 20 20 20 69 66 28 20 21 70 2d 3e 69 44 62 20      if( !p->iDb 
77f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43  ){.      sqliteC
7800: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
7810: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
7820: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7830: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
7840: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
7850: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
7860: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
7870: 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62  _Integer, p->iDb
7880: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7890: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
78a0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
78b0: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
78c0: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
78d0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70    sqliteSelect(p
78e0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
78f0: 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c  SRT_Table, 1, 0,
7900: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
7910: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
7920: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
7930: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
7940: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
7950: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
7960: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
7970: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
7980: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
7990: 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61  xplain==0 && pPa
79a0: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
79b0: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
79c0: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
79d0: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
79e0: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
79f0: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74  b->aDb[p->iDb].t
7a00: 62 6c 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  blHash, .       
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73       p->zName, s
7a30: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
7a40: 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  1, p);.    if( p
7a50: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
7a60: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
7a70: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
7a80: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
7a90: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
7aa0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
7ab0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
7ac0: 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  FKey=p->pFKey; p
7ad0: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65  FKey; pFKey=pFKe
7ae0: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  y->pNextFrom){. 
7af0: 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73       int nTo = s
7b00: 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f  trlen(pFKey->zTo
7b10: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b  ) + 1;.      pFK
7b20: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71  ey->pNextTo = sq
7b30: 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64 62  liteHashFind(&db
7b40: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46  ->aDb[p->iDb].aF
7b50: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
7b60: 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c   nTo);.      sql
7b70: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
7b80: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61  b->aDb[p->iDb].a
7b90: 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f  FKey, pFKey->zTo
7ba0: 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20  , nTo, pFKey);. 
7bb0: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
7bc0: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
7bd0: 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b      db->nTable++
7be0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
7bf0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
7c00: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a  Changes;.  }.}..
7c10: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
7c20: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
7c30: 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
7c40: 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
7c50: 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
7c60: 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
7c70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7c80: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
7c90: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
7ca0: 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
7cb0: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
7cc0: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
7cd0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
7ce0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
7cf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b        /* The tok
7d00: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
7d10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
7d20: 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ew */.  Select *
7d30: 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
7d40: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7d50: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
7d60: 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
7d70: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20  /.  int isTemp  
7d80: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
7d90: 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
7da0: 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  iew */.){.  Tabl
7db0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
7dc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
7dd0: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 0a 20    Token sEnd;.. 
7de0: 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c   sqliteStartTabl
7df0: 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e  e(pParse, pBegin
7e00: 2c 20 70 4e 61 6d 65 2c 20 69 73 54 65 6d 70 2c  , pName, isTemp,
7e10: 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   1);.  p = pPars
7e20: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
7e30: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
7e40: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
7e50: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
7e60: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
7e70: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
7e80: 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
7e90: 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c  f the entire SEL
7ea0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
7eb0: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
7ec0: 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77  iew..  ** This w
7ed0: 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68  ill force all th
7ee0: 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76  e Expr.token.z v
7ef0: 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61  alues to be dyna
7f00: 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c  mically.  ** all
7f10: 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68  ocated rather th
7f20: 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  an point to the 
7f30: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77  input string - w
7f40: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a  hich means that.
7f50: 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70    ** they will p
7f60: 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65  ersist after the
7f70: 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 5f   current sqlite_
7f80: 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75  exec() call retu
7f90: 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  rns..  */.  p->p
7fa0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53  Select = sqliteS
7fb0: 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63 74  electDup(pSelect
7fc0: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63  );.  sqliteSelec
7fd0: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
7fe0: 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  ;.  if( !pParse-
7ff0: 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20  >initFlag ){.   
8000: 20 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f   sqliteViewGetCo
8010: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
8020: 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , p);.  }..  /* 
8030: 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f  Locate the end o
8040: 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45  f the CREATE VIE
8050: 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61  W statement.  Ma
8060: 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f  ke sEnd point to
8070: 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20  .  ** the end.. 
8080: 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61   */.  sEnd = pPa
8090: 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b  rse->sLastToken;
80a0: 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d  .  if( sEnd.z[0]
80b0: 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d  !=0 && sEnd.z[0]
80c0: 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e  !=';' ){.    sEn
80d0: 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20  d.z += sEnd.n;. 
80e0: 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b   }.  sEnd.n = 0;
80f0: 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e  .  n = ((int)sEn
8100: 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67  d.z) - (int)pBeg
8110: 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65  in->z;.  z = pBe
8120: 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
8130: 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d   n>0 && (z[n-1]=
8140: 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28  =';' || isspace(
8150: 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b  z[n-1])) ){ n--;
8160: 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a   }.  sEnd.z = &z
8170: 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20  [n-1];.  sEnd.n 
8180: 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73  = 1;..  /* Use s
8190: 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20  qliteEndTable() 
81a0: 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
81b0: 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
81c0: 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
81d0: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 70  sqliteEndTable(p
81e0: 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29  Parse, &sEnd, 0)
81f0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
8200: 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
8210: 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20  tructure pTable 
8220: 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57  is really a VIEW
8230: 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e  .  Fill in the n
8240: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63  ames of.** the c
8250: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69  olumns of the vi
8260: 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65  ew in the pTable
8270: 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74   structure.  Ret
8280: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  urn the number.*
8290: 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  * of errors.  If
82a0: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
82b0: 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  n leave an error
82c0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
82d0: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
82e0: 6e 74 20 73 71 6c 69 74 65 56 69 65 77 47 65 74  nt sqliteViewGet
82f0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73  ColumnNames(Pars
8300: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
8310: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78 70   *pTable){.  Exp
8320: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
8330: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
8340: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
8350: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
8360: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
8370: 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f  le );..  /* A po
8380: 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
8390: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
83a0: 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
83b0: 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
83c0: 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
83d0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
83e0: 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
83f0: 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
8400: 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
8410: 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
8420: 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
8430: 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
8440: 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
8450: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
8460: 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
8470: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
8480: 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
8490: 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
84a0: 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
84b0: 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
84c0: 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
84d0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
84e0: 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
84f0: 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
8500: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
8510: 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
8520: 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
8530: 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
8540: 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61  this error is ca
8550: 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20  ught previously 
8560: 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  and so the follo
8570: 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73  wing test.  ** s
8580: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69  hould always fai
8590: 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  l.  But we will 
85a0: 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63  leave it in plac
85b0: 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  e just to be saf
85c0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  e..  */.  if( pT
85d0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a  able->nCol<0 ){.
85e0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
85f0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
8600: 72 4d 73 67 2c 20 22 76 69 65 77 20 22 2c 20 70  rMsg, "view ", p
8610: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Table->zName,.  
8620: 20 20 20 20 20 20 20 22 20 69 73 20 63 69 72 63         " is circ
8630: 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
8640: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
8650: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
8660: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
8670: 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
8680: 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65  far, it means we
8690: 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
86a0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73   the table names
86b0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
86c0: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
86d0: 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d   ); /* If nCol==
86e0: 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d  0, then pTable m
86f0: 75 73 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f  ust be a VIEW */
8700: 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65  .  pSel = pTable
8710: 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
8720: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
8730: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 52 65 73  all to sqliteRes
8740: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
8750: 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
8760: 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
8770: 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e  ts in this list.
8780: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65    But we will ne
8790: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
87a0: 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b  e list.  ** back
87b0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
87c0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61   configuration a
87d0: 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65  fterwards, so we
87e0: 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a   save a copy of.
87f0: 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
8800: 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a  l in pEList..  *
8810: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  /.  pEList = pSe
8820: 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65  l->pEList;.  pSe
8830: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  l->pEList = sqli
8840: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 45  teExprListDup(pE
8850: 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65  List);.  if( pSe
8860: 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  l->pEList==0 ){.
8870: 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74      pSel->pEList
8880: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72   = pEList;.    r
8890: 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c  eturn 1;  /* Mal
88a0: 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
88b0: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  }.  pTable->nCol
88c0: 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62   = -1;.  pSelTab
88d0: 20 3d 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53   = sqliteResultS
88e0: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
88f0: 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69  e, 0, pSel);.  i
8900: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
8910: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
8920: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
8930: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
8940: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
8950: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
8960: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
8970: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43  .    pSelTab->nC
8980: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  ol = 0;.    pSel
8990: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
89a0: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
89b0: 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29  able(0, pSelTab)
89c0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  ;.    pParse->db
89d0: 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44  ->aDb[pTable->iD
89e0: 62 5d 2e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b].flags |= SQLI
89f0: 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b  TE_UnresetViews;
8a00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
8a10: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
8a20: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
8a30: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e    sqliteSelectUn
8a40: 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71  bind(pSel);.  sq
8a50: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
8a60: 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29  te(pSel->pEList)
8a70: 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ;.  pSel->pEList
8a80: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74   = pEList;.  ret
8a90: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f  urn nErr;  .}../
8aa0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
8ab0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
8ac0: 20 74 68 65 20 56 49 45 57 20 70 54 61 62 6c 65   the VIEW pTable
8ad0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8ae0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
8af0: 68 65 6e 65 76 65 72 20 61 6e 79 20 6f 74 68 65  henever any othe
8b00: 72 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  r table or view 
8b10: 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20  is modified..** 
8b20: 54 68 65 20 76 69 65 77 20 70 61 73 73 65 64 20  The view passed 
8b30: 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  into this routin
8b40: 65 20 6d 69 67 68 74 20 64 65 70 65 6e 64 20 64  e might depend d
8b50: 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72  irectly or indir
8b60: 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20  ectly.** on the 
8b70: 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c 65  modified or dele
8b80: 74 65 64 20 74 61 62 6c 65 20 73 6f 20 77 65 20  ted table so we 
8b90: 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68  need to clear th
8ba0: 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  e old column.** 
8bb0: 6e 61 6d 65 73 20 73 6f 20 74 68 61 74 20 74 68  names so that th
8bc0: 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d  ey will be recom
8bd0: 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  puted..*/.static
8be0: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
8bf0: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
8c00: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
8c10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
8c20: 70 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 54 61  pTable==0 || pTa
8c30: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ble->pSelect==0 
8c40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
8c50: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30 20  pTable->nCol==0 
8c60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
8c70: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
8c80: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Col; i++){.    s
8c90: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
8ca0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
8cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
8cc0: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d  (pTable->aCol[i]
8cd0: 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c  .zDflt);.    sql
8ce0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
8cf0: 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a  aCol[i].zType);.
8d00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
8d10: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a  (pTable->aCol);.
8d20: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
8d30: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43   0;.  pTable->nC
8d40: 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol = 0;.}../*.**
8d50: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
8d60: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
8d70: 72 79 20 56 49 45 57 2e 0a 2a 2f 0a 73 74 61 74  ry VIEW..*/.stat
8d80: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
8d90: 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74  ewResetAll(sqlit
8da0: 65 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b  e *db, int idx){
8db0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
8dc0: 20 20 69 66 28 20 28 64 62 2d 3e 61 44 62 5b 69    if( (db->aDb[i
8dd0: 64 78 5d 2e 66 6c 61 67 73 20 26 20 53 51 4c 49  dx].flags & SQLI
8de0: 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  TE_UnresetViews)
8df0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8e00: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
8e10: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
8e20: 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b  dx].tblHash); i;
8e30: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
8e40: 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
8e50: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
8e60: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
8e70: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
8e80: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
8e90: 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e  eViewResetColumn
8ea0: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
8eb0: 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62   }.  }.  db->aDb
8ec0: 5b 69 64 78 5d 2e 66 6c 61 67 73 20 26 3d 20 7e  [idx].flags &= ~
8ed0: 53 51 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69  SQLITE_UnresetVi
8ee0: 65 77 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ews;.}../*.** Gi
8ef0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f  ven a token, loo
8f00: 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74  k up a table wit
8f10: 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66  h that name.  If
8f20: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76   not found, leav
8f30: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f  e.** an error fo
8f40: 72 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  r the parser to 
8f50: 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20  find and return 
8f60: 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  NULL..*/.Table *
8f70: 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54  sqliteTableFromT
8f80: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
8f90: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29  se, Token *pTok)
8fa0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
8fb0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
8fc0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
8fd0: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
8fe0: 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20  en(pTok);.  if( 
8ff0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
9000: 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  n 0;.  pTab = sq
9010: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50  liteFindTable(pP
9020: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
9030: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   0);.  sqliteFre
9040: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  e(zName);.  if( 
9050: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
9060: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
9070: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
9080: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
9090: 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  : ", 0, .       
90a0: 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e   pTok->z, pTok->
90b0: 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  n, 0);.    pPars
90c0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20  e->nErr++;.  }. 
90d0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
90e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
90f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
9100: 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
9110: 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
9120: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
9130: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
9140: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
9150: 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
9160: 20 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c 65   sqliteDropTable
9170: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9180: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e  Token *pName, in
9190: 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61 62  t isView){.  Tab
91a0: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64  le *pTable;.  Vd
91b0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73  be *v;.  int bas
91c0: 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  e;.  sqlite *db 
91d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
91e0: 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20  int iDb;..  if( 
91f0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
9200: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
9210: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
9220: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
9230: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  TableFromToken(p
9240: 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20  Parse, pName);. 
9250: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
9260: 20 72 65 74 75 72 6e 3b 0a 20 20 69 44 62 20 3d   return;.  iDb =
9270: 20 70 54 61 62 6c 65 2d 3e 69 44 62 3b 0a 23 69   pTable->iDb;.#i
9280: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9290: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
92a0: 20 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68    if( sqliteAuth
92b0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
92c0: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 53 43 48  LITE_DELETE, SCH
92d0: 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 6c 65  EMA_TABLE(pTable
92e0: 2d 3e 69 44 62 29 2c 30 29 29 7b 0a 20 20 20 20  ->iDb),0)){.    
92f0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7b 0a  return;.  }.  {.
9300: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
9310: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
9320: 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
9330: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
9340: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
9350: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
9360: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
9370: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
9380: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
9390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
93a0: 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20   if( iDb==1 ){. 
93b0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
93c0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
93d0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
93e0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
93f0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
9400: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
9410: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
9420: 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  eAuthCheck(pPars
9430: 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 6c 65 2d  e, code, pTable-
9440: 3e 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20  >zName, 0) ){.  
9450: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
9460: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
9470: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
9480: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
9490: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20   pTable->zName, 
94a0: 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
94b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rn;.    }.  }.#e
94c0: 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62 6c  ndif.  if( pTabl
94d0: 65 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  e->readOnly ){. 
94e0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
94f0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
9500: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70  Msg, "table ", p
9510: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20  Table->zName, . 
9520: 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20        " may not 
9530: 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
9540: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
9550: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r++;.    return;
9560: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69 65  .  }.  if( isVie
9570: 77 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65  w && pTable->pSe
9580: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
9590: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
95a0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
95b0: 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
95c0: 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
95d0: 20 22 2c 0a 20 20 20 20 20 20 70 54 61 62 6c 65   ",.      pTable
95e0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
95f0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
9600: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9610: 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26  .  if( !isView &
9620: 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  & pTable->pSelec
9630: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  t ){.    sqliteS
9640: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
9650: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73 65 20  ->zErrMsg, "use 
9660: 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
9670: 65 74 65 20 76 69 65 77 20 22 2c 0a 20 20 20 20  ete view ",.    
9680: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c    pTable->zName,
9690: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
96a0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
96b0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  urn;.  }..  /* G
96c0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
96d0: 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
96e0: 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
96f0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
9700: 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
9710: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
9720: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
9730: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
9740: 65 4f 70 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20  eOp dropTable[] 
9750: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  = {.      { OP_R
9760: 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44  ewind,     0, AD
9770: 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20  DR(8),  0},.    
9780: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
9790: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
97a0: 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20  0}, /* 1 */.    
97b0: 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c    { OP_MemStore,
97c0: 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20     1, 1,        
97d0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d  0},.      { OP_M
97e0: 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c  emLoad,    1, 0,
97f0: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33          0}, /* 3
9800: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43   */.      { OP_C
9810: 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c  olumn,     0, 2,
9820: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
9830: 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20    { OP_Ne,      
9840: 20 20 20 30 2c 20 41 44 44 52 28 37 29 2c 20 20     0, ADDR(7),  
9850: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
9860: 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
9870: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
9880: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
9890: 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20     0, ADDR(3),  
98a0: 30 7d 2c 20 2f 2a 20 37 20 2a 2f 0a 20 20 20 20  0}, /* 7 */.    
98b0: 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  };.    Index *pI
98c0: 64 78 3b 0a 20 20 20 20 54 72 69 67 67 65 72 20  dx;.    Trigger 
98d0: 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73  *pTrigger;.    s
98e0: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
98f0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
9900: 20 30 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29   0, pTable->iDb)
9910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e  ;.    sqliteOpen
9920: 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70  MasterTable(v, p
9930: 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20  Table->iDb);.   
9940: 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
9950: 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
9960: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
9970: 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 2a 2f  being dropped */
9980: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
9990: 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72  pTable->pTrigger
99a0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72  ;.    while( pTr
99b0: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 53  igger ){.      S
99c0: 72 63 4c 69 73 74 20 2a 70 4e 6d 3b 0a 20 20 20  rcList *pNm;.   
99d0: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
99e0: 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65  ger->iDb==pTable
99f0: 2d 3e 69 44 62 20 29 3b 0a 20 20 20 20 20 20 70  ->iDb );.      p
9a00: 4e 6d 20 3d 20 73 71 6c 69 74 65 53 72 63 4c 69  Nm = sqliteSrcLi
9a10: 73 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 30  stAppend(0, 0, 0
9a20: 29 3b 0a 20 20 20 20 20 20 70 4e 6d 2d 3e 61 5b  );.      pNm->a[
9a30: 30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  0].zName = sqlit
9a40: 65 53 74 72 44 75 70 28 70 54 72 69 67 67 65 72  eStrDup(pTrigger
9a50: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  ->name);.      p
9a60: 4e 6d 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  Nm->a[0].zDataba
9a70: 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  se = sqliteStrDu
9a80: 70 28 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65  p(db->aDb[pTable
9a90: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->iDb].zName);. 
9aa0: 20 20 20 20 20 73 71 6c 69 74 65 44 72 6f 70 54       sqliteDropT
9ab0: 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 70  rigger(pParse, p
9ac0: 4e 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  Nm, 1);.      if
9ad0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
9ae0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  n ){.        pTr
9af0: 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
9b00: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
9b10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
9b20: 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c 65 2d  rigger = pTable-
9b30: 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20  >pTrigger;.     
9b40: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 61 73   }.    }.    bas
9b50: 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  e = sqliteVdbeAd
9b60: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
9b70: 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29 2c  Size(dropTable),
9b80: 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20   dropTable);.   
9b90: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
9ba0: 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70  eP3(v, base+1, p
9bb0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Table->zName, 0)
9bc0: 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 6c  ;.    if( !pTabl
9bd0: 65 2d 3e 69 44 62 20 29 7b 0a 20 20 20 20 20 20  e->iDb ){.      
9be0: 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b  sqliteChangeCook
9bf0: 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d  ie(db, v);.    }
9c00: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
9c10: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
9c20: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
9c30: 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
9c40: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
9c50: 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  p(v, OP_Destroy,
9c60: 20 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70   pTable->tnum, p
9c70: 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20  Table->iDb);.   
9c80: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
9c90: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  le->pIndex; pIdx
9ca0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
9cb0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  xt){.        sql
9cc0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9cd0: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 64 78  OP_Destroy, pIdx
9ce0: 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e  ->tnum, pTable->
9cf0: 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iDb);.      }.  
9d00: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e    }.    sqliteEn
9d10: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
9d20: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  pParse);.  }..  
9d30: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e  /* Delete the in
9d40: 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74  -memory descript
9d50: 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
9d60: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65  ..  **.  ** Exce
9d70: 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51  ption: if the SQ
9d80: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61  L statement bega
9d90: 6e 20 77 69 74 68 20 74 68 65 20 45 58 50 4c 41  n with the EXPLA
9da0: 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a  IN keyword,.  **
9db0: 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73   then no changes
9dc0: 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e   should be made.
9dd0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
9de0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
9df0: 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b      sqliteUnlink
9e00: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64  AndDeleteTable(d
9e10: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  b, pTable);.    
9e20: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
9e30: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
9e40: 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56  s;.  }.  sqliteV
9e50: 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
9e60: 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iDb);.}../*.** T
9e70: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 73  his routine cons
9e80: 74 72 75 63 74 73 20 61 20 50 33 20 73 74 72 69  tructs a P3 stri
9e90: 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ng suitable for 
9ea0: 61 6e 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79  an OP_MakeIdxKey
9eb0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20 61  .** opcode and a
9ec0: 64 64 73 20 74 68 61 74 20 50 33 20 73 74 72 69  dds that P3 stri
9ed0: 6e 67 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72  ng to the most r
9ee0: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
9ef0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20   instruction.** 
9f00: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
9f10: 61 63 68 69 6e 65 2e 20 20 54 68 65 20 50 33 20  achine.  The P3 
9f20: 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 73 20  string consists 
9f30: 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72  of a single char
9f40: 61 63 74 65 72 0a 2a 2a 20 66 6f 72 20 65 61 63  acter.** for eac
9f50: 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  h column in the 
9f60: 69 6e 64 65 78 20 70 49 64 78 20 6f 66 20 74 61  index pIdx of ta
9f70: 62 6c 65 20 70 54 61 62 2e 20 20 49 66 20 74 68  ble pTab.  If th
9f80: 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 0a 2a 2a  e column uses.**
9f90: 20 61 20 6e 75 6d 65 72 69 63 20 73 6f 72 74 20   a numeric sort 
9fa0: 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20  order, then the 
9fb0: 50 33 20 73 74 72 69 6e 67 20 63 68 61 72 61 63  P3 string charac
9fc0: 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ter correspondin
9fd0: 67 20 74 6f 0a 2a 2a 20 74 68 61 74 20 63 6f 6c  g to.** that col
9fe0: 75 6d 6e 20 69 73 20 27 6e 27 2e 20 20 49 66 20  umn is 'n'.  If 
9ff0: 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 20  the column uses 
a000: 61 20 74 65 78 74 20 73 6f 72 74 20 6f 72 64 65  a text sort orde
a010: 72 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 50  r, then the.** P
a020: 33 20 73 74 72 69 6e 67 20 69 73 20 27 74 27 2e  3 string is 't'.
a030: 20 20 53 65 65 20 74 68 65 20 4f 50 5f 4d 61 6b    See the OP_Mak
a040: 65 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 20 64  eIdxKey opcode d
a050: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  ocumentation for
a060: 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  .** additional i
a070: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 65 65  nformation.  See
a080: 20 61 6c 73 6f 20 74 68 65 20 73 71 6c 69 74 65   also the sqlite
a090: 41 64 64 4b 65 79 54 79 70 65 28 29 20 72 6f 75  AddKeyType() rou
a0a0: 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tine..*/.void sq
a0b0: 6c 69 74 65 41 64 64 49 64 78 4b 65 79 54 79 70  liteAddIdxKeyTyp
a0c0: 65 28 56 64 62 65 20 2a 76 2c 20 49 6e 64 65 78  e(Vdbe *v, Index
a0d0: 20 2a 70 49 64 78 29 7b 0a 20 20 63 68 61 72 20   *pIdx){.  char 
a0e0: 2a 7a 54 79 70 65 3b 0a 20 20 54 61 62 6c 65 20  *zType;.  Table 
a0f0: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
a100: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  n;.  assert( pId
a110: 78 21 3d 30 20 26 26 20 70 49 64 78 2d 3e 70 54  x!=0 && pIdx->pT
a120: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 70 54 61  able!=0 );.  pTa
a130: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
a140: 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 6e 43  ;.  n = pIdx->nC
a150: 6f 6c 75 6d 6e 3b 0a 20 20 7a 54 79 70 65 20 3d  olumn;.  zType =
a160: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
a170: 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a  ( n+1 );.  if( z
a180: 54 79 70 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Type==0 ) return
a190: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
a1a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
a1b0: 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  iCol = pIdx->aiC
a1c0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73  olumn[i];.    as
a1d0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26  sert( iCol>=0 &&
a1e0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
a1f0: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61   );.    if( (pTa
a200: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 6f  b->aCol[iCol].so
a210: 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49 54 45  rtOrder & SQLITE
a220: 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53  _SO_TYPEMASK)==S
a230: 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b  QLITE_SO_TEXT ){
a240: 0a 20 20 20 20 20 20 7a 54 79 70 65 5b 69 5d 20  .      zType[i] 
a250: 3d 20 27 74 27 3b 0a 20 20 20 20 7d 65 6c 73 65  = 't';.    }else
a260: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 5b 69 5d  {.      zType[i]
a270: 20 3d 20 27 6e 27 3b 0a 20 20 20 20 7d 0a 20 20   = 'n';.    }.  
a280: 7d 0a 20 20 7a 54 79 70 65 5b 6e 5d 20 3d 20 30  }.  zType[n] = 0
a290: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43 68  ;.  sqliteVdbeCh
a2a0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 54  angeP3(v, -1, zT
a2b0: 79 70 65 2c 20 6e 29 3b 0a 20 20 73 71 6c 69 74  ype, n);.  sqlit
a2c0: 65 46 72 65 65 28 7a 54 79 70 65 29 3b 0a 7d 0a  eFree(zType);.}.
a2d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
a2e0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
a2f0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
a300: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
a310: 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
a320: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
a330: 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
a340: 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
a350: 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
a360: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
a370: 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
a380: 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
a390: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
a3a0: 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
a3b0: 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
a3c0: 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
a3d0: 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
a3e0: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
a3f0: 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20  le referred to. 
a400: 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
a410: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  t of tables in t
a420: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20  he other.** pTo 
a430: 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66  table that the f
a440: 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74  oreign key point
a450: 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e  s to.  flags con
a460: 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
a470: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
a480: 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
a490: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
a4a0: 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
a4b0: 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
a4c0: 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
a4d0: 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
a4e0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
a4f0: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
a500: 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
a510: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
a520: 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
a530: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
a540: 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
a550: 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65  able field.  The
a560: 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20   new FKey.** is 
a570: 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20  not linked into 
a580: 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69  db->aFKey at thi
a590: 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64  s point - that d
a5a0: 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a  oes not happen.*
a5b0: 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 45 6e  * until sqliteEn
a5c0: 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  dTable()..**.** 
a5d0: 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
a5e0: 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
a5f0: 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
a600: 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
a610: 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
a620: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
a630: 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
a640: 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
a650: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
a660: 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
a670: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a680: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
a690: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
a6a0: 49 64 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  IdList *pFromCol
a6b0: 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
a6c0: 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
a6d0: 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
a6e0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
a6f0: 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
a700: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
a710: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
a720: 20 20 49 64 4c 69 73 74 20 2a 70 54 6f 43 6f 6c    IdList *pToCol
a730: 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ,      /* Column
a740: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
a750: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
a760: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
a770: 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
a780: 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
a790: 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  . */.){.  Table 
a7a0: 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
a7b0: 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
a7c0: 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
a7d0: 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
a7e0: 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b   *z;.  FKey *pFK
a7f0: 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ey = 0;..  asser
a800: 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
a810: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
a820: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66  e->nErr ) goto f
a830: 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
a840: 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
a850: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
a860: 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43  ol-1;.    if( iC
a870: 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65  ol<0 ) goto fk_e
a880: 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
a890: 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49  ol && pToCol->nI
a8a0: 64 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  d!=1 ){.      sq
a8b0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
a8c0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
a8d0: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
a8e0: 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20   ", -1,.        
a8f0: 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
a900: 4e 61 6d 65 2c 20 2d 31 2c 20 0a 20 20 20 20 20  Name, -1, .     
a910: 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66      " should ref
a920: 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20  erence only one 
a930: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
a940: 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  ", -1,.         
a950: 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 2c 20  pTo->z, pTo->n, 
a960: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
a970: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
a980: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
a990: 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
a9a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
a9b0: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
a9c0: 49 64 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49  Id!=pFromCol->nI
a9d0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  d ){.    sqliteS
a9e0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
a9f0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20  ->zErrMsg, .    
aa00: 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
aa10: 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
aa20: 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
aa30: 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
aa40: 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
aa50: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
aa60: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 2c 20  erenced table", 
aa70: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
aa80: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
aa90: 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
aaa0: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
aab0: 6f 6d 43 6f 6c 2d 3e 6e 49 64 3b 0a 20 20 7d 0a  omCol->nId;.  }.
aac0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
aad0: 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a  (*pFKey) + nCol*
aae0: 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43  sizeof(pFKey->aC
aaf0: 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20  ol[0]) + pTo->n 
ab00: 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f  + 1;.  if( pToCo
ab10: 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
ab20: 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 49 64 3b  ; i<pToCol->nId;
ab30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
ab40: 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f  te += strlen(pTo
ab50: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
ab60: 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
ab70: 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
ab80: 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  Malloc( nByte );
ab90: 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20  .  if( pFKey==0 
aba0: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
abb0: 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
abc0: 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
abd0: 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
abe0: 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
abf0: 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65  pFKey[1];.  pFKe
ac00: 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63  y->aCol = (struc
ac10: 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20  t sColMap*)z;.  
ac20: 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75  z += sizeof(stru
ac30: 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c  ct sColMap)*nCol
ac40: 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d  ;.  pFKey->zTo =
ac50: 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20   z;.  memcpy(z, 
ac60: 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b  pTo->z, pTo->n);
ac70: 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30  .  z[pTo->n] = 0
ac80: 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b  ;.  z += pTo->n+
ac90: 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  1;.  pFKey->pNex
aca0: 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  tTo = 0;.  pFKey
acb0: 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
acc0: 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
acd0: 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
ace0: 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
acf0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
ad00: 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
ad10: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
ad20: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
ad30: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
ad40: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
ad50: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
ad60: 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ICmp(p->aCol[j].
ad70: 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d  zName, pFromCol-
ad80: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
ad90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  ){.          pFK
ada0: 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f  ey->aCol[i].iFro
adb0: 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  m = j;.         
adc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
add0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ade0: 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29  if( j>=p->nCol )
adf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ae00: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
ae10: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 6b  e->zErrMsg, "unk
ae20: 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 22 2c  nown column \"",
ae30: 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
ae40: 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
ae50: 2c 20 22 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e  , "\" in foreign
ae60: 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22   key definition"
ae70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
ae80: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
ae90: 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
aea0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
aeb0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f  .  }.  if( pToCo
aec0: 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
aed0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
aee0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
aef0: 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  rlen(pToCol->a[i
af00: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
af10: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
af20: 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
af30: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
af40: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
af50: 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
af60: 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
af70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
af80: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
af90: 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c   0;.  pFKey->del
afa0: 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20  eteConf = flags 
afb0: 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
afc0: 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66  >updateConf = (f
afd0: 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78  lags >> 8 ) & 0x
afe0: 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73  ff;.  pFKey->ins
aff0: 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ertConf = (flags
b000: 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b   >> 16 ) & 0xff;
b010: 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
b020: 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
b030: 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
b040: 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
b050: 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
b060: 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
b070: 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
b080: 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20  teFree(pFKey);. 
b090: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
b0a0: 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  ete(pFromCol);. 
b0b0: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
b0c0: 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  ete(pToCol);.}..
b0d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
b0e0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
b0f0: 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
b100: 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
b110: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
b120: 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
b130: 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
b140: 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
b150: 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
b160: 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
b170: 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
b180: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
b190: 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
b1a0: 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
b1b0: 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
b1c0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
b1d0: 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
b1e0: 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
b1f0: 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
b200: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
b210: 65 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  eDeferForeignKey
b220: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b230: 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
b240: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
b250: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
b260: 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
b270: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
b280: 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
b290: 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
b2a0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79   return;.  pFKey
b2b0: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69  ->isDeferred = i
b2c0: 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a  sDeferred;.}../*
b2d0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
b2e0: 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
b2f0: 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78  L table.  pIndex
b300: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
b310: 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
b320: 64 20 70 54 61 62 6c 65 20 69 73 20 74 68 65 20  d pTable is the 
b330: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
b340: 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
b350: 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
b360: 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
b370: 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
b380: 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
b390: 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
b3a0: 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
b3b0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
b3c0: 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
b3d0: 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
b3e0: 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
b3f0: 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
b400: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
b410: 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
b420: 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
b430: 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
b440: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
b450: 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
b460: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
b470: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
b480: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
b490: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
b4a0: 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
b4b0: 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
b4c0: 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
b4d0: 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
b4e0: 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
b4f0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
b500: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
b510: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
b520: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
b530: 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
b540: 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74  void sqliteCreat
b550: 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
b560: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c  *pParse,   /* Al
b570: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
b580: 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
b590: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
b5a0: 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ,    /* Name of 
b5b0: 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 79 20  the index.  May 
b5c0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63  be NULL */.  Src
b5d0: 4c 69 73 74 20 2a 70 54 61 62 6c 65 2c 20 2f 2a  List *pTable, /*
b5e0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
b5f0: 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 20 55 73  le to index.  Us
b600: 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
b610: 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 49 64  ble if 0 */.  Id
b620: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
b630: 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
b640: 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
b650: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
b660: 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  or,     /* OE_Ab
b670: 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
b680: 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
b690: 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  E_None */.  int 
b6a0: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20  isTemp,      /* 
b6b0: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
b6c0: 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65  a temporary inde
b6d0: 78 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  x */.  Token *pS
b6e0: 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43  tart,   /* The C
b6f0: 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
b700: 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45   begins a CREATE
b710: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
b720: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
b730: 64 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29  d      /* The ")
b740: 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68  " that closes th
b750: 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
b760: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  tatement */.){. 
b770: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
b780: 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
b790: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e   indexed */.  In
b7a0: 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f  dex *pIndex;   /
b7b0: 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
b7c0: 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63  e created */.  c
b7d0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
b7e0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f    int i, j;.  To
b7f0: 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20  ken nullId;     
b800: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
b810: 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
b820: 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
b830: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
b840: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
b850: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
b860: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
b870: 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
b880: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
b890: 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
b8a0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
b8b0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
b8c0: 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
b8d0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
b8e0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30  .  if( pTable!=0
b8f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
b900: 70 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20  pName!=0 );.    
b910: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
b920: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  nSrc==1 );.    p
b930: 54 61 62 20 3d 20 20 73 71 6c 69 74 65 53 72 63  Tab =  sqliteSrc
b940: 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
b950: 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65  e, pTable);.  }e
b960: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
b970: 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
b980: 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d   pTab =  pParse-
b990: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a  >pNewTable;.  }.
b9a0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c    if( pTab==0 ||
b9b0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
b9c0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
b9d0: 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54  _index;.  if( pT
b9e0: 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  ab->readOnly ){.
b9f0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
ba00: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
ba10: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20  rMsg, "table ", 
ba20: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
ba30: 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65 20     " may not be 
ba40: 69 6e 64 65 78 65 64 22 2c 20 30 29 3b 0a 20 20  indexed", 0);.  
ba50: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
ba60: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
ba70: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
ba80: 7d 0a 20 20 69 66 28 20 21 69 73 54 65 6d 70 20  }.  if( !isTemp 
ba90: 26 26 20 70 54 61 62 2d 3e 69 44 62 3e 3d 32 20  && pTab->iDb>=2 
baa0: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
bab0: 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  lag==0 ){.    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 20 0a 20 20 20 20 20 20 22 20  zName, .      " 
bb00: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 6e 6f 6e  may not have non
bb10: 2d 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 69 63  -temporary indic
bb20: 65 73 20 61 64 64 65 64 22 2c 20 30 29 3b 0a 20  es added", 0);. 
bb30: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
bb40: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  +;.    goto exit
bb50: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
bb60: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70   }.  if( pTab->p
bb70: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
bb80: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
bb90: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
bba0: 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
bbb0: 65 20 69 6e 64 65 78 65 64 22 2c 20 30 29 3b 0a  e indexed", 0);.
bbc0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
bbd0: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ++;.    goto exi
bbe0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
bbf0: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
bc00: 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 69 73  iDb==1 ){.    is
bc10: 54 65 6d 70 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  Temp = 1;.  }.. 
bc20: 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
bc30: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
bc40: 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
bc50: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
bc60: 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
bc70: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
bc80: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
bc90: 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
bca0: 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
bcb0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
bcc0: 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
bcd0: 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
bce0: 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
bcf0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
bd00: 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
bd10: 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
bd20: 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
bd30: 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
bd40: 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
bd50: 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
bd60: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
bd70: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
bd80: 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
bd90: 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
bda0: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
bdb0: 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
bdc0: 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
bdd0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
bde0: 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
bdf0: 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
be00: 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
be10: 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
be20: 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
be30: 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
be40: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
be50: 26 26 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  && !pParse->init
be60: 46 6c 61 67 20 29 7b 0a 20 20 20 20 49 6e 64 65  Flag ){.    Inde
be70: 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20  x *pISameName;  
be80: 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64    /* Another ind
be90: 65 78 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ex with the same
bea0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62   name */.    Tab
beb0: 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20  le *pTSameName; 
bec0: 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69     /* A table wi
bed0: 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  th same name as 
bee0: 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
bef0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53   zName = sqliteS
bf00: 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c  trNDup(pName->z,
bf10: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
bf20: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
bf30: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
bf40: 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 28  index;.    if( (
bf50: 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c  pISameName = sql
bf60: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
bf70: 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29   zName, 0))!=0 )
bf80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
bf90: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
bfa0: 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64 65 78  >zErrMsg, "index
bfb0: 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20   ", zName, .    
bfc0: 20 20 20 20 20 22 20 61 6c 72 65 61 64 79 20 65       " already e
bfd0: 78 69 73 74 73 22 2c 20 30 29 3b 0a 20 20 20 20  xists", 0);.    
bfe0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
bff0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
c000: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c010: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
c020: 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69  TSameName = sqli
c030: 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  teFindTable(db, 
c040: 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b  zName, 0))!=0 ){
c050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
c060: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
c070: 7a 45 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20  zErrMsg, "there 
c080: 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
c090: 6c 65 20 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20  le named ",.    
c0a0: 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a       zName, 0);.
c0b0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
c0c0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rr++;.      goto
c0d0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
c0e0: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
c0f0: 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29  e if( pName==0 )
c100: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
c110: 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  30];.    int n;.
c120: 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
c130: 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
c140: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
c150: 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
c160: 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
c170: 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66  +){}.    sprintf
c180: 28 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29 3b 0a  (zBuf,"%d)",n);.
c190: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
c1a0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
c1b0: 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28 22 2c 20  ng(&zName, "(", 
c1c0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61  pTab->zName, " a
c1d0: 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a 42 75 66  utoindex ", zBuf
c1e0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  , 0);.    if( zN
c1f0: 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
c200: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
c210: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
c220: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
c230: 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  Dup(pName->z, pN
c240: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7d 0a 0a 20 20  ame->n);.  }..  
c250: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
c260: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
c270: 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
c280: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
c290: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
c2a0: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
c2b0: 69 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54  isTemp==0 || isT
c2c0: 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  emp==1 );.  asse
c2d0: 72 74 28 20 70 54 61 62 2d 3e 69 44 62 3d 3d 70  rt( pTab->iDb==p
c2e0: 50 61 72 73 65 2d 3e 69 44 62 20 7c 7c 20 69 73  Parse->iDb || is
c2f0: 54 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Temp==1 );.  if(
c300: 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b   sqliteAuthCheck
c310: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
c320: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
c330: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 29  ABLE(isTemp), 0)
c340: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
c350: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c360: 20 20 7d 0a 20 20 69 20 3d 20 53 51 4c 49 54 45    }.  i = SQLITE
c370: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
c380: 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69 20   if( isTemp ) i 
c390: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
c3a0: 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 69 66  TEMP_INDEX;.  if
c3b0: 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63  ( sqliteAuthChec
c3c0: 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
c3d0: 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  me, pTab->zName)
c3e0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
c3f0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c400: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
c410: 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
c420: 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
c430: 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
c440: 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
c450: 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
c460: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
c470: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
c480: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
c490: 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
c4a0: 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
c4b0: 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
c4c0: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
c4d0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
c4e0: 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d  nullId.z = pTab-
c4f0: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
c500: 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
c510: 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e  ullId.n = strlen
c520: 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20  (nullId.z);.    
c530: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49 64  pList = sqliteId
c540: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e  ListAppend(0, &n
c550: 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
c560: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
c570: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
c580: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20  x;.  }..  /* .  
c590: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
c5a0: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
c5b0: 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20   .  */.  pIndex 
c5c0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
c5d0: 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
c5e0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
c5f0: 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1 +.            
c600: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
c610: 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e  of(int)*pList->n
c620: 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  Id );.  if( pInd
c630: 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ex==0 ) goto exi
c640: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c650: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
c660: 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64  mn = (int*)&pInd
c670: 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78 2d  ex[1];.  pIndex-
c680: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
c690: 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
c6a0: 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20  n[pList->nId];. 
c6b0: 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e   strcpy(pIndex->
c6c0: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  zName, zName);. 
c6d0: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
c6e0: 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
c6f0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73  ->nColumn = pLis
c700: 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78  t->nId;.  pIndex
c710: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
c720: 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d 20 6f  ex->isUnique = o
c730: 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
c740: 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e  ->autoIndex = pN
c750: 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78  ame==0;.  pIndex
c760: 2d 3e 69 44 62 20 3d 20 69 73 54 65 6d 70 20 3f  ->iDb = isTemp ?
c770: 20 31 20 3a 20 70 50 61 72 73 65 2d 3e 69 44 62   1 : pParse->iDb
c780: 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  ;..  /* Scan the
c790: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
c7a0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
c7b0: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
c7c0: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
c7d0: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
c7e0: 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
c7f0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
c800: 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
c810: 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
c820: 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
c830: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
c840: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
c850: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
c860: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
c870: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
c880: 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74  iteStrICmp(pList
c890: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
c8a0: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
c8b0: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
c8c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
c8d0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
c8e0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
c8f0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
c900: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20  rMsg, "table ", 
c910: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  pTab->zName, .  
c920: 20 20 20 20 20 20 22 20 68 61 73 20 6e 6f 20 63        " has no c
c930: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20 70  olumn named ", p
c940: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
c950: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
c960: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
c970: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e    sqliteFree(pIn
c980: 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  dex);.      goto
c990: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
c9a0: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
c9b0: 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
c9c0: 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ] = j;.  }..  /*
c9d0: 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e   Link the new In
c9e0: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f  dex structure to
c9f0: 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74   its table and t
ca00: 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a  o the other.  **
ca10: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
ca20: 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20  ase structures. 
ca30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
ca40: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
ca50: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
ca60: 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68    p = sqliteHash
ca70: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
ca80: 69 73 54 65 6d 70 5d 2e 69 64 78 48 61 73 68 2c  isTemp].idxHash,
ca90: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
caa0: 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
cab0: 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  x->zName, strlen
cac0: 28 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65  (zName)+1, pInde
cad0: 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
cae0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
caf0: 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
cb00: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
cb10: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
cb20: 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64   sqliteFree(pInd
cb30: 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ex);.      goto 
cb40: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
cb50: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
cb60: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
cb70: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
cb80: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
cb90: 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
cba0: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
cbb0: 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
cbc0: 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
cbd0: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
cbe0: 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
cbf0: 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
cc00: 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
cc10: 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
cc20: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
cc30: 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
cc40: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50   operation of UP
cc50: 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  DATE.  ** and IN
cc60: 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  SERT..  */.  if(
cc70: 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
cc80: 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
cc90: 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c  ndex==0.       |
cca0: 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e  | pTab->pIndex->
ccb0: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
ccc0: 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ace){.    pIndex
ccd0: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
cce0: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62  pIndex;.    pTab
ccf0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
cd00: 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  x;.  }else{.    
cd10: 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20  Index *pOther = 
cd20: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
cd30: 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
cd40: 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
cd50: 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
cd60: 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
cd70: 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
cd80: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
cd90: 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
cda0: 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e  pNext = pOther->
cdb0: 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65  pNext;.    pOthe
cdc0: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
cdd0: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  x;.  }..  /* If 
cde0: 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20  the initFlag is 
cdf0: 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  1 it means we ar
ce00: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51  e reading the SQ
ce10: 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22  L off the.  ** "
ce20: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74  sqlite_master" t
ce30: 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b  able on the disk
ce40: 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69  .  So do not wri
ce50: 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20  te to the disk. 
ce60: 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72   ** again.  Extr
ce70: 61 63 74 20 74 68 65 20 74 61 62 6c 65 20 6e 75  act the table nu
ce80: 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20 70 50  mber from the pP
ce90: 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69  arse->newTnum fi
cea0: 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eld..  */.  if( 
ceb0: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
cec0: 20 26 26 20 70 54 61 62 6c 65 21 3d 30 20 29 7b   && pTable!=0 ){
ced0: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75  .    pIndex->tnu
cee0: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54  m = pParse->newT
cef0: 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  num;.  }..  /* I
cf00: 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69  f the initFlag i
cf10: 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20  s 0 then create 
cf20: 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73  the index on dis
cf30: 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e  k.  This.  ** in
cf40: 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74  volves writing t
cf50: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68  he index into th
cf60: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
cf70: 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  nd filling in th
cf80: 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74  e.  ** index wit
cf90: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  h the current ta
cfa0: 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20  ble contents..  
cfb0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69 74  **.  ** The init
cfc0: 46 6c 61 67 20 69 73 20 30 20 77 68 65 6e 20 74  Flag is 0 when t
cfd0: 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e  he user first en
cfe0: 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e  ters a CREATE IN
cff0: 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e  DEX .  ** comman
d000: 64 2e 20 20 54 68 65 20 69 6e 69 74 46 6c 61 67  d.  The initFlag
d010: 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74   is 1 when a dat
d020: 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
d030: 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45  and .  ** CREATE
d040: 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
d050: 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f  s are read out o
d060: 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  f the master tab
d070: 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65  le.  In.  ** the
d080: 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65   latter case the
d090: 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
d0a0: 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77  xists on disk, w
d0b0: 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a  hich is why.  **
d0c0: 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
d0d0: 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20  o recreate it.. 
d0e0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61 62   **.  ** If pTab
d0f0: 6c 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  le==0 it means t
d100: 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
d110: 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d  erated as a prim
d120: 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20  ary key.  ** or 
d130: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
d140: 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41  t of a CREATE TA
d150: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
d160: 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
d170: 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
d180: 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
d190: 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
d1a0: 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
d1b0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
d1c0: 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
d1d0: 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
d1e0: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69  se if( pParse->i
d1f0: 6e 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20  nitFlag==0 ){.  
d200: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
d210: 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62  e *v;.    int lb
d220: 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e  l1, lbl2;.    in
d230: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  t i;.    int add
d240: 72 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  r;..    v = sqli
d250: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
d260: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
d270: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
d280: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
d290: 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  ( pTable!=0 ){. 
d2a0: 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e       sqliteBegin
d2b0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
d2c0: 50 61 72 73 65 2c 20 30 2c 20 69 73 54 65 6d 70  Parse, 0, isTemp
d2d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f  );.      sqliteO
d2e0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
d2f0: 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 7d  , isTemp);.    }
d300: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
d310: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
d320: 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  cno, 0, 0);.    
d330: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d340: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
d350: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
d360: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
d370: 31 2c 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53  1, "index", P3_S
d380: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
d390: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d3a0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
d3b0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
d3c0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
d3d0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33  Index->zName, P3
d3e0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
d3f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d400: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
d410: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
d420: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
d430: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pTab->zName, P3
d440: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61 64  _STATIC);.    ad
d450: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
d460: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
d470: 65 49 6e 64 65 78 2c 20 30 2c 20 69 73 54 65 6d  eIndex, 0, isTem
d480: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  p);.    sqliteVd
d490: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
d4a0: 64 72 2c 20 28 63 68 61 72 2a 29 26 70 49 6e 64  dr, (char*)&pInd
d4b0: 65 78 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49  ex->tnum, P3_POI
d4c0: 4e 54 45 52 29 3b 0a 20 20 20 20 70 49 6e 64 65  NTER);.    pInde
d4d0: 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  x->tnum = 0;.   
d4e0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
d4f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d500: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
d510: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
d520: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d530: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 73 54 65  OP_Integer, isTe
d540: 6d 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  mp, 0);.      sq
d550: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d560: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
d570: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
d580: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
d590: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
d5a0: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
d5b0: 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45  if( pStart && pE
d5c0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  nd ){.      n = 
d5d0: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
d5e0: 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20  Addr(pStart->z) 
d5f0: 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
d600: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
d610: 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a   addr, pStart->z
d620: 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
d630: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d640: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
d650: 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 5, 0);.    sql
d660: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d670: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
d680: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61   0);.    if( pTa
d690: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
d6a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
d6b0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
d6c0: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20  ->iDb, 0);.     
d6d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d6e0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
d6f0: 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b   2, pTab->tnum);
d700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
d710: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
d720: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pTab->zName, P3
d730: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
d740: 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 56 64 62  lbl2 = sqliteVdb
d750: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
d760: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d770: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
d780: 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  d, 2, lbl2);.   
d790: 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65     lbl1 = sqlite
d7a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d7b0: 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20  Recno, 2, 0);.  
d7c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d7d0: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
d7e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
d7f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d800: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70   OP_Column, 2, p
d810: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
d820: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
d830: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d840: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78  Op(v, OP_MakeIdx
d850: 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  Key, pIndex->nCo
d860: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
d870: 69 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  if( db->file_for
d880: 6d 61 74 3e 3d 34 20 29 20 73 71 6c 69 74 65 41  mat>=4 ) sqliteA
d890: 64 64 49 64 78 4b 65 79 54 79 70 65 28 76 2c 20  ddIdxKeyType(v, 
d8a0: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 73  pIndex);.      s
d8b0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d8c0: 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20  , OP_IdxPut, 1, 
d8d0: 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
d8e0: 3d 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20  =OE_None);.     
d8f0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
d900: 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65  eP3(v, -1, "inde
d910: 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  xed columns are 
d920: 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f  not unique", P3_
d930: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
d940: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d950: 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62  , OP_Next, 2, lb
d960: 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l1);.      sqlit
d970: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
d980: 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20  l(v, lbl2);.    
d990: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d9a0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32  p(v, OP_Close, 2
d9b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
d9c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d9d0: 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a  P_Close, 1, 0);.
d9e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
d9f0: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  able!=0 ){.     
da00: 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a   if( !isTemp ){.
da10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 43 68          sqliteCh
da20: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
da30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
da40: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
da50: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
da60: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
da70: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
da80: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  on(pParse);.    
da90: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  }.  }..  /* Clea
daa0: 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
dab0: 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
dac0: 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  te_index:.  sqli
dad0: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
dae0: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 53  List);.  sqliteS
daf0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61  rcListDelete(pTa
db00: 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ble);.  sqliteFr
db10: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  ee(zName);.  ret
db20: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
db30: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
db40: 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
db50: 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
db60: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
db70: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
db80: 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
db90: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
dba0: 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  teDropIndex(Pars
dbb0: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
dbc0: 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e  st *pName){.  In
dbd0: 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
dbe0: 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
dbf0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
dc00: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
dc10: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
dc20: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
dc30: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
dc40: 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
dc50: 31 20 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  1 );.  pIndex = 
dc60: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
dc70: 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
dc80: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
dc90: 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
dca0: 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
dcb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
dcc0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
dcd0: 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22   such index: %S"
dce0: 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , pName, 0);.   
dcf0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
dd00: 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
dd10: 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
dd20: 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
dd30: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
dd40: 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
dd50: 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
dd60: 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
dd70: 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
dd80: 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
dd90: 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
dda0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
ddb0: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
ddc0: 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a 20  ndex->iDb>1 ){. 
ddd0: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
dde0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
ddf0: 74 20 61 6c 74 65 72 20 73 63 68 65 6d 61 20 6f  t alter schema o
de00: 66 20 61 74 74 61 63 68 65 64 20 22 0a 20 20 20  f attached ".   
de10: 20 20 20 20 22 64 61 74 61 62 61 73 65 73 22 2c      "databases",
de20: 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
de30: 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
de40: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
de50: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
de60: 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
de70: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
de80: 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
de90: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
dea0: 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
deb0: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
dec0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
ded0: 49 54 45 5f 44 45 4c 45 54 45 2c 20 53 43 48 45  ITE_DELETE, SCHE
dee0: 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d  MA_TABLE(pIndex-
def0: 3e 69 44 62 29 2c 20 30 29 20 29 7b 0a 20 20 20  >iDb), 0) ){.   
df00: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
df10: 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
df20: 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69     if( pIndex->i
df30: 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
df40: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
df50: 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
df60: 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  teAuthCheck(pPar
df70: 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
df80: 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
df90: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
dfa0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
dfb0: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
dfc0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
dfd0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
dfe0: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
dff0: 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
e000: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
e010: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
e020: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
e030: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
e040: 62 65 4f 70 20 64 72 6f 70 49 6e 64 65 78 5b 5d  beOp dropIndex[]
e050: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
e060: 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41  Rewind,     0, A
e070: 44 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20 20 20  DDR(9), 0}, .   
e080: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20     { OP_String, 
e090: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
e0a0: 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20  0}, /* 1 */.    
e0b0: 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c    { OP_MemStore,
e0c0: 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 30     1, 1,       0
e0d0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65  },.      { OP_Me
e0e0: 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20  mLoad,    1, 0, 
e0f0: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a        0}, /* 3 *
e100: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  /.      { OP_Col
e110: 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20  umn,     0, 1,  
e120: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
e130: 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20   OP_Eq,         
e140: 30 2c 20 41 44 44 52 28 38 29 2c 20 30 7d 2c 0a  0, ADDR(8), 0},.
e150: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c        { OP_Next,
e160: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33         0, ADDR(3
e170: 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
e180: 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c  P_Goto,       0,
e190: 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20   ADDR(9), 0},.  
e1a0: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
e1b0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
e1c0: 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20   0}, /* 8 */.   
e1d0: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65   };.    int base
e1e0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67  ;..    sqliteBeg
e1f0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
e200: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49 6e 64  (pParse, 0, pInd
e210: 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71  ex->iDb);.    sq
e220: 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61  liteOpenMasterTa
e230: 62 6c 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 69  ble(v, pIndex->i
e240: 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20  Db);.    base = 
e250: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
e260: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
e270: 28 64 72 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f  (dropIndex), dro
e280: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c  pIndex);.    sql
e290: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
e2a0: 76 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e 64 65  v, base+1, pInde
e2b0: 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
e2c0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44    if( pIndex->iD
e2d0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  b==0 ){.      sq
e2e0: 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65  liteChangeCookie
e2f0: 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20  (db, v);.    }. 
e300: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
e310: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
e320: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
e330: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
e340: 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78  _Destroy, pIndex
e350: 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e  ->tnum, pIndex->
e360: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
e370: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
e380: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a  n(pParse);.  }..
e390: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
e3a0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69  in-memory descri
e3b0: 70 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 69 6e  ption of this in
e3c0: 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  dex..  */.  if( 
e3d0: 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
e3e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e   ){.    sqliteUn
e3f0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
e400: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
e410: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
e420: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
e430: 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 65 78 69 74  anges;.  }..exit
e440: 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
e450: 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65  qliteSrcListDele
e460: 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  te(pName);.}../*
e470: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
e480: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
e490: 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
e4a0: 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
e4b0: 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
e4c0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
e4d0: 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
e4e0: 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
e4f0: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
e500: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 49 64  IdList *sqliteId
e510: 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73  ListAppend(IdLis
e520: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
e530: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20  *pToken){.  if( 
e540: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
e550: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pList = sqliteMa
e560: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c  lloc( sizeof(IdL
e570: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
e580: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
e590: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 0;.  }.  if( (
e5a0: 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37 29 3d  pList->nId & 7)=
e5b0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
e5c0: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b   IdList_item *a;
e5d0: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52  .    a = sqliteR
e5e0: 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
e5f0: 20 28 70 4c 69 73 74 2d 3e 6e 49 64 2b 38 29 2a   (pList->nId+8)*
e600: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
e610: 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61  0]) );.    if( a
e620: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
e630: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
e640: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
e650: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
e660: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
e670: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c    }.  memset(&pL
e680: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49  ist->a[pList->nI
e690: 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  d], 0, sizeof(pL
e6a0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69  ist->a[0]));.  i
e6b0: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
e6c0: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c   char **pz = &pL
e6d0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49  ist->a[pList->nI
e6e0: 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71  d].zName;.    sq
e6f0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70  liteSetNString(p
e700: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  z, pToken->z, pT
e710: 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  oken->n, 0);.   
e720: 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20   if( *pz==0 ){. 
e730: 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73       sqliteIdLis
e740: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
e750: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
e760: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e770: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a   sqliteDequote(*
e780: 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pz);.    }.  }. 
e790: 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20   pList->nId++;. 
e7a0: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
e7b0: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
e7c0: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
e7d0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63  to the given Src
e7e0: 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
e7f0: 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a  new SrcList if.*
e800: 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65  * need be.  A ne
e810: 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74  w entry is creat
e820: 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ed in the SrcLis
e830: 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e  t even if pToken
e840: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
e850: 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73  A new SrcList is
e860: 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
e870: 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
e880: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ails..**.** If p
e890: 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
e8a0: 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
e8b0: 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
e8c0: 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
e8d0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
e8e0: 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
e8f0: 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
e900: 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
e910: 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
e920: 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
e930: 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
e940: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
e950: 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
e960: 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
e970: 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
e980: 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
e990: 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
e9a0: 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
e9b0: 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
e9c0: 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
e9d0: 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
e9e0: 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
e9f0: 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
ea00: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
ea10: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
ea20: 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
ea30: 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
ea40: 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
ea50: 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
ea60: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
ea70: 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
ea80: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
ea90: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70   sqliteSrcListAp
eaa0: 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a  pend(A,B,0);.**.
eab0: 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74  ** Then B is a t
eac0: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
ead0: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
eae0: 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20  is unspecified. 
eaf0: 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69   If called.** li
eb00: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
eb10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63         sqliteSrc
eb20: 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43  ListAppend(A,B,C
eb30: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
eb40: 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
eb50: 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
eb60: 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f  atabase name..*/
eb70: 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
eb80: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72  SrcListAppend(Sr
eb90: 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  cList *pList, To
eba0: 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b  ken *pTable, Tok
ebb0: 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a  en *pDatabase){.
ebc0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
ebd0: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
ebe0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
ebf0: 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20  of(SrcList) );. 
ec00: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
ec10: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
ec20: 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 53    if( (pList->nS
ec30: 72 63 20 26 20 37 29 3d 3d 31 20 29 7b 0a 20 20  rc & 7)==1 ){.  
ec40: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
ec50: 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
ec60: 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c  teRealloc(pList,
ec70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec80: 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b  sizeof(*pList) +
ec90: 20 28 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 38 29   (pList->nSrc+8)
eca0: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
ecb0: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
ecc0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
ecd0: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65   sqliteSrcListDe
ece0: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
ecf0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
ed00: 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70   }.    pList = p
ed10: 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  New;.  }.  memse
ed20: 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  t(&pList->a[pLis
ed30: 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73 69 7a  t->nSrc], 0, siz
ed40: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
ed50: 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  );.  if( pDataba
ed60: 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
ed70: 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
ed80: 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
ed90: 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
eda0: 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  && pTable ){.   
edb0: 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20   Token *pTemp = 
edc0: 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70  pDatabase;.    p
edd0: 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c  Database = pTabl
ede0: 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20  e;.    pTable = 
edf0: 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 69 66 28  pTemp;.  }.  if(
ee00: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 63   pTable ){.    c
ee10: 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73  har **pz = &pLis
ee20: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
ee30: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c  ].zName;.    sql
ee40: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  iteSetNString(pz
ee50: 2c 20 70 54 61 62 6c 65 2d 3e 7a 2c 20 70 54 61  , pTable->z, pTa
ee60: 62 6c 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ble->n, 0);.    
ee70: 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20  if( *pz==0 ){.  
ee80: 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73      sqliteSrcLis
ee90: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
eea0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
eeb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eec0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a   sqliteDequote(*
eed0: 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pz);.    }.  }. 
eee0: 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29   if( pDatabase )
eef0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20  {.    char **pz 
ef00: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
ef10: 74 2d 3e 6e 53 72 63 5d 2e 7a 44 61 74 61 62 61  t->nSrc].zDataba
ef20: 73 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  se;.    sqliteSe
ef30: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 44 61  tNString(pz, pDa
ef40: 74 61 62 61 73 65 2d 3e 7a 2c 20 70 44 61 74 61  tabase->z, pData
ef50: 62 61 73 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  base->n, 0);.   
ef60: 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20   if( *pz==0 ){. 
ef70: 20 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69       sqliteSrcLi
ef80: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
ef90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
efa0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
efb0: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
efc0: 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *pz);.    }.  }.
efd0: 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b    pList->nSrc++;
efe0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
eff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
f000: 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61   alias to the la
f010: 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  st identifier on
f020: 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74   the given ident
f030: 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ifier list..*/.v
f040: 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73  oid sqliteSrcLis
f050: 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73  tAddAlias(SrcLis
f060: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
f070: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20  *pToken){.  if( 
f080: 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e  pList && pList->
f090: 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e  nSrc>0 ){.    in
f0a0: 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 53 72  t i = pList->nSr
f0b0: 63 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  c - 1;.    sqlit
f0c0: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69  eSetNString(&pLi
f0d0: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c  st->a[i].zAlias,
f0e0: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
f0f0: 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73  en->n, 0);.    s
f100: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69  qliteDequote(pLi
f110: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29  st->a[i].zAlias)
f120: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
f130: 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
f140: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49  .*/.void sqliteI
f150: 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69  dListDelete(IdLi
f160: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
f170: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
f180: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f190: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
f1a0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
f1b0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
f1c0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
f1d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
f1e0: 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71  (pList->a);.  sq
f1f0: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b  liteFree(pList);
f200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f210: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c   the index in pL
f220: 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74  ist of the ident
f230: 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e  ifier named zId.
f240: 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
f250: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
f260: 69 6e 74 20 73 71 6c 69 74 65 49 64 4c 69 73 74  int sqliteIdList
f270: 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c  Index(IdList *pL
f280: 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ist, const char 
f290: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
f2a0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
f2b0: 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
f2c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
f2d0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
f2e0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
f2f0: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
f300: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
f310: 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
f320: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
f330: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
f340: 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
f350: 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
f360: 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
f370: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 72 63  /.void sqliteSrc
f380: 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69  ListDelete(SrcLi
f390: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
f3a0: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
f3b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f3c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
f3d0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
f3e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
f3f0: 73 74 2d 3e 61 5b 69 5d 2e 7a 44 61 74 61 62 61  st->a[i].zDataba
f400: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
f410: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
f420: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
f430: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
f440: 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  i].zAlias);.    
f450: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
f460: 70 54 61 62 20 26 26 20 70 4c 69 73 74 2d 3e 61  pTab && pList->a
f470: 5b 69 5d 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e  [i].pTab->isTran
f480: 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  sient ){.      s
f490: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
f4a0: 28 30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  (0, pList->a[i].
f4b0: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pTab);.    }.   
f4c0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
f4d0: 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ete(pList->a[i].
f4e0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
f4f0: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
f500: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  List->a[i].pOn);
f510: 0a 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73  .    sqliteIdLis
f520: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61  tDelete(pList->a
f530: 5b 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  [i].pUsing);.  }
f540: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
f550: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ist);.}../*.** B
f560: 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
f570: 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
f580: 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  eBeginTransactio
f590: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
f5a0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
f5b0: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20   sqlite *db;..  
f5c0: 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
f5d0: 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
f5e0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
f5f0: 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
f600: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
f610: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
f620: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
f630: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
f640: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
f650: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
f660: 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
f670: 22 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  ", 0) ) return;.
f680: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
f690: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
f6a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72   ){.    sqliteEr
f6b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f6c0: 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74  cannot start a t
f6d0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 69  ransaction withi
f6e0: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22  n a transaction"
f6f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
f700: 20 7d 0a 20 20 73 71 6c 69 74 65 42 65 67 69 6e   }.  sqliteBegin
f710: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
f720: 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Parse, 0, 0);.  
f730: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
f740: 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64  ITE_InTrans;.  d
f750: 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45  b->onError = onE
f760: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rror;.}../*.** C
f770: 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
f780: 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
f790: 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  teCommitTransact
f7a0: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
f7b0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
f7c0: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
f7d0: 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
f7e0: 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
f7f0: 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
f800: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
f810: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
f820: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
f830: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
f840: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
f850: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
f860: 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
f870: 43 4f 4d 4d 49 54 22 2c 20 30 29 20 29 20 72 65  COMMIT", 0) ) re
f880: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d  turn;.  if( (db-
f890: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
f8a0: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20  InTrans)==0 ){. 
f8b0: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
f8c0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
f8d0: 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72  t commit - no tr
f8e0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
f8f0: 69 76 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ive");.    retur
f900: 6e 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  n;.  }.  db->fla
f910: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
f920: 54 72 61 6e 73 3b 0a 20 20 73 71 6c 69 74 65 45  Trans;.  sqliteE
f930: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
f940: 28 70 50 61 72 73 65 29 3b 0a 20 20 64 62 2d 3e  (pParse);.  db->
f950: 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66  onError = OE_Def
f960: 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ault;.}../*.** R
f970: 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
f980: 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
f990: 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  liteRollbackTran
f9a0: 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
f9b0: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
f9c0: 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
f9d0: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
f9e0: 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
f9f0: 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
fa00: 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
fa10: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
fa20: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
fa30: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
fa40: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
fa50: 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65 63  ( sqliteAuthChec
fa60: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
fa70: 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52  _TRANSACTION, "R
fa80: 4f 4c 4c 42 41 43 4b 22 2c 20 30 29 20 29 20 72  OLLBACK", 0) ) r
fa90: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62  eturn;.  if( (db
faa0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
fab0: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a  _InTrans)==0 ){.
fac0: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
fad0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
fae0: 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f  ot rollback - no
faf0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
fb00: 61 63 74 69 76 65 22 29 3b 0a 20 20 20 20 72 65  active");.    re
fb10: 74 75 72 6e 3b 20 0a 20 20 7d 0a 20 20 76 20 3d  turn; .  }.  v =
fb20: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
fb30: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
fb40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
fb50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c  eAddOp(v, OP_Rol
fb60: 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20  lback, 0, 0);.  
fb70: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  }.  db->flags &=
fb80: 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73   ~SQLITE_InTrans
fb90: 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20  ;.  db->onError 
fba0: 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a  = OE_Default;.}.
fbb0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
fbc0: 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77  VDBE code that w
fbd0: 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73  ill verify the s
fbe0: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 66 6f 72  chema cookie for
fbf0: 20 61 6c 6c 0a 2a 2a 20 6e 61 6d 65 64 20 64 61   all.** named da
fc00: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f  tabase files..*/
fc10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 64 65  .void sqliteCode
fc20: 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72  VerifySchema(Par
fc30: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
fc40: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 20 2a  nt i;.  sqlite *
fc50: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
fc60: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
fc70: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
fc80: 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
fc90: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
fca0: 20 20 20 20 69 66 28 20 69 3d 3d 31 20 7c 7c 20      if( i==1 || 
fcb0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d  db->aDb[i].pBt==
fcc0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
fcd0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
fce0: 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f  p(v, OP_VerifyCo
fcf0: 6f 6b 69 65 2c 20 69 2c 20 64 62 2d 3e 61 44 62  okie, i, db->aDb
fd00: 5b 69 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  [i].schema_cooki
fd10: 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  e);.  }.  pParse
fd20: 2d 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64  ->schemaVerified
fd30: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = 1;.}../*.** G
fd40: 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
fd50: 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20  e that prepares 
fd60: 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65  for doing an ope
fd70: 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d  ration that.** m
fd80: 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
fd90: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
fda0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  This routine sta
fdb0: 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61  rts a new transa
fdc0: 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20  ction if we are 
fdd0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68  not already with
fde0: 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  in.** a transact
fdf0: 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20  ion.  If we are 
fe00: 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61  already within a
fe10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
fe20: 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a  en a checkpoint.
fe30: 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65  ** is set if the
fe40: 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 70   setCheckpoint p
fe50: 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
fe60: 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20  .  A checkpoint 
fe70: 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74  should.** be set
fe80: 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   for operations 
fe90: 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20  that might fail 
fea0: 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72  (due to a constr
feb0: 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a  aint) part of.**
fec0: 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68   the way through
fed0: 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20   and which will 
fee0: 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d  need to undo som
fef0: 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74  e writes without
ff00: 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f   having to.** ro
ff10: 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65  llback the whole
ff20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46   transaction.  F
ff30: 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68  or operations wh
ff40: 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ere all constrai
ff50: 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68  nts.** can be ch
ff60: 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79  ecked before any
ff70: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
ff80: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
ff90: 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a  e, it is never.*
ffa0: 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  * necessary to u
ffb0: 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20  ndo a write and 
ffc0: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73  the checkpoint s
ffd0: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74  hould not be set
ffe0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 6d 70  ..**.** The temp
fff0: 4f 6e 6c 79 20 66 6c 61 67 20 69 6e 64 69 63 61  Only flag indica
10000 74 65 73 20 74 68 61 74 20 6f 6e 6c 79 20 74 65  tes that only te
10010 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 77  mporary tables w
10020 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 0a 2a  ill be changed.*
10030 2a 20 64 75 72 69 6e 67 20 74 68 69 73 20 77 72  * during this wr
10040 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ite operation.  
10050 54 68 65 20 70 72 69 6d 61 72 79 20 64 61 74 61  The primary data
10060 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6e 6f  base table is no
10070 74 0a 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 65  t.** write-locke
10080 64 2e 20 20 4f 6e 6c 79 20 74 68 65 20 74 65 6d  d.  Only the tem
10090 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
100a0 66 69 6c 65 20 67 65 74 73 20 61 20 77 72 69 74  file gets a writ
100b0 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 4f 74 68 65 72  e lock..** Other
100c0 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 63   processes can c
100d0 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 61 64 20  ontinue to read 
100e0 6f 72 20 77 72 69 74 65 20 74 68 65 20 70 72 69  or write the pri
100f0 6d 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mary database fi
10100 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
10110 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
10120 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
10130 72 73 65 2c 20 69 6e 74 20 73 65 74 43 68 65 63  rse, int setChec
10140 6b 70 6f 69 6e 74 2c 20 69 6e 74 20 74 65 6d 70  kpoint, int temp
10150 4f 6e 6c 79 29 7b 0a 20 20 56 64 62 65 20 2a 76  Only){.  Vdbe *v
10160 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  ;.  v = sqliteGe
10170 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
10180 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
10190 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
101a0 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 20 72 65  ->trigStack ) re
101b0 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73  turn; /* if this
101c0 20 69 73 20 69 6e 20 61 20 74 72 69 67 67 65 72   is in a trigger
101d0 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 72 73   */.  if( (pPars
101e0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
101f0 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
10200 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  0 ){.    sqliteV
10210 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
10220 72 61 6e 73 61 63 74 69 6f 6e 2c 20 31 2c 20 30  ransaction, 1, 0
10230 29 3b 0a 20 20 20 20 69 66 28 20 21 74 65 6d 70  );.    if( !temp
10240 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  Only ){.      in
10250 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t i;.      sqlit
10260 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
10270 64 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  db;.      sqlite
10280 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10290 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20  Transaction, 0, 
102a0 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
102b0 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
102c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
102d0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d  db->aDb[i].pBt==
102e0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
102f0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
10300 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e  AddOp(v, OP_Tran
10310 73 61 63 74 69 6f 6e 2c 20 69 2c 20 30 29 3b 0a  saction, i, 0);.
10320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
10330 6c 69 74 65 43 6f 64 65 56 65 72 69 66 79 53 63  liteCodeVerifySc
10340 68 65 6d 61 28 70 50 61 72 73 65 29 3b 0a 20 20  hema(pParse);.  
10350 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
10360 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 29 7b  setCheckpoint ){
10370 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
10380 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b  ddOp(v, OP_Check
10390 70 6f 69 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  point, 0, 0);.  
103a0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
103b0 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69  p(v, OP_Checkpoi
103c0 6e 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  nt, 1, 0);.  }.}
103d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
103e0 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63 6c   code that concl
103f0 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69 6f  udes an operatio
10400 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76 65 20  n that may have 
10410 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20 64  changed.** the d
10420 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
10430 73 20 61 20 63 6f 6d 70 61 6e 69 6f 6e 20 66 75  s a companion fu
10440 6e 63 74 69 6f 6e 20 74 6f 20 42 65 67 69 6e 57  nction to BeginW
10450 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 2e  riteOperation().
10460 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
10470 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
10480 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 69 74  , then commit it
10490 2e 20 20 49 66 20 61 20 63 68 65 63 6b 70 6f 69  .  If a checkpoi
104a0 6e 74 20 77 61 73 0a 2a 2a 20 73 74 61 72 74 65  nt was.** starte
104b0 64 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  d then commit th
104c0 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  at..*/.void sqli
104d0 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
104e0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
104f0 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  e){.  Vdbe *v;. 
10500 20 69 66 28 20 70 50 61 72 73 65 2d 3e 74 72 69   if( pParse->tri
10510 67 53 74 61 63 6b 20 29 20 72 65 74 75 72 6e 3b  gStack ) return;
10520 20 2f 2a 20 69 66 20 74 68 69 73 20 69 73 20 69   /* if this is i
10530 6e 20 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20  n a trigger */. 
10540 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
10550 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
10560 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
10570 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
10580 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
10590 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20  E_InTrans ){.   
105a0 20 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e 67 20 2a   /* Do Nothing *
105b0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  /.  }else{.    s
105c0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
105d0 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20  , OP_Commit, 0, 
105e0 30 29 3b 0a 20 20 7d 0a 7d 0a                    0);.  }.}.