/ Hex Artifact Content
Login

Artifact ede692549ce5c43a80e2a9954421ccaee116b2df:


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 43 4f 50 59 0a  sts.**     COPY.
02a0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02b0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02c0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02d0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02e0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
02f0: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0300: 69 6c 64 2e 63 2c 76 20 31 2e 31 31 36 20 32 30  ild.c,v 1.116 20
0310: 30 32 2f 31 32 2f 30 32 20 30 34 3a 32 35 3a 32  02/12/02 04:25:2
0320: 31 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  1 drh Exp $.*/.#
0330: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0340: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0350: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0360: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0380: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0390: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
03a0: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 43  ** be parsed.  C
03b0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
03c0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
03d0: 65 20 64 61 74 61 62 61 73 65 20 6e 65 65 64 73  e database needs
03e0: 0a 2a 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66  .** to be read f
03f0: 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  rom the SQLITE_M
0400: 41 53 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45  ASTER and SQLITE
0410: 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62  _TEMP_MASTER tab
0420: 6c 65 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  les..** If it do
0430: 65 73 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74  es, then read it
0440: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0450: 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65  BeginParse(Parse
0460: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78   *pParse, int ex
0470: 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71  plainFlag){.  sq
0480: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
0490: 65 2d 3e 64 62 3b 0a 20 20 70 50 61 72 73 65 2d  e->db;.  pParse-
04a0: 3e 65 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61  >explain = expla
04b0: 69 6e 46 6c 61 67 3b 0a 20 20 69 66 28 28 64 62  inFlag;.  if((db
04c0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
04d0: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30  _Initialized)==0
04e0: 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   && pParse->init
04f0: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Flag==0 ){.    i
0500: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e  nt rc = sqliteIn
0510: 69 74 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e  it(db, &pParse->
0520: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
0530: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
0540: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
0550: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
0560: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
0570: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0580: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0590: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
05a0: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
05b0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
05c0: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 77 65  ** parsed and we
05d0: 20 77 61 6e 74 20 74 6f 20 65 78 65 63 75 74 65   want to execute
05e0: 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 74   the VDBE code t
05f0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20  o implement .** 
0600: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2e 20  that statement. 
0610: 20 50 72 69 6f 72 20 61 63 74 69 6f 6e 20 72 6f   Prior action ro
0620: 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61  utines should ha
0630: 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 63 6f  ve already.** co
0640: 6e 73 74 72 75 63 74 65 64 20 56 44 42 45 20 63  nstructed VDBE c
0650: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  ode to do the wo
0660: 72 6b 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  rk of the SQL st
0670: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73  atement..** This
0680: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61   routine just ha
0690: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
06a0: 20 56 44 42 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a   VDBE code..**.*
06b0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
06c0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
06d0: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
06e0: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
06f0: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0700: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0710: 69 64 20 73 71 6c 69 74 65 45 78 65 63 28 50 61  id sqliteExec(Pa
0720: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
0730: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
0740: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  OK;.  sqlite *db
0750: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0760: 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   if( sqlite_mall
0770: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
0780: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
0790: 2d 3e 70 56 64 62 65 20 26 26 20 70 50 61 72 73  ->pVdbe && pPars
07a0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
07b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
07c0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 72  plain ){.      r
07d0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4c 69  c = sqliteVdbeLi
07e0: 73 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  st(pParse->pVdbe
07f0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
0800: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
0810: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0830: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b  Parse->zErrMsg);
0840: 0a 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f  .      db->next_
0850: 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68  cookie = db->sch
0860: 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20  ema_cookie;.    
0870: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49 4c  }else{.      FIL
0880: 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e  E *trace = (db->
0890: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
08a0: 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73  dbeTrace)!=0 ? s
08b0: 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 20  tdout : 0;.     
08c0: 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63 65   sqliteVdbeTrace
08d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
08e0: 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72 63  trace);.      rc
08f0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78 65   = sqliteVdbeExe
0900: 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  c(pParse->pVdbe,
0910: 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61   pParse->xCallba
0920: 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72 67  ck, pParse->pArg
0930: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 50               &pP
0950: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  arse->zErrMsg, d
0960: 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20 20  b->pBusyArg,.   
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73 79         db->xBusy
0990: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  Callback);.     
09a0: 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73 65   if( rc ) pParse
09b0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nErr++;.    }.
09c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
09d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56 64  lete(pParse->pVd
09e0: 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  be);.    pParse-
09f0: 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20 20  >pVdbe = 0;.    
0a00: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
0a10: 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Set = 0;.    pPa
0a20: 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
0a30: 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61    pParse->schema
0a40: 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20 20  Verified = 0;.  
0a50: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  }.  pParse->nTab
0a60: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0a70: 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72  nMem = 0;.  pPar
0a80: 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20  se->nSet = 0;.  
0a90: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30  pParse->nAgg = 0
0aa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0ab0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0ac0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0ad0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0ae0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0af0: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0b00: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0b10: 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  at table.  Retur
0b20: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
0b30: 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  und..*/.Table *s
0b40: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73  qliteFindTable(s
0b50: 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74  qlite *db, const
0b60: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
0b70: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d   Table *p;.  p =
0b80: 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28   sqliteHashFind(
0b90: 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  &db->tblHash, zN
0ba0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
0bb0: 65 29 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  e)+1);.  return 
0bc0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
0bd0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0be0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0bf0: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0c00: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
0c10: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
0c20: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a  of that index..*
0c30: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
0c40: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49   not found..*/.I
0c50: 6e 64 65 78 20 2a 73 71 6c 69 74 65 46 69 6e 64  ndex *sqliteFind
0c60: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
0c70: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
0c80: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
0c90: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61  ;.  p = sqliteHa
0ca0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 69 64 78 48  shFind(&db->idxH
0cb0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
0cc0: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
0cd0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0ce0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
0cf0: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
0d00: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
0d10: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
0d20: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
0d30: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
0d40: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
0d50: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
0d60: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
0d70: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
0d80: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
0d90: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
0da0: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
0db0: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
0dc0: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
0dd0: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
0de0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
0df0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
0e00: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
0e10: 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20  lite *db, Index 
0e20: 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f  *p){.  Index *pO
0e30: 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  ld;.  assert( db
0e40: 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21  !=0 && p->zName!
0e50: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
0e60: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
0e70: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 2d  &db->idxHash, p-
0e80: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
0e90: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
0ea0: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26    if( pOld!=0 &&
0eb0: 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20   pOld!=p ){.    
0ec0: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
0ed0: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70  (&db->idxHash, p
0ee0: 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  Old->zName, strl
0ef0: 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b  en(pOld->zName)+
0f00: 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20  1, pOld);.  }.  
0f10: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
0f20: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
0f30: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
0f40: 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74  rom its table, t
0f50: 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68  hen remove.** th
0f60: 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  e index from the
0f70: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
0f80: 65 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d  e and free its m
0f90: 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75  emory.** structu
0fa0: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
0fb0: 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  iteUnlinkAndDele
0fc0: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  teIndex(sqlite *
0fd0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  db, Index *pInde
0fe0: 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  x){.  if( pIndex
0ff0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
1000: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
1010: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
1020: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
1030: 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
1040: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
1050: 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d     for(p=pIndex-
1060: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
1070: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d   p && p->pNext!=
1080: 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65  pIndex; p=p->pNe
1090: 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 20  xt){}.    if( p 
10a0: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
10b0: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  dex ){.      p->
10c0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
10d0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
10e0: 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  .  sqliteDeleteI
10f0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1100: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
1110: 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f   all schema info
1120: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
1130: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
1140: 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 64 61 74  tables of.** dat
1150: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1160: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1170: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63  is called to rec
1180: 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62  laim memory.** b
1190: 65 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65 63  efore the connec
11a0: 74 69 6f 6e 20 63 6c 6f 73 65 73 2e 20 20 49 74  tion closes.  It
11b0: 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20   is also called 
11c0: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
11d0: 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65  k.** if there we
11e0: 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  re schema change
11f0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  s during the tra
1200: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nsaction..*/.voi
1210: 64 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74  d sqliteResetInt
1220: 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69  ernalSchema(sqli
1230: 74 65 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  te *db){.  HashE
1240: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
1250: 73 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68  sh temp1;.  Hash
1260: 20 74 65 6d 70 32 3b 0a 0a 20 20 73 71 6c 69 74   temp2;..  sqlit
1270: 65 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  eHashClear(&db->
1280: 61 46 4b 65 79 29 3b 0a 20 20 74 65 6d 70 31 20  aFKey);.  temp1 
1290: 3d 20 64 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  = db->tblHash;. 
12a0: 20 74 65 6d 70 32 20 3d 20 64 62 2d 3e 74 72 69   temp2 = db->tri
12b0: 67 48 61 73 68 3b 0a 20 20 73 71 6c 69 74 65 48  gHash;.  sqliteH
12c0: 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 74 72 69  ashInit(&db->tri
12d0: 67 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41  gHash, SQLITE_HA
12e0: 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20  SH_STRING, 0);. 
12f0: 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72   sqliteHashClear
1300: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a  (&db->idxHash);.
1310: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
1320: 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d  teHashFirst(&tem
1330: 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  p2); pElem; pEle
1340: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
1350: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 72  (pElem)){.    Tr
1360: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 20  igger *pTrigger 
1370: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
1380: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71 6c  (pElem);.    sql
1390: 69 74 65 44 65 6c 65 74 65 54 72 69 67 67 65 72  iteDeleteTrigger
13a0: 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 7d 0a  (pTrigger);.  }.
13b0: 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61    sqliteHashClea
13c0: 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 73 71 6c  r(&temp2);.  sql
13d0: 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62 2d  iteHashInit(&db-
13e0: 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45  >tblHash, SQLITE
13f0: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29  _HASH_STRING, 0)
1400: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
1410: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
1420: 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45  emp1); pElem; pE
1430: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
1440: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
1450: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
1460: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
1470: 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  em);.    sqliteD
1480: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1490: 54 61 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Tab);.  }.  sqli
14a0: 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d  teHashClear(&tem
14b0: 70 31 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  p1);.  db->flags
14c0: 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 49 6e 69   &= ~(SQLITE_Ini
14d0: 74 69 61 6c 69 7a 65 64 7c 53 51 4c 49 54 45 5f  tialized|SQLITE_
14e0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a  InternChanges);.
14f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1500: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1510: 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
1520: 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20  ack occurs.  If 
1530: 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63  there were.** sc
1540: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
1550: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
1560: 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76  ion, then we hav
1570: 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  e to reset the.*
1580: 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  * internal hash 
1590: 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61  tables and reloa
15a0: 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b  d them from disk
15b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15c0: 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c  RollbackInternal
15d0: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a  Changes(sqlite *
15e0: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66  db){.  if( db->f
15f0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
1600: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
1610: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e     sqliteResetIn
1620: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 29  ternalSchema(db)
1630: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1640: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1650: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
1660: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
1670: 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  oid sqliteCommit
1680: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
1690: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 64  sqlite *db){.  d
16a0: 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b->schema_cookie
16b0: 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b   = db->next_cook
16c0: 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  ie;.  db->flags 
16d0: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
16e0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
16f0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
1700: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
1710: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
1720: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
1730: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
1740: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
1750: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
1760: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
1770: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
1780: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
1790: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
17a0: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
17b0: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
17c0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
17d0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
17e0: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
17f0: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
1800: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
1810: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
1820: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
1830: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
1840: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
1850: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
1860: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
1870: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1880: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
1890: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
18a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
18b0: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
18c0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
18d0: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
18e0: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
18f0: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
1900: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
1910: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
1920: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
1930: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1940: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
1950: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
1960: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1970: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  eDeleteTable(sql
1980: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
1990: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
19a0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ;.  Index *pInde
19b0: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65  x, *pNext;.  FKe
19c0: 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74  y *pFKey, *pNext
19d0: 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61  FKey;..  if( pTa
19e0: 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ble==0 ) return;
19f0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
1a00: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
1a10: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
1a20: 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  able.  */.  for(
1a30: 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d  pIndex = pTable-
1a40: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
1a50: 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a   pIndex=pNext){.
1a60: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64      pNext = pInd
1a70: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  ex->pNext;.    s
1a80: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
1a90: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
1aa0: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
1ab0: 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ll foreign keys 
1ac0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ad0: 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65  this table.  The
1ae0: 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c   keys.  ** shoul
1af0: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
1b00: 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  een unlinked fro
1b10: 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20  m the db->aFKey 
1b20: 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f  hash table .  */
1b30: 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61  .  for(pFKey=pTa
1b40: 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  ble->pFKey; pFKe
1b50: 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b  y; pFKey=pNextFK
1b60: 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b  ey){.    pNextFK
1b70: 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78  ey = pFKey->pNex
1b80: 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72  tFrom;.    asser
1b90: 74 28 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e  t( sqliteHashFin
1ba0: 64 28 26 64 62 2d 3e 61 46 4b 65 79 2c 70 46 4b  d(&db->aFKey,pFK
1bb0: 65 79 2d 3e 7a 54 6f 2c 73 74 72 6c 65 6e 28 70  ey->zTo,strlen(p
1bc0: 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70  FKey->zTo)+1)!=p
1bd0: 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69  FKey );.    sqli
1be0: 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20  teFree(pFKey);. 
1bf0: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
1c00: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
1c10: 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ure itself..  */
1c20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1c30: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
1c40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1c50: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d  (pTable->aCol[i]
1c60: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  .zName);.    sql
1c70: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
1c80: 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a  aCol[i].zDflt);.
1c90: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1ca0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  Table->aCol[i].z
1cb0: 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Type);.  }.  sql
1cc0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
1cd0: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
1ce0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
1cf0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65  l);.  sqliteSele
1d00: 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d  ctDelete(pTable-
1d10: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >pSelect);.  sql
1d20: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b  iteFree(pTable);
1d30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
1d40: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
1d50: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
1d60: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
1d70: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
1d80: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
1d90: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
1da0: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
1db0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1dc0: 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e  d sqliteUnlinkAn
1dd0: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
1de0: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
1df0: 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c  p){.  Table *pOl
1e00: 64 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20  d;.  FKey *pF1, 
1e10: 2a 70 46 32 3b 0a 20 20 61 73 73 65 72 74 28 20  *pF2;.  assert( 
1e20: 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  db!=0 );.  pOld 
1e30: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1e40: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1e50: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
1e60: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
1e70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c  );.  assert( pOl
1e80: 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20  d==0 || pOld==p 
1e90: 29 3b 0a 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e  );.  for(pF1=p->
1ea0: 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d  pFKey; pF1; pF1=
1eb0: 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  pF1->pNextFrom){
1ec0: 0a 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73  .    int nTo = s
1ed0: 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20  trlen(pF1->zTo) 
1ee0: 2b 20 31 3b 0a 20 20 20 20 70 46 32 20 3d 20 73  + 1;.    pF2 = s
1ef0: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
1f00: 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a  b->aFKey, pF1->z
1f10: 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66  To, nTo);.    if
1f20: 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20  ( pF2==pF1 ){.  
1f30: 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e      sqliteHashIn
1f40: 73 65 72 74 28 26 64 62 2d 3e 61 46 4b 65 79 2c  sert(&db->aFKey,
1f50: 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20   pF1->zTo, nTo, 
1f60: 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20  pF1->pNextTo);. 
1f70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f80: 77 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46  while( pF2 && pF
1f90: 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20  2->pNextTo!=pF1 
1fa0: 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78  ){ pF2=pF2->pNex
1fb0: 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  tTo; }.      if(
1fc0: 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20   pF2 ){.        
1fd0: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  pF2->pNextTo = p
1fe0: 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20  F1->pNextTo;.   
1ff0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2000: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
2010: 6c 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  le(db, p);.}../*
2020: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68  .** Construct th
2030: 65 20 6e 61 6d 65 20 6f 66 20 61 20 75 73 65 72  e name of a user
2040: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
2050: 66 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a  from a token..**
2060: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
2070: 64 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6f 62  d the name is ob
2080: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
2090: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
20a0: 75 73 74 0a 2a 2a 20 62 65 20 66 72 65 65 64 20  ust.** be freed 
20b0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
20c0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72  unction..*/.char
20d0: 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d   *sqliteTableNam
20e0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e  eFromToken(Token
20f0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
2100: 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   *zName = sqlite
2110: 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a  StrNDup(pName->z
2120: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73  , pName->n);.  s
2130: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4e 61  qliteDequote(zNa
2140: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e  me);.  return zN
2150: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ame;.}../*.** Ge
2160: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6f  nerate code to o
2170: 70 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  pen the appropri
2180: 61 74 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  ate master table
2190: 2e 20 20 54 68 65 20 74 61 62 6c 65 0a 2a 2a 20  .  The table.** 
21a0: 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 53  opened will be S
21b0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 66 6f 72  QLITE_MASTER for
21c0: 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c   persistent tabl
21d0: 65 73 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54  es and .** SQLIT
21e0: 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 66 6f  E_TEMP_MASTER fo
21f0: 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  r temporary tabl
2200: 65 73 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69  es.  The table i
2210: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 63  s opened.** on c
2220: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
2230: 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65   sqliteOpenMaste
2240: 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20  rTable(Vdbe *v, 
2250: 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 69  int isTemp){.  i
2260: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
2270: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2280: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78  (v, OP_OpenWrAux
2290: 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 73 71 6c  , 0, 2);.    sql
22a0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
22b0: 76 2c 20 2d 31 2c 20 54 45 4d 50 5f 4d 41 53 54  v, -1, TEMP_MAST
22c0: 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54 41 54  ER_NAME, P3_STAT
22d0: 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IC);.  }else{.  
22e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
22f0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
2300: 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 73 71  e, 0, 2);.    sq
2310: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
2320: 28 76 2c 20 2d 31 2c 20 4d 41 53 54 45 52 5f 4e  (v, -1, MASTER_N
2330: 41 4d 45 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  AME, P3_STATIC);
2340: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  .  }.}../*.** Be
2350: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
2360: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
2370: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
2380: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
2390: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
23a0: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
23b0: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
23c0: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
23d0: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
23e0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
23f0: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
2400: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
2410: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
2420: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
2430: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
2440: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
2450: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a  able name.  The.
2460: 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20  ** pStart token 
2470: 69 73 20 74 68 65 20 43 52 45 41 54 45 20 61 6e  is the CREATE an
2480: 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74  d pName is the t
2490: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
24a0: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
24b0: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
24c0: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
24d0: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
24e0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
24f0: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
2500: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
2510: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
2520: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
2530: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
2540: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
2550: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
2560: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
2570: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
2580: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
2590: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
25a0: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
25b0: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
25c0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
25d0: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
25e0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
25f0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
2600: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
2610: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
2620: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
2630: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
2640: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
2650: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
2660: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
2670: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
2680: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
2690: 65 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  eEndTable() rout
26a0: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
26b0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
26c0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
26d0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
26e0: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
26f0: 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28  qliteStartTable(
2700: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
2710: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 54 6f  oken *pStart, To
2720: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ken *pName, int 
2730: 69 73 54 65 6d 70 29 7b 0a 20 20 54 61 62 6c 65  isTemp){.  Table
2740: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65   *pTable;.  Inde
2750: 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20  x *pIdx;.  char 
2760: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  *zName;.  sqlite
2770: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2780: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
2790: 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54   pParse->sFirstT
27a0: 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a  oken = *pStart;.
27b0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
27c0: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
27d0: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
27e0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
27f0: 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  rn;..  /* Before
2800: 20 74 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74   trying to creat
2810: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
2820: 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ble, make sure t
2830: 68 65 20 42 74 72 65 65 20 66 6f 72 0a 20 20 2a  he Btree for.  *
2840: 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72  * holding tempor
2850: 61 72 79 20 74 61 62 6c 65 73 20 69 73 20 6f 70  ary tables is op
2860: 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  en..  */.  if( i
2870: 73 54 65 6d 70 20 26 26 20 64 62 2d 3e 70 42 65  sTemp && db->pBe
2880: 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Temp==0 ){.    i
2890: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74  nt rc = sqliteBt
28a0: 72 65 65 4f 70 65 6e 28 30 2c 20 30 2c 20 4d 41  reeOpen(0, 0, MA
28b0: 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 70 42  X_PAGES, &db->pB
28c0: 65 54 65 6d 70 29 3b 0a 20 20 20 20 69 66 28 20  eTemp);.    if( 
28d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
28f0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
2900: 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65  zErrMsg, "unable
2910: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
2920: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
2930: 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
2940: 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
2950: 61 72 79 20 74 61 62 6c 65 73 22 2c 20 30 29 3b  ary tables", 0);
2960: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
2970: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
2980: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
2990: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
29a0: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b  QLITE_InTrans ){
29b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
29c0: 74 65 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  teBtreeBeginTran
29d0: 73 28 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b 0a  s(db->pBeTemp);.
29e0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a00: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
2a10: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
2a20: 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20 74 6f  rMsg, "unable to
2a30: 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63   get a write loc
2a40: 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20  k on ".         
2a50: 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20   "the temporary 
2a60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 20  database file", 
2a70: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  0);.        pPar
2a80: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
2a90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2aa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2ab0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
2ac0: 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  e new table name
2ad0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64   does not collid
2ae0: 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69  e with an existi
2af0: 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  ng.  ** index or
2b00: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 49 73   table name.  Is
2b10: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
2b20: 73 61 67 65 20 69 66 20 69 74 20 64 6f 65 73 2e  sage if it does.
2b30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
2b40: 20 61 72 65 20 72 65 2d 72 65 61 64 69 6e 67 20   are re-reading 
2b50: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
2b60: 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20  r table because 
2b70: 6f 66 20 61 20 73 63 68 65 6d 61 0a 20 20 2a 2a  of a schema.  **
2b80: 20 63 68 61 6e 67 65 20 61 6e 64 20 61 20 6e 65   change and a ne
2b90: 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c  w permanent tabl
2ba0: 65 20 69 73 20 66 6f 75 6e 64 20 77 68 6f 73 65  e is found whose
2bb0: 20 6e 61 6d 65 20 63 6f 6c 6c 69 64 65 73 20 77   name collides w
2bc0: 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 78 69 73  ith.  ** an exis
2bd0: 74 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ting temporary t
2be0: 61 62 6c 65 2c 20 74 68 65 6e 20 69 67 6e 6f 72  able, then ignor
2bf0: 65 20 74 68 65 20 6e 65 77 20 70 65 72 6d 61 6e  e the new perman
2c00: 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 20  ent table..  ** 
2c10: 57 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  We will continue
2c20: 20 70 61 72 73 69 6e 67 2c 20 62 75 74 20 74 68   parsing, but th
2c30: 65 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43 6c  e pParse->nameCl
2c40: 61 73 68 20 66 6c 61 67 20 77 69 6c 6c 20 62 65  ash flag will be
2c50: 20 73 65 74 0a 20 20 2a 2a 20 73 6f 20 77 65 20   set.  ** so we 
2c60: 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f 20 64 69 73  will know to dis
2c70: 63 61 72 64 20 74 68 65 20 74 61 62 6c 65 20 72  card the table r
2c80: 65 63 6f 72 64 20 6f 6e 63 65 20 70 61 72 73 69  ecord once parsi
2c90: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e  ng has finished.
2ca0: 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65 20 3d  .  */.  pTable =
2cb0: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
2cc0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  (db, zName);.  i
2cd0: 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  f( pTable!=0 ){.
2ce0: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e      if( pTable->
2cf0: 69 73 54 65 6d 70 20 26 26 20 70 50 61 72 73 65  isTemp && pParse
2d00: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
2d10: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65      pParse->name
2d20: 43 6c 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Clash = 1;.    }
2d30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2d40: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
2d50: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
2d60: 74 61 62 6c 65 20 22 2c 20 30 2c 20 70 4e 61 6d  table ", 0, pNam
2d70: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 0a  e->z, pName->n,.
2d80: 20 20 20 20 20 20 20 20 20 20 22 20 61 6c 72 65            " alre
2d90: 61 64 79 20 65 78 69 73 74 73 22 2c 20 30 2c 20  ady exists", 0, 
2da0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2db0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
2dc0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
2dd0: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  +;.      return;
2de0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2df0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65      pParse->name
2e00: 43 6c 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 20  Clash = 0;.  }. 
2e10: 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c   if( (pIdx = sql
2e20: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
2e30: 20 7a 4e 61 6d 65 29 29 21 3d 30 20 26 26 0a 20   zName))!=0 &&. 
2e40: 20 20 20 20 20 20 20 20 20 28 21 70 49 64 78 2d           (!pIdx-
2e50: 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20  >pTable->isTemp 
2e60: 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  || !pParse->init
2e70: 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 73 71 6c  Flag) ){.    sql
2e80: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
2e90: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
2ea0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
2eb0: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
2ec0: 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ", .       zName
2ed0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2ee0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
2ef0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
2f00: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2f10: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
2f20: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
2f30: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
2f40: 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20   pTable==0 ){.  
2f50: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
2f60: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
2f70: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
2f80: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
2f90: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
2fa0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ;.  pTable->aCol
2fb0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
2fc0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
2fd0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30  able->pIndex = 0
2fe0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 73 54 65  ;.  pTable->isTe
2ff0: 6d 70 20 3d 20 69 73 54 65 6d 70 3b 0a 20 20 69  mp = isTemp;.  i
3000: 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
3010: 61 62 6c 65 20 29 20 73 71 6c 69 74 65 44 65 6c  able ) sqliteDel
3020: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61  eteTable(db, pPa
3030: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b  rse->pNewTable);
3040: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
3050: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
3060: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
3070: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74  ating the code t
3080: 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20  hat will insert 
3090: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
30a0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53   into.  ** the S
30b0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
30c0: 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72  le.  Note in par
30d0: 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20  ticular that we 
30e0: 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20  must go ahead.  
30f0: 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ** and allocate 
3100: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
3110: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
3120: 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f  entry now.  Befo
3130: 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d  re any.  ** PRIM
3140: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
3150: 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70  E keywords are p
3160: 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65  arsed.  Those ke
3170: 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73  ywords will caus
3180: 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74  e.  ** indices t
3190: 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64  o be created and
31a0: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
31b0: 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f  d must come befo
31c0: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64  re the .  ** ind
31d0: 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ices.  Hence, th
31e0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
31f0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
3200: 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
3210: 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20    ** now..  */. 
3220: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e   if( !pParse->in
3230: 69 74 46 6c 61 67 20 26 26 20 28 76 20 3d 20 73  itFlag && (v = s
3240: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
3250: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
3260: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
3270: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
3280: 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20  , 0, isTemp);.  
3290: 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b    if( !isTemp ){
32a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
32b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
32c0: 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66  eger, db->file_f
32d0: 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 20  ormat, 0);.     
32e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
32f0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
3300: 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 1);.    }. 
3310: 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73     sqliteOpenMas
3320: 74 65 72 54 61 62 6c 65 28 76 2c 20 69 73 54 65  terTable(v, isTe
3330: 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  mp);.    sqliteV
3340: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
3350: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
3360: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3370: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
3380: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3390: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
33a0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
33b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
33c0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
33d0: 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d  ey, 0, 0);.  }.}
33e0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
33f0: 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20  w column to the 
3400: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
3410: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
3420: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
3430: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
3440: 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20  outine once for 
3450: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  each column decl
3460: 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20  aration.** in a 
3470: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
3480: 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 53  tement.  sqliteS
3490: 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73  tartTable() gets
34a0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74   called.** first
34b0: 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67   to get things g
34c0: 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73  oing.  Then this
34d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
34e0: 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  ed for each.** c
34f0: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olumn..*/.void s
3500: 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e 28 50  qliteAddColumn(P
3510: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
3520: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54  ken *pName){.  T
3530: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
3540: 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  ;.  char *z = 0;
3550: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
3560: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
3570: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
3580: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
3590: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
35a0: 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  z, pName->z, pNa
35b0: 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 69 66 28  me->n, 0);.  if(
35c0: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
35d0: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
35e0: 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  z);.  for(i=0; i
35f0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
3600: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
3610: 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c  rICmp(z, p->aCol
3620: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
3630: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
3640: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
3650: 7a 45 72 72 4d 73 67 2c 20 22 64 75 70 6c 69 63  zErrMsg, "duplic
3660: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ate column name:
3670: 20 22 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 20   ", z, 0);.     
3680: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
36a0: 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(z);.      retu
36b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
36c0: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
36d0: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
36e0: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
36f0: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  aNew = sqliteRea
3700: 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28  lloc( p->aCol, (
3710: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
3720: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
3730: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
3740: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d  ) return;.    p-
3750: 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20  >aCol = aNew;.  
3760: 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  }.  pCol = &p->a
3770: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20  Col[p->nCol];.  
3780: 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20  memset(pCol, 0, 
3790: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
37a0: 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61  ]));.  pCol->zNa
37b0: 6d 65 20 3d 20 7a 3b 0a 20 20 70 43 6f 6c 2d 3e  me = z;.  pCol->
37c0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49  sortOrder = SQLI
37d0: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 70 2d 3e  TE_SO_NUM;.  p->
37e0: 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nCol++;.}../*.**
37f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3800: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
3810: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
3820: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
3830: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
3840: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
3850: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
3860: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
3870: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
3880: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
3890: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
38a0: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
38b0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
38c0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
38d0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
38e0: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 4e 6f 74  oid sqliteAddNot
38f0: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
3900: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
3910: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
3920: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
3930: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
3940: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
3950: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
3960: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
3970: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
3980: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
3990: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
39a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
39b0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
39c0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
39d0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
39e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
39f0: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
3a00: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
3a10: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
3a20: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
3a30: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
3a40: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
3a50: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
3a60: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
3a70: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
3a80: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
3a90: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
3aa0: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
3ab0: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
3ac0: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
3ad0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
3ae0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
3af0: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
3b00: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
3b10: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
3b20: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
3b30: 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d  d sqliteAddColum
3b40: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
3b50: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72  rse, Token *pFir
3b60: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74  st, Token *pLast
3b70: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
3b80: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
3b90: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a   n;.  char *z, *
3ba0: 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  *pz;.  Column *p
3bb0: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
3bc0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
3bd0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
3be0: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
3bf0: 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
3c00: 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70  urn;.  pCol = &p
3c10: 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20  ->aCol[i];.  pz 
3c20: 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a  = &pCol->zType;.
3c30: 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b    n = pLast->n +
3c40: 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20   Addr(pLast->z) 
3c50: 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e 7a  - Addr(pFirst->z
3c60: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53  );.  sqliteSetNS
3c70: 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73 74  tring(pz, pFirst
3c80: 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20  ->z, n, 0);.  z 
3c90: 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d  = *pz;.  if( z==
3ca0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
3cb0: 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  r(i=j=0; z[i]; i
3cc0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d  ++){.    int c =
3cd0: 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69   z[i];.    if( i
3ce0: 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74  sspace(c) ) cont
3cf0: 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d  inue;.    z[j++]
3d00: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d   = c;.  }.  z[j]
3d10: 20 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d 3e 73 6f   = 0;.  pCol->so
3d20: 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45  rtOrder = SQLITE
3d30: 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 69 66 28 20 70  _SO_NUM;.  if( p
3d40: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f  Parse->db->file_
3d50: 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
3d60: 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
3d70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 77 69 74  i++){.      swit
3d80: 63 68 28 20 7a 5b 69 5d 20 29 7b 0a 20 20 20 20  ch( z[i] ){.    
3d90: 20 20 20 20 63 61 73 65 20 27 62 27 3a 0a 20 20      case 'b':.  
3da0: 20 20 20 20 20 20 63 61 73 65 20 27 42 27 3a 20        case 'B': 
3db0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3dc0: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26  sqliteStrNICmp(&
3dd0: 7a 5b 69 5d 2c 22 62 6c 6f 62 22 2c 34 29 3d 3d  z[i],"blob",4)==
3de0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
3df0: 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72   pCol->sortOrder
3e00: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58   = SQLITE_SO_TEX
3e10: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  T;.            r
3e20: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20  eturn;.         
3e30: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
3e40: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
3e50: 20 20 20 20 20 20 63 61 73 65 20 27 63 27 3a 0a        case 'c':.
3e60: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 43 27          case 'C'
3e70: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  : {.          if
3e80: 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  ( sqliteStrNICmp
3e90: 28 26 7a 5b 69 5d 2c 22 63 68 61 72 22 2c 34 29  (&z[i],"char",4)
3ea0: 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ==0 ||.         
3eb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53           sqliteS
3ec0: 74 72 4e 49 43 6d 70 28 26 7a 5b 69 5d 2c 22 63  trNICmp(&z[i],"c
3ed0: 6c 6f 62 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20  lob",4)==0 ){.  
3ee0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
3ef0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49  sortOrder = SQLI
3f00: 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20  TE_SO_TEXT;.    
3f10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
3f20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3f30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3f40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
3f50: 61 73 65 20 27 78 27 3a 0a 20 20 20 20 20 20 20  ase 'x':.       
3f60: 20 63 61 73 65 20 27 58 27 3a 20 7b 0a 20 20 20   case 'X': {.   
3f70: 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 32 20         if( i>=2 
3f80: 26 26 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d  && sqliteStrNICm
3f90: 70 28 26 7a 5b 69 2d 32 5d 2c 22 74 65 78 74 22  p(&z[i-2],"text"
3fa0: 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,4)==0 ){.      
3fb0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72 74        pCol->sort
3fc0: 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53  Order = SQLITE_S
3fd0: 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 20 20  O_TEXT;.        
3fe0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
3ff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4000: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4010: 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75   }.        defau
4020: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lt: {.          
4030: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4050: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
4060: 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74  given token is t
4070: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
4080: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f   for the last co
4090: 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a  lumn added to.**
40a0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
40b0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
40c0: 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69  ruction.  If "mi
40d0: 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72 75 65  nusFlag" is true
40e0: 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
40f0: 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61  e value token wa
4100: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
4110: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
4120: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4130: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
4140: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
4150: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
4160: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
4170: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
4180: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
4190: 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  eAddDefaultValue
41a0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
41b0: 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74  Token *pVal, int
41c0: 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54   minusFlag){.  T
41d0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
41e0: 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20  ;.  char **pz;. 
41f0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
4200: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
4210: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
4220: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
4230: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
4240: 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69   pz = &p->aCol[i
4250: 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d  ].zDflt;.  if( m
4260: 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20  inusFlag ){.    
4270: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
4280: 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61  (pz, "-", 1, pVa
4290: 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30  l->z, pVal->n, 0
42a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
42b0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
42c0: 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56  (pz, pVal->z, pV
42d0: 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20  al->n, 0);.  }. 
42e0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a   sqliteDequote(*
42f0: 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  pz);.}../*.** De
4300: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
4310: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
4320: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
4330: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
4340: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
4350: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
4360: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
4370: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
4380: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
4390: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
43a0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
43b0: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
43c0: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
43d0: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
43e0: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
43f0: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
4400: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
4410: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
4420: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
4430: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
4440: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
4450: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
4460: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
4470: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
4480: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
4490: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
44a0: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
44b0: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
44c0: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
44d0: 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20  as the row id.  
44e0: 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46  (Exception:.** F
44f0: 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
4500: 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
4510: 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c  older databases,
4520: 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   do not do this.
4530: 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66  ** if the file f
4540: 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75  ormat version nu
4550: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
4560: 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54  n 1.)  Set the T
4570: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
4580: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
4590: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
45a0: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
45b0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
45c0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
45d0: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
45e0: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
45f0: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
4600: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
4610: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
4620: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
4630: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
4640: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
4650: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
4660: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
4670: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
4680: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
4690: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
46a0: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
46b0: 69 74 65 41 64 64 50 72 69 6d 61 72 79 4b 65 79  iteAddPrimaryKey
46c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
46d0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  IdList *pList, i
46e0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
46f0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
4700: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
4710: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
4720: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
4730: 2d 31 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  -1;.  if( pTab==
4740: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
4750: 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b  ( pTab->hasPrimK
4760: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
4770: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
4780: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
4790: 6c 65 20 5c 22 22 2c 20 70 54 61 62 2d 3e 7a 4e  le \"", pTab->zN
47a0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 5c  ame, .        "\
47b0: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
47c0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
47d0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
47e0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
47f0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
4800: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31  ->hasPrimKey = 1
4810: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
4820: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
4830: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
4840: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74   }else if( pList
4850: 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a 20 20 20 20  ->nId==1 ){.    
4860: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
4870: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
4880: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
4890: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c  sqliteStrICmp(pL
48a0: 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ist->a[0].zName,
48b0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
48c0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
48d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
48e0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
48f0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
4900: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70  ){.    zType = p
4910: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
4920: 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zType;.  }.  if(
4930: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c   pParse->db->fil
4940: 65 5f 66 6f 72 6d 61 74 3e 3d 31 20 26 26 20 0a  e_format>=1 && .
4950: 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65             zType
4960: 20 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d   && sqliteStrICm
4970: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
4980: 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54  R")==0 ){.    pT
4990: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
49a0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
49b0: 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  onf = onError;. 
49c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
49d0: 74 65 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  teCreateIndex(pP
49e0: 61 72 73 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73  arse, 0, 0, pLis
49f0: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30  t, onError, 0, 0
4a00: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4a10: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
4a20: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
4a30: 20 74 79 70 65 20 67 69 76 65 6e 20 74 68 65 20   type given the 
4a40: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 74  collation type t
4a50: 6f 6b 65 6e 2e 0a 2a 2a 20 52 65 70 6f 72 74 20  oken..** Report 
4a60: 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
4a70: 74 79 70 65 20 69 73 20 75 6e 64 65 66 69 6e 65  type is undefine
4a80: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
4a90: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
4aa0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
4ab0: 20 2a 70 54 79 70 65 29 7b 0a 20 20 69 66 28 20   *pType){.  if( 
4ac0: 70 54 79 70 65 3d 3d 30 20 29 20 72 65 74 75 72  pType==0 ) retur
4ad0: 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 4b 3b  n SQLITE_SO_UNK;
4ae0: 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d  .  if( pType->n=
4af0: 3d 34 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e  =4 && sqliteStrN
4b00: 49 43 6d 70 28 70 54 79 70 65 2d 3e 7a 2c 20 22  ICmp(pType->z, "
4b10: 74 65 78 74 22 2c 20 34 29 3d 3d 30 20 29 7b 0a  text", 4)==0 ){.
4b20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4b30: 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 7d 0a 20  E_SO_TEXT;.  }. 
4b40: 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 37   if( pType->n==7
4b50: 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e 49 43   && sqliteStrNIC
4b60: 6d 70 28 70 54 79 70 65 2d 3e 7a 2c 20 22 6e 75  mp(pType->z, "nu
4b70: 6d 65 72 69 63 22 2c 20 37 29 3d 3d 30 20 29 7b  meric", 7)==0 ){
4b80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4b90: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 7d 0a 20  TE_SO_NUM;.  }. 
4ba0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
4bb0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
4bc0: 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c  sg, "unknown col
4bd0: 6c 61 74 69 6e 67 20 74 79 70 65 3a 20 22 2c 20  lating type: ", 
4be0: 2d 31 2c 0a 20 20 20 20 70 54 79 70 65 2d 3e 7a  -1,.    pType->z
4bf0: 2c 20 70 54 79 70 65 2d 3e 6e 2c 20 30 29 3b 0a  , pType->n, 0);.
4c00: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
4c10: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
4c20: 45 5f 53 4f 5f 55 4e 4b 3b 0a 7d 0a 0a 2f 2a 0a  E_SO_UNK;.}../*.
4c30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4c40: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
4c50: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
4c60: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
4c70: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
4c80: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4c90: 6e 74 2e 20 20 41 20 22 43 4f 4c 4c 41 54 45 22  nt.  A "COLLATE"
4ca0: 20 63 6c 61 75 73 65 20 68 61 73 0a 2a 2a 20 62   clause has.** b
4cb0: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
4cc0: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
4cd0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 43 6f 6c  ine sets the Col
4ce0: 75 6d 6e 2e 73 6f 72 74 4f 72 64 65 72 20 6f 6e  umn.sortOrder on
4cf0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
4d00: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
4d10: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
4d20: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f  void sqliteAddCo
4d30: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
4d40: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 63 6f 6c  *pParse, int col
4d50: 6c 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20  lType){.  Table 
4d60: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  *p;.  int i;.  i
4d70: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
4d80: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
4d90: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
4da0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
4db0: 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d  >=0 ) p->aCol[i]
4dc0: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 63 6f 6c  .sortOrder = col
4dd0: 6c 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lType;.}../*.** 
4de0: 43 6f 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e  Come up with a n
4df0: 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  ew random value 
4e00: 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 63  for the schema c
4e10: 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72  ookie.  Make sur
4e20: 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c  e.** the new val
4e30: 75 65 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ue is different 
4e40: 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a  from the old..**
4e50: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
4e60: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
4e70: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
4e80: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
4e90: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
4ea0: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
4eb0: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
4ec0: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
4ed0: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
4ee0: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
4ef0: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
4f00: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
4f10: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
4f20: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
4f30: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
4f40: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
4f50: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
4f60: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
4f70: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
4f80: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
4f90: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
4fa0: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
4fb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
4fc0: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
4fd0: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
4fe0: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
4ff0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
5000: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
5010: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
5020: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
5030: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
5040: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
5050: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
5060: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
5070: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
5080: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
5090: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
50a0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
50b0: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
50c0: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
50d0: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
50e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
50f0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69  hangeCookie(sqli
5100: 74 65 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 29  te *db, Vdbe *v)
5110: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65 78 74  {.  if( db->next
5120: 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 73 63 68  _cookie==db->sch
5130: 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20  ema_cookie ){.  
5140: 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69    db->next_cooki
5150: 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63  e = db->schema_c
5160: 6f 6f 6b 69 65 20 2b 20 73 71 6c 69 74 65 52 61  ookie + sqliteRa
5170: 6e 64 6f 6d 42 79 74 65 28 29 20 2b 20 31 3b 0a  ndomByte() + 1;.
5180: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
5190: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
51a0: 61 6e 67 65 73 3b 0a 20 20 20 20 73 71 6c 69 74  anges;.    sqlit
51b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
51c0: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 6e 65  _Integer, db->ne
51d0: 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20  xt_cookie, 0);. 
51e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
51f0: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
5200: 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d  ie, 0, 0);.  }.}
5210: 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20  ../*.** Measure 
5220: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
5230: 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20  aracters needed 
5240: 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69  to output the gi
5250: 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  ven.** identifie
5260: 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72  r.  The number r
5270: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
5280: 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64   any quotes used
5290: 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  .** but does not
52a0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c   include the nul
52b0: 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f  l terminator..*/
52c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
52d0: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
52e0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
52f0: 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74 65  .  int needQuote
5300: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b   = 0;.  for(n=0;
5310: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
5320: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27 27      if( *z=='\''
5330: 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f   ){ n++; needQuo
5340: 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65  te=1; }.  }.  re
5350: 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75 6f  turn n + needQuo
5360: 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  te*2;.}../*.** W
5370: 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69  rite an identifi
5380: 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  er onto the end 
5390: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  of the given str
53a0: 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f  ing.  Add.** quo
53b0: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73  te characters as
53c0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
53d0: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
53e0: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
53f0: 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64 65 6e  Idx, char *zIden
5400: 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  t){.  int i, j, 
5410: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
5420: 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d   *pIdx;.  for(j=
5430: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
5440: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61  +){.    if( !isa
5450: 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20  lnum(zIdent[j]) 
5460: 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f  && zIdent[j]!='_
5470: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ' ) break;.  }. 
5480: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49   needQuote =  zI
5490: 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73  dent[j]!=0 || is
54a0: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
54b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
54c0: 20 20 20 7c 7c 20 73 71 6c 69 74 65 4b 65 79 77     || sqliteKeyw
54d0: 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20  ordCode(zIdent, 
54e0: 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28  j)!=TK_ID;.  if(
54f0: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
5500: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f  ++] = '\'';.  fo
5510: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
5520: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
5530: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
5540: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
5550: 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d  ]=='\'' ) z[i++]
5560: 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69   = '\'';.  }.  i
5570: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
5580: 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [i++] = '\'';.  
5590: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
55a0: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
55b0: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
55c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
55d0: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
55e0: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
55f0: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
5600: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
5610: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
5620: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
5630: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
5640: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
5650: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
5660: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
5670: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
5680: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61  eateTableStmt(Ta
5690: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
56a0: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
56b0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
56c0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
56d0: 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  nd;.  n = 0;.  f
56e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
56f0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b  l; i++){.    n +
5700: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
5710: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
5720: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e  .  }.  n += iden
5730: 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65  tLength(p->zName
5740: 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20 29 7b  );.  if( n<40 ){
5750: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
5760: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
5770: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
5780: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
5790: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
57a0: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
57b0: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
57c0: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
57d0: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
57e0: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d   zStmt = sqliteM
57f0: 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 69 66  alloc( n );.  if
5800: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74  ( zStmt==0 ) ret
5810: 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28  urn 0;.  strcpy(
5820: 7a 53 74 6d 74 2c 20 70 2d 3e 69 73 54 65 6d 70  zStmt, p->isTemp
5830: 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20   ? "CREATE TEMP 
5840: 54 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54  TABLE " : "CREAT
5850: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
5860: 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b  = strlen(zStmt);
5870: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
5880: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
5890: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
58a0: 20 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   '(';.  for(i=0;
58b0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
58c0: 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53  {.    strcpy(&zS
58d0: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
58e0: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26     k += strlen(&
58f0: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
5900: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
5910: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
5920: 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e   &k, p->aCol[i].
5930: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74  zName);.  }.  st
5940: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
5950: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
5960: 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zStmt;.}../*.** 
5970: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5980: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
5990: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
59a0: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
59b0: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
59c0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
59d0: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
59e0: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
59f0: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
5a00: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
5a10: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
5a20: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
5a30: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
5a40: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
5a50: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
5a60: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
5a70: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
5a80: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
5a90: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
5aa0: 73 6b 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68  sk,.** unless th
5ab0: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
5ac0: 79 20 74 61 62 6c 65 20 6f 72 20 69 6e 69 74 46  y table or initF
5ad0: 6c 61 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e  lag==1.  When in
5ae0: 69 74 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74  itFlag==1,.** it
5af0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
5b00: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
5b10: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
5b20: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
5b30: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
5b40: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
5b50: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
5b60: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
5b70: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
5b80: 61 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e  anges, so the en
5b90: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
5ba0: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
5bb0: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
5bc0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
5bd0: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
5be0: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
5bf0: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
5c00: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
5c10: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
5c20: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
5c30: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
5c40: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
5c50: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
5c60: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
5c70: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
5c80: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
5c90: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
5ca0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
5cb0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
5cc0: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
5cd0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
5ce0: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
5cf0: 69 64 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c  id sqliteEndTabl
5d00: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
5d10: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65   Token *pEnd, Se
5d20: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
5d30: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
5d40: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
5d50: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  e->db;..  if( (p
5d60: 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63  End==0 && pSelec
5d70: 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d  t==0) || pParse-
5d80: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
5d90: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
5da0: 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50  return;.  p = pP
5db0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
5dc0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
5dd0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  turn;..  /* Add 
5de0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
5df0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
5e00: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
5e10: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
5e20: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
5e30: 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d 30 20 7c  ->nameClash==0 |
5e40: 7c 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  | pParse->initFl
5e50: 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ag==1 );.  if( p
5e60: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
5e70: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 61 6d  0 && pParse->nam
5e80: 65 43 6c 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  eClash==0 ){.   
5e90: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
5ea0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
5eb0: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
5ec0: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
5ed0: 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
5ee0: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
5ef0: 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69  me)+1, p);.    i
5f00: 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20  f( pOld ){.     
5f10: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64   assert( p==pOld
5f20: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
5f30: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
5f40: 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72  inside HashInser
5f50: 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  t() */.      ret
5f60: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  urn;.    }.    f
5f70: 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65  or(pFKey=p->pFKe
5f80: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
5f90: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
5fa0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  ){.      int nTo
5fb0: 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d   = strlen(pFKey-
5fc0: 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20  >zTo) + 1;.     
5fd0: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
5fe0: 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64  = sqliteHashFind
5ff0: 28 26 64 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b  (&db->aFKey, pFK
6000: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  ey->zTo, nTo);. 
6010: 20 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49       sqliteHashI
6020: 6e 73 65 72 74 28 26 64 62 2d 3e 61 46 4b 65 79  nsert(&db->aFKey
6030: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
6040: 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d  o, pFKey);.    }
6050: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
6060: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
6070: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
6080: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
6090: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
60a0: 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ges;.  }..  /* I
60b0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 67  f the table is g
60c0: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
60d0: 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 63 6f 6e  SELECT, then con
60e0: 73 74 72 75 63 74 20 74 68 65 0a 20 20 2a 2a 20  struct the.  ** 
60f0: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
6100: 61 6e 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  and the text of 
6110: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  the table..  */.
6120: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
6130: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  .    Table *pSel
6140: 54 61 62 20 3d 20 73 71 6c 69 74 65 52 65 73 75  Tab = sqliteResu
6150: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
6160: 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74  arse, 0, pSelect
6170: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54  );.    if( pSelT
6180: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
6190: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
61a0: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  Col==0 );.    p-
61b0: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
61c0: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 43  >nCol;.    p->aC
61d0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
61e0: 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d  ol;.    pSelTab-
61f0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70  >nCol = 0;.    p
6200: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
6210: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
6220: 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54  teTable(0, pSelT
6230: 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ab);.  }..  /* I
6240: 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69  f the initFlag i
6250: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
6260: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
6270: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
6280: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
6290: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
62a0: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
62b0: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
62c0: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
62d0: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
62e0: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
62f0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
6300: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
6310: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 50  able from the pP
6320: 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69  arse->newTnum fi
6330: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
6340: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
6350: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
6360: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
6370: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
6380: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
6390: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
63a0: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
63b0: 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  = pParse->newTnu
63c0: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
63d0: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
63e0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
63f0: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
6400: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
6410: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
6420: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
6430: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
6440: 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a  ecord number.  *
6450: 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  * for the new ta
6460: 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64  ble entry should
6470: 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74   already be on t
6480: 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
6490: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
64a0: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
64b0: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
64c0: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
64d0: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
64e0: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
64f0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
6500: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
6510: 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  ( !pParse->initF
6520: 6c 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  lag ){.    int n
6530: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a  ;.    Vdbe *v;..
6540: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65      v = sqliteGe
6550: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
6560: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
6570: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d  turn;.    if( p-
6580: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
6590: 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
65a0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
65b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
65c0: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
65d0: 6c 65 2c 20 30 2c 20 70 2d 3e 69 73 54 65 6d 70  le, 0, p->isTemp
65e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
65f0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
6600: 31 2c 20 28 63 68 61 72 20 2a 29 26 70 2d 3e 74  1, (char *)&p->t
6610: 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  num, P3_POINTER)
6620: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6630: 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
6640: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6650: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
6660: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
6670: 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  }.    p->tnum = 
6680: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  0;.    sqliteVdb
6690: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
66a0: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  l, 1, 0);.    sq
66b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
66c0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
66d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  );.    if( p->pS
66e0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
66f0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
6700: 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 74 61 62  geP3(v, -1, "tab
6710: 6c 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  le", P3_STATIC);
6720: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6730: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
6740: 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 76 69 65  geP3(v, -1, "vie
6750: 77 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  w", P3_STATIC);.
6760: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6770: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6780: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
6790: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
67a0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e  ngeP3(v, -1, p->
67b0: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
67c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
67d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
67e0: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
67f0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
6800: 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61  P3(v, -1, p->zNa
6810: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
6820: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6830: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 34  dOp(v, OP_Dup, 4
6840: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6850: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6860: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
6870: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
6880: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20  {.      char *z 
6890: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
68a0: 74 28 70 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  t(p);.      n = 
68b0: 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20  z ? strlen(z) : 
68c0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  0;.      sqliteV
68d0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
68e0: 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  1, z, n);.      
68f0: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
6900: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6910: 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20  assert( pEnd!=0 
6920: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64  );.      n = Add
6930: 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64  r(pEnd->z) - Add
6940: 72 28 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74  r(pParse->sFirst
6950: 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20  Token.z) + 1;.  
6960: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6970: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 50  angeP3(v, -1, pP
6980: 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65  arse->sFirstToke
6990: 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  n.z, n);.    }. 
69a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
69b0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
69c0: 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20  ord, 5, 0);.    
69d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
69e0: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
69f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
6a00: 21 70 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20  !p->isTemp ){.  
6a10: 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65      sqliteChange
6a20: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20  Cookie(db, v);. 
6a30: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
6a40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
6a50: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
6a60: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
6a70: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70        int op = p
6a80: 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70  ->isTemp ? OP_Op
6a90: 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65  enWrAux : OP_Ope
6aa0: 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 73 71  nWrite;.      sq
6ab0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6ac0: 20 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20   op, 1, 0);.    
6ad0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
6ae0: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
6af0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
6b00: 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c  Select, SRT_Tabl
6b10: 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  e, 1, 0, 0, 0);.
6b20: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6b30: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
6b40: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 7d  n(pParse);.  }.}
6b50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ../*.** The pars
6b60: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
6b70: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
6b80: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
6b90: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
6ba0: 74 65 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  teCreateView(.  
6bb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6bc0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
6bd0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
6be0: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
6bf0: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
6c00: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
6c10: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
6c20: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
6c30: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e,      /* The t
6c40: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
6c50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6c60: 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74  view */.  Select
6c70: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
6c80: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
6c90: 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  nt that will bec
6ca0: 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77  ome the new view
6cb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
6cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
6cd0: 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59   for a TEMPORARY
6ce0: 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61   view */.){.  Ta
6cf0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
6d00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6d10: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
6d20: 0a 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  .  sqliteStartTa
6d30: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67  ble(pParse, pBeg
6d40: 69 6e 2c 20 70 4e 61 6d 65 2c 20 69 73 54 65 6d  in, pName, isTem
6d50: 70 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  p);.  p = pParse
6d60: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
6d70: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
6d80: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
6d90: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
6da0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2f 2a  return;.  }.  /*
6db0: 20 49 67 6e 6f 72 65 20 4f 52 44 45 52 20 42 59   Ignore ORDER BY
6dc0: 20 63 6c 61 75 73 65 73 20 6f 6e 20 61 20 53 45   clauses on a SE
6dd0: 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 53  LECT */.  if( pS
6de0: 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 20  elect->pOrderBy 
6df0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70  ){.    sqliteExp
6e00: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c  rListDelete(pSel
6e10: 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  ect->pOrderBy);.
6e20: 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72      pSelect->pOr
6e30: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  derBy = 0;.  }. 
6e40: 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
6e50: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
6e60: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
6e70: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
6e80: 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
6e90: 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
6ea0: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
6eb0: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
6ec0: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
6ed0: 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
6ee0: 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
6ef0: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
6f00: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
6f10: 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
6f20: 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
6f30: 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
6f40: 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
6f50: 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  urns..  */.  p->
6f60: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
6f70: 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63  SelectDup(pSelec
6f80: 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65  t);.  sqliteSele
6f90: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
6fa0: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  );.  if( !pParse
6fb0: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
6fc0: 20 20 73 71 6c 69 74 65 56 69 65 77 47 65 74 43    sqliteViewGetC
6fd0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
6fe0: 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
6ff0: 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
7000: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
7010: 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
7020: 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
7030: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
7040: 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
7050: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
7060: 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
7070: 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30  ]!=0 && sEnd.z[0
7080: 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
7090: 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
70a0: 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
70b0: 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29 73 45  ;.  n = ((int)sE
70c0: 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42 65  nd.z) - (int)pBe
70d0: 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42  gin->z;.  z = pB
70e0: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
70f0: 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d  ( n>0 && (z[n-1]
7100: 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65  ==';' || isspace
7110: 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d  (z[n-1])) ){ n--
7120: 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
7130: 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
7140: 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20   = 1;..  /* Use 
7150: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29  sqliteEndTable()
7160: 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
7170: 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
7180: 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
7190: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
71a0: 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30  pParse, &sEnd, 0
71b0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
71c0: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
71d0: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
71e0: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
71f0: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
7200: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
7210: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
7220: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
7230: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
7240: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
7250: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
7260: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
7270: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
7280: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
7290: 72 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  re->zErrMsg..*/.
72a0: 69 6e 74 20 73 71 6c 69 74 65 56 69 65 77 47 65  int sqliteViewGe
72b0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
72c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
72d0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78  e *pTable){.  Ex
72e0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
72f0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
7300: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
7310: 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  ;.  int nErr = 0
7320: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
7330: 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70  ble );..  /* A p
7340: 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
7350: 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
7360: 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
7370: 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
7380: 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
7390: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
73a0: 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
73b0: 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
73c0: 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
73d0: 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
73e0: 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
73f0: 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
7400: 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
7410: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
7420: 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
7430: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
7440: 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
7450: 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
7460: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
7470: 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
7480: 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
7490: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
74a0: 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
74b0: 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
74c0: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
74d0: 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
74e0: 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
74f0: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
7500: 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63   this error is c
7510: 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79  aught previously
7520: 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c   and so the foll
7530: 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20  owing test.  ** 
7540: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61  should always fa
7550: 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  il.  But we will
7560: 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61   leave it in pla
7570: 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  ce just to be sa
7580: 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  fe..  */.  if( p
7590: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
75a0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
75b0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
75c0: 72 72 4d 73 67 2c 20 22 76 69 65 77 20 22 2c 20  rrMsg, "view ", 
75d0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20  pTable->zName,. 
75e0: 20 20 20 20 20 20 20 20 22 20 69 73 20 63 69 72          " is cir
75f0: 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
7600: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
7610: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
7620: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
7630: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
7640: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
7650: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
7660: 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
7670: 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
7680: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
7690: 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d  t ); /* If nCol=
76a0: 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20  =0, then pTable 
76b0: 6d 75 73 74 20 62 65 20 61 20 56 49 45 57 20 2a  must be a VIEW *
76c0: 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c  /.  pSel = pTabl
76d0: 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  e->pSelect;..  /
76e0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
76f0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 52 65  call to sqliteRe
7700: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
7710: 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e  ) will expand an
7720: 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65  y.  ** "*" eleme
7730: 6e 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74  nts in this list
7740: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6e  .  But we will n
7750: 65 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74  eed to restore t
7760: 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63  he list.  ** bac
7770: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
7780: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
7790: 61 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20 77  afterwards, so w
77a0: 65 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f 66  e save a copy of
77b0: 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e  .  ** the origin
77c0: 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20  al in pEList..  
77d0: 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  */.  pEList = pS
77e0: 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53  el->pEList;.  pS
77f0: 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  el->pEList = sql
7800: 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70  iteExprListDup(p
7810: 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53  EList);.  if( pS
7820: 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b  el->pEList==0 ){
7830: 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  .    pSel->pELis
7840: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  t = pEList;.    
7850: 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61  return 1;  /* Ma
7860: 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
7870: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   }.  pTable->nCo
7880: 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61  l = -1;.  pSelTa
7890: 62 20 3d 20 73 71 6c 69 74 65 52 65 73 75 6c 74  b = sqliteResult
78a0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
78b0: 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20  se, 0, pSel);.  
78c0: 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20  if( pSelTab ){. 
78d0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
78e0: 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e->aCol==0 );.  
78f0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
7900: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
7910: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
7920: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
7930: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e  ;.    pSelTab->n
7940: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  Col = 0;.    pSe
7950: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
7960: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
7970: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
7980: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  );.    pParse->d
7990: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
79a0: 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b  TE_UnresetViews;
79b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
79c0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
79d0: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
79e0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e    sqliteSelectUn
79f0: 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71  bind(pSel);.  sq
7a00: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
7a10: 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29  te(pSel->pEList)
7a20: 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ;.  pSel->pEList
7a30: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74   = pEList;.  ret
7a40: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f  urn nErr;  .}../
7a50: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
7a60: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
7a70: 20 74 68 65 20 56 49 45 57 20 70 54 61 62 6c 65   the VIEW pTable
7a80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7a90: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
7aa0: 68 65 6e 65 76 65 72 20 61 6e 79 20 6f 74 68 65  henever any othe
7ab0: 72 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  r table or view 
7ac0: 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20  is modified..** 
7ad0: 54 68 65 20 76 69 65 77 20 70 61 73 73 65 64 20  The view passed 
7ae0: 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  into this routin
7af0: 65 20 6d 69 67 68 74 20 64 65 70 65 6e 64 20 64  e might depend d
7b00: 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72  irectly or indir
7b10: 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20  ectly.** on the 
7b20: 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c 65  modified or dele
7b30: 74 65 64 20 74 61 62 6c 65 20 73 6f 20 77 65 20  ted table so we 
7b40: 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68  need to clear th
7b50: 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  e old column.** 
7b60: 6e 61 6d 65 73 20 73 6f 20 74 68 61 74 20 74 68  names so that th
7b70: 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d  ey will be recom
7b80: 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  puted..*/.static
7b90: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
7ba0: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
7bb0: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
7bc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
7bd0: 70 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 54 61  pTable==0 || pTa
7be0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ble->pSelect==0 
7bf0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
7c00: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30 20  pTable->nCol==0 
7c10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
7c20: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
7c30: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Col; i++){.    s
7c40: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
7c50: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
7c60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
7c70: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d  (pTable->aCol[i]
7c80: 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c  .zDflt);.    sql
7c90: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
7ca0: 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a  aCol[i].zType);.
7cb0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
7cc0: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a  (pTable->aCol);.
7cd0: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
7ce0: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43   0;.  pTable->nC
7cf0: 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol = 0;.}../*.**
7d00: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
7d10: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
7d20: 72 79 20 56 49 45 57 2e 0a 2a 2f 0a 76 6f 69 64  ry VIEW..*/.void
7d30: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
7d40: 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 29 7b  All(sqlite *db){
7d50: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
7d60: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
7d70: 20 26 20 53 51 4c 49 54 45 5f 55 6e 72 65 73 65   & SQLITE_Unrese
7d80: 74 56 69 65 77 73 29 3d 3d 30 20 29 20 72 65 74  tViews)==0 ) ret
7d90: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
7da0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
7db0: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69  ->tblHash); i; i
7dc0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
7dd0: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
7de0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
7df0: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
7e00: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
7e10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
7e20: 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iewResetColumnNa
7e30: 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d  mes(pTab);.    }
7e40: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
7e50: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 55 6e 72 65   &= ~SQLITE_Unre
7e60: 73 65 74 56 69 65 77 73 3b 0a 7d 0a 0a 2f 2a 0a  setViews;.}../*.
7e70: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
7e80: 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c  , look up a tabl
7e90: 65 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d 65  e with that name
7ea0: 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c  .  If not found,
7eb0: 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72   leave.** an err
7ec0: 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  or for the parse
7ed0: 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20 72 65  r to find and re
7ee0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61  turn NULL..*/.Ta
7ef0: 62 6c 65 20 2a 73 71 6c 69 74 65 54 61 62 6c 65  ble *sqliteTable
7f00: 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20  FromToken(Parse 
7f10: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
7f20: 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a  pTok){.  char *z
7f30: 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70  Name;.  Table *p
7f40: 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  Tab;.  zName = s
7f50: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
7f60: 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20  omToken(pTok);. 
7f70: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
7f80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61 62  return 0;.  pTab
7f90: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
7fa0: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
7fb0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
7fc0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ree(zName);.  if
7fd0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
7fe0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
7ff0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
8000: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  sg, "no such tab
8010: 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20  le: ", 0, .     
8020: 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b     pTok->z, pTok
8030: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ->n, 0);.    pPa
8040: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d  rse->nErr++;.  }
8050: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
8060: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8070: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8080: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
8090: 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
80a0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
80b0: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
80c0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
80d0: 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
80e0: 69 64 20 73 71 6c 69 74 65 44 72 6f 70 54 61 62  id sqliteDropTab
80f0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
8100: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
8110: 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54  int isView){.  T
8120: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
8130: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62  Vdbe *v;.  int b
8140: 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  ase;.  sqlite *d
8150: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8160: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
8170: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
8180: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
8190: 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20 3d  turn;.  pTable =
81a0: 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d   sqliteTableFrom
81b0: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 4e  Token(pParse, pN
81c0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
81d0: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
81e0: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 72 65    if( pTable->re
81f0: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
8200: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
8210: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
8220: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 6c 65  "table ", pTable
8230: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
8240: 20 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72   " may not be dr
8250: 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
8260: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
8270: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8280: 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20    if( isView && 
8290: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d  pTable->pSelect=
82a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
82b0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
82c0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73 65  e->zErrMsg, "use
82d0: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
82e0: 65 6c 65 74 65 20 74 61 62 6c 65 20 22 2c 0a 20  elete table ",. 
82f0: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61       pTable->zNa
8300: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  me, 0);.    pPar
8310: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
8320: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
8330: 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
8340: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  ble->pSelect ){.
8350: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
8360: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
8370: 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50 20  rMsg, "use DROP 
8380: 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
8390: 69 65 77 20 22 2c 0a 20 20 20 20 20 20 70 54 61  iew ",.      pTa
83a0: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  ble->zName, 0);.
83b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
83c0: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
83d0: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
83e0: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
83f0: 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
8400: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
8410: 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
8420: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
8430: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
8440: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
8450: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
8460: 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20  ropTable[] = {. 
8470: 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
8480: 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29  ,     0, ADDR(8)
8490: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
84a0: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c  P_String,     0,
84b0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
84c0: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 1 */.      { O
84d0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c  P_MemStore,   1,
84e0: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   1,        0},. 
84f0: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
8500: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
8510: 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20     0}, /* 3 */. 
8520: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
8530: 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20  ,     0, 2,     
8540: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
8550: 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c  P_Ne,         0,
8560: 20 41 44 44 52 28 37 29 2c 20 20 30 7d 2c 0a 20   ADDR(7),  0},. 
8570: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
8580: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
8590: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
85a0: 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c  P_Next,       0,
85b0: 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f   ADDR(3),  0}, /
85c0: 2a 20 37 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  * 7 */.    };.  
85d0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
85e0: 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69     Trigger *pTri
85f0: 67 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  gger;.    sqlite
8600: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
8610: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
8620: 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b 0a  Table->isTemp);.
8630: 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61      sqliteOpenMa
8640: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54 61  sterTable(v, pTa
8650: 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20  ble->isTemp);.  
8660: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
8670: 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
8680: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
8690: 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 2a   being dropped *
86a0: 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  /.    pTrigger =
86b0: 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65   pTable->pTrigge
86c0: 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  r;.    while( pT
86d0: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
86e0: 54 6f 6b 65 6e 20 74 74 3b 0a 20 20 20 20 20 20  Token tt;.      
86f0: 74 74 2e 7a 20 3d 20 70 54 61 62 6c 65 2d 3e 70  tt.z = pTable->p
8700: 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 3b 0a 20  Trigger->name;. 
8710: 20 20 20 20 20 74 74 2e 6e 20 3d 20 73 74 72 6c       tt.n = strl
8720: 65 6e 28 70 54 61 62 6c 65 2d 3e 70 54 72 69 67  en(pTable->pTrig
8730: 67 65 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  ger->name);.    
8740: 20 20 73 71 6c 69 74 65 44 72 6f 70 54 72 69 67    sqliteDropTrig
8750: 67 65 72 28 70 50 61 72 73 65 2c 20 26 74 74 2c  ger(pParse, &tt,
8760: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
8770: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
8780: 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67  {.        pTrigg
8790: 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70  er = pTrigger->p
87a0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Next;.      }els
87b0: 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69 67  e{.        pTrig
87c0: 67 65 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54  ger = pTable->pT
87d0: 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a  rigger;.      }.
87e0: 20 20 20 20 7d 0a 20 20 20 20 62 61 73 65 20 3d      }.    base =
87f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8800: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
8810: 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72  e(dropTable), dr
8820: 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71  opTable);.    sq
8830: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
8840: 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62  (v, base+1, pTab
8850: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  le->zName, 0);. 
8860: 20 20 20 69 66 28 20 21 70 54 61 62 6c 65 2d 3e     if( !pTable->
8870: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
8880: 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b  sqliteChangeCook
8890: 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d  ie(db, v);.    }
88a0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
88b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
88c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
88d0: 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
88e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
88f0: 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  p(v, OP_Destroy,
8900: 20 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70   pTable->tnum, p
8910: 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b 0a  Table->isTemp);.
8920: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
8930: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
8940: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
8950: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
8960: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8970: 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70  v, OP_Destroy, p
8980: 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c  Idx->tnum, pTabl
8990: 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  e->isTemp);.    
89a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
89b0: 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
89c0: 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
89d0: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
89e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65  the in-memory de
89f0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
8a00: 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a   table..  **.  *
8a10: 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20  * Exception: if 
8a20: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
8a30: 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68 65  t began with the
8a40: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
8a50: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63  ,.  ** then no c
8a60: 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65  hanges should be
8a70: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   made..  */.  if
8a80: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
8a90: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
8aa0: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
8ab0: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c 65 29  able(db, pTable)
8ac0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
8ad0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
8ae0: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20 73  Changes;.  }.  s
8af0: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
8b00: 6c 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l(db);.}../*.** 
8b10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e  This routine con
8b20: 73 74 72 75 63 74 73 20 61 20 50 33 20 73 74 72  structs a P3 str
8b30: 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
8b40: 20 61 6e 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65   an OP_MakeIdxKe
8b50: 79 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20  y.** opcode and 
8b60: 61 64 64 73 20 74 68 61 74 20 50 33 20 73 74 72  adds that P3 str
8b70: 69 6e 67 20 74 6f 20 74 68 65 20 6d 6f 73 74 20  ing to the most 
8b80: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
8b90: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  d instruction.**
8ba0: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
8bb0: 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 50 33  machine.  The P3
8bc0: 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 73   string consists
8bd0: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 68 61   of a single cha
8be0: 72 61 63 74 65 72 0a 2a 2a 20 66 6f 72 20 65 61  racter.** for ea
8bf0: 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ch column in the
8c00: 20 69 6e 64 65 78 20 70 49 64 78 20 6f 66 20 74   index pIdx of t
8c10: 61 62 6c 65 20 70 54 61 62 2e 20 20 49 66 20 74  able pTab.  If t
8c20: 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 0a 2a  he column uses.*
8c30: 2a 20 61 20 6e 75 6d 65 72 69 63 20 73 6f 72 74  * a numeric sort
8c40: 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65   order, then the
8c50: 20 50 33 20 73 74 72 69 6e 67 20 63 68 61 72 61   P3 string chara
8c60: 63 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  cter correspondi
8c70: 6e 67 20 74 6f 0a 2a 2a 20 74 68 61 74 20 63 6f  ng to.** that co
8c80: 6c 75 6d 6e 20 69 73 20 27 6e 27 2e 20 20 49 66  lumn is 'n'.  If
8c90: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73   the column uses
8ca0: 20 61 20 74 65 78 74 20 73 6f 72 74 20 6f 72 64   a text sort ord
8cb0: 65 72 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  er, then the.** 
8cc0: 50 33 20 73 74 72 69 6e 67 20 69 73 20 27 74 27  P3 string is 't'
8cd0: 2e 20 20 53 65 65 20 74 68 65 20 4f 50 5f 4d 61  .  See the OP_Ma
8ce0: 6b 65 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 20  keIdxKey opcode 
8cf0: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f  documentation fo
8d00: 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20  r.** additional 
8d10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 65  information.  Se
8d20: 65 20 61 6c 73 6f 20 74 68 65 20 73 71 6c 69 74  e also the sqlit
8d30: 65 41 64 64 4b 65 79 54 79 70 65 28 29 20 72 6f  eAddKeyType() ro
8d40: 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  utine..*/.void s
8d50: 71 6c 69 74 65 41 64 64 49 64 78 4b 65 79 54 79  qliteAddIdxKeyTy
8d60: 70 65 28 56 64 62 65 20 2a 76 2c 20 49 6e 64 65  pe(Vdbe *v, Inde
8d70: 78 20 2a 70 49 64 78 29 7b 0a 20 20 63 68 61 72  x *pIdx){.  char
8d80: 20 2a 7a 54 79 70 65 3b 0a 20 20 54 61 62 6c 65   *zType;.  Table
8d90: 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c   *pTab;.  int i,
8da0: 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   n;.  assert( pI
8db0: 64 78 21 3d 30 20 26 26 20 70 49 64 78 2d 3e 70  dx!=0 && pIdx->p
8dc0: 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 70 54  Table!=0 );.  pT
8dd0: 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
8de0: 65 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 6e  e;.  n = pIdx->n
8df0: 43 6f 6c 75 6d 6e 3b 0a 20 20 7a 54 79 70 65 20  Column;.  zType 
8e00: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
8e10: 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 54 79  n+1 );.  if( zTy
8e20: 70 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pe==0 ) return;.
8e30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
8e40: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  i++){.    int iC
8e50: 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
8e60: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  umn[i];.    asse
8e70: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  rt( iCol>=0 && i
8e80: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
8e90: 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
8ea0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 6f 72 74  >aCol[iCol].sort
8eb0: 4f 72 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53  Order & SQLITE_S
8ec0: 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c  O_TYPEMASK)==SQL
8ed0: 49 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20  ITE_SO_TEXT ){. 
8ee0: 20 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20       zType[i] = 
8ef0: 27 74 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  't';.    }else{.
8f00: 20 20 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d        zType[i] =
8f10: 20 27 6e 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   'n';.    }.  }.
8f20: 20 20 7a 54 79 70 65 5b 6e 5d 20 3d 20 30 3b 0a    zType[n] = 0;.
8f30: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
8f40: 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70  geP3(v, -1, zTyp
8f50: 65 2c 20 6e 29 3b 0a 20 20 73 71 6c 69 74 65 46  e, n);.  sqliteF
8f60: 72 65 65 28 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f  ree(zType);.}../
8f70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8f80: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
8f90: 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
8fa0: 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
8fb0: 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
8fc0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
8fd0: 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
8fe0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
8ff0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
9000: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
9010: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
9020: 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
9030: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
9040: 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
9050: 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
9060: 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
9070: 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
9080: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
9090: 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70   referred to.  p
90a0: 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20  ToCol is a list 
90b0: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
90c0: 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61   other.** pTo ta
90d0: 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72  ble that the for
90e0: 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20  eign key points 
90f0: 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61  to.  flags conta
9100: 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  ins all.** infor
9110: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
9120: 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
9130: 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20  tion algorithms 
9140: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20  specified.** in 
9150: 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f  the ON DELETE, O
9160: 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20  N UPDATE and ON 
9170: 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a  INSERT clauses..
9180: 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74  **.** An FKey st
9190: 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
91a0: 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
91b0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
91c0: 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  tly.** under con
91d0: 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
91e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
91f0: 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e  le field.  The n
9200: 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f  ew FKey.** is no
9210: 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62  t linked into db
9220: 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73 20  ->aFKey at this 
9230: 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65  point - that doe
9240: 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20  s not happen.** 
9250: 75 6e 74 69 6c 20 73 71 6c 69 74 65 45 6e 64 54  until sqliteEndT
9260: 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  able()..**.** Th
9270: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
9280: 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
9290: 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
92a0: 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
92b0: 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 44 65  l.** to sqliteDe
92c0: 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
92d0: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
92e0: 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
92f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65  /.void sqliteCre
9300: 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
9310: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9320: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
9330: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64   context */.  Id
9340: 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20  List *pFromCol, 
9350: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
9360: 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
9370: 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
9380: 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
9390: 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
93a0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
93b0: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
93c0: 49 64 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20  IdList *pToCol, 
93d0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20       /* Columns 
93e0: 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
93f0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
9400: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
9410: 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
9420: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
9430: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
9440: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
9450: 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
9460: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
9470: 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
9480: 7a 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  z;.  FKey *pFKey
9490: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
94a0: 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
94b0: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
94c0: 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f  >nErr ) goto fk_
94d0: 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
94e0: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
94f0: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
9500: 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  -1;.    if( iCol
9510: 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  <0 ) goto fk_end
9520: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
9530: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21   && pToCol->nId!
9540: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
9550: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
9560: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
9570: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 22  foreign key on "
9580: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 70  , -1,.         p
9590: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
95a0: 6d 65 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20  me, -1, .       
95b0: 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
95c0: 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
95d0: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 22 2c  lumn of table ",
95e0: 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 70 54   -1,.         pT
95f0: 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 2c 20 30 29  o->z, pTo->n, 0)
9600: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
9610: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f  nErr++;.      go
9620: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
9630: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
9640: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
9650: 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64  l && pToCol->nId
9660: 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20  !=pFromCol->nId 
9670: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
9680: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
9690: 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20 20 20  zErrMsg, .      
96a0: 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
96b0: 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
96c0: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
96d0: 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
96e0: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
96f0: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
9700: 65 6e 63 65 64 20 74 61 62 6c 65 22 2c 20 30 29  enced table", 0)
9710: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
9720: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 66  rr++;.    goto f
9730: 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
9740: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
9750: 43 6f 6c 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20  Col->nId;.  }.  
9760: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
9770: 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69  pFKey) + nCol*si
9780: 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
9790: 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
97a0: 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
97b0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
97c0: 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69  i<pToCol->nId; i
97d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
97e0: 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f   += strlen(pToCo
97f0: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
9800: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
9810: 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61  pFKey = sqliteMa
9820: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
9830: 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20   if( pFKey==0 ) 
9840: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70  goto fk_end;.  p
9850: 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
9860: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
9870: 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
9880: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
9890: 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d  Key[1];.  pFKey-
98a0: 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20  >aCol = (struct 
98b0: 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20  sColMap*)z;.  z 
98c0: 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  += sizeof(struct
98d0: 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a   sColMap)*nCol;.
98e0: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
98f0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  ;.  memcpy(z, pT
9900: 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
9910: 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
9920: 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
9930: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54  .  pFKey->pNextT
9940: 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  o = 0;.  pFKey->
9950: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
9960: 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
9970: 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
9980: 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
9990: 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
99a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
99b0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
99c0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
99d0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
99e0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
99f0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
9a00: 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  mp(p->aCol[j].zN
9a10: 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  ame, pFromCol->a
9a20: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
9a30: 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79  .          pFKey
9a40: 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20  ->aCol[i].iFrom 
9a50: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = j;.          b
9a60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
9a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9a80: 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a  ( j>=p->nCol ){.
9a90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
9aa0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
9ab0: 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f  >zErrMsg, "unkno
9ac0: 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 22 2c 20 0a  wn column \"", .
9ad0: 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
9ae0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  ol->a[i].zName, 
9af0: 22 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  "\" in foreign k
9b00: 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
9b10: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  0);.        pPar
9b20: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
9b30: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
9b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9b50: 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
9b60: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
9b70: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
9b80: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
9b90: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
9ba0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
9bb0: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
9bc0: 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
9bd0: 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
9be0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
9bf0: 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
9c00: 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
9c10: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
9c20: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
9c30: 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
9c40: 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20  eConf = flags & 
9c50: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  0xff;.  pFKey->u
9c60: 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61  pdateConf = (fla
9c70: 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
9c80: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72  ;.  pFKey->inser
9c90: 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  tConf = (flags >
9ca0: 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a  > 16 ) & 0xff;..
9cb0: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
9cc0: 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
9cd0: 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
9ce0: 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
9cf0: 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
9d00: 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
9d10: 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
9d20: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73  Free(pFKey);.  s
9d30: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
9d40: 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  e(pFromCol);.  s
9d50: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
9d60: 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  e(pToCol);.}../*
9d70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9d80: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
9d90: 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
9da0: 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
9db0: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
9dc0: 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
9dd0: 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
9de0: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
9df0: 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
9e00: 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
9e10: 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
9e20: 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
9e30: 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
9e40: 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
9e50: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
9e60: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
9e70: 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
9e80: 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
9e90: 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
9ea0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
9eb0: 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
9ec0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
9ed0: 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 20  t isDeferred){. 
9ee0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
9ef0: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
9f00: 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
9f10: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
9f20: 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
9f30: 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
9f40: 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e  eturn;.  pFKey->
9f50: 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44  isDeferred = isD
9f60: 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  eferred;.}../*.*
9f70: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
9f80: 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
9f90: 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78 20 69  table.  pIndex i
9fa0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
9fb0: 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
9fc0: 70 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61  pTable is the na
9fd0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
9fe0: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
9ff0: 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
a000: 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
a010: 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  r a primary key 
a020: 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
a030: 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73   is created to s
a040: 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51  atisfy a.** UNIQ
a050: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
a060: 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49  If pTable and pI
a070: 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75  ndex are NULL, u
a080: 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
a090: 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74  able.** as the t
a0a0: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
a0b0: 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  ed.  pParse->pNe
a0c0: 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c  wTable is a tabl
a0d0: 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72  e that is.** cur
a0e0: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
a0f0: 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52  structed by a CR
a100: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
a110: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  ment..**.** pLis
a120: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
a130: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
a140: 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
a150: 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69  l be NULL if thi
a160: 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72  s.** is a primar
a170: 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d  y key or unique-
a180: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
a190: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  e most recent co
a1a0: 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  lumn added.** to
a1b0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
a1c0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
a1d0: 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f  ruction.  .*/.vo
a1e0: 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65 49  id sqliteCreateI
a1f0: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
a200: 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20  Parse,   /* All 
a210: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
a220: 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
a230: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
a240: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
a250: 65 20 69 6e 64 65 78 2e 20 20 4d 61 79 20 62 65  e index.  May be
a260: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
a270: 20 2a 70 54 61 62 6c 65 2c 20 20 20 2f 2a 20 4e   *pTable,   /* N
a280: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
a290: 20 74 6f 20 69 6e 64 65 78 2e 20 20 55 73 65 20   to index.  Use 
a2a0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
a2b0: 65 20 69 66 20 30 20 2a 2f 0a 20 20 49 64 4c 69  e if 0 */.  IdLi
a2c0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
a2d0: 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
a2e0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
a2f0: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
a300: 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72  ,     /* OE_Abor
a310: 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
a320: 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
a330: 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
a340: 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68  *pStart,   /* Th
a350: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
a360: 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45  hat begins a CRE
a370: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
a380: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
a390: 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65  pEnd      /* The
a3a0: 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
a3b0: 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
a3c0: 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  X statement */.)
a3d0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
a3e0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
a3f0: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
a400: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
a410: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
a420: 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  o be created */.
a430: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
a440: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  0;.  int i, j;. 
a450: 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20   Token nullId;  
a460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61             /* Fa
a470: 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20  ke token for an 
a480: 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f  empty ID list */
a490: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
a4a0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
a4b0: 74 20 68 69 64 65 4e 61 6d 65 20 3d 20 30 3b 20  t hideName = 0; 
a4c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
a4d0: 74 20 70 75 74 20 74 61 62 6c 65 20 6e 61 6d 65  t put table name
a4e0: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
a4f0: 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61  le */..  if( pPa
a500: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
a510: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
a520: 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  d ) goto exit_cr
a530: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f  eate_index;..  /
a540: 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
a550: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
a560: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
a570: 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
a580: 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
a590: 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b  if( pTable!=0 ){
a5a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
a5b0: 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  me!=0 );.    pTa
a5c0: 62 20 3d 20 20 73 71 6c 69 74 65 54 61 62 6c 65  b =  sqliteTable
a5d0: 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
a5e0: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c  , pTable);.  }el
a5f0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
a600: 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pName==0 );.    
a610: 70 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e  pTab =  pParse->
a620: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  pNewTable;.  }. 
a630: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
a640: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
a650: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
a660: 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61  index;.  if( pTa
a670: 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
a680: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
a690: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
a6a0: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70  Msg, "table ", p
a6b0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20  Tab->zName, .   
a6c0: 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 68 61 76     " may not hav
a6d0: 65 20 6e 65 77 20 69 6e 64 69 63 65 73 20 61 64  e new indices ad
a6e0: 64 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ded", 0);.    pP
a6f0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
a700: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
a710: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
a720: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
a730: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  t ){.    sqliteS
a740: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
a750: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69 65 77  ->zErrMsg, "view
a760: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
a770: 65 78 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70  exed", 0);.    p
a780: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
a790: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
a7a0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
a7b0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
a7c0: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 77 68  ex is created wh
a7d0: 69 6c 65 20 72 65 2d 72 65 61 64 69 6e 67 20 74  ile re-reading t
a7e0: 68 65 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 73  he schema from s
a7f0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
a800: 2a 20 62 75 74 20 74 68 65 20 74 61 62 6c 65 20  * but the table 
a810: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
a820: 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20  this index is a 
a830: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
a840: 20 69 74 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c   it can.  ** onl
a850: 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
a860: 74 61 62 6c 65 20 74 68 61 74 20 74 68 69 73 20  table that this 
a870: 69 6e 64 65 78 20 69 73 20 72 65 61 6c 6c 79 20  index is really 
a880: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
a890: 69 73 0a 20 20 2a 2a 20 6f 6e 65 20 77 68 6f 73  is.  ** one whos
a8a0: 65 20 6e 61 6d 65 20 69 73 20 68 69 64 64 65 6e  e name is hidden
a8b0: 20 62 65 68 69 6e 64 20 61 20 74 65 6d 70 6f 72   behind a tempor
a8c0: 61 72 79 20 74 61 62 6c 65 20 77 69 74 68 20 74  ary table with t
a8d0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 0a 20 20  he same name..  
a8e0: 2a 2a 20 53 69 6e 63 65 20 69 74 73 20 74 61 62  ** Since its tab
a8f0: 6c 65 20 68 61 73 20 62 65 65 6e 20 73 75 70 70  le has been supp
a900: 72 65 73 73 65 64 2c 20 77 65 20 6e 65 65 64 20  ressed, we need 
a910: 74 6f 20 61 6c 73 6f 20 73 75 70 70 72 65 73 73  to also suppress
a920: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e   the.  ** index.
a930: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
a940: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20  se->initFlag && 
a950: 21 70 50 61 72 73 65 2d 3e 69 73 54 65 6d 70 20  !pParse->isTemp 
a960: 26 26 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 20  && pTab->isTemp 
a970: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
a980: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
a990: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
a9a0: 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
a9b0: 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
a9c0: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
a9d0: 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
a9e0: 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
a9f0: 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
aa00: 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a  ame name.  .  **
aa10: 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
aa20: 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64    If we are read
aa30: 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
aa40: 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63   permanent indic
aa50: 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  es from the.  **
aa60: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
aa70: 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f  able (because so
aa80: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
aa90: 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68   changed the sch
aaa0: 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e  ema) and.  ** on
aab0: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e  e of the index n
aac0: 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69  ames collides wi
aad0: 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  th the name of a
aae0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
aaf0: 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20   or.  ** index, 
ab00: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e  then we will con
ab10: 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73  tinue to process
ab20: 20 74 68 69 73 20 69 6e 64 65 78 2c 20 62 75 74   this index, but
ab30: 20 77 65 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a   we will not.  *
ab40: 2a 20 73 74 6f 72 65 20 69 74 73 20 6e 61 6d 65  * store its name
ab50: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
ab60: 6c 65 2e 20 20 53 65 74 20 74 68 65 20 68 69 64  le.  Set the hid
ab70: 65 4e 61 6d 65 20 66 6c 61 67 20 74 6f 20 61 63  eName flag to ac
ab80: 63 6f 6d 70 6c 69 73 68 0a 20 20 2a 2a 20 74 68  complish.  ** th
ab90: 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  is..  **.  ** If
aba0: 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61   pName==0 it mea
abb0: 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20  ns that we are. 
abc0: 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
abd0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
abe0: 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
abf0: 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f  int.  We have to
ac00: 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a   invent our.  **
ac10: 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   own name..  */.
ac20: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
ac30: 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65     Index *pISame
ac40: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74  Name;    /* Anot
ac50: 68 65 72 20 69 6e 64 65 78 20 77 69 74 68 20 74  her index with t
ac60: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  he same name */.
ac70: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d      Table *pTSam
ac80: 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74  eName;    /* A t
ac90: 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e  able with same n
aca0: 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65 78  ame as the index
acb0: 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   */.    zName = 
acc0: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
acd0: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
ace0: 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
acf0: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
ad00: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
ad10: 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20  if( (pISameName 
ad20: 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
ad30: 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30  x(db, zName))!=0
ad40: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
ad50: 53 61 6d 65 4e 61 6d 65 2d 3e 70 54 61 62 6c 65  SameName->pTable
ad60: 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50 61 72  ->isTemp && pPar
ad70: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
ad80: 20 20 20 20 20 20 20 20 68 69 64 65 4e 61 6d 65          hideName
ad90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
ada0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
adb0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
adc0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e  se->zErrMsg, "in
add0: 64 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20  dex ", zName, . 
ade0: 20 20 20 20 20 20 20 20 20 20 22 20 61 6c 72 65            " alre
adf0: 61 64 79 20 65 78 69 73 74 73 22 2c 20 30 29 3b  ady exists", 0);
ae00: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
ae10: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
ae20: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
ae30: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
ae40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
ae50: 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c  pTSameName = sql
ae60: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
ae70: 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20   zName))!=0 ){. 
ae80: 20 20 20 20 20 69 66 28 20 70 54 53 61 6d 65 4e       if( pTSameN
ae90: 61 6d 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70  ame->isTemp && p
aea0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
aeb0: 29 7b 0a 20 20 20 20 20 20 20 20 68 69 64 65 4e  ){.        hideN
aec0: 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ame = 1;.      }
aed0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
aee0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
aef0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
af00: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
af10: 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
af20: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  ",.           zN
af30: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
af40: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
af50: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
af60: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
af70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
af80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
af90: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69   zBuf[30];.    i
afa0: 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20  nt n;.    Index 
afb0: 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28  *pLoop;.    for(
afc0: 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64  pLoop=pTab->pInd
afd0: 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20  ex, n=1; pLoop; 
afe0: 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65  pLoop=pLoop->pNe
aff0: 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73  xt, n++){}.    s
b000: 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 29  printf(zBuf,"%d)
b010: 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20  ",n);.    zName 
b020: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  = 0;.    sqliteS
b030: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
b040: 20 22 28 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   "(", pTab->zNam
b050: 65 2c 20 22 20 61 75 74 6f 69 6e 64 65 78 20 22  e, " autoindex "
b060: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20  , zBuf, 0);.    
b070: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
b080: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
b090: 69 6e 64 65 78 3b 0a 20 20 20 20 68 69 64 65 4e  index;.    hideN
b0a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ame = sqliteFind
b0b0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
b0c0: 21 3d 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  !=0;.  }..  /* I
b0d0: 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d  f pList==0, it m
b0e0: 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e  eans this routin
b0f0: 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  e was called to 
b100: 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20  make a primary. 
b110: 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74   ** key out of t
b120: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
b130: 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
b140: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
b150: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72  tion..  ** So cr
b160: 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74  eate a fake list
b170: 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69   to simulate thi
b180: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
b190: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75  ist==0 ){.    nu
b1a0: 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61  llId.z = pTab->a
b1b0: 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  Col[pTab->nCol-1
b1c0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c  ].zName;.    nul
b1d0: 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e  lId.n = strlen(n
b1e0: 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c  ullId.z);.    pL
b1f0: 69 73 74 20 3d 20 73 71 6c 69 74 65 49 64 4c 69  ist = sqliteIdLi
b200: 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e 75 6c  stAppend(0, &nul
b210: 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  lId);.    if( pL
b220: 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ist==0 ) goto ex
b230: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
b240: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  .  }..  /* .  **
b250: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   Allocate the in
b260: 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a  dex structure. .
b270: 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20    */.  pIndex = 
b280: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
b290: 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73 74  zeof(Index) + st
b2a0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20  rlen(zName) + 1 
b2b0: 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
b2c0: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
b2d0: 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e 49 64  (int)*pList->nId
b2e0: 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78   );.  if( pIndex
b2f0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
b300: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
b310: 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
b320: 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78   = (int*)&pIndex
b330: 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a  [1];.  pIndex->z
b340: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
b350: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
b360: 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73  pList->nId];.  s
b370: 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  trcpy(pIndex->zN
b380: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70  ame, zName);.  p
b390: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
b3a0: 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
b3b0: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d  nColumn = pList-
b3c0: 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  >nId;.  pIndex->
b3d0: 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
b3e0: 2d 3e 69 73 55 6e 69 71 75 65 20 3d 20 6f 6e 45  ->isUnique = onE
b3f0: 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
b400: 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d  autoIndex = pNam
b410: 65 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e  e==0;..  /* Scan
b420: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
b430: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
b440: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
b450: 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  exed and.  ** lo
b460: 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  ad the column in
b470: 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49  dices into the I
b480: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
b490: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
b4a0: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c  .  ** if any col
b4b0: 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  umn is not found
b4c0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
b4d0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
b4e0: 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  i++){.    for(j=
b4f0: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
b500: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
b510: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70   sqliteStrICmp(p
b520: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
b530: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  , pTab->aCol[j].
b540: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
b550: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
b560: 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   j>=pTab->nCol )
b570: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
b580: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
b590: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
b5a0: 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   ", pTab->zName,
b5b0: 20 0a 20 20 20 20 20 20 20 20 22 20 68 61 73 20   .        " has 
b5c0: 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
b5d0: 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ", pList->a[i].z
b5e0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
b5f0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
b600: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
b610: 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  (pIndex);.      
b620: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
b630: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
b640: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
b650: 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a  mn[i] = j;.  }..
b660: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
b670: 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
b680: 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
b690: 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
b6a0: 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
b6b0: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
b6c0: 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  es. .  */.  if( 
b6d0: 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
b6e0: 20 26 26 20 21 68 69 64 65 4e 61 6d 65 20 29 7b   && !hideName ){
b6f0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
b700: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73     p = sqliteHas
b710: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78  hInsert(&db->idx
b720: 48 61 73 68 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  Hash, pIndex->zN
b730: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
b740: 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20  e)+1, pIndex);. 
b750: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
b760: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
b770: 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
b780: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
b790: 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ed */.      sqli
b7a0: 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a  teFree(pIndex);.
b7b0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
b7c0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
b7d0: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67    }.    db->flag
b7e0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
b7f0: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a  rnChanges;.  }..
b800: 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67    /* When adding
b810: 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65   an index to the
b820: 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73   list of indices
b830: 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61   for a table, ma
b840: 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c  ke.  ** sure all
b850: 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64   indices labeled
b860: 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65   OE_Replace come
b870: 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65   after all those
b880: 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45   labeled.  ** OE
b890: 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69  _Ignore.  This i
b8a0: 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
b8b0: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
b8c0: 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a  ation of UPDATE.
b8d0: 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e    ** and INSERT.
b8e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e 45 72  .  */.  if( onEr
b8f0: 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
b900: 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
b910: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 54 61  =0.       || pTa
b920: 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
b930: 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
b940: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65  .    pIndex->pNe
b950: 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
b960: 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  x;.    pTab->pIn
b970: 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
b980: 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78  }else{.    Index
b990: 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
b9a0: 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77 68 69  >pIndex;.    whi
b9b0: 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
b9c0: 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
b9d0: 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
b9e0: 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
b9f0: 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
ba00: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
ba10: 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
ba20: 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
ba30: 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e  ;.    pOther->pN
ba40: 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
ba50: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69  }..  /* If the i
ba60: 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69 74 20  nitFlag is 1 it 
ba70: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
ba80: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
ba90: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
baa0: 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  e_master" table 
bab0: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f  on the disk.  So
bac0: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
bad0: 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61   the disk.  ** a
bae0: 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
baf0: 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  he table number 
bb00: 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73 65 2d  from the pParse-
bb10: 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a  >newTnum field..
bb20: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
bb30: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 70  e->initFlag && p
bb40: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
bb50: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 70  pIndex->tnum = p
bb60: 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a  Parse->newTnum;.
bb70: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
bb80: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30 20 74   initFlag is 0 t
bb90: 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69  hen create the i
bba0: 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54  ndex on disk.  T
bbb0: 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65  his.  ** involve
bbc0: 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e  s writing the in
bbd0: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73  dex into the mas
bbe0: 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69  ter table and fi
bbf0: 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a  lling in the.  *
bc00: 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  * index with the
bc10: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63   current table c
bc20: 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20  ontents..  **.  
bc30: 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20  ** The initFlag 
bc40: 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73  is 0 when the us
bc50: 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20  er first enters 
bc60: 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a  a CREATE INDEX .
bc70: 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 54    ** command.  T
bc80: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31  he initFlag is 1
bc90: 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
bca0: 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a   is opened and .
bcb0: 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45    ** CREATE INDE
bcc0: 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  X statements are
bcd0: 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65   read out of the
bce0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20   master table.  
bcf0: 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74  In.  ** the latt
bd00: 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65  er case the inde
bd10: 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
bd20: 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20   on disk, which 
bd30: 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64  is why.  ** we d
bd40: 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63  on't want to rec
bd50: 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20  reate it..  **. 
bd60: 20 2a 2a 20 49 66 20 70 54 61 62 6c 65 3d 3d 30   ** If pTable==0
bd70: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69   it means this i
bd80: 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65  ndex is generate
bd90: 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b  d as a primary k
bda0: 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55  ey.  ** or UNIQU
bdb0: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  E constraint of 
bdc0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
bdd0: 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
bde0: 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
bdf0: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
be00: 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
be10: 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
be20: 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
be30: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65  ization.  ** ste
be40: 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
be50: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
be60: 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  ( pParse->initFl
be70: 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ag==0 ){.    int
be80: 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
be90: 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c  .    int lbl1, l
bea0: 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  bl2;.    int i;.
beb0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
bec0: 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 70    int isTemp = p
bed0: 54 61 62 2d 3e 69 73 54 65 6d 70 3b 0a 0a 20 20  Tab->isTemp;..  
bee0: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
bef0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
bf00: 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
bf10: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
bf20: 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ex;.    if( pTab
bf30: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  le!=0 ){.      s
bf40: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
bf50: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
bf60: 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20   0, isTemp);.   
bf70: 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73     sqliteOpenMas
bf80: 74 65 72 54 61 62 6c 65 28 76 2c 20 69 73 54 65  terTable(v, isTe
bf90: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  mp);.    }.    s
bfa0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
bfb0: 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30  , OP_NewRecno, 0
bfc0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
bfd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bfe0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
bff0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
c000: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e  ngeP3(v, -1, "in
c010: 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49 43 29  dex", P3_STATIC)
c020: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
c030: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
c040: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ng, 0, 0);.    s
c050: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
c060: 33 28 76 2c 20 2d 31 2c 20 70 49 6e 64 65 78 2d  3(v, -1, pIndex-
c070: 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  >zName, P3_STATI
c080: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  C);.    sqliteVd
c090: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
c0a0: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
c0b0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
c0c0: 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d  eP3(v, -1, pTab-
c0d0: 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49  >zName, P3_STATI
c0e0: 43 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  C);.    addr = s
c0f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c100: 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
c110: 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20  , 0, isTemp);.  
c120: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
c130: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63  geP3(v, addr, (c
c140: 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e  har*)&pIndex->tn
c150: 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b  um, P3_POINTER);
c160: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75  .    pIndex->tnu
c170: 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  m = 0;.    if( p
c180: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  Table ){.      s
c190: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c1a0: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
c1b0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d  .      if( isTem
c1c0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  p ){.        sql
c1d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c1e0: 4f 50 5f 4f 70 65 6e 57 72 41 75 78 2c 20 31 2c  OP_OpenWrAux, 1,
c1f0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
c200: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c210: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c220: 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29  OpenWrite, 1, 0)
c230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c240: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
c250: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c260: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
c270: 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 26      if( pStart &
c280: 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  & pEnd ){.      
c290: 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a  n = Addr(pEnd->z
c2a0: 29 20 2d 20 41 64 64 72 28 70 53 74 61 72 74 2d  ) - Addr(pStart-
c2b0: 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73  >z) + 1;.      s
c2c0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
c2d0: 33 28 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72  3(v, addr, pStar
c2e0: 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  t->z, n);.    }.
c2f0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c300: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
c310: 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20  cord, 5, 0);.   
c320: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c330: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
c340: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
c350: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
c360: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c370: 28 76 2c 20 69 73 54 65 6d 70 20 3f 20 4f 50 5f  (v, isTemp ? OP_
c380: 4f 70 65 6e 41 75 78 20 3a 20 4f 50 5f 4f 70 65  OpenAux : OP_Ope
c390: 6e 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  n, 2, pTab->tnum
c3a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
c3b0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
c3c0: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
c3d0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
c3e0: 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 56    lbl2 = sqliteV
c3f0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
c400: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
c410: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
c420: 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20  ind, 2, lbl2);. 
c430: 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69       lbl1 = sqli
c440: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
c450: 50 5f 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a  P_Recno, 2, 0);.
c460: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c470: 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
c480: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c490: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
c4a0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c  v, OP_Column, 2,
c4b0: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
c4c0: 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n[i]);.      }. 
c4d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
c4e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49  ddOp(v, OP_MakeI
c4f0: 64 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e  dxKey, pIndex->n
c500: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
c510: 20 20 69 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66    if( db->file_f
c520: 6f 72 6d 61 74 3e 3d 34 20 29 20 73 71 6c 69 74  ormat>=4 ) sqlit
c530: 65 41 64 64 49 64 78 4b 65 79 54 79 70 65 28 76  eAddIdxKeyType(v
c540: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  , pIndex);.     
c550: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c560: 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31  (v, OP_IdxPut, 1
c570: 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  , pIndex->onErro
c580: 72 21 3d 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20  r!=OE_None);.   
c590: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
c5a0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32  Op(v, OP_Next, 2
c5b0: 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73  , lbl1);.      s
c5c0: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
c5d0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a  Label(v, lbl2);.
c5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
c5f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
c600: 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 2, 0);.      
c610: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
c620: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20  v, OP_Close, 1, 
c630: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
c640: 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  ( pTable!=0 ){. 
c650: 20 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70       if( !isTemp
c660: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c670: 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  teChangeCookie(d
c680: 62 2c 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, v);.      }. 
c690: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
c6a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
c6b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
c6c0: 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
c6d0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
c6e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
c6f0: 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20  Clean up before 
c700: 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f  exiting */.exit_
c710: 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20  create_index:.  
c720: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
c730: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  te(pList);.  sql
c740: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
c750: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
c760: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c770: 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
c780: 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
c790: 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
c7a0: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
c7b0: 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
c7c0: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
c7d0: 20 73 71 6c 69 74 65 44 72 6f 70 49 6e 64 65 78   sqliteDropIndex
c7e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c7f0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
c800: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
c810: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
c820: 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
c830: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
c840: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
c850: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
c860: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
c870: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 4e 61   ) return;.  zNa
c880: 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  me = sqliteTable
c890: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
c8a0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
c8b0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
c8c0: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
c8d0: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
c8e0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
c8f0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ee(zName);.  if(
c900: 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
c910: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
c920: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
c930: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  Msg, "no such in
c940: 64 65 78 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20  dex: ", 0, .    
c950: 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e      pName->z, pN
c960: 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ame->n, 0);.    
c970: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
c980: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
c990: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
c9a0: 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
c9b0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
c9c0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
c9d0: 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
c9e0: 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
c9f0: 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
ca00: 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
ca10: 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
ca20: 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ped", 0);.    pP
ca30: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
ca40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
ca50: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
ca60: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
ca70: 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
ca80: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
ca90: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
caa0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
cab0: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
cac0: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f  tatic VdbeOp dro
cad0: 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20  pIndex[] = {.   
cae0: 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
caf0: 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
cb00: 30 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f  0}, .      { OP_
cb10: 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30  String,     0, 0
cb20: 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31  ,       0}, /* 1
cb30: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d   */.      { OP_M
cb40: 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c  emStore,   1, 1,
cb50: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
cb60: 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20   { OP_MemLoad,  
cb70: 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    1, 0,       0}
cb80: 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20  , /* 3 */.      
cb90: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
cba0: 20 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c   0, 1,       0},
cbb0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20  .      { OP_Eq, 
cbc0: 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28          0, ADDR(
cbd0: 38 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  8), 0},.      { 
cbe0: 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30  OP_Next,       0
cbf0: 2c 20 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20  , ADDR(3), 0},. 
cc00: 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20       { OP_Goto, 
cc10: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29        0, ADDR(9)
cc20: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
cc30: 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20  _Delete,     0, 
cc40: 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
cc50: 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  8 */.    };.    
cc60: 69 6e 74 20 62 61 73 65 3b 0a 20 20 20 20 54 61  int base;.    Ta
cc70: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
cc80: 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 20  ex->pTable;..   
cc90: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
cca0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
ccb0: 65 2c 20 30 2c 20 70 54 61 62 2d 3e 69 73 54 65  e, 0, pTab->isTe
ccc0: 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f  mp);.    sqliteO
ccd0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
cce0: 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b  , pTab->isTemp);
ccf0: 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69  .    base = sqli
cd00: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
cd10: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
cd20: 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64  pIndex), dropInd
cd30: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  ex);.    sqliteV
cd40: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
cd50: 61 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a  ase+1, pIndex->z
cd60: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Name, 0);.    if
cd70: 28 20 21 70 54 61 62 2d 3e 69 73 54 65 6d 70 20  ( !pTab->isTemp 
cd80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43  ){.      sqliteC
cd90: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
cda0: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
cdb0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
cdc0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
cdd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
cde0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
cdf0: 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  roy, pIndex->tnu
ce00: 6d 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29  m, pTab->isTemp)
ce10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  ;.    sqliteEndW
ce20: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
ce30: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
ce40: 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d   Delete the in-m
ce50: 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f  emory descriptio
ce60: 6e 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e  n of this index.
ce70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
ce80: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
ce90: 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b      sqliteUnlink
cea0: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64  AndDeleteIndex(d
ceb0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  b, pIndex);.    
cec0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
ced0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
cee0: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
cef0: 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
cf00: 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
cf10: 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
cf20: 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
cf30: 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
cf40: 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
cf50: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
cf60: 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
cf70: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
cf80: 73 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74  st *sqliteIdList
cf90: 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70  Append(IdList *p
cfa0: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
cfb0: 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
cfc0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
cfd0: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
cfe0: 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  ( sizeof(IdList)
cff0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
d000: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
d010: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73  .  }.  if( (pLis
d020: 74 2d 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20 29  t->nId & 7)==0 )
d030: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
d040: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
d050: 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c   a = sqliteReall
d060: 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c  oc(pList->a, (pL
d070: 69 73 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65  ist->nId+8)*size
d080: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
d090: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
d0a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49  ){.      sqliteI
d0b0: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
d0c0: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
d0d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
d0e0: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
d0f0: 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
d100: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20  >a[pList->nId], 
d110: 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
d120: 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
d130: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  Token ){.    cha
d140: 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d  r **pz = &pList-
d150: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a  >a[pList->nId].z
d160: 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Name;.    sqlite
d170: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
d180: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
d190: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ->n, 0);.    if(
d1a0: 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20   *pz==0 ){.     
d1b0: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
d1c0: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
d1d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
d1e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
d1f0: 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  iteDequote(*pz);
d200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69  .    }.  }.  pLi
d210: 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74  st->nId++;.  ret
d220: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
d230: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
d240: 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
d250: 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
d260: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
d270: 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
d280: 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
d290: 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
d2a0: 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
d2b0: 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20  en if pToken is 
d2c0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  NULL..**.** A ne
d2d0: 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74  w SrcList is ret
d2e0: 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
d2f0: 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
d300: 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
d310: 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e  liteSrcListAppen
d320: 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  d(SrcList *pList
d330: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
d340: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
d350: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
d360: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
d370: 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
d380: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
d390: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
d3a0: 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e  .  if( (pList->n
d3b0: 53 72 63 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20  Src & 7)==0 ){. 
d3c0: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
d3d0: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61  t_item *a;.    a
d3e0: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
d3f0: 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73  (pList->a, (pLis
d400: 74 2d 3e 6e 53 72 63 2b 38 29 2a 73 69 7a 65 6f  t->nSrc+8)*sizeo
d410: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
d420: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
d430: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 72  {.      sqliteSr
d440: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  cListDelete(pLis
d450: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
d460: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
d470: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
d480: 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
d490: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c  >a[pList->nSrc],
d4a0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
d4b0: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
d4c0: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68  pToken ){.    ch
d4d0: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74  ar **pz = &pList
d4e0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
d4f0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69  .zName;.    sqli
d500: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
d510: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
d520: 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69  en->n, 0);.    i
d530: 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20  f( *pz==0 ){.   
d540: 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74     sqliteSrcList
d550: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
d560: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
d570: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d580: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70  sqliteDequote(*p
d590: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
d5a0: 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20  pList->nSrc++;. 
d5b0: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
d5c0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61  ../*.** Add an a
d5d0: 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74  lias to the last
d5e0: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74   identifier on t
d5f0: 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66  he given identif
d600: 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ier list..*/.voi
d610: 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41  d sqliteSrcListA
d620: 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20  ddAlias(SrcList 
d630: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
d640: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
d650: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53  ist && pList->nS
d660: 72 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  rc>0 ){.    int 
d670: 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20  i = pList->nSrc 
d680: 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  - 1;.    sqliteS
d690: 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74  etNString(&pList
d6a0: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70  ->a[i].zAlias, p
d6b0: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
d6c0: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ->n, 0);.    sql
d6d0: 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74  iteDequote(pList
d6e0: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a  ->a[i].zAlias);.
d6f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
d700: 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
d710: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c  /.void sqliteIdL
d720: 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74  istDelete(IdList
d730: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
d740: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
d750: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
d760: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
d770: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
d780: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
d790: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
d7a0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
d7b0: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
d7c0: 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
d7d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d7e0: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
d7f0: 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
d800: 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
d810: 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
d820: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
d830: 74 20 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e  t sqliteIdListIn
d840: 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
d850: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
d860: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
d870: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
d880: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
d890: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
d8a0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
d8b0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
d8c0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
d8d0: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
d8e0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
d8f0: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
d900: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
d910: 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63  tire SrcList inc
d920: 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73  luding all its s
d930: 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  ubstructure..*/.
d940: 76 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69  void sqliteSrcLi
d950: 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
d960: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
d970: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
d980: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
d990: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
d9a0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
d9b0: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
d9c0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
d9d0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
d9e0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
d9f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
da00: 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70  ->a[i].pTab && p
da10: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d  List->a[i].pTab-
da20: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
da30: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
da40: 74 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74  teTable(0, pList
da50: 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20  ->a[i].pTab);.  
da60: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 53 65    }.    sqliteSe
da70: 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74  lectDelete(pList
da80: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
da90: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44  .    sqliteExprD
daa0: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
dab0: 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ].pOn);.    sqli
dac0: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
dad0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e  List->a[i].pUsin
dae0: 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
daf0: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
db00: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
db10: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  st);.}../*.** Th
db20: 65 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 69  e COPY command i
db30: 73 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c  s for compatibil
db40: 69 74 79 20 77 69 74 68 20 50 6f 73 74 67 72 65  ity with Postgre
db50: 53 51 4c 20 61 6e 64 20 73 70 65 63 69 66 69 63  SQL and specific
db60: 69 61 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68 65  ially.** for the
db70: 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65 61 64   ability to read
db80: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 70   the output of p
db90: 67 5f 64 75 6d 70 2e 20 20 54 68 65 20 66 6f 72  g_dump.  The for
dba0: 6d 61 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c  mat is as.** fol
dbb0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43  lows:.**.**    C
dbc0: 4f 50 59 20 74 61 62 6c 65 20 46 52 4f 4d 20 66  OPY table FROM f
dbd0: 69 6c 65 20 5b 55 53 49 4e 47 20 44 45 4c 49 4d  ile [USING DELIM
dbe0: 49 54 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a 2a  ITERS string].**
dbf0: 0a 2a 2a 20 22 74 61 62 6c 65 22 20 69 73 20 61  .** "table" is a
dc00: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
dc10: 20 6e 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c 20   name.  We will 
dc20: 72 65 61 64 20 6c 69 6e 65 73 20 6f 66 20 63 6f  read lines of co
dc30: 64 65 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20  de from.** file 
dc40: 74 6f 20 66 69 6c 6c 20 74 68 69 73 20 74 61 62  to fill this tab
dc50: 6c 65 20 77 69 74 68 20 64 61 74 61 2e 20 20 46  le with data.  F
dc60: 69 6c 65 20 6d 69 67 68 74 20 62 65 20 22 73 74  ile might be "st
dc70: 64 69 6e 22 2e 20 20 54 68 65 20 6f 70 74 69 6f  din".  The optio
dc80: 6e 61 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65 72  nal.** delimiter
dc90: 20 73 74 72 69 6e 67 20 69 64 65 6e 74 69 66 69   string identifi
dca0: 65 73 20 74 68 65 20 66 69 65 6c 64 20 73 65 70  es the field sep
dcb0: 61 72 61 74 6f 72 73 2e 20 20 54 68 65 20 64 65  arators.  The de
dcc0: 66 61 75 6c 74 20 69 73 20 61 20 74 61 62 2e 0a  fault is a tab..
dcd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f  */.void sqliteCo
dce0: 70 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  py(.  Parse *pPa
dcf0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
dd00: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
dd10: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
dd20: 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 54 68  bleName,   /* Th
dd30: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
dd40: 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  ble into which w
dd50: 65 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a 2f  e will insert */
dd60: 0a 20 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e  .  Token *pFilen
dd70: 61 6d 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 66  ame,    /* The f
dd80: 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ile from which t
dd90: 6f 20 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61  o obtain informa
dda0: 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
ddb0: 2a 70 44 65 6c 69 6d 69 74 65 72 2c 20 20 20 2f  *pDelimiter,   /
ddc0: 2a 20 55 73 65 20 74 68 69 73 20 61 73 20 74 68  * Use this as th
ddd0: 65 20 66 69 65 6c 64 20 64 65 6c 69 6d 69 74 65  e field delimite
dde0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  r */.  int onErr
ddf0: 6f 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  or          /* W
de00: 68 61 74 20 74 6f 20 64 6f 20 69 66 20 61 20 63  hat to do if a c
de10: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 73 20  onstraint fails 
de20: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
de30: 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61  Tab;.  char *zTa
de40: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  b;.  int i;.  Vd
de50: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64  be *v;.  int add
de60: 72 2c 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20  r, end;.  Index 
de70: 2a 70 49 64 78 3b 0a 20 20 73 71 6c 69 74 65 20  *pIdx;.  sqlite 
de80: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
de90: 3b 0a 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69  ;..  zTab = sqli
dea0: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
deb0: 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29  oken(pTableName)
dec0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d  ;.  if( sqlite_m
ded0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20  alloc_failed || 
dee0: 7a 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63  zTab==0 ) goto c
def0: 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70  opy_cleanup;.  p
df00: 54 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  Tab = sqliteTabl
df10: 65 4e 61 6d 65 54 6f 54 61 62 6c 65 28 70 50 61  eNameToTable(pPa
df20: 72 73 65 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71  rse, zTab);.  sq
df30: 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a  liteFree(zTab);.
df40: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
df50: 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75  goto copy_cleanu
df60: 70 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  p;.  v = sqliteG
df70: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
df80: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69    if( v ){.    i
df90: 6e 74 20 6f 70 65 6e 4f 70 3b 0a 20 20 20 20 73  nt openOp;.    s
dfa0: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
dfb0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
dfc0: 20 31 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70   1, pTab->isTemp
dfd0: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  );.    addr = sq
dfe0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
dff0: 20 4f 50 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c   OP_FileOpen, 0,
e000: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
e010: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
e020: 64 64 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e  ddr, pFilename->
e030: 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29  z, pFilename->n)
e040: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
e050: 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64  DequoteP3(v, add
e060: 72 29 3b 0a 20 20 20 20 6f 70 65 6e 4f 70 20 3d  r);.    openOp =
e070: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 3f 20   pTab->isTemp ? 
e080: 4f 50 5f 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f  OP_OpenWrAux : O
e090: 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20  P_OpenWrite;.   
e0a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
e0b0: 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 30 2c 20 70  (v, openOp, 0, p
e0c0: 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Tab->tnum);.    
e0d0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
e0e0: 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P3(v, -1, pTab->
e0f0: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
e100: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  );.    for(i=1, 
e110: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
e120: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
e130: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
e140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
e150: 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70  eAddOp(v, openOp
e160: 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29  , i, pIdx->tnum)
e170: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
e180: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
e190: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50  , pIdx->zName, P
e1a0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  3_STATIC);.    }
e1b0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
e1c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e  gs & SQLITE_Coun
e1d0: 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73  tRows ){.      s
e1e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
e1f0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
e200: 20 30 29 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c   0);  /* Initial
e210: 69 7a 65 20 74 68 65 20 72 6f 77 20 63 6f 75 6e  ize the row coun
e220: 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65  t */.    }.    e
e230: 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nd = sqliteVdbeM
e240: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
e250: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
e260: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69  beAddOp(v, OP_Fi
e270: 6c 65 52 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43  leRead, pTab->nC
e280: 6f 6c 2c 20 65 6e 64 29 3b 0a 20 20 20 20 69 66  ol, end);.    if
e290: 28 20 70 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a  ( pDelimiter ){.
e2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
e2b0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
e2c0: 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c  , pDelimiter->z,
e2d0: 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b   pDelimiter->n);
e2e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
e2f0: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64  eDequoteP3(v, ad
e300: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
e310: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
e320: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
e330: 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20  , "\t", 1);.    
e340: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  }.    if( pTab->
e350: 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
e360: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
e370: 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75  p(v, OP_FileColu
e380: 6d 6e 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 2c  mn, pTab->iPKey,
e390: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
e3a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
e3b0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30  _MustBeInt, 0, 0
e3c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
e3d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
e3e0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
e3f0: 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  no, 0, 0);.    }
e400: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e410: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
e420: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70  {.      if( i==p
e430: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
e440: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
e450: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
e460: 20 63 6f 6c 75 6d 6e 20 69 73 20 66 69 6c 6c 65   column is fille
e470: 64 20 77 69 74 68 20 4e 55 4c 4c 20 73 69 6e 63  d with NULL sinc
e480: 65 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  e its.        **
e490: 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73   value is always
e4a0: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65   pulled from the
e4b0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a   record number *
e4c0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
e4d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e4e0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
e4f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e500: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
e510: 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f  dOp(v, OP_FileCo
e520: 6c 75 6d 6e 2c 20 69 2c 20 30 29 3b 0a 20 20 20  lumn, i, 0);.   
e530: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
e540: 71 6c 69 74 65 47 65 6e 65 72 61 74 65 43 6f 6e  qliteGenerateCon
e550: 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 70 50  straintChecks(pP
e560: 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30  arse, pTab, 0, 0
e570: 2c 20 30 2c 20 30 2c 20 6f 6e 45 72 72 6f 72 2c  , 0, 0, onError,
e580: 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69   addr);.    sqli
e590: 74 65 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74  teCompleteInsert
e5a0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
e5b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
e5c0: 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67     if( (db->flag
e5d0: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
e5e0: 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20 20 20  Rows)!=0 ){.    
e5f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
e600: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
e610: 31 2c 20 30 29 3b 20 20 2f 2a 20 49 6e 63 72 65  1, 0);  /* Incre
e620: 6d 65 6e 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a  ment row count *
e630: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  /.    }.    sqli
e640: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e650: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29  P_Goto, 0, addr)
e660: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
e670: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
e680: 65 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  end);.    sqlite
e690: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e6a0: 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Noop, 0, 0);.   
e6b0: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
e6c0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
e6d0: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  ;.    if( db->fl
e6e0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
e6f0: 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20  ntRows ){.      
e700: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e710: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e  v, OP_ColumnCoun
e720: 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
e730: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e740: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
e750: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
e760: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
e770: 33 28 76 2c 20 2d 31 2c 20 22 72 6f 77 73 20 69  3(v, -1, "rows i
e780: 6e 73 65 72 74 65 64 22 2c 20 50 33 5f 53 54 41  nserted", P3_STA
e790: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
e7a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e7b0: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 31 2c 20 30  P_Callback, 1, 0
e7c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
e7d0: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  copy_cleanup:.  
e7e0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
e7f0: 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72   The non-standar
e800: 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64  d VACUUM command
e810: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c 65 61   is used to clea
e820: 6e 20 75 70 20 74 68 65 20 64 61 74 61 62 61 73  n up the databas
e830: 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66  e,.** collapse f
e840: 72 65 65 20 73 70 61 63 65 2c 20 65 74 63 2e 20  ree space, etc. 
e850: 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20   It is modelled 
e860: 61 66 74 65 72 20 74 68 65 20 56 41 43 55 55 4d  after the VACUUM
e870: 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50   command.** in P
e880: 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a 2a  ostgreSQL..**.**
e890: 20 49 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30 2e   In version 1.0.
e8a0: 78 20 6f 66 20 53 51 4c 69 74 65 2c 20 74 68 65  x of SQLite, the
e8b0: 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20   VACUUM command 
e8c0: 77 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67 64  would call.** gd
e8d0: 62 6d 5f 72 65 6f 72 67 61 6e 69 7a 65 28 29 20  bm_reorganize() 
e8e0: 6f 6e 20 61 6c 6c 20 74 68 65 20 64 61 74 61 62  on all the datab
e8f0: 61 73 65 20 74 61 62 6c 65 73 2e 20 20 42 75 74  ase tables.  But
e900: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
e910: 74 68 20 32 2e 30 2e 30 2c 20 53 51 4c 69 74 65  th 2.0.0, SQLite
e920: 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20   no longer uses 
e930: 47 44 42 4d 20 73 6f 20 74 68 69 73 20 63 6f 6d  GDBM so this com
e940: 6d 61 6e 64 20 68 61 73 0a 2a 2a 20 62 65 63 6f  mand has.** beco
e950: 6d 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76  me a no-op..*/.v
e960: 6f 69 64 20 73 71 6c 69 74 65 56 61 63 75 75 6d  oid sqliteVacuum
e970: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e980: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
e990: 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  e){.  /* Do noth
e9a0: 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ing */.}../*.** 
e9b0: 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
e9c0: 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
e9d0: 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  teBeginTransacti
e9e0: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
e9f0: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
ea00: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20    sqlite *db;.. 
ea10: 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
ea20: 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
ea30: 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d  )==0 || db->pBe=
ea40: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
ea50: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
ea60: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
ea70: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
ea80: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  ;.  if( db->flag
ea90: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
eaa0: 6e 73 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ns ){.    pParse
eab0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 73 71  ->nErr++;.    sq
eac0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
ead0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
eae0: 22 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20  "cannot start a 
eaf0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 22 0a 20 20  transaction ".  
eb00: 20 20 20 20 20 22 77 69 74 68 69 6e 20 61 20 74       "within a t
eb10: 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 30 29 3b  ransaction", 0);
eb20: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
eb30: 0a 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72  .  sqliteBeginWr
eb40: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
eb50: 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 64 62  rse, 0, 0);.  db
eb60: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
eb70: 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d  E_InTrans;.  db-
eb80: 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72  >onError = onErr
eb90: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  or;.}../*.** Com
eba0: 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
ebb0: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
ebc0: 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f  CommitTransactio
ebd0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
ebe0: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
ebf0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
ec00: 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
ec10: 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42  db)==0 || db->pB
ec20: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
ec30: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
ec40: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
ec50: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
ec60: 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66  rn;.  if( (db->f
ec70: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
ec80: 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20  Trans)==0 ){.   
ec90: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
eca0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
ecb0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
ecc0: 72 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 22  rrMsg, .       "
ecd0: 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20  cannot commit - 
ece0: 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  no transaction i
ecf0: 73 20 61 63 74 69 76 65 22 2c 20 30 29 3b 0a 20  s active", 0);. 
ed00: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
ed10: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
ed20: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
ed30: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
ed40: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
ed50: 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20  ;.  db->onError 
ed60: 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a  = OE_Default;.}.
ed70: 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
ed80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
ed90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c  .void sqliteRoll
eda0: 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
edb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
edc0: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
edd0: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
ede0: 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
edf0: 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
ee00: 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20  || db->pBe==0 ) 
ee10: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
ee20: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
ee30: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
ee40: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
ee50: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
ee60: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
ee70: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =0 ){.    pParse
ee80: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 73 71  ->nErr++;.    sq
ee90: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
eea0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 0a  Parse->zErrMsg,.
eeb0: 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 72         "cannot r
eec0: 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61  ollback - no tra
eed0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
eee0: 76 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ve", 0);.    ret
eef0: 75 72 6e 3b 20 0a 20 20 7d 0a 20 20 76 20 3d 20  urn; .  }.  v = 
ef00: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
ef10: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
ef20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
ef30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c  AddOp(v, OP_Roll
ef40: 62 61 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  back, 0, 0);.  }
ef50: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
ef60: 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b  ~SQLITE_InTrans;
ef70: 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d  .  db->onError =
ef80: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a   OE_Default;.}..
ef90: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
efa0: 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
efb0: 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
efc0: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
efd0: 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
efe0: 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
eff0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f000: 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
f010: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
f020: 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
f030: 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
f040: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
f050: 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
f060: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
f070: 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
f080: 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
f090: 20 69 66 20 74 68 65 20 73 65 74 43 68 65 63 6b   if the setCheck
f0a0: 70 6f 69 6e 74 20 70 61 72 61 6d 65 74 65 72 20  point parameter 
f0b0: 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
f0c0: 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
f0d0: 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
f0e0: 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
f0f0: 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
f100: 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
f110: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
f120: 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
f130: 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
f140: 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
f150: 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
f160: 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
f170: 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
f180: 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
f190: 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
f1a0: 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
f1b0: 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
f1c0: 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
f1d0: 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
f1e0: 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
f1f0: 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
f200: 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
f210: 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
f220: 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
f230: 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54   be set..**.** T
f240: 68 65 20 74 65 6d 70 4f 6e 6c 79 20 66 6c 61 67  he tempOnly flag
f250: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
f260: 6f 6e 6c 79 20 74 65 6d 70 6f 72 61 72 79 20 74  only temporary t
f270: 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 63 68  ables will be ch
f280: 61 6e 67 65 64 0a 2a 2a 20 64 75 72 69 6e 67 20  anged.** during 
f290: 74 68 69 73 20 77 72 69 74 65 20 6f 70 65 72 61  this write opera
f2a0: 74 69 6f 6e 2e 20 20 54 68 65 20 70 72 69 6d 61  tion.  The prima
f2b0: 72 79 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ry database tabl
f2c0: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 77 72 69 74  e is not.** writ
f2d0: 65 2d 6c 6f 63 6b 65 64 2e 20 20 4f 6e 6c 79 20  e-locked.  Only 
f2e0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61  the temporary da
f2f0: 74 61 62 61 73 65 20 66 69 6c 65 20 67 65 74 73  tabase file gets
f300: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a   a write lock..*
f310: 2a 20 4f 74 68 65 72 20 70 72 6f 63 65 73 73 65  * Other processe
f320: 73 20 63 61 6e 20 63 6f 6e 74 69 6e 75 65 20 74  s can continue t
f330: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
f340: 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74 61  the primary data
f350: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  base file..*/.vo
f360: 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72  id sqliteBeginWr
f370: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
f380: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
f390: 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69  setCheckpoint, i
f3a0: 6e 74 20 74 65 6d 70 4f 6e 6c 79 29 7b 0a 20 20  nt tempOnly){.  
f3b0: 56 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73  Vdbe *v;.  v = s
f3c0: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
f3d0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
f3e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
f3f0: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
f400: 63 6b 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  ck ) return; /* 
f410: 69 66 20 74 68 69 73 20 69 73 20 69 6e 20 61 20  if this is in a 
f420: 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 69 66 28  trigger */.  if(
f430: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
f440: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
f450: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
f460: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
f470: 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
f480: 6e 2c 20 74 65 6d 70 4f 6e 6c 79 2c 20 30 29 3b  n, tempOnly, 0);
f490: 0a 20 20 20 20 69 66 28 20 21 74 65 6d 70 4f 6e  .    if( !tempOn
f4a0: 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ly ){.      sqli
f4b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f4c0: 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20  P_VerifyCookie, 
f4d0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 73 63 68 65  pParse->db->sche
f4e0: 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20  ma_cookie, 0);. 
f4f0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68       pParse->sch
f500: 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b  emaVerified = 1;
f510: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
f520: 66 28 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74  f( setCheckpoint
f530: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
f540: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68  beAddOp(v, OP_Ch
f550: 65 63 6b 70 6f 69 6e 74 2c 20 30 2c 20 30 29 3b  eckpoint, 0, 0);
f560: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
f570: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
f580: 20 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70   concludes an op
f590: 65 72 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 79  eration that may
f5a0: 20 68 61 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a   have changed.**
f5b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
f5c0: 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70 61 6e  This is a compan
f5d0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ion function to 
f5e0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
f5f0: 69 6f 6e 28 29 2e 0a 2a 2a 20 49 66 20 61 20 74  ion()..** If a t
f600: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
f610: 74 61 72 74 65 64 2c 20 74 68 65 6e 20 63 6f 6d  tarted, then com
f620: 6d 69 74 20 69 74 2e 20 20 49 66 20 61 20 63 68  mit it.  If a ch
f630: 65 63 6b 70 6f 69 6e 74 20 77 61 73 0a 2a 2a 20  eckpoint was.** 
f640: 73 74 61 72 74 65 64 20 74 68 65 6e 20 63 6f 6d  started then com
f650: 6d 69 74 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69  mit that..*/.voi
f660: 64 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65  d sqliteEndWrite
f670: 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
f680: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
f690: 20 2a 76 3b 0a 20 20 69 66 28 20 70 50 61 72 73   *v;.  if( pPars
f6a0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 20 72  e->trigStack ) r
f6b0: 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69  eturn; /* if thi
f6c0: 73 20 69 73 20 69 6e 20 61 20 74 72 69 67 67 65  s is in a trigge
f6d0: 72 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  r */.  v = sqlit
f6e0: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
f6f0: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
f700: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
f710: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
f720: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20   SQLITE_InTrans 
f730: 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 4e 6f 74  ){.    /* Do Not
f740: 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  hing */.  }else{
f750: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
f760: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69  ddOp(v, OP_Commi
f770: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 0, 0);.  }.}.
f780: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ../*.** Interpre
f790: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
f7a0: 6e 67 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20  ng as a boolean 
f7b0: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
f7c0: 20 69 6e 74 20 67 65 74 42 6f 6f 6c 65 61 6e 28   int getBoolean(
f7d0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74  char *z){.  stat
f7e0: 69 63 20 63 68 61 72 20 2a 61 7a 54 72 75 65 5b  ic char *azTrue[
f7f0: 5d 20 3d 20 7b 20 22 79 65 73 22 2c 20 22 6f 6e  ] = { "yes", "on
f800: 22 2c 20 22 74 72 75 65 22 20 7d 3b 0a 20 20 69  ", "true" };.  i
f810: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d  nt i;.  if( z[0]
f820: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
f830: 20 20 69 66 28 20 69 73 64 69 67 69 74 28 7a 5b    if( isdigit(z[
f840: 30 5d 29 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d  0]) || (z[0]=='-
f850: 27 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b 31  ' && isdigit(z[1
f860: 5d 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ])) ){.    retur
f870: 6e 20 61 74 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20  n atoi(z);.  }. 
f880: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
f890: 6f 66 28 61 7a 54 72 75 65 29 2f 73 69 7a 65 6f  of(azTrue)/sizeo
f8a0: 66 28 61 7a 54 72 75 65 5b 30 5d 29 3b 20 69 2b  f(azTrue[0]); i+
f8b0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
f8c0: 74 65 53 74 72 49 43 6d 70 28 7a 2c 61 7a 54 72  teStrICmp(z,azTr
f8d0: 75 65 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 75  ue[i])==0 ) retu
f8e0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
f8f0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
f900: 72 6f 63 65 73 73 20 61 20 70 72 61 67 6d 61 20  rocess a pragma 
f910: 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a  statement.  .**.
f920: 2a 2a 20 50 72 61 67 6d 61 73 20 61 72 65 20 6f  ** Pragmas are o
f930: 66 20 74 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a  f this form:.**.
f940: 2a 2a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69  **      PRAGMA i
f950: 64 20 3d 20 76 61 6c 75 65 0a 2a 2a 0a 2a 2a 20  d = value.**.** 
f960: 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6d  The identifier m
f970: 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 73  ight also be a s
f980: 74 72 69 6e 67 2e 20 20 54 68 65 20 76 61 6c 75  tring.  The valu
f990: 65 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 61  e is a string, a
f9a0: 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  nd.** identifier
f9b0: 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20 20  , or a number.  
f9c0: 49 66 20 6d 69 6e 75 73 46 6c 61 67 20 69 73 20  If minusFlag is 
f9d0: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76  true, then the v
f9e0: 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d  alue is.** a num
f9f0: 62 65 72 20 74 68 61 74 20 77 61 73 20 70 72 65  ber that was pre
fa00: 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73  ceded by a minus
fa10: 20 73 69 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73   sign..*/.void s
fa20: 71 6c 69 74 65 50 72 61 67 6d 61 28 50 61 72 73  qlitePragma(Pars
fa30: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
fa40: 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a   *pLeft, Token *
fa50: 70 52 69 67 68 74 2c 20 69 6e 74 20 6d 69 6e 75  pRight, int minu
fa60: 73 46 6c 61 67 29 7b 0a 20 20 63 68 61 72 20 2a  sFlag){.  char *
fa70: 7a 4c 65 66 74 20 3d 20 30 3b 0a 20 20 63 68 61  zLeft = 0;.  cha
fa80: 72 20 2a 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20  r *zRight = 0;. 
fa90: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
faa0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a 4c 65  arse->db;..  zLe
fab0: 66 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  ft = sqliteStrND
fac0: 75 70 28 70 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65  up(pLeft->z, pLe
fad0: 66 74 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65  ft->n);.  sqlite
fae0: 44 65 71 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a  Dequote(zLeft);.
faf0: 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20    if( minusFlag 
fb00: 29 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20  ){.    zRight = 
fb10: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  0;.    sqliteSet
fb20: 4e 53 74 72 69 6e 67 28 26 7a 52 69 67 68 74 2c  NString(&zRight,
fb30: 20 22 2d 22 2c 20 31 2c 20 70 52 69 67 68 74 2d   "-", 1, pRight-
fb40: 3e 7a 2c 20 70 52 69 67 68 74 2d 3e 6e 2c 20 30  >z, pRight->n, 0
fb50: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
fb60: 7a 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 53  zRight = sqliteS
fb70: 74 72 4e 44 75 70 28 70 52 69 67 68 74 2d 3e 7a  trNDup(pRight->z
fb80: 2c 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20  , pRight->n);.  
fb90: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
fba0: 7a 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 0a 20  zRight);.  }. . 
fbb0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
fbc0: 20 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73   default_cache_s
fbd0: 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41  ize.  **  PRAGMA
fbe0: 20 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73   default_cache_s
fbf0: 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ize=N.  **.  ** 
fc00: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
fc10: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
fc20: 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20 73 65  nt persistent se
fc30: 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20  tting for the.  
fc40: 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69  ** page cache si
fc50: 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72  ze.  The value r
fc60: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d  eturned is the m
fc70: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
fc80: 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74  .  ** pages in t
fc90: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
fca0: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
fcb0: 73 65 74 73 20 62 6f 74 68 20 74 68 65 20 63 75  sets both the cu
fcc0: 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20  rrent.  ** page 
fcd0: 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65  cache size value
fce0: 20 61 6e 64 20 74 68 65 20 70 65 72 73 69 73 74   and the persist
fcf0: 65 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 73  ent page cache s
fd00: 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 73  ize value.  ** s
fd10: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
fd20: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a  abase file..  **
fd30: 0a 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  .  ** The defaul
fd40: 74 20 63 61 63 68 65 20 73 69 7a 65 20 69 73 20  t cache size is 
fd50: 73 74 6f 72 65 64 20 69 6e 20 6d 65 74 61 2d 76  stored in meta-v
fd60: 61 6c 75 65 20 32 20 6f 66 20 70 61 67 65 20 31  alue 2 of page 1
fd70: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   of the.  ** dat
fd80: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
fd90: 20 63 61 63 68 65 20 73 69 7a 65 20 69 73 20 61   cache size is a
fda0: 63 74 75 61 6c 6c 79 20 74 68 65 20 61 62 73 6f  ctually the abso
fdb0: 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 0a 20 20  lute value of.  
fdc0: 2a 2a 20 74 68 69 73 20 6d 65 6d 6f 72 79 20 6c  ** this memory l
fdd0: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 20 73 69  ocation.  The si
fde0: 67 6e 20 6f 66 20 6d 65 74 61 2d 76 61 6c 75 65  gn of meta-value
fdf0: 20 32 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68   2 determines th
fe00: 65 0a 20 20 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  e.  ** synchrono
fe10: 75 73 20 73 65 74 74 69 6e 67 2e 20 20 41 20 6e  us setting.  A n
fe20: 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 6d 65  egative value me
fe30: 61 6e 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ans synchronous 
fe40: 69 73 20 6f 66 66 0a 20 20 2a 2a 20 61 6e 64 20  is off.  ** and 
fe50: 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
fe60: 20 6d 65 61 6e 73 20 73 79 6e 63 68 72 6f 6e 6f   means synchrono
fe70: 75 73 20 69 73 20 6f 6e 2e 0a 20 20 2a 2f 0a 20  us is on..  */. 
fe80: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
fe90: 6d 70 28 7a 4c 65 66 74 2c 22 64 65 66 61 75 6c  mp(zLeft,"defaul
fea0: 74 5f 63 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d  t_cache_size")==
feb0: 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
fec0: 56 64 62 65 4f 70 20 67 65 74 43 61 63 68 65 53  VdbeOp getCacheS
fed0: 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ize[] = {.      
fee0: 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  { OP_ReadCookie,
fef0: 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30    0, 2,        0
ff00: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 41 62  },.      { OP_Ab
ff10: 73 56 61 6c 75 65 2c 20 20 20 20 30 2c 20 30 2c  sValue,    0, 0,
ff20: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
ff30: 20 20 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20    { OP_Dup,     
ff40: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
ff50: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
ff60: 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20  Integer,     0, 
ff70: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
ff80: 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20      { OP_Ne,    
ff90: 20 20 20 20 20 20 30 2c 20 36 2c 20 20 20 20 20        0, 6,     
ffa0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
ffb0: 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20 4d  P_Integer,     M
ffc0: 41 58 5f 50 41 47 45 53 2c 30 2c 20 30 7d 2c 0a  AX_PAGES,0, 0},.
ffd0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
ffe0: 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20  nCount, 1, 0,   
fff0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
10000 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
10010 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 63   0, 0,        "c
10020 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20 20  ache_size"},.   
10030 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
10040 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
10050 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
10060 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
10070 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
10080 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
10090 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
100a0 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66   pRight->z==pLef
100b0 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  t->z ){.      sq
100c0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
100d0 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67  t(v, ArraySize(g
100e0 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67 65  etCacheSize), ge
100f0 74 43 61 63 68 65 53 69 7a 65 29 3b 0a 20 20 20  tCacheSize);.   
10100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
10110 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  t addr;.      in
10120 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28 7a 52  t size = atoi(zR
10130 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ight);.      if(
10140 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d   size<0 ) size =
10150 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71   -size;.      sq
10160 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
10170 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
10180 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
10190 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
101a0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 69 7a 65  OP_Integer, size
101b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
101c0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
101d0 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 30 2c  P_ReadCookie, 0,
101e0 20 32 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20   2);.      addr 
101f0 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
10200 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
10210 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
10220 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
10230 20 4f 50 5f 47 65 2c 20 30 2c 20 61 64 64 72 2b   OP_Ge, 0, addr+
10240 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
10250 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10260 4e 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b  Negative, 0, 0);
10270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
10280 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
10290 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20  Cookie, 0, 2);. 
102a0 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72       sqliteEndWr
102b0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
102c0 72 73 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  rse);.      db->
102d0 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 64 62 2d  cache_size = db-
102e0 3e 63 61 63 68 65 5f 73 69 7a 65 3c 30 20 3f 20  >cache_size<0 ? 
102f0 2d 73 69 7a 65 20 3a 20 73 69 7a 65 3b 0a 20 20  -size : size;.  
10300 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 53      sqliteBtreeS
10310 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e  etCacheSize(db->
10320 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73  pBe, db->cache_s
10330 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ize);.    }.  }e
10340 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  lse..  /*.  **  
10350 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
10360 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63  e.  **  PRAGMA c
10370 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a  ache_size=N.  **
10380 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
10390 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
103a0 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73   current local s
103b0 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
103c0 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
103d0 69 7a 65 2e 20 20 54 68 65 20 6c 6f 63 61 6c 20  ize.  The local 
103e0 73 65 74 74 69 6e 67 20 63 61 6e 20 62 65 20 64  setting can be d
103f0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 0a 20 20  ifferent from.  
10400 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
10410 74 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  t cache size val
10420 75 65 20 74 68 61 74 20 69 73 20 73 74 6f 72 65  ue that is store
10430 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
10440 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 73 65  e.  ** file itse
10450 6c 66 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72  lf.  The value r
10460 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d  eturned is the m
10470 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
10480 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74  .  ** pages in t
10490 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
104a0 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
104b0 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a 20  sets the local. 
104c0 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
104d0 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 74 20 64  ize value.  It d
104e0 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
104f0 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a 20 20  he persistent.  
10500 2a 2a 20 63 61 63 68 65 20 73 69 7a 65 20 73 74  ** cache size st
10510 6f 72 65 64 20 6f 6e 20 74 68 65 20 64 69 73 6b  ored on the disk
10520 20 73 6f 20 74 68 65 20 63 61 63 68 65 20 73 69   so the cache si
10530 7a 65 20 77 69 6c 6c 20 72 65 76 65 72 74 0a 20  ze will revert. 
10540 20 2a 2a 20 74 6f 20 69 74 73 20 64 65 66 61 75   ** to its defau
10550 6c 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68  lt value when th
10560 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c  e database is cl
10570 6f 73 65 64 20 61 6e 64 20 72 65 6f 70 65 6e 65  osed and reopene
10580 64 2e 0a 20 20 2a 2a 20 4e 20 73 68 6f 75 6c 64  d..  ** N should
10590 20 62 65 20 61 20 70 6f 73 69 74 69 76 65 20 69   be a positive i
105a0 6e 74 65 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  nteger..  */.  i
105b0 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
105c0 28 7a 4c 65 66 74 2c 22 63 61 63 68 65 5f 73 69  (zLeft,"cache_si
105d0 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ze")==0 ){.    s
105e0 74 61 74 69 63 20 56 64 62 65 4f 70 20 67 65 74  tatic VdbeOp get
105f0 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a  CacheSize[] = {.
10600 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
10610 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20  nCount, 1, 0,   
10620 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
10630 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
10640 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 63   0, 0,        "c
10650 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20 20  ache_size"},.   
10660 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
10670 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
10680 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
10690 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
106a0 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
106b0 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
106c0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
106d0 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66   pRight->z==pLef
106e0 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 69 6e  t->z ){.      in
106f0 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63  t size = db->cac
10700 68 65 5f 73 69 7a 65 3b 3b 0a 20 20 20 20 20 20  he_size;;.      
10710 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a  if( size<0 ) siz
10720 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
10730 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
10740 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10750 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  size, 0);.      
10760 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
10770 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
10780 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20  (getCacheSize), 
10790 67 65 74 43 61 63 68 65 53 69 7a 65 29 3b 0a 20  getCacheSize);. 
107a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
107b0 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28  int size = atoi(
107c0 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69  zRight);.      i
107d0 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65  f( size<0 ) size
107e0 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
107f0 69 66 28 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  if( db->cache_si
10800 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73  ze<0 ) size = -s
10810 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63  ize;.      db->c
10820 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
10830 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74  ;.      sqliteBt
10840 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
10850 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63  db->pBe, db->cac
10860 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  he_size);.    }.
10870 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20    }else..  /*.  
10880 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61 75  **  PRAGMA defau
10890 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  lt_synchronous. 
108a0 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61   **  PRAGMA defa
108b0 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ult_synchronous=
108c0 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a  BOOLEAN.  **.  *
108d0 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
108e0 20 72 65 74 75 72 6e 73 20 74 68 65 20 70 65 72   returns the per
108f0 73 69 73 74 65 6e 74 20 76 61 6c 75 65 20 6f 66  sistent value of
10900 20 74 68 65 20 22 73 79 6e 63 68 72 6f 6e 6f 75   the "synchronou
10910 73 22 20 73 65 74 74 69 6e 67 0a 20 20 2a 2a 20  s" setting.  ** 
10920 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20 69  that is stored i
10930 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
10940 20 54 68 69 73 20 69 73 20 74 68 65 20 73 79 6e   This is the syn
10950 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67  chronous setting
10960 20 74 68 61 74 0a 20 20 2a 2a 20 69 73 20 75 73   that.  ** is us
10970 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
10980 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
10990 65 64 20 75 6e 6c 65 73 73 20 6f 76 65 72 72 69  ed unless overri
109a0 64 64 65 6e 20 62 79 20 61 20 73 65 70 61 72 61  dden by a separa
109b0 74 65 0a 20 20 2a 2a 20 22 73 79 6e 63 68 72 6f  te.  ** "synchro
109c0 6e 6f 75 73 22 20 70 72 61 67 6d 61 2e 20 20 54  nous" pragma.  T
109d0 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63  he second form c
109e0 68 61 6e 67 65 73 20 74 68 65 20 70 65 72 73 69  hanges the persi
109f0 73 74 65 6e 74 20 61 6e 64 20 74 68 65 0a 20 20  stent and the.  
10a00 2a 2a 20 6c 6f 63 61 6c 20 73 79 6e 63 68 72 6f  ** local synchro
10a10 6e 6f 75 73 20 73 65 74 74 69 6e 67 20 74 6f 20  nous setting to 
10a20 74 68 65 20 76 61 6c 75 65 20 67 69 76 65 6e 2e  the value given.
10a30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 73 79  .  **.  ** If sy
10a40 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 2c  nchronous is on,
10a50 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 64 6f 20   SQLite will do 
10a60 61 6e 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  an fsync() syste
10a70 6d 20 63 61 6c 6c 20 61 74 20 73 74 72 61 74 65  m call at strate
10a80 67 69 63 0a 20 20 2a 2a 20 70 6f 69 6e 74 73 20  gic.  ** points 
10a90 74 6f 20 69 6e 73 75 72 65 20 74 68 61 74 20 61  to insure that a
10aa0 6c 6c 20 70 72 65 76 69 6f 75 73 6c 79 20 77 72  ll previously wr
10ab0 69 74 74 65 6e 20 64 61 74 61 20 68 61 73 20 61  itten data has a
10ac0 63 74 75 61 6c 6c 79 20 62 65 65 6e 0a 20 20 2a  ctually been.  *
10ad0 2a 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  * written onto t
10ae0 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20  he disk surface 
10af0 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
10b00 67 2e 20 20 54 68 69 73 20 6d 6f 64 65 20 69 6e  g.  This mode in
10b10 73 75 72 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sures that.  ** 
10b20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c  the database wil
10b30 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e 20 61  l always be in a
10b40 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
10b50 65 20 65 76 65 6e 74 20 69 66 20 74 68 65 20 6f  e event if the o
10b60 70 65 72 61 74 69 6e 67 0a 20 20 2a 2a 20 73 79  perating.  ** sy
10b70 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
10b80 70 6f 77 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  power to the com
10b90 70 75 74 65 72 20 69 73 20 69 6e 74 65 72 72 75  puter is interru
10ba0 70 74 65 64 20 75 6e 65 78 70 65 63 74 65 64 6c  pted unexpectedl
10bb0 79 2e 0a 20 20 2a 2a 20 57 68 65 6e 20 73 79 6e  y..  ** When syn
10bc0 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
10bd0 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
10be0 20 77 61 69 74 20 66 6f 72 20 63 68 61 6e 67 65   wait for change
10bf0 73 20 74 6f 20 61 63 74 75 61 6c 6c 79 0a 20 20  s to actually.  
10c00 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ** be written to
10c10 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
10c20 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 41 73   continuing.  As
10c30 20 73 6f 6f 6e 20 61 73 20 69 74 20 68 61 6e 64   soon as it hand
10c40 73 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  s changes.  ** t
10c50 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  o the operating 
10c60 73 79 73 74 65 6d 2c 20 69 74 20 61 73 73 75 6d  system, it assum
10c70 65 73 20 74 68 61 74 20 74 68 65 20 63 68 61 6e  es that the chan
10c80 67 65 73 20 61 72 65 20 70 65 72 6d 61 6e 65 6e  ges are permanen
10c90 74 20 61 6e 64 0a 20 20 2a 2a 20 69 74 20 63 6f  t and.  ** it co
10ca0 6e 74 69 6e 75 65 73 20 67 6f 69 6e 67 2e 20 20  ntinues going.  
10cb0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  The database can
10cc0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
10cd0 20 62 79 20 61 20 70 72 6f 67 72 61 6d 20 63 72   by a program cr
10ce0 61 73 68 0a 20 20 2a 2a 20 65 76 65 6e 20 77 69  ash.  ** even wi
10cf0 74 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6f  th synchronous o
10d00 66 66 2c 20 62 75 74 20 61 6e 20 6f 70 65 72 61  ff, but an opera
10d10 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
10d20 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 0a  h or power loss.
10d30 20 20 2a 2a 20 63 6f 75 6c 64 20 70 6f 74 65 6e    ** could poten
10d40 74 69 61 6c 6c 79 20 63 6f 72 72 75 70 74 20 64  tially corrupt d
10d50 61 74 61 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ata.  On the oth
10d60 65 72 20 68 61 6e 64 2c 20 73 79 6e 63 68 72 6f  er hand, synchro
10d70 6e 6f 75 73 20 6f 66 66 20 69 73 0a 20 20 2a 2a  nous off is.  **
10d80 20 66 61 73 74 65 72 20 74 68 61 6e 20 73 79 6e   faster than syn
10d90 63 68 72 6f 6e 6f 75 73 20 6f 6e 2e 0a 20 20 2a  chronous on..  *
10da0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  /.  if( sqliteSt
10db0 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 64 65 66  rICmp(zLeft,"def
10dc0 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73  ault_synchronous
10dd0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  ")==0 ){.    sta
10de0 74 69 63 20 56 64 62 65 4f 70 20 67 65 74 53 79  tic VdbeOp getSy
10df0 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  nc[] = {.      {
10e00 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20   OP_Integer,    
10e10 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
10e20 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61  ,.      { OP_Rea
10e30 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c 20  dCookie,  0, 2, 
10e40 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
10e50 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
10e60 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
10e70 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4c  0},.      { OP_L
10e80 74 2c 20 20 20 20 20 20 20 20 20 20 30 2c 20 35  t,          0, 5
10e90 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
10ea0 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20     { OP_AddImm, 
10eb0 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20       1, 0,      
10ec0 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
10ed0 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c  _ColumnCount, 1,
10ee0 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
10ef0 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
10f00 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
10f10 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73      "synchronous
10f20 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  "},.      { OP_C
10f30 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30  allback,    1, 0
10f40 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
10f50 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   };.    Vdbe *v 
10f60 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
10f70 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
10f80 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
10f90 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
10fa0 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20  z==pLeft->z ){. 
10fb0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
10fc0 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
10fd0 79 53 69 7a 65 28 67 65 74 53 79 6e 63 29 2c 20  ySize(getSync), 
10fe0 67 65 74 53 79 6e 63 29 3b 0a 20 20 20 20 7d 65  getSync);.    }e
10ff0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  lse{.      int a
11000 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  ddr;.      int s
11010 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f  ize = db->cache_
11020 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
11030 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20  size<0 ) size = 
11040 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c  -size;.      sql
11050 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
11060 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
11070 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11080 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
11090 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 30 2c  P_ReadCookie, 0,
110a0 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
110b0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
110c0 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
110d0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
110e0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
110f0 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
11100 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
11110 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20  AddOp(v, OP_Ne, 
11120 30 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20  0, addr+3);.    
11130 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
11140 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
11150 4d 41 58 5f 50 41 47 45 53 2c 20 30 29 3b 0a 20  MAX_PAGES, 0);. 
11160 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
11170 64 64 4f 70 28 76 2c 20 4f 50 5f 41 62 73 56 61  ddOp(v, OP_AbsVa
11180 6c 75 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  lue, 0, 0);.    
11190 20 20 69 66 28 20 21 67 65 74 42 6f 6f 6c 65 61    if( !getBoolea
111a0 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
111b0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
111c0 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74  ddOp(v, OP_Negat
111d0 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ive, 0, 0);.    
111e0 20 20 20 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65      size = -size
111f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11200 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11210 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
11220 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71   0, 2);.      sq
11230 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
11240 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
11250 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73       db->cache_s
11260 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ize = size;.    
11270 20 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74    sqliteBtreeSet
11280 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42  CacheSize(db->pB
11290 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a  e, db->cache_siz
112a0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
112b0 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  e..  /*.  **   P
112c0 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
112d0 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  s.  **   PRAGMA 
112e0 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 42 4f 4f 4c  synchronous=BOOL
112f0 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  EAN.  **.  ** Re
11300 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
11310 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  local value of t
11320 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 66  he synchronous f
11330 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20  lag.  Changing. 
11340 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76 61   ** the local va
11350 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b  lue does not mak
11360 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
11370 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20 74   disk file and t
11380 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
11390 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65  value will be re
113a0 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74 20  stored the next 
113b0 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73  time the databas
113c0 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65 64  e is.  ** opened
113d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
113e0 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
113f0 2c 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 29 3d  ,"synchronous")=
11400 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
11410 20 56 64 62 65 4f 70 20 67 65 74 53 79 6e 63 5b   VdbeOp getSync[
11420 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
11430 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c  _ColumnCount, 1,
11440 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
11450 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
11460 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
11470 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73      "synchronous
11480 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  "},.      { OP_C
11490 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30  allback,    1, 0
114a0 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
114b0 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   };.    Vdbe *v 
114c0 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
114d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
114e0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
114f0 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
11500 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20  z==pLeft->z ){. 
11510 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
11520 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
11530 65 72 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  er, db->cache_si
11540 7a 65 3e 3d 30 2c 20 30 29 3b 0a 20 20 20 20 20  ze>=0, 0);.     
11550 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11560 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
11570 65 28 67 65 74 53 79 6e 63 29 2c 20 67 65 74 53  e(getSync), getS
11580 79 6e 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ync);.    }else{
11590 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
115a0 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  = db->cache_size
115b0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
115c0 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a  <0 ) size = -siz
115d0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 67 65  e;.      if( !ge
115e0 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
115f0 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b   ) size = -size;
11600 0a 20 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65  .      db->cache
11610 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
11620 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 53      sqliteBtreeS
11630 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e  etCacheSize(db->
11640 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73  pBe, db->cache_s
11650 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ize);.    }.  }e
11660 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
11670 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
11680 22 74 72 69 67 67 65 72 5f 6f 76 65 72 68 65 61  "trigger_overhea
11690 64 5f 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20  d_test")==0 ){. 
116a0 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61     if( getBoolea
116b0 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
116c0 20 20 20 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74     always_code_t
116d0 72 69 67 67 65 72 5f 73 65 74 75 70 20 3d 20 31  rigger_setup = 1
116e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
116f0 20 20 20 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74     always_code_t
11700 72 69 67 67 65 72 5f 73 65 74 75 70 20 3d 20 30  rigger_setup = 0
11710 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
11720 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
11730 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 76 64 62  ICmp(zLeft, "vdb
11740 65 5f 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a  e_trace")==0 ){.
11750 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
11760 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
11770 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
11780 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63   SQLITE_VdbeTrac
11790 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
117a0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
117b0 20 7e 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61   ~SQLITE_VdbeTra
117c0 63 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ce;.    }.  }els
117d0 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
117e0 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 66  trICmp(zLeft, "f
117f0 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73  ull_column_names
11800 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
11810 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67   getBoolean(zRig
11820 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ht) ){.      db-
11830 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
11840 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20  _FullColNames;. 
11850 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11860 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
11870 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
11880 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  s;.    }.  }else
11890 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ..  if( sqliteSt
118a0 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 73 68  rICmp(zLeft, "sh
118b0 6f 77 5f 64 61 74 61 74 79 70 65 73 22 29 3d 3d  ow_datatypes")==
118c0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  0 ){.    if( get
118d0 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
118e0 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  ){.      db->fla
118f0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65 70  gs |= SQLITE_Rep
11900 6f 72 74 54 79 70 65 73 3b 0a 20 20 20 20 7d 65  ortTypes;.    }e
11910 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  lse{.      db->f
11920 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
11930 52 65 70 6f 72 74 54 79 70 65 73 3b 0a 20 20 20  ReportTypes;.   
11940 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
11950 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
11960 7a 4c 65 66 74 2c 20 22 72 65 73 75 6c 74 5f 73  zLeft, "result_s
11970 65 74 5f 64 65 74 61 69 6c 73 22 29 3d 3d 30 20  et_details")==0 
11980 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
11990 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
119a0 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
119b0 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65 73 75 6c   |= SQLITE_Resul
119c0 74 44 65 74 61 69 6c 73 3b 0a 20 20 20 20 7d 65  tDetails;.    }e
119d0 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  lse{.      db->f
119e0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
119f0 52 65 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20  ResultDetails;. 
11a00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
11a10 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
11a20 70 28 7a 4c 65 66 74 2c 20 22 63 6f 75 6e 74 5f  p(zLeft, "count_
11a30 63 68 61 6e 67 65 73 22 29 3d 3d 30 20 29 7b 0a  changes")==0 ){.
11a40 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
11a50 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
11a60 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
11a70 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
11a80 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
11a90 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
11aa0 20 7e 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f   ~SQLITE_CountRo
11ab0 77 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ws;.    }.  }els
11ac0 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
11ad0 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 65  trICmp(zLeft, "e
11ae0 6d 70 74 79 5f 72 65 73 75 6c 74 5f 63 61 6c 6c  mpty_result_call
11af0 62 61 63 6b 73 22 29 3d 3d 30 20 29 7b 0a 20 20  backs")==0 ){.  
11b00 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
11b10 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
11b20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
11b30 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61  QLITE_NullCallba
11b40 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ck;.    }else{. 
11b50 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
11b60 3d 20 7e 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61  = ~SQLITE_NullCa
11b70 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  llback;.    }.  
11b80 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
11b90 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
11ba0 2c 20 22 74 61 62 6c 65 5f 69 6e 66 6f 22 29 3d  , "table_info")=
11bb0 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
11bc0 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20  *pTab;.    Vdbe 
11bd0 2a 76 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  *v;.    pTab = s
11be0 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
11bf0 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  b, zRight);.    
11c00 69 66 28 20 70 54 61 62 20 29 20 76 20 3d 20 73  if( pTab ) v = s
11c10 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
11c20 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54  rse);.    if( pT
11c30 61 62 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20  ab && v ){.     
11c40 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 74   static VdbeOp t
11c50 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b  ableInfoPreface[
11c60 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
11c70 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
11c80 35 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  5, 0,       0},.
11c90 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
11ca0 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
11cb0 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20        "cid"},.  
11cc0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
11cd0 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20  nName,  1, 0,   
11ce0 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20      "name"},.   
11cf0 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
11d00 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20  Name,  2, 0,    
11d10 20 20 20 22 74 79 70 65 22 7d 2c 0a 20 20 20 20     "type"},.    
11d20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
11d30 61 6d 65 2c 20 20 33 2c 20 30 2c 20 20 20 20 20  ame,  3, 0,     
11d40 20 20 22 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20    "notnull"},.  
11d50 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
11d60 6e 4e 61 6d 65 2c 20 20 34 2c 20 30 2c 20 20 20  nName,  4, 0,   
11d70 20 20 20 20 22 64 66 6c 74 5f 76 61 6c 75 65 22      "dflt_value"
11d80 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  },.      };.    
11d90 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
11da0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
11db0 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
11dc0 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65  tableInfoPreface
11dd0 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66  ), tableInfoPref
11de0 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ace);.      sqli
11df0 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  teViewGetColumnN
11e00 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
11e10 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  b);.      for(i=
11e20 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
11e30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
11e40 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11e50 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
11e60 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
11e70 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11e80 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
11e90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11ea0 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
11eb0 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  -1, pTab->aCol[i
11ec0 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ].zName, P3_STAT
11ed0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
11ee0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11ef0 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
11f00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11f10 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
11f20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
11f30 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  pTab->aCol[i].zT
11f40 79 70 65 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c  ype ? pTab->aCol
11f50 5b 69 5d 2e 7a 54 79 70 65 20 3a 20 22 6e 75 6d  [i].zType : "num
11f60 65 72 69 63 22 2c 20 50 33 5f 53 54 41 54 49 43  eric", P3_STATIC
11f70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11f80 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11f90 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e  _Integer, pTab->
11fa0 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c  aCol[i].notNull,
11fb0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
11fc0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11fd0 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
11fe0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11ff0 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
12000 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  -1, pTab->aCol[i
12010 5d 2e 7a 44 66 6c 74 2c 20 50 33 5f 53 54 41 54  ].zDflt, P3_STAT
12020 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
12030 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12040 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 35 2c 20  OP_Callback, 5, 
12050 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
12060 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
12070 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
12080 4c 65 66 74 2c 20 22 69 6e 64 65 78 5f 69 6e 66  Left, "index_inf
12090 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  o")==0 ){.    In
120a0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54  dex *pIdx;.    T
120b0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
120c0 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 70 49 64  Vdbe *v;.    pId
120d0 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  x = sqliteFindIn
120e0 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74 29 3b  dex(db, zRight);
120f0 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 29 20  .    if( pIdx ) 
12100 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
12110 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
12120 66 28 20 70 49 64 78 20 26 26 20 76 20 29 7b 0a  f( pIdx && v ){.
12130 20 20 20 20 20 20 73 74 61 74 69 63 20 56 64 62        static Vdb
12140 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f 50 72 65  eOp tableInfoPre
12150 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  face[] = {.     
12160 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f     { OP_ColumnCo
12170 75 6e 74 2c 20 33 2c 20 30 2c 20 20 20 20 20 20  unt, 3, 0,      
12180 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f   0},.        { O
12190 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30  P_ColumnName,  0
121a0 2c 20 30 2c 20 20 20 20 20 20 20 22 73 65 71 6e  , 0,       "seqn
121b0 6f 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  o"},.        { O
121c0 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31  P_ColumnName,  1
121d0 2c 20 30 2c 20 20 20 20 20 20 20 22 63 69 64 22  , 0,       "cid"
121e0 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  },.        { OP_
121f0 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20  ColumnName,  2, 
12200 30 2c 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d  0,       "name"}
12210 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ,.      };.     
12220 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 54   int i;.      pT
12230 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
12240 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  e;.      sqliteV
12250 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
12260 41 72 72 61 79 53 69 7a 65 28 74 61 62 6c 65 49  ArraySize(tableI
12270 6e 66 6f 50 72 65 66 61 63 65 29 2c 20 74 61 62  nfoPreface), tab
12280 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a  leInfoPreface);.
12290 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
122a0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
122b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
122c0 74 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61  t cnum = pIdx->a
122d0 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
122e0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
122f0 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
12300 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, i, 0);.      
12310 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
12320 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
12330 20 63 6e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20   cnum, 0);.     
12340 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
12350 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
12360 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
12370 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
12380 6f 6c 3e 63 6e 75 6d 20 29 3b 0a 20 20 20 20 20  ol>cnum );.     
12390 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
123a0 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
123b0 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e  b->aCol[cnum].zN
123c0 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
123d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
123e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
123f0 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a  allback, 3, 0);.
12400 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12410 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
12420 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
12430 2c 20 22 69 6e 64 65 78 5f 6c 69 73 74 22 29 3d  , "index_list")=
12440 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
12450 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65  *pIdx;.    Table
12460 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65   *pTab;.    Vdbe
12470 20 2a 76 3b 0a 20 20 20 20 70 54 61 62 20 3d 20   *v;.    pTab = 
12480 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
12490 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20  db, zRight);.   
124a0 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
124b0 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74     v = sqliteGet
124c0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
124d0 20 20 20 20 70 49 64 78 20 3d 20 70 54 61 62 2d      pIdx = pTab-
124e0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  >pIndex;.    }. 
124f0 20 20 20 69 66 28 20 70 54 61 62 20 26 26 20 70     if( pTab && p
12500 49 64 78 20 26 26 20 76 20 29 7b 0a 20 20 20 20  Idx && v ){.    
12510 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20    int i = 0; .  
12520 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
12530 70 20 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61  p indexListPrefa
12540 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ce[] = {.       
12550 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e   { OP_ColumnCoun
12560 74 2c 20 33 2c 20 30 2c 20 20 20 20 20 20 20 30  t, 3, 0,       0
12570 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  },.        { OP_
12580 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20  ColumnName,  0, 
12590 30 2c 20 20 20 20 20 20 20 22 73 65 71 22 7d 2c  0,       "seq"},
125a0 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
125b0 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c  lumnName,  1, 0,
125c0 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a         "name"},.
125d0 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
125e0 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20  umnName,  2, 0, 
125f0 20 20 20 20 20 20 22 75 6e 69 71 75 65 22 7d 2c        "unique"},
12600 0a 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20  .      };..     
12610 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12620 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
12630 65 28 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61  e(indexListPrefa
12640 63 65 29 2c 20 69 6e 64 65 78 4c 69 73 74 50 72  ce), indexListPr
12650 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20 77 68  eface);.      wh
12660 69 6c 65 28 70 49 64 78 29 7b 0a 20 20 20 20 20  ile(pIdx){.     
12670 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
12680 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
12690 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
126a0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
126b0 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
126c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
126d0 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
126e0 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e  (v, -1, pIdx->zN
126f0 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
12700 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
12710 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
12720 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 6f 6e  nteger, pIdx->on
12730 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 20  Error!=OE_None, 
12740 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
12750 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
12760 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30  P_Callback, 3, 0
12770 29 3b 0a 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a  );.        ++i;.
12780 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 70          pIdx = p
12790 49 64 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Idx->pNext;.    
127a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
127b0 65 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  e..#ifndef NDEBU
127c0 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  G.  if( sqliteSt
127d0 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 70 61  rICmp(zLeft, "pa
127e0 72 73 65 72 5f 74 72 61 63 65 22 29 3d 3d 30 20  rser_trace")==0 
127f0 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f  ){.    extern vo
12800 69 64 20 73 71 6c 69 74 65 50 61 72 73 65 72 54  id sqliteParserT
12810 72 61 63 65 28 46 49 4c 45 2a 2c 20 63 68 61 72  race(FILE*, char
12820 20 2a 29 3b 0a 20 20 20 20 69 66 28 20 67 65 74   *);.    if( get
12830 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
12840 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 50  ){.      sqliteP
12850 61 72 73 65 72 54 72 61 63 65 28 73 74 64 6f 75  arserTrace(stdou
12860 74 2c 20 22 70 61 72 73 65 72 3a 20 22 29 3b 0a  t, "parser: ");.
12870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12880 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61   sqliteParserTra
12890 63 65 28 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ce(0, 0);.    }.
128a0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
128b0 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
128c0 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 74 65  Cmp(zLeft, "inte
128d0 67 72 69 74 79 5f 63 68 65 63 6b 22 29 3d 3d 30  grity_check")==0
128e0 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
128f0 64 62 65 4f 70 20 63 68 65 63 6b 44 62 5b 5d 20  dbeOp checkDb[] 
12900 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  = {.      { OP_S
12910 65 74 49 6e 73 65 72 74 2c 20 20 20 30 2c 20 30  etInsert,   0, 0
12920 2c 20 20 20 20 20 20 20 20 22 32 22 7d 2c 0a 20  ,        "2"},. 
12930 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20       { OP_Open, 
12940 20 20 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20         0, 2,    
12950 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
12960 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20  OP_Rewind,      
12970 30 2c 20 36 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 6,        0},
12980 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
12990 6d 6e 2c 20 20 20 20 20 20 30 2c 20 33 2c 20 20  mn,      0, 3,  
129a0 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
129b0 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  3 */.      { OP_
129c0 53 65 74 49 6e 73 65 72 74 2c 20 20 20 30 2c 20  SetInsert,   0, 
129d0 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
129e0 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20      { OP_Next,  
129f0 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20        0, 3,     
12a00 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
12a10 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 30  P_IntegrityCk, 0
12a20 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
12a30 20 20 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20     /* 6 */.     
12a40 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e   { OP_ColumnCoun
12a50 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20  t, 1, 0,        
12a60 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
12a70 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
12a80 2c 20 20 20 20 20 20 20 20 22 69 6e 74 65 67 72  ,        "integr
12a90 69 74 79 5f 63 68 65 63 6b 22 7d 2c 0a 20 20 20  ity_check"},.   
12aa0 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
12ab0 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
12ac0 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
12ad0 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20 31 2c  _SetInsert,   1,
12ae0 20 30 2c 20 20 20 20 20 20 20 20 22 32 22 7d 2c   0,        "2"},
12af0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e  .      { OP_Open
12b00 41 75 78 2c 20 20 20 20 20 31 2c 20 32 2c 20 20  Aux,     1, 2,  
12b10 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
12b20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20  { OP_Rewind,    
12b30 20 20 31 2c 20 31 36 2c 20 20 20 20 20 20 20 30    1, 16,       0
12b40 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  },.      { OP_Co
12b50 6c 75 6d 6e 2c 20 20 20 20 20 20 31 2c 20 33 2c  lumn,      1, 3,
12b60 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
12b70 2a 20 31 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  * 13 */.      { 
12b80 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20  OP_SetInsert,   
12b90 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
12ba0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
12bb0 2c 20 20 20 20 20 20 20 20 31 2c 20 31 33 2c 20  ,        1, 13, 
12bc0 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
12bd0 7b 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b  { OP_IntegrityCk
12be0 2c 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30  , 1, 1,        0
12bf0 7d 2c 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20  },    /* 16 */. 
12c00 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61       { OP_Callba
12c10 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ck,    1, 0,    
12c20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20      0},.    };. 
12c30 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
12c40 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
12c50 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
12c60 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
12c70 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
12c80 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
12c90 63 68 65 63 6b 44 62 29 2c 20 63 68 65 63 6b 44  checkDb), checkD
12ca0 62 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b  b);.  }else..  {
12cb0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  }.  sqliteFree(z
12cc0 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  Left);.  sqliteF
12cd0 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 7d 0a     ree(zRight);.}.