/ Hex Artifact Content
Login

Artifact 0d661e653e02ce8037917c35403d9f0ff4418e6e:


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 30 37 20 32 30  ild.c,v 1.107 20
0310: 30 32 2f 30 38 2f 30 32 20 31 30 3a 33 36 3a 30  02/08/02 10:36:0
0320: 39 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  9 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 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  }.}../*.** Locat
0a60: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0a70: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0a80: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0a90: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0aa0: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0ab0: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0ac0: 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  at table.  Retur
0ad0: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
0ae0: 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  und..*/.Table *s
0af0: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73  qliteFindTable(s
0b00: 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74  qlite *db, const
0b10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
0b20: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d   Table *p;.  p =
0b30: 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28   sqliteHashFind(
0b40: 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  &db->tblHash, zN
0b50: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
0b60: 65 29 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  e)+1);.  return 
0b70: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
0b80: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0b90: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0ba0: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0bb0: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
0bc0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
0bd0: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a  of that index..*
0be0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
0bf0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49   not found..*/.I
0c00: 6e 64 65 78 20 2a 73 71 6c 69 74 65 46 69 6e 64  ndex *sqliteFind
0c10: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
0c20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
0c30: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
0c40: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61  ;.  p = sqliteHa
0c50: 73 68 46 69 6e 64 28 26 64 62 2d 3e 69 64 78 48  shFind(&db->idxH
0c60: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
0c70: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
0c80: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0c90: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
0ca0: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
0cb0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
0cc0: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
0cd0: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
0ce0: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
0cf0: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
0d00: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
0d10: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
0d20: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
0d30: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
0d40: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
0d50: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
0d60: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
0d70: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
0d80: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
0d90: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
0da0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
0db0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
0dc0: 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20  lite *db, Index 
0dd0: 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f  *p){.  Index *pO
0de0: 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  ld;.  assert( db
0df0: 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21  !=0 && p->zName!
0e00: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
0e10: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
0e20: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 2d  &db->idxHash, p-
0e30: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
0e40: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
0e50: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26    if( pOld!=0 &&
0e60: 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20   pOld!=p ){.    
0e70: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
0e80: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70  (&db->idxHash, p
0e90: 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  Old->zName, strl
0ea0: 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b  en(pOld->zName)+
0eb0: 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20  1, pOld);.  }.  
0ec0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
0ed0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
0ee0: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
0ef0: 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74  rom its table, t
0f00: 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68  hen remove.** th
0f10: 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  e index from the
0f20: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
0f30: 65 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d  e and free its m
0f40: 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75  emory.** structu
0f50: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
0f60: 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  iteUnlinkAndDele
0f70: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  teIndex(sqlite *
0f80: 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  db, Index *pInde
0f90: 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  x){.  if( pIndex
0fa0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
0fb0: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
0fc0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
0fd0: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
0fe0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
0ff0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
1000: 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d     for(p=pIndex-
1010: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
1020: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d   p && p->pNext!=
1030: 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65  pIndex; p=p->pNe
1040: 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 20  xt){}.    if( p 
1050: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
1060: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  dex ){.      p->
1070: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
1080: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
1090: 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  .  sqliteDeleteI
10a0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
10b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
10c0: 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f   all schema info
10d0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
10e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
10f0: 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 64 61 74  tables of.** dat
1100: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1110: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1120: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63  is called to rec
1130: 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62  laim memory.** b
1140: 65 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65 63  efore the connec
1150: 74 69 6f 6e 20 63 6c 6f 73 65 73 2e 20 20 49 74  tion closes.  It
1160: 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20   is also called 
1170: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
1180: 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65  k.** if there we
1190: 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  re schema change
11a0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  s during the tra
11b0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nsaction..*/.voi
11c0: 64 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74  d sqliteResetInt
11d0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69  ernalSchema(sqli
11e0: 74 65 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  te *db){.  HashE
11f0: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
1200: 73 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68  sh temp1;.  Hash
1210: 20 74 65 6d 70 32 3b 0a 0a 20 20 74 65 6d 70 31   temp2;..  temp1
1220: 20 3d 20 64 62 2d 3e 74 62 6c 48 61 73 68 3b 0a   = db->tblHash;.
1230: 20 20 74 65 6d 70 32 20 3d 20 64 62 2d 3e 74 72    temp2 = db->tr
1240: 69 67 48 61 73 68 3b 0a 20 20 73 71 6c 69 74 65  igHash;.  sqlite
1250: 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 74 72  HashInit(&db->tr
1260: 69 67 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48  igHash, SQLITE_H
1270: 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a  ASH_STRING, 0);.
1280: 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61    sqliteHashClea
1290: 72 28 26 64 62 2d 3e 69 64 78 48 61 73 68 29 3b  r(&db->idxHash);
12a0: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
12b0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65  iteHashFirst(&te
12c0: 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  mp2); pElem; pEl
12d0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
12e0: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
12f0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
1300: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
1310: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71  a(pElem);.    sq
1320: 6c 69 74 65 44 65 6c 65 74 65 54 72 69 67 67 65  liteDeleteTrigge
1330: 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 7d  r(pTrigger);.  }
1340: 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65  .  sqliteHashCle
1350: 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 73 71  ar(&temp2);.  sq
1360: 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62  liteHashInit(&db
1370: 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54  ->tblHash, SQLIT
1380: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
1390: 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  );.  for(pElem=s
13a0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
13b0: 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70  temp1); pElem; p
13c0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
13d0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
13e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
13f0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
1400: 6c 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lem);.    sqlite
1410: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
1420: 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pTab);.  }.  sql
1430: 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 65  iteHashClear(&te
1440: 6d 70 31 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  mp1);.  db->flag
1450: 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 49 6e  s &= ~(SQLITE_In
1460: 69 74 69 61 6c 69 7a 65 64 7c 53 51 4c 49 54 45  itialized|SQLITE
1470: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
1480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1490: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
14a0: 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
14b0: 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66  back occurs.  If
14c0: 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73   there were.** s
14d0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
14e0: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
14f0: 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61  tion, then we ha
1500: 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a  ve to reset the.
1510: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  ** internal hash
1520: 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f   tables and relo
1530: 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73  ad them from dis
1540: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
1550: 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61  eRollbackInterna
1560: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
1570: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1580: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
1590: 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a  nternChanges ){.
15a0: 20 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 49      sqliteResetI
15b0: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
15c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15e0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f  called when a co
15f0: 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  mmit occurs..*/.
1600: 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69  void sqliteCommi
1610: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
1620: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
1630: 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  db->schema_cooki
1640: 65 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  e = db->next_coo
1650: 6b 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  kie;.  db->flags
1660: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
1670: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
1680: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d  .** Remove the m
1690: 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63  emory data struc
16a0: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
16b0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a   with the given.
16c0: 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68  ** Table.  No ch
16d0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
16e0: 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72  o disk by this r
16f0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
1700: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
1710: 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61  deletes the data
1720: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
1730: 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a  does not unlink.
1740: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74  ** the table dat
1750: 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  a structure from
1760: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
1770: 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65    But it does de
1780: 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20  stroy.** memory 
1790: 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68  structures of th
17a0: 65 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  e indices associ
17b0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
17c0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63  ble..**.** Indic
17d0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
17e0: 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  th the table are
17f0: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
1800: 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20  he "db".** data 
1810: 73 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21  structure if db!
1820: 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e  =NULL.  If db==N
1830: 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74  ULL, indices att
1840: 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  ached to.** the 
1850: 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65  table are delete
1860: 64 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73  d, but it is ass
1870: 75 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61  umed they have a
1880: 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75  lready been.** u
1890: 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64  nlinked..*/.void
18a0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
18b0: 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54  le(sqlite *db, T
18c0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
18d0: 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20   int i;.  Index 
18e0: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
18f0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
1900: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1910: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
1920: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1930: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
1940: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  e->aCol[i].zName
1950: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
1960: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
1970: 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71  ].zDflt);.    sq
1980: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
1990: 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b  >aCol[i].zType);
19a0: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 49 6e 64 65  .  }.  for(pInde
19b0: 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x = pTable->pInd
19c0: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
19d0: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ex=pNext){.    p
19e0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
19f0: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
1a00: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
1a10: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
1a20: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
1a30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
1a40: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
1a50: 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 53 65  Col);.  sqliteSe
1a60: 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c  lectDelete(pTabl
1a70: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  e->pSelect);.  s
1a80: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
1a90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
1aa0: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
1ab0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
1ac0: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
1ad0: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
1ae0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
1af0: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
1b00: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
1b10: 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41  id sqliteUnlinkA
1b20: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  ndDeleteTable(sq
1b30: 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20  lite *db, Table 
1b40: 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f  *p){.  Table *pO
1b50: 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  ld;.  assert( db
1b60: 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  !=0 );.  pOld = 
1b70: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
1b80: 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70  (&db->tblHash, p
1b90: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
1ba0: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b  p->zName)+1, 0);
1bb0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d  .  assert( pOld=
1bc0: 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b  =0 || pOld==p );
1bd0: 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54  .  sqliteDeleteT
1be0: 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  able(db, p);.}..
1bf0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
1c00: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 75 73  the name of a us
1c10: 65 72 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  er table or inde
1c20: 78 20 66 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a  x from a token..
1c30: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
1c40: 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 69 73 20  old the name is 
1c50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1c60: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
1c70: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72 65 65   must.** be free
1c80: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
1c90: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68   function..*/.ch
1ca0: 61 72 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e  ar *sqliteTableN
1cb0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b  ameFromToken(Tok
1cc0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
1cd0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
1ce0: 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d  teStrNDup(pName-
1cf0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
1d00: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
1d10: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1d20: 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zName;.}../*.** 
1d30: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1d40: 20 6f 70 65 6e 20 74 68 65 20 61 70 70 72 6f 70   open the approp
1d50: 72 69 61 74 65 20 6d 61 73 74 65 72 20 74 61 62  riate master tab
1d60: 6c 65 2e 20 20 54 68 65 20 74 61 62 6c 65 0a 2a  le.  The table.*
1d70: 2a 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  * opened will be
1d80: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 66   SQLITE_MASTER f
1d90: 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 74 61  or persistent ta
1da0: 62 6c 65 73 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  bles and .** SQL
1db0: 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20  ITE_TEMP_MASTER 
1dc0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61  for temporary ta
1dd0: 62 6c 65 73 2e 20 20 54 68 65 20 74 61 62 6c 65  bles.  The table
1de0: 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
1df0: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
1e00: 69 64 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73  id sqliteOpenMas
1e10: 74 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76  terTable(Vdbe *v
1e20: 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20  , int isTemp){. 
1e30: 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
1e40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1e50: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 41  Op(v, OP_OpenWrA
1e60: 75 78 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 73  ux, 0, 2);.    s
1e70: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
1e80: 33 28 76 2c 20 2d 31 2c 20 54 45 4d 50 5f 4d 41  3(v, -1, TEMP_MA
1e90: 53 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54  STER_NAME, P3_ST
1ea0: 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ATIC);.  }else{.
1eb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
1ec0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
1ed0: 69 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20  ite, 0, 2);.    
1ee0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
1ef0: 50 33 28 76 2c 20 2d 31 2c 20 4d 41 53 54 45 52  P3(v, -1, MASTER
1f00: 5f 4e 41 4d 45 2c 20 50 33 5f 53 54 41 54 49 43  _NAME, P3_STATIC
1f10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1f20: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
1f30: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
1f40: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
1f50: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
1f60: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
1f70: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
1f80: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
1f90: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
1fa0: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
1fb0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1fc0: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
1fd0: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
1fe0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
1ff0: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
2000: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
2010: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
2020: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
2030: 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65  e.** pStart toke
2040: 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20  n is the CREATE 
2050: 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65  and pName is the
2060: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
2070: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
2080: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
2090: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
20a0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
20b0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
20c0: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
20d0: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
20e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
20f0: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
2100: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
2110: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
2120: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
2130: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
2140: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
2150: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
2160: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
2170: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
2180: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
2190: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
21a0: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
21b0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
21c0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
21d0: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
21e0: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
21f0: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
2200: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
2210: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
2220: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
2230: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2240: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
2250: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
2260: 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20 72 6f  iteEndTable() ro
2270: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
2280: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
2290: 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  he construction 
22a0: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
22b0: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64   record..*/.void
22c0: 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c   sqliteStartTabl
22d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
22e0: 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
22f0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e  Token *pName, in
2300: 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 54 61 62  t isTemp){.  Tab
2310: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e  le *pTable;.  In
2320: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61  dex *pIdx;.  cha
2330: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69  r *zName;.  sqli
2340: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
2350: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
2360: 0a 20 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73  .  pParse->sFirs
2370: 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74  tToken = *pStart
2380: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
2390: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
23a0: 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69  oken(pName);.  i
23b0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
23c0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f  turn;..  /* Befo
23d0: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63 72 65  re trying to cre
23e0: 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
23f0: 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65  table, make sure
2400: 20 74 68 65 20 42 74 72 65 65 20 66 6f 72 0a 20   the Btree for. 
2410: 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70   ** holding temp
2420: 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69 73 20  orary tables is 
2430: 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  open..  */.  if(
2440: 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d 3e 70   isTemp && db->p
2450: 42 65 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20  BeTemp==0 ){.   
2460: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2470: 42 74 72 65 65 4f 70 65 6e 28 30 2c 20 30 2c 20  BtreeOpen(0, 0, 
2480: 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e  MAX_PAGES, &db->
2490: 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20 69 66  pBeTemp);.    if
24a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
24c0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
24d0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62  ->zErrMsg, "unab
24e0: 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
24f0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
2500: 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
2510: 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
2520: 6f 72 61 72 79 20 74 61 62 6c 65 73 22 2c 20 30  orary tables", 0
2530: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
2540: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
2550: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
2560: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
2570: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20   SQLITE_InTrans 
2580: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2590: 6c 69 74 65 42 74 72 65 65 42 65 67 69 6e 54 72  liteBtreeBeginTr
25a0: 61 6e 73 28 64 62 2d 3e 70 42 65 54 65 6d 70 29  ans(db->pBeTemp)
25b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
25c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25d0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
25e0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
25f0: 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20  ErrMsg, "unable 
2600: 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c  to get a write l
2610: 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20  ock on ".       
2620: 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72     "the temporar
2630: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22  y database file"
2640: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
2650: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
2660: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2670: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2680: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
2690: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
26a0: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
26b0: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
26c0: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
26d0: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  or table name.  
26e0: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
26f0: 65 73 73 61 67 65 20 69 66 20 69 74 20 64 6f 65  essage if it doe
2700: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  s..  **.  ** If 
2710: 77 65 20 61 72 65 20 72 65 2d 72 65 61 64 69 6e  we are re-readin
2720: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
2730: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
2740: 65 20 6f 66 20 61 20 73 63 68 65 6d 61 0a 20 20  e of a schema.  
2750: 2a 2a 20 63 68 61 6e 67 65 20 61 6e 64 20 61 20  ** change and a 
2760: 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61  new permanent ta
2770: 62 6c 65 20 69 73 20 66 6f 75 6e 64 20 77 68 6f  ble is found who
2780: 73 65 20 6e 61 6d 65 20 63 6f 6c 6c 69 64 65 73  se name collides
2790: 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 78   with.  ** an ex
27a0: 69 73 74 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  isting temporary
27b0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 69 67 6e   table, then ign
27c0: 6f 72 65 20 74 68 65 20 6e 65 77 20 70 65 72 6d  ore the new perm
27d0: 61 6e 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a  anent table..  *
27e0: 2a 20 57 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  * We will contin
27f0: 75 65 20 70 61 72 73 69 6e 67 2c 20 62 75 74 20  ue parsing, but 
2800: 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65  the pParse->name
2810: 43 6c 61 73 68 20 66 6c 61 67 20 77 69 6c 6c 20  Clash flag will 
2820: 62 65 20 73 65 74 0a 20 20 2a 2a 20 73 6f 20 77  be set.  ** so w
2830: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f 20 64  e will know to d
2840: 69 73 63 61 72 64 20 74 68 65 20 74 61 62 6c 65  iscard the table
2850: 20 72 65 63 6f 72 64 20 6f 6e 63 65 20 70 61 72   record once par
2860: 73 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65  sing has finishe
2870: 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65  d..  */.  pTable
2880: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
2890: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  le(db, zName);. 
28a0: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29   if( pTable!=0 )
28b0: 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  {.    if( pTable
28c0: 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50 61 72  ->isTemp && pPar
28d0: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
28e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 61        pParse->na
28f0: 6d 65 43 6c 61 73 68 20 3d 20 31 3b 0a 20 20 20  meClash = 1;.   
2900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2910: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
2920: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
2930: 20 22 74 61 62 6c 65 20 22 2c 20 30 2c 20 70 4e   "table ", 0, pN
2940: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
2950: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 61 6c  ,.          " al
2960: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 30  ready exists", 0
2970: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
2980: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
2990: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
29a0: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
29b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  n;.    }.  }else
29c0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 61  {.    pParse->na
29d0: 6d 65 43 6c 61 73 68 20 3d 20 30 3b 0a 20 20 7d  meClash = 0;.  }
29e0: 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73  .  if( (pIdx = s
29f0: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
2a00: 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 26 26  b, zName))!=0 &&
2a10: 0a 20 20 20 20 20 20 20 20 20 20 28 21 70 49 64  .          (!pId
2a20: 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  x->pTable->isTem
2a30: 70 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69 6e  p || !pParse->in
2a40: 69 74 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 73  itFlag) ){.    s
2a50: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
2a60: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
2a70: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
2a80: 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65  dy an index name
2a90: 64 20 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e 61  d ", .       zNa
2aa0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
2ab0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
2ac0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
2ad0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
2ae0: 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71   }.  pTable = sq
2af0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
2b00: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
2b10: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
2b20: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
2b30: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
2b40: 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  n;.  }.  pTable-
2b50: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
2b60: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
2b70: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43   0;.  pTable->aC
2b80: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
2b90: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
2ba0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
2bb0: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 73   0;.  pTable->is
2bc0: 54 65 6d 70 20 3d 20 69 73 54 65 6d 70 3b 0a 20  Temp = isTemp;. 
2bd0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
2be0: 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 44  wTable ) sqliteD
2bf0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
2c00: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
2c10: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  );.  pParse->pNe
2c20: 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  wTable = pTable;
2c30: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
2c40: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
2c50: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
2c60: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
2c70: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
2c80: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
2c90: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
2ca0: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
2cb0: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
2cc0: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
2cd0: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
2ce0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
2cf0: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
2d00: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
2d10: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
2d20: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
2d30: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
2d40: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
2d50: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
2d60: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
2d70: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
2d80: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
2d90: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
2da0: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
2db0: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
2dc0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
2dd0: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
2de0: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
2df0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
2e00: 69 6e 69 74 46 6c 61 67 20 26 26 20 28 76 20 3d  initFlag && (v =
2e10: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
2e20: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
2e30: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
2e40: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
2e50: 73 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  se, 0);.    if( 
2e60: 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  !isTemp ){.     
2e70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2e80: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2e90: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c  db->file_format,
2ea0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2eb0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2ec0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 31  _SetCookie, 0, 1
2ed0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2ee0: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
2ef0: 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20  le(v, isTemp);. 
2f00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
2f10: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
2f20: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  o, 0, 0);.    sq
2f30: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2f40: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
2f50: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2f60: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
2f70: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
2f80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2f90: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
2fa0: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
2fb0: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
2fc0: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
2fd0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
2fe0: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
2ff0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
3000: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
3010: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
3020: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
3030: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
3040: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
3050: 2e 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  .  sqliteStartTa
3060: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
3070: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
3080: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
3090: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
30a0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
30b0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
30c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
30d0: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
30e0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
30f0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
3100: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
3110: 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c  ar *z = 0;.  Col
3120: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
3130: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
3140: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
3150: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 53 65  turn;.  sqliteSe
3160: 74 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61  tNString(&z, pNa
3170: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c  me->z, pName->n,
3180: 20 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20   0);.  if( z==0 
3190: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
31a0: 74 65 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  teDequote(z);.  
31b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
31c0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
31d0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
31e0: 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  z, p->aCol[i].zN
31f0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
3200: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
3210: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
3220: 67 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f  g, "duplicate co
3230: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c  lumn name: ", z,
3240: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
3250: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3260: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
3270: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
3280: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
3290: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30  ->nCol & 0x7)==0
32a0: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a   ){.    Column *
32b0: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
32c0: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20   sqliteRealloc( 
32d0: 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f  p->aCol, (p->nCo
32e0: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
32f0: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
3300: 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( aNew==0 ) retu
3310: 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20  rn;.    p->aCol 
3320: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
3330: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
3340: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
3350: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
3360: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
3370: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
3380: 3b 0a 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72  ;.  pCol->sortOr
3390: 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  der = SQLITE_SO_
33a0: 4e 55 4d 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  NUM;.  p->nCol++
33b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
33c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
33d0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
33e0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
33f0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
3400: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
3410: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
3420: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
3430: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
3440: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
3450: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
3460: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
3470: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
3480: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
3490: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
34a0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
34b0: 6c 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  liteAddNotNull(P
34c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
34d0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
34e0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
34f0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
3500: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
3510: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
3520: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
3530: 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f  f( i>=0 ) p->aCo
3540: 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f  l[i].notNull = o
3550: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
3560: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3570: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
3580: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
3590: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
35a0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
35b0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
35c0: 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f  .  The pFirst to
35d0: 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74  ken is the first
35e0: 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  .** token in the
35f0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b   sequence of tok
3600: 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ens that describ
3610: 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68  e the type of th
3620: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72  e.** column curr
3630: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
3640: 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73  truction.   pLas
3650: 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f  t is the last to
3660: 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65  ken.** in the se
3670: 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69  quence.  Use thi
3680: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  s information to
3690: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72   construct a str
36a0: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74  ing.** that cont
36b0: 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d  ains the typenam
36c0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
36d0: 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73  and store that s
36e0: 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70  tring.** in zTyp
36f0: 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  e..*/ .void sqli
3700: 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  teAddColumnType(
3710: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
3720: 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f  oken *pFirst, To
3730: 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54  ken *pLast){.  T
3740: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
3750: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  , j;.  int n;.  
3760: 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20  char *z, **pz;. 
3770: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
3780: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
3790: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
37a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
37b0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
37c0: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
37d0: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
37e0: 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f  [i];.  pz = &pCo
37f0: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20  l->zType;.  n = 
3800: 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28  pLast->n + Addr(
3810: 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72  pLast->z) - Addr
3820: 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73  (pFirst->z);.  s
3830: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
3840: 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e  pz, pFirst->z, n
3850: 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b  , 0);.  z = *pz;
3860: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
3870: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  turn;.  for(i=j=
3880: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
3890: 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b     int c = z[i];
38a0: 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65  .    if( isspace
38b0: 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (c) ) continue;.
38c0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
38d0: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
38e0: 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65    pCol->sortOrde
38f0: 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  r = SQLITE_SO_NU
3900: 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  M;.  for(i=0; z[
3910: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77  i]; i++){.    sw
3920: 69 74 63 68 28 20 7a 5b 69 5d 20 29 7b 0a 20 20  itch( z[i] ){.  
3930: 20 20 20 20 63 61 73 65 20 27 62 27 3a 0a 20 20      case 'b':.  
3940: 20 20 20 20 63 61 73 65 20 27 42 27 3a 20 7b 0a      case 'B': {.
3950: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
3960: 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 5b 69 5d  teStrNICmp(&z[i]
3970: 2c 22 62 6c 6f 62 22 2c 34 29 3d 3d 30 20 29 7b  ,"blob",4)==0 ){
3980: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
3990: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c  >sortOrder = SQL
39a0: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20  ITE_SO_TEXT;.   
39b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
39c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
39d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
39e0: 20 20 20 20 20 20 63 61 73 65 20 27 63 27 3a 0a        case 'c':.
39f0: 20 20 20 20 20 20 63 61 73 65 20 27 43 27 3a 20        case 'C': 
3a00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
3a10: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 5b  liteStrNICmp(&z[
3a20: 69 5d 2c 22 63 68 61 72 22 2c 34 29 3d 3d 30 20  i],"char",4)==0 
3a30: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
3a40: 20 20 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d     sqliteStrNICm
3a50: 70 28 26 7a 5b 69 5d 2c 22 63 6c 6f 62 22 2c 34  p(&z[i],"clob",4
3a60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3a70: 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65    pCol->sortOrde
3a80: 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45  r = SQLITE_SO_TE
3a90: 58 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  XT;.          re
3aa0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
3ab0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
3ad0: 65 20 27 78 27 3a 0a 20 20 20 20 20 20 63 61 73  e 'x':.      cas
3ae0: 65 20 27 58 27 3a 20 7b 0a 20 20 20 20 20 20 20  e 'X': {.       
3af0: 20 69 66 28 20 69 3e 3d 32 20 26 26 20 73 71 6c   if( i>=2 && sql
3b00: 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 5b 69  iteStrNICmp(&z[i
3b10: 2d 32 5d 2c 22 74 65 78 74 22 2c 34 29 3d 3d 30  -2],"text",4)==0
3b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
3b30: 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  ol->sortOrder = 
3b40: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
3b50: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3b60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3b70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3b80: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
3b90: 3a 20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61  : {.        brea
3ba0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3bb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3bc0: 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73  e given token is
3bd0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
3be0: 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20  ue for the last 
3bf0: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a  column added to.
3c00: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ** the table cur
3c10: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
3c20: 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22  struction.  If "
3c30: 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72  minusFlag" is tr
3c40: 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ue, it.** means 
3c50: 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20  the value token 
3c60: 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20  was preceded by 
3c70: 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a  a minus sign..**
3c80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3c90: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
3ca0: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
3cb0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
3cc0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
3cd0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
3ce0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
3cf0: 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c  iteAddDefaultVal
3d00: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
3d10: 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69  , Token *pVal, i
3d20: 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20  nt minusFlag){. 
3d30: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
3d40: 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b   i;.  char **pz;
3d50: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
3d60: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
3d70: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
3d80: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
3d90: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
3da0: 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c  .  pz = &p->aCol
3db0: 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28  [i].zDflt;.  if(
3dc0: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
3dd0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
3de0: 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70  ng(pz, "-", 1, p
3df0: 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c  Val->z, pVal->n,
3e00: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
3e10: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
3e20: 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20  ng(pz, pVal->z, 
3e30: 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d  pVal->n, 0);.  }
3e40: 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
3e50: 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (*pz);.}../*.** 
3e60: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
3e70: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
3e80: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
3e90: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
3ea0: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
3eb0: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
3ec0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
3ed0: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
3ee0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
3ef0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
3f00: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
3f10: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
3f20: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
3f30: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
3f40: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
3f50: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
3f60: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
3f70: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
3f80: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
3f90: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
3fa0: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
3fb0: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
3fc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
3fd0: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
3fe0: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
3ff0: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
4000: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
4010: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
4020: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
4030: 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e  n as the row id.
4040: 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a    (Exception:.**
4050: 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   For backwards c
4060: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
4070: 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65  h older database
4080: 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  s, do not do thi
4090: 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65  s.** if the file
40a0: 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20   format version 
40b0: 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
40c0: 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65  han 1.)  Set the
40d0: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
40e0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
40f0: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
4100: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
4110: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
4120: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4130: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
4140: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
4150: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
4160: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
4170: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
4180: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
4190: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
41a0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
41b0: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
41c0: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
41d0: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
41e0: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
41f0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
4200: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
4210: 71 6c 69 74 65 41 64 64 50 72 69 6d 61 72 79 4b  qliteAddPrimaryK
4220: 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
4230: 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  , IdList *pList,
4240: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
4250: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
4260: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
4270: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
4280: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
4290: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54 61 62  = -1;.  if( pTab
42a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
42b0: 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69  if( pTab->hasPri
42c0: 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  mKey ){.    sqli
42d0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
42e0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
42f0: 61 62 6c 65 20 5c 22 22 2c 20 70 54 61 62 2d 3e  able \"", pTab->
4300: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
4310: 22 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  "\" has more tha
4320: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
4330: 79 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  y", 0);.    pPar
4340: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
4350: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
4360: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d  ab->hasPrimKey =
4370: 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   1;.  if( pList=
4380: 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  =0 ){.    iCol =
4390: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b   pTab->nCol - 1;
43a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69  .  }else if( pLi
43b0: 73 74 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a 20 20  st->nId==1 ){.  
43c0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
43d0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
43e0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Col++){.      if
43f0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
4400: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pList->a[0].zNam
4410: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
4420: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  ol].zName)==0 ) 
4430: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4440: 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26  .  if( iCol>=0 &
4450: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
4460: 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  l ){.    zType =
4470: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
4480: 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69  ].zType;.  }.  i
4490: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
44a0: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 31 20 26 26  ile_format>=1 &&
44b0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a 54 79   .           zTy
44c0: 70 65 20 26 26 20 73 71 6c 69 74 65 53 74 72 49  pe && sqliteStrI
44d0: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
44e0: 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  GER")==0 ){.    
44f0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
4500: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
4510: 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b  yConf = onError;
4520: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
4530: 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28  liteCreateIndex(
4540: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 70 4c  pParse, 0, 0, pL
4550: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
4560: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
4570: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
4580: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
4590: 6e 67 20 74 79 70 65 20 67 69 76 65 6e 20 74 68  ng type given th
45a0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  e collation type
45b0: 20 74 6f 6b 65 6e 2e 0a 2a 2a 20 52 65 70 6f 72   token..** Repor
45c0: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  t an error if th
45d0: 65 20 74 79 70 65 20 69 73 20 75 6e 64 65 66 69  e type is undefi
45e0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
45f0: 74 65 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61  teCollateType(Pa
4600: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
4610: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 69 66  en *pType){.  if
4620: 28 20 70 54 79 70 65 3d 3d 30 20 29 20 72 65 74  ( pType==0 ) ret
4630: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e  urn SQLITE_SO_UN
4640: 4b 3b 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e  K;.  if( pType->
4650: 6e 3d 3d 34 20 26 26 20 73 71 6c 69 74 65 53 74  n==4 && sqliteSt
4660: 72 4e 49 43 6d 70 28 70 54 79 70 65 2d 3e 7a 2c  rNICmp(pType->z,
4670: 20 22 74 65 78 74 22 2c 20 34 29 3d 3d 30 20 29   "text", 4)==0 )
4680: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
4690: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 7d  ITE_SO_TEXT;.  }
46a0: 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d  .  if( pType->n=
46b0: 3d 37 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e  =7 && sqliteStrN
46c0: 49 43 6d 70 28 70 54 79 70 65 2d 3e 7a 2c 20 22  ICmp(pType->z, "
46d0: 6e 75 6d 65 72 69 63 22 2c 20 37 29 3d 3d 30 20  numeric", 7)==0 
46e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
46f0: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 7d  LITE_SO_NUM;.  }
4700: 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72  .  sqliteSetNStr
4710: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
4720: 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e 20 63  rMsg, "unknown c
4730: 6f 6c 6c 61 74 69 6e 67 20 74 79 70 65 3a 20 22  ollating type: "
4740: 2c 20 2d 31 2c 0a 20 20 20 20 70 54 79 70 65 2d  , -1,.    pType-
4750: 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 2c 20 30 29  >z, pType->n, 0)
4760: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  ;.  pParse->nErr
4770: 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ++;.  return SQL
4780: 49 54 45 5f 53 4f 5f 55 4e 4b 3b 0a 7d 0a 0a 2f  ITE_SO_UNK;.}../
4790: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
47a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
47b0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
47c0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
47d0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
47e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
47f0: 6d 65 6e 74 2e 20 20 41 20 22 43 4f 4c 4c 41 54  ment.  A "COLLAT
4800: 45 22 20 63 6c 61 75 73 65 20 68 61 73 0a 2a 2a  E" clause has.**
4810: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
4820: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
4830: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 43  utine sets the C
4840: 6f 6c 75 6d 6e 2e 73 6f 72 74 4f 72 64 65 72 20  olumn.sortOrder 
4850: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
4860: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
4870: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
4880: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64  /.void sqliteAdd
4890: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
48a0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 63  e *pParse, int c
48b0: 6f 6c 6c 54 79 70 65 29 7b 0a 20 20 54 61 62 6c  ollType){.  Tabl
48c0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
48d0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
48e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
48f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
4900: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
4910: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
4920: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 63  i].sortOrder = c
4930: 6f 6c 6c 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ollType;.}../*.*
4940: 2a 20 43 6f 6d 65 20 75 70 20 77 69 74 68 20 61  * Come up with a
4950: 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75   new random valu
4960: 65 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61  e for the schema
4970: 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73   cookie.  Make s
4980: 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76  ure.** the new v
4990: 61 6c 75 65 20 69 73 20 64 69 66 66 65 72 65 6e  alue is differen
49a0: 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a  t from the old..
49b0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
49c0: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
49d0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
49e0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
49f0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
4a00: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
4a10: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
4a20: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
4a30: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
4a40: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
4a50: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
4a60: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
4a70: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
4a80: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
4a90: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
4aa0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
4ab0: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
4ac0: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
4ad0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
4ae0: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
4af0: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
4b00: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
4b10: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
4b20: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
4b30: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
4b40: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
4b50: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
4b60: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
4b70: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
4b80: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
4b90: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
4ba0: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
4bb0: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
4bc0: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
4bd0: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
4be0: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
4bf0: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
4c00: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
4c10: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
4c20: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
4c30: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
4c40: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
4c50: 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71  eChangeCookie(sq
4c60: 6c 69 74 65 20 2a 64 62 2c 20 56 64 62 65 20 2a  lite *db, Vdbe *
4c70: 76 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65  v){.  if( db->ne
4c80: 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 73  xt_cookie==db->s
4c90: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a  chema_cookie ){.
4ca0: 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f      db->next_coo
4cb0: 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d 61  kie = db->schema
4cc0: 5f 63 6f 6f 6b 69 65 20 2b 20 73 71 6c 69 74 65  _cookie + sqlite
4cd0: 52 61 6e 64 6f 6d 42 79 74 65 28 29 20 2b 20 31  RandomByte() + 1
4ce0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
4cf0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
4d00: 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 73 71 6c  Changes;.    sql
4d10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4d20: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
4d30: 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b  next_cookie, 0);
4d40: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4d50: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
4d60: 6f 6b 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  okie, 0, 0);.  }
4d70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
4d80: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
4d90: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
4da0: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
4db0: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
4dc0: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
4dd0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
4de0: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
4df0: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
4e00: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
4e10: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
4e20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
4e30: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
4e40: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
4e50: 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f  n;.  int needQuo
4e60: 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d  te = 0;.  for(n=
4e70: 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29  0; *z; n++, z++)
4e80: 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c  {.    if( *z=='\
4e90: 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51  '' ){ n++; needQ
4ea0: 75 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20  uote=1; }.  }.  
4eb0: 72 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51  return n + needQ
4ec0: 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uote*2;.}../*.**
4ed0: 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69   Write an identi
4ee0: 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e  fier onto the en
4ef0: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73  d of the given s
4f00: 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71  tring.  Add.** q
4f10: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
4f20: 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  as needed..*/.st
4f30: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
4f40: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
4f50: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64  *pIdx, char *zId
4f60: 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  ent){.  int i, j
4f70: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
4f80: 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28   = *pIdx;.  for(
4f90: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
4fa0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  j++){.    if( !i
4fb0: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
4fc0: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
4fd0: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
4fe0: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20  .  needQuote =  
4ff0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20  zIdent[j]!=0 || 
5000: 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  isdigit(zIdent[0
5010: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
5020: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 4b 65       || sqliteKe
5030: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
5040: 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69  , j)!=TK_ID;.  i
5050: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
5060: 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [i++] = '\'';.  
5070: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
5080: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
5090: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
50a0: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
50b0: 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b  [j]=='\'' ) z[i+
50c0: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20  +] = '\'';.  }. 
50d0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
50e0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[i++] = '\'';.
50f0: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
5100: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
5110: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
5120: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5130: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
5140: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
5150: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
5160: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
5170: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
5180: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
5190: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
51a0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
51b0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
51c0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
51d0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
51e0: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
51f0: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
5200: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
5210: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
5220: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
5230: 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  zEnd;.  n = 0;. 
5240: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5250: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  Col; i++){.    n
5260: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
5270: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
5280: 29 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64  );.  }.  n += id
5290: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
52a0: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20  me);.  if( n<40 
52b0: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
52c0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
52d0: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
52e0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
52f0: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
5300: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
5310: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
5320: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
5330: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
5340: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
5350: 65 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20  eMalloc( n );.  
5360: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72  if( zStmt==0 ) r
5370: 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70  eturn 0;.  strcp
5380: 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 73 54 65  y(zStmt, p->isTe
5390: 6d 70 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d  mp ? "CREATE TEM
53a0: 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43 52 45  P TABLE " : "CRE
53b0: 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20  ATE TABLE ");.  
53c0: 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74  k = strlen(zStmt
53d0: 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53  );.  identPut(zS
53e0: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d  tmt, &k, p->zNam
53f0: 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d  e);.  zStmt[k++]
5400: 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d   = '(';.  for(i=
5410: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
5420: 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26  +){.    strcpy(&
5430: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
5440: 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e  .    k += strlen
5450: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
5460: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
5470: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
5480: 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69  t, &k, p->aCol[i
5490: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
54a0: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
54b0: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
54c0: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
54d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
54e0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f  s called to repo
54f0: 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22  rt the final ")"
5500: 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
5510: 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42  .** a CREATE TAB
5520: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
5530: 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74  .** The table st
5540: 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68  ructure that oth
5550: 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  er action routin
5560: 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69  es have been bui
5570: 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65  lding.** is adde
5580: 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
5590: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61  l hash tables, a
55a0: 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
55b0: 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72  s have.** occurr
55c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74  ed..**.** An ent
55d0: 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ry for the table
55e0: 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20   is made in the 
55f0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20  master table on 
5600: 64 69 73 6b 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20  disk,.** unless 
5610: 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
5620: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 69 6e 69  ary table or ini
5630: 74 46 6c 61 67 3d 3d 31 2e 20 20 57 68 65 6e 20  tFlag==1.  When 
5640: 69 6e 69 74 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20  initFlag==1,.** 
5650: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
5660: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
5670: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
5680: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
5690: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
56a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
56b0: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
56c0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
56d0: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
56e0: 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68 65 20  changes, so the 
56f0: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
5700: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
5710: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
5720: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
5730: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
5740: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
5750: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
5760: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
5770: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
5780: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
5790: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
57a0: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
57b0: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
57c0: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
57d0: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
57e0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
57f0: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
5800: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
5810: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
5820: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
5830: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
5840: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
5850: 76 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 54 61  void sqliteEndTa
5860: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
5870: 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  e, Token *pEnd, 
5880: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
5890: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
58a0: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
58b0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
58c0: 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c  (pEnd==0 && pSel
58d0: 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73  ect==0) || pPars
58e0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
58f0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
5900: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
5910: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5920: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
5930: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 41 64  return;..  /* Ad
5940: 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
5950: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
5960: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
5970: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
5980: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
5990: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d 30  se->nameClash==0
59a0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   || pParse->init
59b0: 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Flag==1 );.  if(
59c0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
59d0: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ==0 && pParse->n
59e0: 61 6d 65 43 6c 61 73 68 3d 3d 30 20 29 7b 0a 20  ameClash==0 ){. 
59f0: 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
5a00: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
5a10: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
5a20: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
5a30: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
5a40: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
5a50: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
5a60: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
5a70: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
5a80: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
5a90: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
5aa0: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65  rt() */.      re
5ab0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
5ac0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5ad0: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  e = 0;.    db->n
5ae0: 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d  Table++;.    db-
5af0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
5b00: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
5b10: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
5b20: 20 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61   table is genera
5b30: 74 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43  ted from a SELEC
5b40: 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63  T, then construc
5b50: 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20  t the.  ** list 
5b60: 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  of columns and t
5b70: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 74  he text of the t
5b80: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
5b90: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
5ba0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d  Table *pSelTab =
5bb0: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
5bc0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
5bd0: 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20   0, pSelect);.  
5be0: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
5bf0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61   ) return;.    a
5c00: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d  ssert( p->aCol==
5c10: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  0 );.    p->nCol
5c20: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
5c30: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  ;.    p->aCol = 
5c40: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
5c50: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
5c60: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
5c70: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
5c80: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
5c90: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
5ca0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
5cb0: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69   initFlag is 1 i
5cc0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
5cd0: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
5ce0: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
5cf0: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
5d00: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
5d10: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
5d20: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
5d30: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
5d40: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
5d50: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
5d60: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
5d70: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
5d80: 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73 65 2d  from the pParse-
5d90: 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  >newTnum field. 
5da0: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
5db0: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
5dc0: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
5dd0: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
5de0: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
5df0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
5e00: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
5e10: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50 61     p->tnum = pPa
5e20: 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20  rse->newTnum;.  
5e30: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
5e40: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
5e50: 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
5e60: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
5e70: 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
5e80: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
5e90: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
5ea0: 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64  ase.  The record
5eb0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
5ec0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65   the new table e
5ed0: 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65  ntry should alre
5ee0: 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74  ady be on the st
5ef0: 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ack..  **.  ** I
5f00: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
5f10: 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
5f20: 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
5f30: 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
5f40: 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
5f50: 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
5f60: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
5f70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
5f80: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
5f90: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
5fa0: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76   Vdbe *v;..    v
5fb0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
5fc0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
5fd0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
5fe0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
5ff0: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
6000: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
6010: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  le */.      sqli
6020: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6030: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30  P_CreateTable, 0
6040: 2c 20 70 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20  , p->isTemp);.  
6050: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6060: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63  angeP3(v, -1, (c
6070: 68 61 72 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20  har *)&p->tnum, 
6080: 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
6090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
60a0: 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
60b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
60c0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
60d0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
60e0: 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20   p->tnum = 0;.  
60f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6100: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
6110: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
6120: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
6130: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
6140: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
6150: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
6160: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6170: 76 2c 20 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20  v, -1, "table", 
6180: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
6190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
61a0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
61b0: 76 2c 20 2d 31 2c 20 22 76 69 65 77 22 2c 20 50  v, -1, "view", P
61c0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  3_STATIC);.    }
61d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
61e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
61f0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
6200: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
6210: 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65  (v, -1, p->zName
6220: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
6230: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6240: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
6250: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
6260: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
6270: 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50   -1, p->zName, P
6280: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
6290: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
62a0: 2c 20 4f 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b  , OP_Dup, 4, 0);
62b0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
62c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
62d0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  g, 0, 0);.    if
62e0: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
62f0: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65     char *z = cre
6300: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b  ateTableStmt(p);
6310: 0a 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73  .      n = z ? s
6320: 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20  trlen(z) : 0;.  
6330: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6340: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c  angeP3(v, -1, z,
6350: 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
6360: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65  eFree(z);.    }e
6370: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
6380: 74 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  t( pEnd!=0 );.  
6390: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
63a0: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61  d->z) - Addr(pPa
63b0: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
63c0: 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73  .z) + 1;.      s
63d0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
63e0: 33 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d  3(v, -1, pParse-
63f0: 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20  >sFirstToken.z, 
6400: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  n);.    }.    sq
6410: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6420: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6430: 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  5, 0);.    sqlit
6440: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6450: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
6460: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69  );.    if( !p->i
6470: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73  sTemp ){.      s
6480: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
6490: 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a  e(db, v);.    }.
64a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
64b0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
64c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
64d0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
64e0: 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 69 73 54   int op = p->isT
64f0: 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41  emp ? OP_OpenWrA
6500: 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74  ux : OP_OpenWrit
6510: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  e;.      sqliteV
6520: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
6530: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  1, 0);.      pPa
6540: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
6550: 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63       sqliteSelec
6560: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
6570: 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c  t, SRT_Table, 1,
6580: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
6590: 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72  .    sqliteEndWr
65a0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
65b0: 72 73 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rse);.  }.}../*.
65c0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
65d0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
65e0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
65f0: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
6600: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65  /.void sqliteCre
6610: 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
6620: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
6630: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
6640: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
6650: 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
6660: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
6670: 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
6680: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
6690: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
66a0: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
66b0: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
66c0: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
66d0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
66e0: 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
66f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
6700: 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
6710: 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
6720: 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20   int isTemp     
6730: 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
6740: 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
6750: 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 73   */.){.  Token s
6760: 45 6e 64 3b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  End;.  Table *p;
6770: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6780: 3b 0a 20 20 69 6e 74 20 6e 2c 20 6f 66 66 73 65  ;.  int n, offse
6790: 74 3b 0a 0a 20 20 73 71 6c 69 74 65 53 74 61 72  t;..  sqliteStar
67a0: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
67b0: 42 65 67 69 6e 2c 20 70 4e 61 6d 65 2c 20 69 73  Begin, pName, is
67c0: 54 65 6d 70 29 3b 0a 20 20 70 20 3d 20 70 50 61  Temp);.  p = pPa
67d0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
67e0: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
67f0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
6800: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
6810: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6820: 20 2f 2a 20 49 67 6e 6f 72 65 20 4f 52 44 45 52   /* Ignore ORDER
6830: 20 42 59 20 63 6c 61 75 73 65 73 20 6f 6e 20 61   BY clauses on a
6840: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
6850: 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72   pSelect->pOrder
6860: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
6870: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
6880: 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79  Select->pOrderBy
6890: 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e  );.    pSelect->
68a0: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
68b0: 7d 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  }.  p->pSelect =
68c0: 20 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20   pSelect;.  if( 
68d0: 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61  !pParse->initFla
68e0: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  g ){.    if( sql
68f0: 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  iteViewGetColumn
6900: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
6910: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
6920: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 45  ;.    }.  }.  sE
6930: 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61  nd = pParse->sLa
6940: 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73  stToken;.  if( s
6950: 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73  End.z[0]!=0 && s
6960: 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b  End.z[0]!=';' ){
6970: 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73  .    sEnd.z += s
6980: 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e  End.n;.  }.  sEn
6990: 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28  d.n = 0;.  n = (
69a0: 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d 20 28  (int)sEnd.z) - (
69b0: 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  int)pBegin->z;. 
69c0: 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a   z = pBegin->z;.
69d0: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
69e0: 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20  (z[n-1]==';' || 
69f0: 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29  isspace(z[n-1]))
6a00: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
6a10: 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
6a20: 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 20 20 7a   sEnd.n = 1;.  z
6a30: 20 3d 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e 7a   = p->pSelect->z
6a40: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53  Select = sqliteS
6a50: 74 72 4e 44 75 70 28 7a 2c 20 6e 29 3b 0a 20 20  trNDup(z, n);.  
6a60: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 6f 66 66  if( z ){.    off
6a70: 73 65 74 20 3d 20 28 28 69 6e 74 29 7a 29 20 2d  set = ((int)z) -
6a80: 20 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b   (int)pBegin->z;
6a90: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63  .    sqliteSelec
6aa0: 74 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 2d 3e  tMoveStrings(p->
6ab0: 70 53 65 6c 65 63 74 2c 20 6f 66 66 73 65 74 29  pSelect, offset)
6ac0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 54  ;.    sqliteEndT
6ad0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45  able(pParse, &sE
6ae0: 6e 64 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  nd, 0);.  }.  re
6af0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
6b00: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
6b10: 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61  re pTable is rea
6b20: 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c  lly a VIEW.  Fil
6b30: 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  l in the names o
6b40: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73  f.** the columns
6b50: 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20   of the view in 
6b60: 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63  the pTable struc
6b70: 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68  ture.  Return th
6b80: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
6b90: 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
6ba0: 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76  ror is seen leav
6bb0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
6bc0: 67 65 20 69 6e 20 70 50 61 72 65 2d 3e 7a 45 72  ge in pPare->zEr
6bd0: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
6be0: 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  iteViewGetColumn
6bf0: 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
6c00: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
6c10: 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  le){.  ExprList 
6c20: 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63  *pEList;.  Selec
6c30: 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65  t *pSel;.  Table
6c40: 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74   *pSelTab;.  int
6c50: 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73   nErr = 0;..  as
6c60: 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a  sert( pTable );.
6c70: 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
6c80: 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
6c90: 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
6ca0: 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
6cb0: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
6cc0: 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
6cd0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
6ce0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
6cf0: 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
6d00: 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
6d10: 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
6d20: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
6d30: 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
6d40: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
6d50: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
6d60: 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
6d70: 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
6d80: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
6d90: 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
6da0: 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
6db0: 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
6dc0: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
6dd0: 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
6de0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
6df0: 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
6e00: 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
6e10: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
6e20: 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
6e30: 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65  Actually, this e
6e40: 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70  rror is caught p
6e50: 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f  reviously and so
6e60: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
6e70: 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  est.  ** should 
6e80: 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75  always fail.  Bu
6e90: 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20  t we will leave 
6ea0: 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74  it in place just
6eb0: 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a   to be safe..  *
6ec0: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
6ed0: 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
6ee0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
6ef0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
6f00: 22 76 69 65 77 20 22 2c 20 70 54 61 62 6c 65 2d  "view ", pTable-
6f10: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
6f20: 20 22 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79   " is circularly
6f30: 20 64 65 66 69 6e 65 64 22 2c 20 30 29 3b 0a 20   defined", 0);. 
6f40: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
6f50: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  +;.    return 1;
6f60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
6f70: 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
6f80: 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
6f90: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
6fa0: 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f  able names..  */
6fb0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
6fc0: 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a  e->pSelect ); /*
6fd0: 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65   If nCol==0, the
6fe0: 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20 62 65  n pTable must be
6ff0: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70 53 65   a VIEW */.  pSe
7000: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  l = pTable->pSel
7010: 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20  ect;..  /* Note 
7020: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
7030: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
7040: 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20  OfSelect() will 
7050: 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20  expand any.  ** 
7060: 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  "*" elements in 
7070: 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20  this list.  But 
7080: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  we will need to 
7090: 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74  restore the list
70a0: 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74  .  ** back to it
70b0: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
70c0: 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61  guration afterwa
70d0: 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20  rds, so we save 
70e0: 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74  a copy of.  ** t
70f0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70  he original in p
7100: 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45  EList..  */.  pE
7110: 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c  List = pSel->pEL
7120: 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c  ist;.  pSel->pEL
7130: 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ist = sqliteExpr
7140: 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74 29 3b  ListDup(pEList);
7150: 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c  .  if( pSel->pEL
7160: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53  ist==0 ){.    pS
7170: 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  el->pEList = pEL
7180: 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ist;.    return 
7190: 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61  1;  /* Malloc fa
71a0: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  iled */.  }.  pT
71b0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
71c0: 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c  .  pSelTab = sql
71d0: 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65  iteResultSetOfSe
71e0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
71f0: 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53 65  pSel);.  if( pSe
7200: 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  lTab ){.    asse
7210: 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
7220: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c  ==0 );.    pTabl
7230: 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
7240: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61  b->nCol;.    pTa
7250: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
7260: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70  Tab->aCol;.    p
7270: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
7280: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61  ;.    pSelTab->a
7290: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Col = 0;.    sql
72a0: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
72b0: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
72c0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
72d0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 55 6e 72 65  s |= SQLITE_Unre
72e0: 73 65 74 56 69 65 77 73 3b 0a 20 20 7d 65 6c 73  setViews;.  }els
72f0: 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  e{.    pTable->n
7300: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72  Col = 0;.    nEr
7310: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  r++;.  }.  sqlit
7320: 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53  eSelectUnbind(pS
7330: 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  el);.  sqliteExp
7340: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c  rListDelete(pSel
7350: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 65  ->pEList);.  pSe
7360: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  l->pEList = pELi
7370: 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72  st;.  return nEr
7380: 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  r;  .}../*.** Cl
7390: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
73a0: 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 56 49  ames from the VI
73b0: 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  EW pTable..**.**
73c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
73d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
73e0: 20 61 6e 79 20 6f 74 68 65 72 20 74 61 62 6c 65   any other table
73f0: 20 6f 72 20 76 69 65 77 20 69 73 20 6d 6f 64 69   or view is modi
7400: 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76 69 65  fied..** The vie
7410: 77 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  w passed into th
7420: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
7430: 20 64 65 70 65 6e 64 20 64 69 72 65 63 74 6c 79   depend directly
7440: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 0a 2a   or indirectly.*
7450: 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66 69 65  * on the modifie
7460: 64 20 6f 72 20 64 65 6c 65 74 65 64 20 74 61 62  d or deleted tab
7470: 6c 65 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f  le so we need to
7480: 20 63 6c 65 61 72 20 74 68 65 20 6f 6c 64 20 63   clear the old c
7490: 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73  olumn.** names s
74a0: 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c  o that they will
74b0: 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64 2e 0a   be recomputed..
74c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
74d0: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 43 6f  qliteViewResetCo
74e0: 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20  lumnNames(Table 
74f0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
7500: 69 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  i;.  if( pTable=
7510: 3d 30 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 70 53  =0 || pTable->pS
7520: 65 6c 65 63 74 3d 3d 30 20 29 20 72 65 74 75 72  elect==0 ) retur
7530: 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  n;.  if( pTable-
7540: 3e 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  >nCol==0 ) retur
7550: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
7560: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
7570: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
7580: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
7590: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  i].zName);.    s
75a0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
75b0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29  ->aCol[i].zDflt)
75c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
75d0: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d  (pTable->aCol[i]
75e0: 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73  .zType);.  }.  s
75f0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
7600: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c  ->aCol);.  pTabl
7610: 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->aCol = 0;.  p
7620: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
7630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
7640: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
7650: 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
7660: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7670: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
7680: 69 74 65 20 2a 64 62 29 7b 0a 20 20 48 61 73 68  ite *db){.  Hash
7690: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 28  Elem *i;.  if( (
76a0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
76b0: 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  TE_UnresetViews)
76c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
76d0: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
76e0: 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 48 61  First(&db->tblHa
76f0: 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  sh); i; i=sqlite
7700: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
7710: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
7720: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
7730: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
7740: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
7750: 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
7760: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61  tColumnNames(pTa
7770: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
7780: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
7790: 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77  LITE_UnresetView
77a0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  s;.}../*.** Give
77b0: 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20  n a token, look 
77c0: 75 70 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  up a table with 
77d0: 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e  that name.  If n
77e0: 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a  ot found, leave.
77f0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20  ** an error for 
7800: 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 66 69  the parser to fi
7810: 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  nd and return NU
7820: 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  LL..*/.Table *sq
7830: 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b  liteTableFromTok
7840: 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  en(Parse *pParse
7850: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a  , Token *pTok){.
7860: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
7870: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
7880: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61  zName = sqliteTa
7890: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
78a0: 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e  (pTok);.  if( zN
78b0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
78c0: 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  0;.  pTab = sqli
78d0: 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  teFindTable(pPar
78e0: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  se->db, zName);.
78f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
7900: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  me);.  if( pTab=
7910: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
7920: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
7930: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
7940: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20   such table: ", 
7950: 30 2c 20 0a 20 20 20 20 20 20 20 20 70 54 6f 6b  0, .        pTok
7960: 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29  ->z, pTok->n, 0)
7970: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
7980: 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rr++;.  }.  retu
7990: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
79a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
79b0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
79c0: 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
79d0: 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
79e0: 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
79f0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
7a00: 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
7a10: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
7a20: 74 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  teDropTable(Pars
7a30: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
7a40: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
7a50: 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  iew){.  Table *p
7a60: 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76  Table;.  Vdbe *v
7a70: 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20  ;.  int base;.  
7a80: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
7a90: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
7aa0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
7ab0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
7ac0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
7ad0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
7ae0: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  TableFromToken(p
7af0: 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20  Parse, pName);. 
7b00: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
7b10: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
7b20: 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79 20  Table->readOnly 
7b30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
7b40: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
7b50: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
7b60: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
7b70: 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61 79 20  , .       " may 
7b80: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
7b90: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
7ba0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
7bb0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  urn;.  }.  if( i
7bc0: 73 56 69 65 77 20 26 26 20 70 54 61 62 6c 65 2d  sView && pTable-
7bd0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
7be0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
7bf0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
7c00: 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50 20 54  Msg, "use DROP T
7c10: 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
7c20: 61 62 6c 65 20 22 2c 0a 20 20 20 20 20 20 70 54  able ",.      pT
7c30: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  able->zName, 0);
7c40: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7c50: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r++;.    return;
7c60: 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
7c70: 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53  ew && pTable->pS
7c80: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
7c90: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
7ca0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
7cb0: 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f  use DROP VIEW to
7cc0: 20 64 65 6c 65 74 65 20 76 69 65 77 20 22 2c 0a   delete view ",.
7cd0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e        pTable->zN
7ce0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ame, 0);.    pPa
7cf0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
7d00: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
7d10: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
7d20: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
7d30: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
7d40: 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
7d50: 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
7d60: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
7d70: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
7d80: 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63   v ){.    static
7d90: 20 56 64 62 65 4f 70 20 64 72 6f 70 54 61 62 6c   VdbeOp dropTabl
7da0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  e[] = {.      { 
7db0: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
7dc0: 2c 20 41 44 44 52 28 38 29 2c 20 20 30 7d 2c 0a  , ADDR(8),  0},.
7dd0: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
7de0: 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  g,     0, 0,    
7df0: 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a      0}, /* 1 */.
7e00: 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74        { OP_MemSt
7e10: 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20  ore,   1, 1,    
7e20: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
7e30: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31  OP_MemLoad,    1
7e40: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
7e50: 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
7e60: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
7e70: 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
7e80: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20        { OP_Ne,  
7e90: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 37         0, ADDR(7
7ea0: 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ),  0},.      { 
7eb0: 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30  OP_Delete,     0
7ec0: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
7ed0: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c        { OP_Next,
7ee0: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33         0, ADDR(3
7ef0: 29 2c 20 20 30 7d 2c 20 2f 2a 20 37 20 2a 2f 0a  ),  0}, /* 7 */.
7f00: 20 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78      };.    Index
7f10: 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 72 69 67   *pIdx;.    Trig
7f20: 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20  ger *pTrigger;. 
7f30: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
7f40: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
7f50: 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  rse, 0);.    sql
7f60: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
7f70: 6c 65 28 76 2c 20 70 54 61 62 6c 65 2d 3e 69 73  le(v, pTable->is
7f80: 54 65 6d 70 29 3b 0a 20 20 20 20 2f 2a 20 44 72  Temp);.    /* Dr
7f90: 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  op all triggers 
7fa0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7fb0: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
7fc0: 64 72 6f 70 70 65 64 20 2a 2f 0a 20 20 20 20 70  dropped */.    p
7fd0: 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c 65  Trigger = pTable
7fe0: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
7ff0: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
8000: 29 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 74  ){.      Token t
8010: 74 3b 0a 20 20 20 20 20 20 74 74 2e 7a 20 3d 20  t;.      tt.z = 
8020: 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72  pTable->pTrigger
8030: 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20 74 74  ->name;.      tt
8040: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62  .n = strlen(pTab
8050: 6c 65 2d 3e 70 54 72 69 67 67 65 72 2d 3e 6e 61  le->pTrigger->na
8060: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
8070: 65 44 72 6f 70 54 72 69 67 67 65 72 28 70 50 61  eDropTrigger(pPa
8080: 72 73 65 2c 20 26 74 74 2c 20 31 29 3b 0a 20 20  rse, &tt, 1);.  
8090: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
80a0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  explain ){.     
80b0: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
80c0: 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
80d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
80e0: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
80f0: 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b  Table->pTrigger;
8100: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8110: 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
8120: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
8130: 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54   ArraySize(dropT
8140: 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65  able), dropTable
8150: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
8160: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
8170: 65 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  e+1, pTable->zNa
8180: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  me, 0);.    if( 
8190: 21 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20  !pTable->isTemp 
81a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43  ){.      sqliteC
81b0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
81c0: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
81d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
81e0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
81f0: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ;.    if( !isVie
8200: 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  w ){.      sqlit
8210: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8220: 5f 44 65 73 74 72 6f 79 2c 20 70 54 61 62 6c 65  _Destroy, pTable
8230: 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e  ->tnum, pTable->
8240: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66  isTemp);.      f
8250: 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e  or(pIdx=pTable->
8260: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
8270: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
8280: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
8290: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
82a0: 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e  estroy, pIdx->tn
82b0: 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65  um, pTable->isTe
82c0: 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mp);.      }.   
82d0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64   }.    sqliteEnd
82e0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
82f0: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
8300: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d  * Delete the in-
8310: 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69  memory descripti
8320: 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  on of the table.
8330: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
8340: 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51 4c  tion: if the SQL
8350: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61 6e   statement began
8360: 20 77 69 74 68 20 74 68 65 20 45 58 50 4c 41 49   with the EXPLAI
8370: 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20  N keyword,.  ** 
8380: 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  then no changes 
8390: 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e 0a  should be made..
83a0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
83b0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
83c0: 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41     sqliteUnlinkA
83d0: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  ndDeleteTable(db
83e0: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 64  , pTable);.    d
83f0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
8400: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
8410: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69  ;.  }.  sqliteVi
8420: 65 77 52 65 73 65 74 41 6c 6c 28 64 62 29 3b 0a  ewResetAll(db);.
8430: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8440: 75 74 69 6e 65 20 63 6f 6e 73 74 72 75 63 74 73  utine constructs
8450: 20 61 20 50 33 20 73 74 72 69 6e 67 20 73 75 69   a P3 string sui
8460: 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 4f 50 5f  table for an OP_
8470: 4d 61 6b 65 49 64 78 4b 65 79 0a 2a 2a 20 6f 70  MakeIdxKey.** op
8480: 63 6f 64 65 20 61 6e 64 20 61 64 64 73 20 74 68  code and adds th
8490: 61 74 20 50 33 20 73 74 72 69 6e 67 20 74 6f 20  at P3 string to 
84a0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
84b0: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
84c0: 75 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  uction.** in the
84d0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
84e0: 2e 20 20 54 68 65 20 50 33 20 73 74 72 69 6e 67  .  The P3 string
84f0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
8500: 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 0a  ingle character.
8510: 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ** for each colu
8520: 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  mn in the index 
8530: 70 49 64 78 20 6f 66 20 74 61 62 6c 65 20 70 54  pIdx of table pT
8540: 61 62 2e 20 20 49 66 20 74 68 65 20 63 6f 6c 75  ab.  If the colu
8550: 6d 6e 20 75 73 65 73 0a 2a 2a 20 61 20 6e 75 6d  mn uses.** a num
8560: 65 72 69 63 20 73 6f 72 74 20 6f 72 64 65 72 2c  eric sort order,
8570: 20 74 68 65 6e 20 74 68 65 20 50 33 20 73 74 72   then the P3 str
8580: 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 63 6f  ing character co
8590: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0a 2a  rresponding to.*
85a0: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73  * that column is
85b0: 20 27 6e 27 2e 20 20 49 66 20 74 68 65 20 63 6f   'n'.  If the co
85c0: 6c 75 6d 6e 20 75 73 65 73 20 61 20 74 65 78 74  lumn uses a text
85d0: 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74 68 65   sort order, the
85e0: 6e 20 74 68 65 0a 2a 2a 20 50 33 20 73 74 72 69  n the.** P3 stri
85f0: 6e 67 20 69 73 20 27 74 27 2e 20 20 53 65 65 20  ng is 't'.  See 
8600: 74 68 65 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65  the OP_MakeIdxKe
8610: 79 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e  y opcode documen
8620: 74 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 64  tation for.** ad
8630: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
8640: 74 69 6f 6e 2e 20 20 53 65 65 20 61 6c 73 6f 20  tion.  See also 
8650: 74 68 65 20 73 71 6c 69 74 65 41 64 64 4b 65 79  the sqliteAddKey
8660: 54 79 70 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a  Type() routine..
8670: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
8680: 64 49 64 78 4b 65 79 54 79 70 65 28 56 64 62 65  dIdxKeyType(Vdbe
8690: 20 2a 76 2c 20 49 6e 64 65 78 20 2a 70 49 64 78   *v, Index *pIdx
86a0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  ){.  char *zType
86b0: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
86c0: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61  .  int i, n;.  a
86d0: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 26  ssert( pIdx!=0 &
86e0: 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 21 3d  & pIdx->pTable!=
86f0: 30 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  0 );.  pTab = pI
8700: 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 6e 20  dx->pTable;.  n 
8710: 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
8720: 0a 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  .  zType = sqlit
8730: 65 4d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a  eMalloc( n+1 );.
8740: 20 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29    if( zType==0 )
8750: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
8760: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
8770: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49     int iCol = pI
8780: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
8790: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f  .    assert( iCo
87a0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
87b0: 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 69  b->nCol );.    i
87c0: 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  f( (pTab->aCol[i
87d0: 43 6f 6c 5d 2e 73 6f 72 74 4f 72 64 65 72 20 26  Col].sortOrder &
87e0: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d   SQLITE_SO_TYPEM
87f0: 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  ASK)==SQLITE_SO_
8800: 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 54  TEXT ){.      zT
8810: 79 70 65 5b 69 5d 20 3d 20 27 74 27 3b 0a 20 20  ype[i] = 't';.  
8820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
8830: 54 79 70 65 5b 69 5d 20 3d 20 27 6e 27 3b 0a 20  Type[i] = 'n';. 
8840: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 54 79 70 65     }.  }.  zType
8850: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [n] = 0;.  sqlit
8860: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
8870: 20 2d 31 2c 20 7a 54 79 70 65 2c 20 6e 29 3b 0a   -1, zType, n);.
8880: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 79    sqliteFree(zTy
8890: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  pe);.}../*.** Cr
88a0: 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
88b0: 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
88c0: 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74 68  e.  pIndex is th
88d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
88e0: 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62  dex .** and pTab
88f0: 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  le is the name o
8900: 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
8910: 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
8920: 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
8930: 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
8940: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
8950: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
8960: 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
8970: 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
8980: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
8990: 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
89a0: 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
89b0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
89c0: 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
89d0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
89e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
89f0: 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
8a00: 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
8a10: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
8a20: 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
8a30: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
8a40: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
8a50: 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
8a60: 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
8a70: 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
8a80: 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
8a90: 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
8aa0: 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
8ab0: 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
8ac0: 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
8ad0: 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
8ae0: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
8af0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8b00: 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ion.  .*/.void s
8b10: 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78  qliteCreateIndex
8b20: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8b30: 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f  e,   /* All info
8b40: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
8b50: 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
8b60: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f  ken *pName,    /
8b70: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
8b80: 64 65 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  dex.  May be NUL
8b90: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  L */.  Token *pT
8ba0: 61 62 6c 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  able,   /* Name 
8bb0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
8bc0: 69 6e 64 65 78 2e 20 20 55 73 65 20 70 50 61 72  index.  Use pPar
8bd0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
8be0: 20 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a   0 */.  IdList *
8bf0: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
8c00: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
8c10: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
8c20: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
8c30: 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
8c40: 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
8c50: 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
8c60: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
8c70: 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52  art,   /* The CR
8c80: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
8c90: 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20  begins a CREATE 
8ca0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
8cb0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
8cc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22        /* The ")"
8cd0: 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65   that closes the
8ce0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
8cf0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
8d00: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
8d10: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
8d20: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
8d30: 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a  ex *pIndex;   /*
8d40: 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
8d50: 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
8d60: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
8d70: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b   int i, j;.  Tok
8d80: 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20  en nullId;      
8d90: 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74         /* Fake t
8da0: 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74  oken for an empt
8db0: 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 73  y ID list */.  s
8dc0: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
8dd0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 68 69  se->db;.  int hi
8de0: 64 65 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  deName = 0;     
8df0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 70 75      /* Do not pu
8e00: 74 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20  t table name in 
8e10: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a  the hash table *
8e20: 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  /..  if( pParse-
8e30: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
8e40: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
8e50: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
8e60: 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20  _index;..  /*.  
8e70: 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
8e80: 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
8e90: 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
8ea0: 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
8eb0: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
8ec0: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
8ed0: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21 3d   assert( pName!=
8ee0: 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
8ef0: 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d   sqliteTableFrom
8f00: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 54  Token(pParse, pT
8f10: 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  able);.  }else{.
8f20: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
8f30: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  e==0 );.    pTab
8f40: 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   =  pParse->pNew
8f50: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  Table;.  }.  if(
8f60: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72   pTab==0 || pPar
8f70: 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
8f80: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
8f90: 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  x;.  if( pTab->r
8fa0: 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
8fb0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
8fc0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
8fd0: 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d   "table ", pTab-
8fe0: 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 22  >zName, .      "
8ff0: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 6e 65   may not have ne
9000: 77 20 69 6e 64 69 63 65 73 20 61 64 64 65 64 22  w indices added"
9010: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
9020: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
9030: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
9040: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
9050: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
9060: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
9070: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
9080: 72 72 4d 73 67 2c 20 22 76 69 65 77 73 20 6d 61  rrMsg, "views ma
9090: 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
90a0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
90b0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
90c0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
90d0: 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
90e0: 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 69   If this index i
90f0: 73 20 63 72 65 61 74 65 64 20 77 68 69 6c 65 20  s created while 
9100: 72 65 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73  re-reading the s
9110: 63 68 65 6d 61 20 66 72 6f 6d 20 73 71 6c 69 74  chema from sqlit
9120: 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 62 75  e_master.  ** bu
9130: 74 20 74 68 65 20 74 61 62 6c 65 20 61 73 73 6f  t the table asso
9140: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
9150: 20 69 6e 64 65 78 20 69 73 20 61 20 74 65 6d 70   index is a temp
9160: 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 69 74 20  orary table, it 
9170: 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 6d 65  can.  ** only me
9180: 61 6e 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  an that the tabl
9190: 65 20 74 68 61 74 20 74 68 69 73 20 69 6e 64 65  e that this inde
91a0: 78 20 69 73 20 72 65 61 6c 6c 79 20 61 73 73 6f  x is really asso
91b0: 63 69 61 74 65 64 20 77 69 74 68 20 69 73 0a 20  ciated with is. 
91c0: 20 2a 2a 20 6f 6e 65 20 77 68 6f 73 65 20 6e 61   ** one whose na
91d0: 6d 65 20 69 73 20 68 69 64 64 65 6e 20 62 65 68  me is hidden beh
91e0: 69 6e 64 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ind a temporary 
91f0: 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
9200: 61 6d 65 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 53  ame name..  ** S
9210: 69 6e 63 65 20 69 74 73 20 74 61 62 6c 65 20 68  ince its table h
9220: 61 73 20 62 65 65 6e 20 73 75 70 70 72 65 73 73  as been suppress
9230: 65 64 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 61  ed, we need to a
9240: 6c 73 6f 20 73 75 70 70 72 65 73 73 20 74 68 65  lso suppress the
9250: 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 2a  .  ** index..  *
9260: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
9270: 69 6e 69 74 46 6c 61 67 20 26 26 20 21 70 50 61  initFlag && !pPa
9280: 72 73 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70  rse->isTemp && p
9290: 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20  Tab->isTemp ){. 
92a0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
92b0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
92c0: 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
92d0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
92e0: 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
92f0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
9300: 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
9310: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
9320: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
9330: 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
9340: 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
9350: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
9360: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
9370: 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
9380: 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
9390: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
93a0: 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
93b0: 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
93c0: 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
93d0: 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
93e0: 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
93f0: 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
9400: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
9410: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
9420: 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
9430: 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
9440: 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
9450: 73 20 69 6e 64 65 78 2c 20 62 75 74 20 77 65 20  s index, but we 
9460: 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 73 74  will not.  ** st
9470: 6f 72 65 20 69 74 73 20 6e 61 6d 65 20 69 6e 20  ore its name in 
9480: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
9490: 20 53 65 74 20 74 68 65 20 68 69 64 65 4e 61 6d   Set the hideNam
94a0: 65 20 66 6c 61 67 20 74 6f 20 61 63 63 6f 6d 70  e flag to accomp
94b0: 6c 69 73 68 0a 20 20 2a 2a 20 74 68 69 73 2e 0a  lish.  ** this..
94c0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
94d0: 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
94e0: 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
94f0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
9500: 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
9510: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
9520: 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
9530: 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
9540: 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
9550: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 49  ( pName ){.    I
9560: 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65  ndex *pISameName
9570: 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20  ;    /* Another 
9580: 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73  index with the s
9590: 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ame name */.    
95a0: 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d  Table *pTSameNam
95b0: 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65  e;    /* A table
95c0: 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20   with same name 
95d0: 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  as the index */.
95e0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
95f0: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
9600: 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20  oken(pName);.   
9610: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
9620: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
9630: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
9640: 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71  (pISameName = sq
9650: 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62  liteFindIndex(db
9660: 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a  , zName))!=0 ){.
9670: 20 20 20 20 20 20 69 66 28 20 70 49 53 61 6d 65        if( pISame
9680: 4e 61 6d 65 2d 3e 70 54 61 62 6c 65 2d 3e 69 73  Name->pTable->is
9690: 54 65 6d 70 20 26 26 20 70 50 61 72 73 65 2d 3e  Temp && pParse->
96a0: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
96b0: 20 20 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 31      hideName = 1
96c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
96d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
96e0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
96f0: 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20  zErrMsg, "index 
9700: 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  ", zName, .     
9710: 20 20 20 20 20 20 22 20 61 6c 72 65 61 64 79 20        " already 
9720: 65 78 69 73 74 73 22 2c 20 30 29 3b 0a 20 20 20  exists", 0);.   
9730: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
9740: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  r++;.        got
9750: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
9760: 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
9770: 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54 53 61   }.    if( (pTSa
9780: 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46  meName = sqliteF
9790: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
97a0: 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  me))!=0 ){.     
97b0: 20 69 66 28 20 70 54 53 61 6d 65 4e 61 6d 65 2d   if( pTSameName-
97c0: 3e 69 73 54 65 6d 70 20 26 26 20 70 50 61 72 73  >isTemp && pPars
97d0: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
97e0: 20 20 20 20 20 20 20 68 69 64 65 4e 61 6d 65 20         hideName 
97f0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
9800: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9810: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
9820: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68 65  e->zErrMsg, "the
9830: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
9840: 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 2c 0a 20  table named ",. 
9850: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c            zName,
9860: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
9870: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
9880: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
9890: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
98a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
98b0: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  se{.    char zBu
98c0: 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  f[30];.    int n
98d0: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
98e0: 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
98f0: 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
9900: 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
9910: 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
9920: 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e  n++){}.    sprin
9930: 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29  tf(zBuf,"%d)",n)
9940: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  ;.    zName = 0;
9950: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
9960: 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28 22  ring(&zName, "("
9970: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  , pTab->zName, "
9980: 20 61 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a 42   autoindex ", zB
9990: 75 66 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  uf, 0);.    if( 
99a0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
99b0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
99c0: 78 3b 0a 20 20 20 20 68 69 64 65 4e 61 6d 65 20  x;.    hideName 
99d0: 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
99e0: 78 28 64 62 2c 20 7a 4e 61 6d 65 29 21 3d 30 3b  x(db, zName)!=0;
99f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  .  }..  /* If pL
9a00: 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
9a10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
9a20: 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
9a30: 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
9a40: 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
9a50: 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
9a60: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
9a70: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
9a80: 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
9a90: 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
9aa0: 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
9ab0: 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
9ac0: 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64  =0 ){.    nullId
9ad0: 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .z = pTab->aCol[
9ae0: 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
9af0: 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  ame;.    nullId.
9b00: 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49  n = strlen(nullI
9b10: 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
9b20: 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70  = sqliteIdListAp
9b30: 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49 64 29  pend(0, &nullId)
9b40: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
9b50: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
9b60: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
9b70: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
9b80: 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
9b90: 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
9ba0: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
9bb0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
9bc0: 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e  (Index) + strlen
9bd0: 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20  (zName) + 1 +.  
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bf0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74        sizeof(int
9c00: 29 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29 3b 0a  )*pList->nId );.
9c10: 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
9c20: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
9c30: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64  te_index;.  pInd
9c40: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  ex->aiColumn = (
9c50: 69 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d 3b  int*)&pIndex[1];
9c60: 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
9c70: 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65   = (char*)&pInde
9c80: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73  x->aiColumn[pLis
9c90: 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70  t->nId];.  strcp
9ca0: 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
9cb0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65   zName);.  pInde
9cc0: 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
9cd0: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
9ce0: 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64  umn = pList->nId
9cf0: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
9d00: 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 69 73  ror = pIndex->is
9d10: 55 6e 69 71 75 65 20 3d 20 6f 6e 45 72 72 6f 72  Unique = onError
9d20: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
9d30: 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30  Index = pName==0
9d40: 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  ;..  /* Scan the
9d50: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
9d60: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
9d70: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
9d80: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
9d90: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
9da0: 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
9db0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
9dc0: 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
9dd0: 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
9de0: 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
9df0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
9e00: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
9e10: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
9e20: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
9e30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9e40: 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74  iteStrICmp(pList
9e50: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
9e60: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
9e70: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
9e80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
9e90: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
9ea0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
9eb0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
9ec0: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20  rMsg, "table ", 
9ed0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  pTab->zName, .  
9ee0: 20 20 20 20 20 20 22 20 68 61 73 20 6e 6f 20 63        " has no c
9ef0: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20 70  olumn named ", p
9f00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
9f10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
9f20: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
9f30: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e    sqliteFree(pIn
9f40: 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  dex);.      goto
9f50: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
9f60: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
9f70: 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
9f80: 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ] = j;.  }..  /*
9f90: 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e   Link the new In
9fa0: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f  dex structure to
9fb0: 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74   its table and t
9fc0: 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a  o the other.  **
9fd0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
9fe0: 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20  ase structures. 
9ff0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
a000: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20  rse->explain && 
a010: 21 68 69 64 65 4e 61 6d 65 20 29 7b 0a 20 20 20  !hideName ){.   
a020: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70   Index *p;.    p
a030: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73   = sqliteHashIns
a040: 65 72 74 28 26 64 62 2d 3e 69 64 78 48 61 73 68  ert(&db->idxHash
a050: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
a060: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
a070: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  , pIndex);.    i
a080: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73  f( p ){.      as
a090: 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
a0a0: 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
a0b0: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
a0c0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  /.      sqliteFr
a0d0: 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ee(pIndex);.    
a0e0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
a0f0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
a100: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
a110: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
a120: 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  anges;.  }..  /*
a130: 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
a140: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
a150: 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
a160: 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
a170: 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
a180: 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
a190: 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
a1a0: 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
a1b0: 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
a1c0: 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
a1d0: 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
a1e0: 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
a1f0: 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a  n of UPDATE.  **
a200: 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a   and INSERT..  *
a210: 2f 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21  /.  if( onError!
a220: 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
a230: 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
a240: 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
a250: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
a260: 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
a270: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
a280: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
a290: 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
a2a0: 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  = pIndex;.  }els
a2b0: 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  e{.    Index *pO
a2c0: 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
a2d0: 64 65 78 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  dex;.    while( 
a2e0: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
a2f0: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
a300: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
a310: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 70 4f 74  ace ){.      pOt
a320: 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
a330: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
a340: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
a350: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
a360: 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
a370: 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  = pIndex;.  }.. 
a380: 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46   /* If the initF
a390: 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65 61 6e  lag is 1 it mean
a3a0: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
a3b0: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
a3c0: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
a3d0: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
a3e0: 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20  he disk.  So do 
a3f0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
a400: 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e   disk.  ** again
a410: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 74  .  Extract the t
a420: 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d  able number from
a430: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 65 77   the pParse->new
a440: 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20 2a 2f  Tnum field..  */
a450: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69  .  if( pParse->i
a460: 6e 69 74 46 6c 61 67 20 26 26 20 70 54 61 62 6c  nitFlag && pTabl
a470: 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64  e!=0 ){.    pInd
a480: 65 78 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73  ex->tnum = pPars
a490: 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  e->newTnum;.  }.
a4a0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69  .  /* If the ini
a4b0: 74 46 6c 61 67 20 69 73 20 30 20 74 68 65 6e 20  tFlag is 0 then 
a4c0: 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
a4d0: 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
a4e0: 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
a4f0: 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
a500: 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
a510: 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
a520: 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
a530: 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
a540: 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
a550: 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
a560: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30  he initFlag is 0
a570: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66   when the user f
a580: 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52  irst enters a CR
a590: 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a  EATE INDEX .  **
a5a0: 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20 69   command.  The i
a5b0: 6e 69 74 46 6c 61 67 20 69 73 20 31 20 77 68 65  nitFlag is 1 whe
a5c0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
a5d0: 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
a5e0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
a5f0: 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
a600: 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
a610: 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
a620: 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
a630: 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
a640: 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
a650: 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
a660: 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
a670: 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
a680: 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e it..  **.  ** 
a690: 49 66 20 70 54 61 62 6c 65 3d 3d 30 20 69 74 20  If pTable==0 it 
a6a0: 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
a6b0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
a6c0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
a6d0: 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
a6e0: 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
a6f0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
a700: 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
a710: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
a720: 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
a730: 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
a740: 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
a750: 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
a760: 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
a770: 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
a780: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50  */.  else if( pP
a790: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d  arse->initFlag==
a7a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  0 ){.    int n;.
a7b0: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
a7c0: 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b   int lbl1, lbl2;
a7d0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
a7e0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e  int addr;.    in
a7f0: 74 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62 2d  t isTemp = pTab-
a800: 3e 69 73 54 65 6d 70 3b 0a 0a 20 20 20 20 76 20  >isTemp;..    v 
a810: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
a820: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
a830: 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
a840: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
a850: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d      if( pTable!=
a860: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
a870: 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
a880: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 29 3b  tion(pParse, 0);
a890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 70 65  .      sqliteOpe
a8a0: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
a8b0: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  isTemp);.    }. 
a8c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a8d0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
a8e0: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  o, 0, 0);.    sq
a8f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
a900: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
a910: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
a920: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
a930: 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41   "index", P3_STA
a940: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
a950: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a960: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
a970: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
a980: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 6e  ngeP3(v, -1, pIn
a990: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  dex->zName, P3_S
a9a0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
a9b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
a9c0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
a9d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
a9e0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
a9f0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Tab->zName, P3_S
aa00: 54 41 54 49 43 29 3b 0a 20 20 20 20 61 64 64 72  TATIC);.    addr
aa10: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
aa20: 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  Op(v, OP_CreateI
aa30: 6e 64 65 78 2c 20 30 2c 20 69 73 54 65 6d 70 29  ndex, 0, isTemp)
aa40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
aa50: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
aa60: 2c 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  , (char*)&pIndex
aa70: 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54  ->tnum, P3_POINT
aa80: 45 52 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ER);.    pIndex-
aa90: 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69  >tnum = 0;.    i
aaa0: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
aab0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
aac0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
aad0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69   0);.      if( i
aae0: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
aaf0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ab00: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78  (v, OP_OpenWrAux
ab10: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
ab20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
ab30: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
ab40: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
ab50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
ab60: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
ab70: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ab80: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
ab90: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  0);.    if( pSta
aba0: 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20  rt && pEnd ){.  
abb0: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
abc0: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 53 74  d->z) - Addr(pSt
abd0: 61 72 74 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20  art->z) + 1;.   
abe0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
abf0: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
ac00: 53 74 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20  Start->z, n);.  
ac10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
ac20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
ac30: 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b  keRecord, 5, 0);
ac40: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
ac50: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
ac60: 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tKey, 0, 0);.   
ac70: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
ac80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ac90: 64 64 4f 70 28 76 2c 20 69 73 54 65 6d 70 20 3f  ddOp(v, isTemp ?
aca0: 20 4f 50 5f 4f 70 65 6e 41 75 78 20 3a 20 4f 50   OP_OpenAux : OP
acb0: 5f 4f 70 65 6e 2c 20 32 2c 20 70 54 61 62 2d 3e  _Open, 2, pTab->
acc0: 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  tnum);.      sql
acd0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
ace0: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
acf0: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
ad00: 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c        lbl2 = sql
ad10: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
ad20: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
ad30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ad40: 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c 32  _Rewind, 2, lbl2
ad50: 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20  );.      lbl1 = 
ad60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
ad70: 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 32 2c 20  v, OP_Recno, 2, 
ad80: 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
ad90: 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
ada0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
adb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
adc0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
add0: 2c 20 32 2c 20 70 49 6e 64 65 78 2d 3e 61 69 43  , 2, pIndex->aiC
ade0: 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20 20  olumn[i]);.     
adf0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
ae00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
ae10: 61 6b 65 49 64 78 4b 65 79 2c 20 70 49 6e 64 65  akeIdxKey, pInde
ae20: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  x->nColumn, 0);.
ae30: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 66 69        if( db->fi
ae40: 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20 73  le_format>=4 ) s
ae50: 71 6c 69 74 65 41 64 64 49 64 78 4b 65 79 54 79  qliteAddIdxKeyTy
ae60: 70 65 28 76 2c 20 70 49 6e 64 65 78 29 3b 0a 20  pe(v, pIndex);. 
ae70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ae80: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 50 75  ddOp(v, OP_IdxPu
ae90: 74 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e  t, 1, pIndex->on
aea0: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 3b  Error!=OE_None);
aeb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
aec0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
aed0: 74 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  t, 2, lbl1);.   
aee0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
aef0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
af00: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
af10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
af20: 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20  Close, 2, 0);.  
af30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
af40: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
af50: 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
af60: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
af70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  ){.      if( !is
af80: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
af90: 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b  sqliteChangeCook
afa0: 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 20  ie(db, v);.     
afb0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
afc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
afd0: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
afe0: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
aff0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
b000: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
b010: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
b020: 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
b030: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
b040: 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74  :.  sqliteIdList
b050: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
b060: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
b070: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
b080: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
b090: 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
b0a0: 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
b0b0: 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
b0c0: 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
b0d0: 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
b0e0: 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
b0f0: 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 49  void sqliteDropI
b100: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
b110: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
b120: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
b130: 65 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ex;.  char *zNam
b140: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
b150: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
b160: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
b170: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
b180: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
b190: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
b1a0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54   zName = sqliteT
b1b0: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
b1c0: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
b1d0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
b1e0: 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  n;.  pIndex = sq
b1f0: 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62  liteFindIndex(db
b200: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
b210: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
b220: 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
b230: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
b240: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
b250: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
b260: 68 20 69 6e 64 65 78 3a 20 22 2c 20 30 2c 20 0a  h index: ", 0, .
b270: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a          pName->z
b280: 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a  , pName->n, 0);.
b290: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
b2a0: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
b2b0: 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
b2c0: 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20  ->autoIndex ){. 
b2d0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
b2e0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
b2f0: 4d 73 67 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  Msg, "index asso
b300: 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
b310: 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
b320: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
b330: 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
b340: 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
b350: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
b360: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b370: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
b380: 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
b390: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
b3a0: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
b3b0: 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
b3c0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
b3d0: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
b3e0: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
b3f0: 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b   dropIndex[] = {
b400: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
b410: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
b420: 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20 7b  9), 0}, .      {
b430: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
b440: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
b450: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
b460: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31  OP_MemStore,   1
b470: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
b480: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
b490: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
b4a0: 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
b4b0: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
b4c0: 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20       0, 1,      
b4d0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
b4e0: 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
b4f0: 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(8), 0},.    
b500: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
b510: 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 30     0, ADDR(3), 0
b520: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  },.      { OP_Go
b530: 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  to,       0, ADD
b540: 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(9), 0},.      
b550: 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
b560: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
b570: 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a   /* 8 */.    };.
b580: 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20      int base;.  
b590: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b5a0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
b5b0: 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e  .    sqliteBegin
b5c0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
b5d0: 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 73  Parse, 0);.    s
b5e0: 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54  qliteOpenMasterT
b5f0: 61 62 6c 65 28 76 2c 20 70 54 61 62 2d 3e 69 73  able(v, pTab->is
b600: 54 65 6d 70 29 3b 0a 20 20 20 20 62 61 73 65 20  Temp);.    base 
b610: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
b620: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
b630: 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c 20 64  ze(dropIndex), d
b640: 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  ropIndex);.    s
b650: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
b660: 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e  3(v, base+1, pIn
b670: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
b680: 20 20 20 20 69 66 28 20 21 70 54 61 62 2d 3e 69      if( !pTab->i
b690: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73  sTemp ){.      s
b6a0: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
b6b0: 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a  e(db, v);.    }.
b6c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b6d0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
b6e0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
b6f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b700: 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e 64 65  P_Destroy, pInde
b710: 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69  x->tnum, pTab->i
b720: 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  sTemp);.    sqli
b730: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
b740: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
b750: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
b760: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63  e in-memory desc
b770: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ription of this 
b780: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66  index..  */.  if
b790: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
b7a0: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
b7b0: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49  UnlinkAndDeleteI
b7c0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
b7d0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
b7e0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
b7f0: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a  Changes;.  }.}..
b800: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
b810: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
b820: 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
b830: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
b840: 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
b850: 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
b860: 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
b870: 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
b880: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
b890: 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
b8a0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c  IdListAppend(IdL
b8b0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
b8c0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
b8d0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
b8e0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
b8f0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
b900: 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
b910: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
b920: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
b930: 20 28 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37   (pList->nId & 7
b940: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
b950: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
b960: 61 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  a;.    a = sqlit
b970: 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
b980: 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 49 64 2b 38  a, (pList->nId+8
b990: 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
b9a0: 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
b9b0: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   a==0 ){.      s
b9c0: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
b9d0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
b9e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
b9f0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
ba00: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
ba10: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
ba20: 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  nId], 0, sizeof(
ba30: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
ba40: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
ba50: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
ba60: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
ba70: 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  nId].zName;.    
ba80: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
ba90: 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  (pz, pToken->z, 
baa0: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
bab0: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
bac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c  .      sqliteIdL
bad0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
bae0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
baf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bb00: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
bb10: 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
bb20: 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
bb30: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
bb40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
bb50: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
bb60: 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
bb70: 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
bb80: 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
bb90: 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
bba0: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
bbb0: 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
bbc0: 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b  ist even if pTok
bbd0: 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  en is NULL..**.*
bbe0: 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20  * A new SrcList 
bbf0: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
bc00: 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
bc10: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 53 72 63 4c 69   fails..*/.SrcLi
bc20: 73 74 20 2a 73 71 6c 69 74 65 53 72 63 4c 69 73  st *sqliteSrcLis
bc30: 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20  tAppend(SrcList 
bc40: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
bc50: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
bc60: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
bc70: 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
bc80: 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  oc( sizeof(IdLis
bc90: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
bca0: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
bcb0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4c  0;.  }.  if( (pL
bcc0: 69 73 74 2d 3e 6e 53 72 63 20 26 20 37 29 3d 3d  ist->nSrc & 7)==
bcd0: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
bce0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  SrcList_item *a;
bcf0: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52  .    a = sqliteR
bd00: 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
bd10: 20 28 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 38 29   (pList->nSrc+8)
bd20: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
bd30: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
bd40: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  a==0 ){.      sq
bd50: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
bd60: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
bd70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
bd80: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
bd90: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
bda0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
bdb0: 6e 53 72 63 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nSrc], 0, sizeof
bdc0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
bdd0: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
bde0: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
bdf0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
be00: 3e 6e 53 72 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  >nSrc].zName;.  
be10: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
be20: 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  ng(pz, pToken->z
be30: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
be40: 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20  .    if( *pz==0 
be50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
be60: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  rcListDelete(pLi
be70: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
be80: 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
be90: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
bea0: 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a  ote(*pz);.    }.
beb0: 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72    }.  pList->nSr
bec0: 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  c++;.  return pL
bed0: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ist;.}../*.** Ad
bee0: 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
bef0: 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
bf00: 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
bf10: 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
bf20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 72  */.void sqliteSr
bf30: 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53 72  cListAddAlias(Sr
bf40: 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  cList *pList, To
bf50: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
bf60: 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
bf70: 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20  st->nSrc>0 ){.  
bf80: 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
bf90: 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 73  >nSrc - 1;.    s
bfa0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
bfb0: 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  &pList->a[i].zAl
bfc0: 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ias, pToken->z, 
bfd0: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
bfe0: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
bff0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
c000: 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ias);.  }.}../*.
c010: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
c020: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
c030: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
c040: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
c050: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
c060: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
c070: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
c080: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
c090: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
c0a0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
c0b0: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
c0c0: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
c0d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
c0e0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
c0f0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
c100: 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
c110: 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
c120: 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
c130: 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
c140: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49 64  .*/.int sqliteId
c150: 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
c160: 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
c170: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
c180: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
c190: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
c1a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
c1b0: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
c1c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53  .    if( sqliteS
c1d0: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
c1e0: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
c1f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
c200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
c210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
c220: 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
c230: 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
c240: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
c250: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
c260: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53  eSrcListDelete(S
c270: 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
c280: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
c290: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
c2a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
c2b0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
c2c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
c2d0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
c2e0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
c2f0: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
c300: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28  zAlias);.    if(
c310: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61   pList->a[i].pTa
c320: 62 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  b && pList->a[i]
c330: 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65  .pTab->isTransie
c340: 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
c350: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  teDeleteTable(0,
c360: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61   pList->a[i].pTa
c370: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
c380: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
c390: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  (pList->a[i].pSe
c3a0: 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
c3b0: 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69 73  eExprDelete(pLis
c3c0: 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20  t->a[i].pOn);.  
c3d0: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
c3e0: 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  lete(pList->a[i]
c3f0: 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  .pUsing);.  }.  
c400: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
c410: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ->a);.  sqliteFr
c420: 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  ee(pList);.}../*
c430: 0a 2a 2a 20 54 68 65 20 43 4f 50 59 20 63 6f 6d  .** The COPY com
c440: 6d 61 6e 64 20 69 73 20 66 6f 72 20 63 6f 6d 70  mand is for comp
c450: 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 50  atibility with P
c460: 6f 73 74 67 72 65 53 51 4c 20 61 6e 64 20 73 70  ostgreSQL and sp
c470: 65 63 69 66 69 63 69 61 6c 6c 79 0a 2a 2a 20 66  ecificially.** f
c480: 6f 72 20 74 68 65 20 61 62 69 6c 69 74 79 20 74  or the ability t
c490: 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74 70 75  o read the outpu
c4a0: 74 20 6f 66 20 70 67 5f 64 75 6d 70 2e 20 20 54  t of pg_dump.  T
c4b0: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 0a  he format is as.
c4c0: 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  ** follows:.**.*
c4d0: 2a 20 20 20 20 43 4f 50 59 20 74 61 62 6c 65 20  *    COPY table 
c4e0: 46 52 4f 4d 20 66 69 6c 65 20 5b 55 53 49 4e 47  FROM file [USING
c4f0: 20 44 45 4c 49 4d 49 54 45 52 53 20 73 74 72 69   DELIMITERS stri
c500: 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74 61 62 6c 65  ng].**.** "table
c510: 22 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67  " is an existing
c520: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 57 65   table name.  We
c530: 20 77 69 6c 6c 20 72 65 61 64 20 6c 69 6e 65 73   will read lines
c540: 20 6f 66 20 63 6f 64 65 20 66 72 6f 6d 0a 2a 2a   of code from.**
c550: 20 66 69 6c 65 20 74 6f 20 66 69 6c 6c 20 74 68   file to fill th
c560: 69 73 20 74 61 62 6c 65 20 77 69 74 68 20 64 61  is table with da
c570: 74 61 2e 20 20 46 69 6c 65 20 6d 69 67 68 74 20  ta.  File might 
c580: 62 65 20 22 73 74 64 69 6e 22 2e 20 20 54 68 65  be "stdin".  The
c590: 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 65 6c   optional.** del
c5a0: 69 6d 69 74 65 72 20 73 74 72 69 6e 67 20 69 64  imiter string id
c5b0: 65 6e 74 69 66 69 65 73 20 74 68 65 20 66 69 65  entifies the fie
c5c0: 6c 64 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20  ld separators.  
c5d0: 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 61  The default is a
c5e0: 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   tab..*/.void sq
c5f0: 6c 69 74 65 43 6f 70 79 28 0a 20 20 50 61 72 73  liteCopy(.  Pars
c600: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c610: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
c620: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
c630: 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20  n *pTableName,  
c640: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   /* The name of 
c650: 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  the table into w
c660: 68 69 63 68 20 77 65 20 77 69 6c 6c 20 69 6e 73  hich we will ins
c670: 65 72 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ert */.  Token *
c680: 70 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a  pFilename,    /*
c690: 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77   The file from w
c6a0: 68 69 63 68 20 74 6f 20 6f 62 74 61 69 6e 20 69  hich to obtain i
c6b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
c6c0: 54 6f 6b 65 6e 20 2a 70 44 65 6c 69 6d 69 74 65  Token *pDelimite
c6d0: 72 2c 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73  r,   /* Use this
c6e0: 20 61 73 20 74 68 65 20 66 69 65 6c 64 20 64 65   as the field de
c6f0: 6c 69 6d 69 74 65 72 20 2a 2f 0a 20 20 69 6e 74  limiter */.  int
c700: 20 6f 6e 45 72 72 6f 72 20 20 20 20 20 20 20 20   onError        
c710: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
c720: 69 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  if a constraint 
c730: 66 61 69 6c 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  fails */.){.  Ta
c740: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 63 68 61  ble *pTab;.  cha
c750: 72 20 2a 7a 54 61 62 3b 0a 20 20 69 6e 74 20 69  r *zTab;.  int i
c760: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
c770: 6e 74 20 61 64 64 72 2c 20 65 6e 64 3b 0a 20 20  nt addr, end;.  
c780: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 73  Index *pIdx;.  s
c790: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
c7a0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a 54 61 62 20  se->db;..  zTab 
c7b0: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d  = sqliteTableNam
c7c0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c  eFromToken(pTabl
c7d0: 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71  eName);.  if( sq
c7e0: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
c7f0: 65 64 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20  ed || zTab==0 ) 
c800: 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75  goto copy_cleanu
c810: 70 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  p;.  pTab = sqli
c820: 74 65 54 61 62 6c 65 4e 61 6d 65 54 6f 54 61 62  teTableNameToTab
c830: 6c 65 28 70 50 61 72 73 65 2c 20 7a 54 61 62 29  le(pParse, zTab)
c840: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
c850: 54 61 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  Tab);.  if( pTab
c860: 3d 3d 30 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f  ==0 ) goto copy_
c870: 63 6c 65 61 6e 75 70 3b 0a 20 20 76 20 3d 20 73  cleanup;.  v = s
c880: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
c890: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
c8a0: 0a 20 20 20 20 69 6e 74 20 6f 70 65 6e 4f 70 3b  .    int openOp;
c8b0: 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e  .    sqliteBegin
c8c0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
c8d0: 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 61  Parse, 1);.    a
c8e0: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
c8f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65  AddOp(v, OP_File
c900: 4f 70 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Open, 0, 0);.   
c910: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
c920: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 46 69  eP3(v, addr, pFi
c930: 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c 65  lename->z, pFile
c940: 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  name->n);.    sq
c950: 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74 65 50  liteVdbeDequoteP
c960: 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  3(v, addr);.    
c970: 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62 2d 3e 69  openOp = pTab->i
c980: 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 57  sTemp ? OP_OpenW
c990: 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 57 72  rAux : OP_OpenWr
c9a0: 69 74 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  ite;.    sqliteV
c9b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e  dbeAddOp(v, open
c9c0: 4f 70 2c 20 30 2c 20 70 54 61 62 2d 3e 74 6e 75  Op, 0, pTab->tnu
c9d0: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  m);.    sqliteVd
c9e0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
c9f0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50  , pTab->zName, P
ca00: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 66  3_STATIC);.    f
ca10: 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61  or(i=1, pIdx=pTa
ca20: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
ca30: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
ca40: 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  t, i++){.      s
ca50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ca60: 2c 20 6f 70 65 6e 4f 70 2c 20 69 2c 20 70 49 64  , openOp, i, pId
ca70: 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  x->tnum);.      
ca80: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
ca90: 50 33 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e  P3(v, -1, pIdx->
caa0: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
cab0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
cac0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
cad0: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b  ITE_CountRows ){
cae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
caf0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
cb00: 65 67 65 72 2c 20 30 2c 20 30 29 3b 20 20 2f 2a  eger, 0, 0);  /*
cb10: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
cb20: 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  row count */.   
cb30: 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20 73 71 6c   }.    end = sql
cb40: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
cb50: 28 76 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  (v);.    addr = 
cb60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
cb70: 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61 64 2c 20  v, OP_FileRead, 
cb80: 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65 6e 64 29  pTab->nCol, end)
cb90: 3b 0a 20 20 20 20 69 66 28 20 70 44 65 6c 69 6d  ;.    if( pDelim
cba0: 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  iter ){.      sq
cbb0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
cbc0: 28 76 2c 20 61 64 64 72 2c 20 70 44 65 6c 69 6d  (v, addr, pDelim
cbd0: 69 74 65 72 2d 3e 7a 2c 20 70 44 65 6c 69 6d 69  iter->z, pDelimi
cbe0: 74 65 72 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 73  ter->n);.      s
cbf0: 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74 65  qliteVdbeDequote
cc00: 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  P3(v, addr);.   
cc10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
cc20: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
cc30: 28 76 2c 20 61 64 64 72 2c 20 22 5c 74 22 2c 20  (v, addr, "\t", 
cc40: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
cc50: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
cc60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
cc70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cc80: 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 70 54 61 62  FileColumn, pTab
cc90: 2d 3e 69 50 4b 65 79 2c 20 30 29 3b 0a 20 20 20  ->iPKey, 0);.   
cca0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ccb0: 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  Op(v, OP_MustBeI
ccc0: 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  nt, 0, 0);.    }
ccd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
cce0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ccf0: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30  P_NewRecno, 0, 0
cd00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
cd10: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
cd20: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
cd30: 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( i==pTab->iPK
cd40: 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ey ){.        /*
cd50: 20 54 68 65 20 69 6e 74 65 67 65 72 20 70 72 69   The integer pri
cd60: 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  mary key column 
cd70: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 4e  is filled with N
cd80: 55 4c 4c 20 73 69 6e 63 65 20 69 74 73 0a 20 20  ULL since its.  
cd90: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69        ** value i
cda0: 73 20 61 6c 77 61 79 73 20 70 75 6c 6c 65 64 20  s always pulled 
cdb0: 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 20  from the record 
cdc0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20  number */.      
cdd0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cde0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
cdf0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  0, 0);.      }el
ce00: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
ce10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ce20: 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 69 2c  P_FileColumn, i,
ce30: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ce40: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 47 65 6e   }.    sqliteGen
ce50: 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  erateConstraintC
ce60: 68 65 63 6b 73 28 70 50 61 72 73 65 2c 20 70 54  hecks(pParse, pT
ce70: 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ab, 0, 0, 0, 0, 
ce80: 6f 6e 45 72 72 6f 72 2c 20 61 64 64 72 29 3b 0a  onError, addr);.
ce90: 20 20 20 20 73 71 6c 69 74 65 43 6f 6d 70 6c 65      sqliteComple
cea0: 74 65 49 6e 73 65 72 74 69 6f 6e 28 70 50 61 72  teInsertion(pPar
ceb0: 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c 20  se, pTab, 0, 0, 
cec0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28  0, 0);.    if( (
ced0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
cee0: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d 30  TE_CountRows)!=0
cef0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
cf00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cf10: 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 20 20  AddImm, 1, 0);  
cf20: 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 72 6f 77  /* Increment row
cf30: 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a   count */.    }.
cf40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
cf50: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
cf60: 30 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71  0, addr);.    sq
cf70: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
cf80: 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20  abel(v, end);.  
cf90: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cfa0: 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c  p(v, OP_Noop, 0,
cfb0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45   0);.    sqliteE
cfc0: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
cfd0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
cfe0: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
cff0: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29  LITE_CountRows )
d000: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
d010: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
d020: 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 29  lumnCount, 1, 0)
d030: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d040: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
d050: 6c 75 6d 6e 4e 61 6d 65 2c 20 30 2c 20 30 29 3b  lumnName, 0, 0);
d060: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
d070: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
d080: 20 22 72 6f 77 73 20 69 6e 73 65 72 74 65 64 22   "rows inserted"
d090: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
d0a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d0b0: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
d0c0: 63 6b 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  ck, 1, 0);.    }
d0d0: 0a 20 20 7d 0a 20 20 0a 63 6f 70 79 5f 63 6c 65  .  }.  .copy_cle
d0e0: 61 6e 75 70 3a 0a 20 20 72 65 74 75 72 6e 3b 0a  anup:.  return;.
d0f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6e  }../*.** The non
d100: 2d 73 74 61 6e 64 61 72 64 20 56 41 43 55 55 4d  -standard VACUUM
d110: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
d120: 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65   to clean up the
d130: 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 63 6f   database,.** co
d140: 6c 6c 61 70 73 65 20 66 72 65 65 20 73 70 61 63  llapse free spac
d150: 65 2c 20 65 74 63 2e 20 20 49 74 20 69 73 20 6d  e, etc.  It is m
d160: 6f 64 65 6c 6c 65 64 20 61 66 74 65 72 20 74 68  odelled after th
d170: 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64  e VACUUM command
d180: 0a 2a 2a 20 69 6e 20 50 6f 73 74 67 72 65 53 51  .** in PostgreSQ
d190: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 76 65 72 73  L..**.** In vers
d1a0: 69 6f 6e 20 31 2e 30 2e 78 20 6f 66 20 53 51 4c  ion 1.0.x of SQL
d1b0: 69 74 65 2c 20 74 68 65 20 56 41 43 55 55 4d 20  ite, the VACUUM 
d1c0: 63 6f 6d 6d 61 6e 64 20 77 6f 75 6c 64 20 63 61  command would ca
d1d0: 6c 6c 0a 2a 2a 20 67 64 62 6d 5f 72 65 6f 72 67  ll.** gdbm_reorg
d1e0: 61 6e 69 7a 65 28 29 20 6f 6e 20 61 6c 6c 20 74  anize() on all t
d1f0: 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
d200: 65 73 2e 20 20 42 75 74 20 62 65 67 69 6e 6e 69  es.  But beginni
d210: 6e 67 0a 2a 2a 20 77 69 74 68 20 32 2e 30 2e 30  ng.** with 2.0.0
d220: 2c 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67  , SQLite no long
d230: 65 72 20 75 73 65 73 20 47 44 42 4d 20 73 6f 20  er uses GDBM so 
d240: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 68 61 73  this command has
d250: 0a 2a 2a 20 62 65 63 6f 6d 65 20 61 20 6e 6f 2d  .** become a no-
d260: 6f 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  op..*/.void sqli
d270: 74 65 56 61 63 75 75 6d 28 50 61 72 73 65 20 2a  teVacuum(Parse *
d280: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
d290: 54 61 62 6c 65 4e 61 6d 65 29 7b 0a 20 20 2f 2a  TableName){.  /*
d2a0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d   Do nothing */.}
d2b0: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
d2c0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
d2d0: 6f 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e 54  oid sqliteBeginT
d2e0: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
d2f0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
d300: 45 72 72 6f 72 29 7b 0a 20 20 73 71 6c 69 74 65  Error){.  sqlite
d310: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   *db;..  if( pPa
d320: 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
d330: 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
d340: 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74  db->pBe==0 ) ret
d350: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
d360: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
d370: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
d380: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
d390: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
d3a0: 54 45 5f 49 6e 54 72 61 6e 73 20 29 20 72 65 74  TE_InTrans ) ret
d3b0: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 42 65 67  urn;.  sqliteBeg
d3c0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
d3d0: 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 64  (pParse, 0);.  d
d3e0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
d3f0: 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62  TE_InTrans;.  db
d400: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72  ->onError = onEr
d410: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ror;.}../*.** Co
d420: 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
d430: 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
d440: 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  eCommitTransacti
d450: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
d460: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
d470: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
d480: 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
d490: 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70  >db)==0 || db->p
d4a0: 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Be==0 ) return;.
d4b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
d4c0: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
d4d0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
d4e0: 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e  urn;.  if( (db->
d4f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
d500: 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20 72 65 74  nTrans)==0 ) ret
d510: 75 72 6e 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  urn;.  db->flags
d520: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72   &= ~SQLITE_InTr
d530: 61 6e 73 3b 0a 20 20 73 71 6c 69 74 65 45 6e 64  ans;.  sqliteEnd
d540: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
d550: 50 61 72 73 65 29 3b 0a 20 20 64 62 2d 3e 6f 6e  Parse);.  db->on
d560: 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75  Error = OE_Defau
d570: 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  lt;.}../*.** Rol
d580: 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
d590: 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
d5a0: 74 65 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61  teRollbackTransa
d5b0: 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
d5c0: 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  rse){.  sqlite *
d5d0: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
d5e0: 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
d5f0: 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
d600: 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65  b)==0 || db->pBe
d610: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d620: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
d630: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
d640: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
d650: 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  n;.  if( (db->fl
d660: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
d670: 72 61 6e 73 29 3d 3d 30 20 29 20 72 65 74 75 72  rans)==0 ) retur
d680: 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  n;.  v = sqliteG
d690: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
d6a0: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
d6b0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d6c0: 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c 20 30  , OP_Rollback, 0
d6d0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  , 0);.  }.  db->
d6e0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
d6f0: 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e  _InTrans;.  db->
d700: 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66  onError = OE_Def
d710: 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ault;.}../*.** G
d720: 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
d730: 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20  e that prepares 
d740: 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65  for doing an ope
d750: 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d  ration that.** m
d760: 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
d770: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
d780: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  This routine sta
d790: 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61  rts a new transa
d7a0: 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20  ction if we are 
d7b0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68  not already with
d7c0: 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  in.** a transact
d7d0: 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20  ion.  If we are 
d7e0: 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61  already within a
d7f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
d800: 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a  en a checkpoint.
d810: 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65  ** is set if the
d820: 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 70   setCheckpoint p
d830: 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
d840: 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20  .  A checkpoint 
d850: 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74  should.** be set
d860: 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   for operations 
d870: 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20  that might fail 
d880: 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72  (due to a constr
d890: 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a  aint) part of.**
d8a0: 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68   the way through
d8b0: 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20   and which will 
d8c0: 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d  need to undo som
d8d0: 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74  e writes without
d8e0: 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f   having to.** ro
d8f0: 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65  llback the whole
d900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46   transaction.  F
d910: 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68  or operations wh
d920: 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ere all constrai
d930: 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68  nts.** can be ch
d940: 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79  ecked before any
d950: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
d960: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
d970: 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a  e, it is never.*
d980: 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  * necessary to u
d990: 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20  ndo a write and 
d9a0: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73  the checkpoint s
d9b0: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74  hould not be set
d9c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d9d0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
d9e0: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
d9f0: 65 2c 20 69 6e 74 20 73 65 74 43 68 65 63 6b 70  e, int setCheckp
da00: 6f 69 6e 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  oint){.  Vdbe *v
da10: 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  ;.  v = sqliteGe
da20: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
da30: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
da40: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
da50: 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 20 72 65  ->trigStack ) re
da60: 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73  turn; /* if this
da70: 20 69 73 20 69 6e 20 61 20 74 72 69 67 67 65 72   is in a trigger
da80: 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 72 73   */.  if( (pPars
da90: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
daa0: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
dab0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  0 ){.    sqliteV
dac0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
dad0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30  ransaction, 0, 0
dae0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
daf0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72  eAddOp(v, OP_Ver
db00: 69 66 79 43 6f 6f 6b 69 65 2c 20 70 50 61 72 73  ifyCookie, pPars
db10: 65 2d 3e 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f  e->db->schema_co
db20: 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  okie, 0);.    pP
db30: 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72 69  arse->schemaVeri
db40: 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  fied = 1;.  }els
db50: 65 20 69 66 28 20 73 65 74 43 68 65 63 6b 70 6f  e if( setCheckpo
db60: 69 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  int ){.    sqlit
db70: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
db80: 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 30 2c 20  _Checkpoint, 0, 
db90: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
dba0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
dbb0: 68 61 74 20 63 6f 6e 63 6c 75 64 65 73 20 61 6e  hat concludes an
dbc0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20   operation that 
dbd0: 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65 64  may have changed
dbe0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
dbf0: 2e 20 20 54 68 69 73 20 69 73 20 61 20 63 6f 6d  .  This is a com
dc00: 70 61 6e 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  panion function 
dc10: 74 6f 20 42 65 67 69 6e 57 72 69 74 65 4f 70 65  to BeginWriteOpe
dc20: 72 61 74 69 6f 6e 28 29 2e 0a 2a 2a 20 49 66 20  ration()..** If 
dc30: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
dc40: 73 20 73 74 61 72 74 65 64 2c 20 74 68 65 6e 20  s started, then 
dc50: 63 6f 6d 6d 69 74 20 69 74 2e 20 20 49 66 20 61  commit it.  If a
dc60: 20 63 68 65 63 6b 70 6f 69 6e 74 20 77 61 73 0a   checkpoint was.
dc70: 2a 2a 20 73 74 61 72 74 65 64 20 74 68 65 6e 20  ** started then 
dc80: 63 6f 6d 6d 69 74 20 74 68 61 74 2e 0a 2a 2f 0a  commit that..*/.
dc90: 76 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 57 72  void sqliteEndWr
dca0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
dcb0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
dcc0: 64 62 65 20 2a 76 3b 0a 20 20 69 66 28 20 70 50  dbe *v;.  if( pP
dcd0: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
dce0: 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20  ) return; /* if 
dcf0: 74 68 69 73 20 69 73 20 69 6e 20 61 20 74 72 69  this is in a tri
dd00: 67 67 65 72 20 2a 2f 0a 20 20 76 20 3d 20 73 71  gger */.  v = sq
dd10: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
dd20: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
dd30: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
dd40: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
dd50: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
dd60: 6e 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20  ns ){.    /* Do 
dd70: 4e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c  Nothing */.  }el
dd80: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  se{.    sqliteVd
dd90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
dda0: 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  mmit, 0, 0);.  }
ddb0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  .}.../*.** Inter
ddc0: 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20 73  pret the given s
ddd0: 74 72 69 6e 67 20 61 73 20 61 20 62 6f 6f 6c 65  tring as a boole
dde0: 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  an value..*/.sta
ddf0: 74 69 63 20 69 6e 74 20 67 65 74 42 6f 6f 6c 65  tic int getBoole
de00: 61 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 73  an(char *z){.  s
de10: 74 61 74 69 63 20 63 68 61 72 20 2a 61 7a 54 72  tatic char *azTr
de20: 75 65 5b 5d 20 3d 20 7b 20 22 79 65 73 22 2c 20  ue[] = { "yes", 
de30: 22 6f 6e 22 2c 20 22 74 72 75 65 22 20 7d 3b 0a  "on", "true" };.
de40: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a    int i;.  if( z
de50: 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  [0]==0 ) return 
de60: 30 3b 0a 20 20 69 66 28 20 69 73 64 69 67 69 74  0;.  if( isdigit
de70: 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b 30 5d 3d  (z[0]) || (z[0]=
de80: 3d 27 2d 27 20 26 26 20 69 73 64 69 67 69 74 28  ='-' && isdigit(
de90: 7a 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 72 65  z[1])) ){.    re
dea0: 74 75 72 6e 20 61 74 6f 69 28 7a 29 3b 0a 20 20  turn atoi(z);.  
deb0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  }.  for(i=0; i<s
dec0: 69 7a 65 6f 66 28 61 7a 54 72 75 65 29 2f 73 69  izeof(azTrue)/si
ded0: 7a 65 6f 66 28 61 7a 54 72 75 65 5b 30 5d 29 3b  zeof(azTrue[0]);
dee0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
def0: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 61  qliteStrICmp(z,a
df00: 7a 54 72 75 65 5b 69 5d 29 3d 3d 30 20 29 20 72  zTrue[i])==0 ) r
df10: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
df20: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
df30: 2a 20 50 72 6f 63 65 73 73 20 61 20 70 72 61 67  * Process a prag
df40: 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  ma statement.  .
df50: 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73 20 61 72  **.** Pragmas ar
df60: 65 20 6f 66 20 74 68 69 73 20 66 6f 72 6d 3a 0a  e of this form:.
df70: 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52 41 47 4d  **.**      PRAGM
df80: 41 20 69 64 20 3d 20 76 61 6c 75 65 0a 2a 2a 0a  A id = value.**.
df90: 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69 65  ** The identifie
dfa0: 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  r might also be 
dfb0: 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 76  a string.  The v
dfc0: 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
dfd0: 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66  , and.** identif
dfe0: 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72  ier, or a number
dff0: 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67 20  .  If minusFlag 
e000: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
e010: 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20  e value is.** a 
e020: 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61 73 20  number that was 
e030: 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d 69  preceded by a mi
e040: 6e 75 73 20 73 69 67 6e 2e 0a 2a 2f 0a 76 6f 69  nus sign..*/.voi
e050: 64 20 73 71 6c 69 74 65 50 72 61 67 6d 61 28 50  d sqlitePragma(P
e060: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
e070: 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65  ken *pLeft, Toke
e080: 6e 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6d  n *pRight, int m
e090: 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 63 68 61  inusFlag){.  cha
e0a0: 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r *zLeft = 0;.  
e0b0: 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20 30  char *zRight = 0
e0c0: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
e0d0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
e0e0: 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 53 74  zLeft = sqliteSt
e0f0: 72 4e 44 75 70 28 70 4c 65 66 74 2d 3e 7a 2c 20  rNDup(pLeft->z, 
e100: 70 4c 65 66 74 2d 3e 6e 29 3b 0a 20 20 73 71 6c  pLeft->n);.  sql
e110: 69 74 65 44 65 71 75 6f 74 65 28 7a 4c 65 66 74  iteDequote(zLeft
e120: 29 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c  );.  if( minusFl
e130: 61 67 20 29 7b 0a 20 20 20 20 7a 52 69 67 68 74  ag ){.    zRight
e140: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
e150: 53 65 74 4e 53 74 72 69 6e 67 28 26 7a 52 69 67  SetNString(&zRig
e160: 68 74 2c 20 22 2d 22 2c 20 31 2c 20 70 52 69 67  ht, "-", 1, pRig
e170: 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74 2d 3e 6e  ht->z, pRight->n
e180: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
e190: 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71 6c 69     zRight = sqli
e1a0: 74 65 53 74 72 4e 44 75 70 28 70 52 69 67 68 74  teStrNDup(pRight
e1b0: 2d 3e 7a 2c 20 70 52 69 67 68 74 2d 3e 6e 29 3b  ->z, pRight->n);
e1c0: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f  .    sqliteDequo
e1d0: 74 65 28 7a 52 69 67 68 74 29 3b 0a 20 20 7d 0a  te(zRight);.  }.
e1e0: 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41   .  /*.  **  PRA
e1f0: 47 4d 41 20 64 65 66 61 75 6c 74 5f 63 61 63 68  GMA default_cach
e200: 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41  e_size.  **  PRA
e210: 47 4d 41 20 64 65 66 61 75 6c 74 5f 63 61 63 68  GMA default_cach
e220: 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20  e_size=N.  **.  
e230: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
e240: 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75  m reports the cu
e250: 72 72 65 6e 74 20 70 65 72 73 69 73 74 65 6e 74  rrent persistent
e260: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65   setting for the
e270: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
e280: 20 73 69 7a 65 2e 20 20 54 68 65 20 76 61 6c 75   size.  The valu
e290: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
e2a0: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
e2b0: 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69   of.  ** pages i
e2c0: 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
e2d0: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  .  The second fo
e2e0: 72 6d 20 73 65 74 73 20 62 6f 74 68 20 74 68 65  rm sets both the
e2f0: 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61   current.  ** pa
e300: 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61  ge cache size va
e310: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 65 72 73  lue and the pers
e320: 69 73 74 65 6e 74 20 70 61 67 65 20 63 61 63 68  istent page cach
e330: 65 20 73 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a  e size value.  *
e340: 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
e350: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
e360: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65 66   **.  ** The def
e370: 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 20  ault cache size 
e380: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 74  is stored in met
e390: 61 2d 76 61 6c 75 65 20 32 20 6f 66 20 70 61 67  a-value 2 of pag
e3a0: 65 20 31 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  e 1 of the.  ** 
e3b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
e3c0: 54 68 65 20 63 61 63 68 65 20 73 69 7a 65 20 69  The cache size i
e3d0: 73 20 61 63 74 75 61 6c 6c 79 20 74 68 65 20 61  s actually the a
e3e0: 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66  bsolute value of
e3f0: 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 6d 6f 72  .  ** this memor
e400: 79 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65  y location.  The
e410: 20 73 69 67 6e 20 6f 66 20 6d 65 74 61 2d 76 61   sign of meta-va
e420: 6c 75 65 20 32 20 64 65 74 65 72 6d 69 6e 65 73  lue 2 determines
e430: 20 74 68 65 0a 20 20 2a 2a 20 73 79 6e 63 68 72   the.  ** synchr
e440: 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67 2e 20 20  onous setting.  
e450: 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  A negative value
e460: 20 6d 65 61 6e 73 20 73 79 6e 63 68 72 6f 6e 6f   means synchrono
e470: 75 73 20 69 73 20 6f 66 66 0a 20 20 2a 2a 20 61  us is off.  ** a
e480: 6e 64 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  nd a positive va
e490: 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e 63 68 72  lue means synchr
e4a0: 6f 6e 6f 75 73 20 69 73 20 6f 6e 2e 0a 20 20 2a  onous is on..  *
e4b0: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  /.  if( sqliteSt
e4c0: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 64 65 66  rICmp(zLeft,"def
e4d0: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 22  ault_cache_size"
e4e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )==0 ){.    stat
e4f0: 69 63 20 56 64 62 65 4f 70 20 67 65 74 43 61 63  ic VdbeOp getCac
e500: 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20  heSize[] = {.   
e510: 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b     { OP_ReadCook
e520: 69 65 2c 20 20 30 2c 20 32 2c 20 20 20 20 20 20  ie,  0, 2,      
e530: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
e540: 5f 41 62 73 56 61 6c 75 65 2c 20 20 20 20 30 2c  _AbsValue,    0,
e550: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
e560: 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20 20       { OP_Dup,  
e570: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20         0, 0,    
e580: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
e590: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20  OP_Integer,     
e5a0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
e5b0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20  .      { OP_Ne, 
e5c0: 20 20 20 20 20 20 20 20 20 30 2c 20 36 2c 20 20           0, 6,  
e5d0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
e5e0: 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20  { OP_Integer,   
e5f0: 20 20 4d 41 58 5f 50 41 47 45 53 2c 30 2c 20 30    MAX_PAGES,0, 0
e600: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  },.      { OP_Co
e610: 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c  lumnCount, 1, 0,
e620: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
e630: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
e640: 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
e650: 20 22 63 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a   "cache_size"},.
e660: 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62        { OP_Callb
e670: 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  ack,    1, 0,   
e680: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a       0},.    };.
e690: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
e6a0: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
e6b0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
e6c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
e6d0: 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70  if( pRight->z==p
e6e0: 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  Left->z ){.     
e6f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
e700: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
e710: 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c  e(getCacheSize),
e720: 20 67 65 74 43 61 63 68 65 53 69 7a 65 29 3b 0a   getCacheSize);.
e730: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e740: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
e750: 20 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69   int size = atoi
e760: 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (zRight);.      
e770: 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a  if( size<0 ) siz
e780: 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
e790: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
e7a0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
e7b0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  e, 0);.      sql
e7c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e7d0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 69 7a 65  OP_Integer, size
e7e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
e7f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e800: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 30 2c  P_ReadCookie, 0,
e810: 20 32 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20   2);.      addr 
e820: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
e830: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
e840: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
e850: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
e860: 20 4f 50 5f 47 65 2c 20 30 2c 20 61 64 64 72 2b   OP_Ge, 0, addr+
e870: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
e880: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e890: 4e 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b  Negative, 0, 0);
e8a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
e8b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
e8c0: 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20  Cookie, 0, 2);. 
e8d0: 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72       sqliteEndWr
e8e0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
e8f0: 72 73 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  rse);.      db->
e900: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 64 62 2d  cache_size = db-
e910: 3e 63 61 63 68 65 5f 73 69 7a 65 3c 30 20 3f 20  >cache_size<0 ? 
e920: 2d 73 69 7a 65 20 3a 20 73 69 7a 65 3b 0a 20 20  -size : size;.  
e930: 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 53      sqliteBtreeS
e940: 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e  etCacheSize(db->
e950: 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73  pBe, db->cache_s
e960: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ize);.    }.  }e
e970: 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  lse..  /*.  **  
e980: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
e990: 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63  e.  **  PRAGMA c
e9a0: 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a  ache_size=N.  **
e9b0: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
e9c0: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
e9d0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73   current local s
e9e0: 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20  etting for the. 
e9f0: 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
ea00: 69 7a 65 2e 20 20 54 68 65 20 6c 6f 63 61 6c 20  ize.  The local 
ea10: 73 65 74 74 69 6e 67 20 63 61 6e 20 62 65 20 64  setting can be d
ea20: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 0a 20 20  ifferent from.  
ea30: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
ea40: 74 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  t cache size val
ea50: 75 65 20 74 68 61 74 20 69 73 20 73 74 6f 72 65  ue that is store
ea60: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
ea70: 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 73 65  e.  ** file itse
ea80: 6c 66 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72  lf.  The value r
ea90: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d  eturned is the m
eaa0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
eab0: 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74  .  ** pages in t
eac0: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
ead0: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
eae0: 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a 20  sets the local. 
eaf0: 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
eb00: 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 74 20 64  ize value.  It d
eb10: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
eb20: 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a 20 20  he persistent.  
eb30: 2a 2a 20 63 61 63 68 65 20 73 69 7a 65 20 73 74  ** cache size st
eb40: 6f 72 65 64 20 6f 6e 20 74 68 65 20 64 69 73 6b  ored on the disk
eb50: 20 73 6f 20 74 68 65 20 63 61 63 68 65 20 73 69   so the cache si
eb60: 7a 65 20 77 69 6c 6c 20 72 65 76 65 72 74 0a 20  ze will revert. 
eb70: 20 2a 2a 20 74 6f 20 69 74 73 20 64 65 66 61 75   ** to its defau
eb80: 6c 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68  lt value when th
eb90: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c  e database is cl
eba0: 6f 73 65 64 20 61 6e 64 20 72 65 6f 70 65 6e 65  osed and reopene
ebb0: 64 2e 0a 20 20 2a 2a 20 4e 20 73 68 6f 75 6c 64  d..  ** N should
ebc0: 20 62 65 20 61 20 70 6f 73 69 74 69 76 65 20 69   be a positive i
ebd0: 6e 74 65 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  nteger..  */.  i
ebe0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
ebf0: 28 7a 4c 65 66 74 2c 22 63 61 63 68 65 5f 73 69  (zLeft,"cache_si
ec00: 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ze")==0 ){.    s
ec10: 74 61 74 69 63 20 56 64 62 65 4f 70 20 67 65 74  tatic VdbeOp get
ec20: 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a  CacheSize[] = {.
ec30: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
ec40: 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20  nCount, 1, 0,   
ec50: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
ec60: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
ec70: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 63   0, 0,        "c
ec80: 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20 20  ache_size"},.   
ec90: 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
eca0: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
ecb0: 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
ecc0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
ecd0: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
ece0: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
ecf0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
ed00: 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66   pRight->z==pLef
ed10: 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 69 6e  t->z ){.      in
ed20: 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63  t size = db->cac
ed30: 68 65 5f 73 69 7a 65 3b 3b 0a 20 20 20 20 20 20  he_size;;.      
ed40: 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a  if( size<0 ) siz
ed50: 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
ed60: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ed70: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
ed80: 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  size, 0);.      
ed90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
eda0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
edb0: 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20  (getCacheSize), 
edc0: 67 65 74 43 61 63 68 65 53 69 7a 65 29 3b 0a 20  getCacheSize);. 
edd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ede0: 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28  int size = atoi(
edf0: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69  zRight);.      i
ee00: 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65  f( size<0 ) size
ee10: 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
ee20: 69 66 28 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  if( db->cache_si
ee30: 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73  ze<0 ) size = -s
ee40: 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63  ize;.      db->c
ee50: 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
ee60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74  ;.      sqliteBt
ee70: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
ee80: 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63  db->pBe, db->cac
ee90: 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  he_size);.    }.
eea0: 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20    }else..  /*.  
eeb0: 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61 75  **  PRAGMA defau
eec0: 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  lt_synchronous. 
eed0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61   **  PRAGMA defa
eee0: 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  ult_synchronous=
eef0: 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a  BOOLEAN.  **.  *
ef00: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
ef10: 20 72 65 74 75 72 6e 73 20 74 68 65 20 70 65 72   returns the per
ef20: 73 69 73 74 65 6e 74 20 76 61 6c 75 65 20 6f 66  sistent value of
ef30: 20 74 68 65 20 22 73 79 6e 63 68 72 6f 6e 6f 75   the "synchronou
ef40: 73 22 20 73 65 74 74 69 6e 67 0a 20 20 2a 2a 20  s" setting.  ** 
ef50: 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20 69  that is stored i
ef60: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
ef70: 20 54 68 69 73 20 69 73 20 74 68 65 20 73 79 6e   This is the syn
ef80: 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67  chronous setting
ef90: 20 74 68 61 74 0a 20 20 2a 2a 20 69 73 20 75 73   that.  ** is us
efa0: 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
efb0: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
efc0: 65 64 20 75 6e 6c 65 73 73 20 6f 76 65 72 72 69  ed unless overri
efd0: 64 64 65 6e 20 62 79 20 61 20 73 65 70 61 72 61  dden by a separa
efe0: 74 65 0a 20 20 2a 2a 20 22 73 79 6e 63 68 72 6f  te.  ** "synchro
eff0: 6e 6f 75 73 22 20 70 72 61 67 6d 61 2e 20 20 54  nous" pragma.  T
f000: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63  he second form c
f010: 68 61 6e 67 65 73 20 74 68 65 20 70 65 72 73 69  hanges the persi
f020: 73 74 65 6e 74 20 61 6e 64 20 74 68 65 0a 20 20  stent and the.  
f030: 2a 2a 20 6c 6f 63 61 6c 20 73 79 6e 63 68 72 6f  ** local synchro
f040: 6e 6f 75 73 20 73 65 74 74 69 6e 67 20 74 6f 20  nous setting to 
f050: 74 68 65 20 76 61 6c 75 65 20 67 69 76 65 6e 2e  the value given.
f060: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 73 79  .  **.  ** If sy
f070: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 2c  nchronous is on,
f080: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 64 6f 20   SQLite will do 
f090: 61 6e 20 66 73 79 6e 63 28 29 20 73 79 73 74 65  an fsync() syste
f0a0: 6d 20 63 61 6c 6c 20 61 74 20 73 74 72 61 74 65  m call at strate
f0b0: 67 69 63 0a 20 20 2a 2a 20 70 6f 69 6e 74 73 20  gic.  ** points 
f0c0: 74 6f 20 69 6e 73 75 72 65 20 74 68 61 74 20 61  to insure that a
f0d0: 6c 6c 20 70 72 65 76 69 6f 75 73 6c 79 20 77 72  ll previously wr
f0e0: 69 74 74 65 6e 20 64 61 74 61 20 68 61 73 20 61  itten data has a
f0f0: 63 74 75 61 6c 6c 79 20 62 65 65 6e 0a 20 20 2a  ctually been.  *
f100: 2a 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  * written onto t
f110: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20  he disk surface 
f120: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
f130: 67 2e 20 20 54 68 69 73 20 6d 6f 64 65 20 69 6e  g.  This mode in
f140: 73 75 72 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sures that.  ** 
f150: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c  the database wil
f160: 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e 20 61  l always be in a
f170: 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
f180: 65 20 65 76 65 6e 74 20 69 66 20 74 68 65 20 6f  e event if the o
f190: 70 65 72 61 74 69 6e 67 0a 20 20 2a 2a 20 73 79  perating.  ** sy
f1a0: 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
f1b0: 70 6f 77 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  power to the com
f1c0: 70 75 74 65 72 20 69 73 20 69 6e 74 65 72 72 75  puter is interru
f1d0: 70 74 65 64 20 75 6e 65 78 70 65 63 74 65 64 6c  pted unexpectedl
f1e0: 79 2e 0a 20 20 2a 2a 20 57 68 65 6e 20 73 79 6e  y..  ** When syn
f1f0: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
f200: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
f210: 20 77 61 69 74 20 66 6f 72 20 63 68 61 6e 67 65   wait for change
f220: 73 20 74 6f 20 61 63 74 75 61 6c 6c 79 0a 20 20  s to actually.  
f230: 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ** be written to
f240: 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
f250: 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 41 73   continuing.  As
f260: 20 73 6f 6f 6e 20 61 73 20 69 74 20 68 61 6e 64   soon as it hand
f270: 73 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  s changes.  ** t
f280: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  o the operating 
f290: 73 79 73 74 65 6d 2c 20 69 74 20 61 73 73 75 6d  system, it assum
f2a0: 65 73 20 74 68 61 74 20 74 68 65 20 63 68 61 6e  es that the chan
f2b0: 67 65 73 20 61 72 65 20 70 65 72 6d 61 6e 65 6e  ges are permanen
f2c0: 74 20 61 6e 64 0a 20 20 2a 2a 20 69 74 20 63 6f  t and.  ** it co
f2d0: 6e 74 69 6e 75 65 73 20 67 6f 69 6e 67 2e 20 20  ntinues going.  
f2e0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  The database can
f2f0: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
f300: 20 62 79 20 61 20 70 72 6f 67 72 61 6d 20 63 72   by a program cr
f310: 61 73 68 0a 20 20 2a 2a 20 65 76 65 6e 20 77 69  ash.  ** even wi
f320: 74 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6f  th synchronous o
f330: 66 66 2c 20 62 75 74 20 61 6e 20 6f 70 65 72 61  ff, but an opera
f340: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
f350: 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 0a  h or power loss.
f360: 20 20 2a 2a 20 63 6f 75 6c 64 20 70 6f 74 65 6e    ** could poten
f370: 74 69 61 6c 6c 79 20 63 6f 72 72 75 70 74 20 64  tially corrupt d
f380: 61 74 61 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ata.  On the oth
f390: 65 72 20 68 61 6e 64 2c 20 73 79 6e 63 68 72 6f  er hand, synchro
f3a0: 6e 6f 75 73 20 6f 66 66 20 69 73 0a 20 20 2a 2a  nous off is.  **
f3b0: 20 66 61 73 74 65 72 20 74 68 61 6e 20 73 79 6e   faster than syn
f3c0: 63 68 72 6f 6e 6f 75 73 20 6f 6e 2e 0a 20 20 2a  chronous on..  *
f3d0: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  /.  if( sqliteSt
f3e0: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 64 65 66  rICmp(zLeft,"def
f3f0: 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73  ault_synchronous
f400: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  ")==0 ){.    sta
f410: 74 69 63 20 56 64 62 65 4f 70 20 67 65 74 53 79  tic VdbeOp getSy
f420: 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  nc[] = {.      {
f430: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20   OP_Integer,    
f440: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
f450: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61  ,.      { OP_Rea
f460: 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c 20  dCookie,  0, 2, 
f470: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
f480: 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
f490: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
f4a0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4c  0},.      { OP_L
f4b0: 74 2c 20 20 20 20 20 20 20 20 20 20 30 2c 20 35  t,          0, 5
f4c0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
f4d0: 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20     { OP_AddImm, 
f4e0: 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20       1, 0,      
f4f0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
f500: 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c  _ColumnCount, 1,
f510: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
f520: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
f530: 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
f540: 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73      "synchronous
f550: 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  "},.      { OP_C
f560: 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30  allback,    1, 0
f570: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
f580: 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   };.    Vdbe *v 
f590: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
f5a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
f5b0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
f5c0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
f5d0: 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20  z==pLeft->z ){. 
f5e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f5f0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
f600: 79 53 69 7a 65 28 67 65 74 53 79 6e 63 29 2c 20  ySize(getSync), 
f610: 67 65 74 53 79 6e 63 29 3b 0a 20 20 20 20 7d 65  getSync);.    }e
f620: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  lse{.      int a
f630: 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  ddr;.      int s
f640: 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f  ize = db->cache_
f650: 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
f660: 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20  size<0 ) size = 
f670: 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c  -size;.      sql
f680: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
f690: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
f6a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
f6b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
f6c0: 65 61 64 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29  eadCookie, 0, 2)
f6d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
f6e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
f6f0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
f700: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
f710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
f720: 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
f730: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
f740: 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 30 2c 20  Op(v, OP_Ne, 0, 
f750: 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73  addr+3);.      s
f760: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f770: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 4d 41 58  , OP_AddImm, MAX
f780: 5f 50 41 47 45 53 2c 20 30 29 3b 0a 20 20 20 20  _PAGES, 0);.    
f790: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
f7a0: 70 28 76 2c 20 4f 50 5f 41 62 73 56 61 6c 75 65  p(v, OP_AbsValue
f7b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
f7c0: 66 28 20 21 67 65 74 42 6f 6f 6c 65 61 6e 28 7a  f( !getBoolean(z
f7d0: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
f7e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
f7f0: 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65  p(v, OP_Negative
f800: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
f810: 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20   size = -size;. 
f820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
f830: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f840: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c  OP_SetCookie, 0,
f850: 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
f860: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
f870: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  on(pParse);.    
f880: 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65    db->cache_size
f890: 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73   = size;.      s
f8a0: 71 6c 69 74 65 42 74 72 65 65 53 65 74 43 61 63  qliteBtreeSetCac
f8b0: 68 65 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20  heSize(db->pBe, 
f8c0: 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b  db->cache_size);
f8d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
f8e0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
f8f0: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  MA synchronous. 
f900: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 79 6e   **   PRAGMA syn
f910: 63 68 72 6f 6e 6f 75 73 3d 42 4f 4f 4c 45 41 4e  chronous=BOOLEAN
f920: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
f930: 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63  n or set the loc
f940: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
f950: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 66 6c 61 67  synchronous flag
f960: 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a  .  Changing.  **
f970: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
f980: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63   does not make c
f990: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69  hanges to the di
f9a0: 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 0a  sk file and the.
f9b0: 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
f9c0: 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f  ue will be resto
f9d0: 72 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d  red the next tim
f9e0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  e the database i
f9f0: 73 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20  s.  ** opened.. 
fa00: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
fa10: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 73  StrICmp(zLeft,"s
fa20: 79 6e 63 68 72 6f 6e 6f 75 73 22 29 3d 3d 30 20  ynchronous")==0 
fa30: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
fa40: 62 65 4f 70 20 67 65 74 53 79 6e 63 5b 5d 20 3d  beOp getSync[] =
fa50: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f   {.      { OP_Co
fa60: 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c  lumnCount, 1, 0,
fa70: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
fa80: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
fa90: 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
faa0: 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 7d 2c   "synchronous"},
fab0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c  .      { OP_Call
fac0: 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20  back,    1, 0,  
fad0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
fae0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
faf0: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
fb00: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
fb10: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
fb20: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d   if( pRight->z==
fb30: 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20  pLeft->z ){.    
fb40: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
fb50: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
fb60: 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3e   db->cache_size>
fb70: 3d 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  =0, 0);.      sq
fb80: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
fb90: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67  t(v, ArraySize(g
fba0: 65 74 53 79 6e 63 29 2c 20 67 65 74 53 79 6e 63  etSync), getSync
fbb0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
fbc0: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64      int size = d
fbd0: 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 0a 20  b->cache_size;. 
fbe0: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20       if( size<0 
fbf0: 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
fc00: 20 20 20 20 20 20 69 66 28 20 21 67 65 74 42 6f        if( !getBo
fc10: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 20  olean(zRight) ) 
fc20: 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20  size = -size;.  
fc30: 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69      db->cache_si
fc40: 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20  ze = size;.     
fc50: 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74 43   sqliteBtreeSetC
fc60: 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42 65  acheSize(db->pBe
fc70: 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  , db->cache_size
fc80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
fc90: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ..  if( sqliteSt
fca0: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 74 72  rICmp(zLeft, "tr
fcb0: 69 67 67 65 72 5f 6f 76 65 72 68 65 61 64 5f 74  igger_overhead_t
fcc0: 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  est")==0 ){.    
fcd0: 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a  if( getBoolean(z
fce0: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
fcf0: 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72 69 67  always_code_trig
fd00: 67 65 72 5f 73 65 74 75 70 20 3d 20 31 3b 0a 20  ger_setup = 1;. 
fd10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fd20: 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72 69 67  always_code_trig
fd30: 67 65 72 5f 73 65 74 75 70 20 3d 20 30 3b 0a 20  ger_setup = 0;. 
fd40: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
fd50: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
fd60: 70 28 7a 4c 65 66 74 2c 20 22 76 64 62 65 5f 74  p(zLeft, "vdbe_t
fd70: 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  race")==0 ){.   
fd80: 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
fd90: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
fda0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
fdb0: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b 0a  LITE_VdbeTrace;.
fdc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fdd0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
fde0: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b  QLITE_VdbeTrace;
fdf0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
fe00: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
fe10: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 66 75 6c 6c  Cmp(zLeft, "full
fe20: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 22 29 3d  _column_names")=
fe30: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
fe40: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
fe50: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
fe60: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 75  ags |= SQLITE_Fu
fe70: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20  llColNames;.    
fe80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d  }else{.      db-
fe90: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
fea0: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
feb0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
fec0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
fed0: 6d 70 28 7a 4c 65 66 74 2c 20 22 73 68 6f 77 5f  mp(zLeft, "show_
fee0: 64 61 74 61 74 79 70 65 73 22 29 3d 3d 30 20 29  datatypes")==0 )
fef0: 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f  {.    if( getBoo
ff00: 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
ff10: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
ff20: 7c 3d 20 53 51 4c 49 54 45 5f 52 65 70 6f 72 74  |= SQLITE_Report
ff30: 54 79 70 65 73 3b 0a 20 20 20 20 7d 65 6c 73 65  Types;.    }else
ff40: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
ff50: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 52 65 70  s &= ~SQLITE_Rep
ff60: 6f 72 74 54 79 70 65 73 3b 0a 20 20 20 20 7d 0a  ortTypes;.    }.
ff70: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
ff80: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
ff90: 66 74 2c 20 22 72 65 73 75 6c 74 5f 73 65 74 5f  ft, "result_set_
ffa0: 64 65 74 61 69 6c 73 22 29 3d 3d 30 20 29 7b 0a  details")==0 ){.
ffb0: 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
ffc0: 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
ffd0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
ffe0: 20 53 51 4c 49 54 45 5f 52 65 73 75 6c 74 44 65   SQLITE_ResultDe
fff0: 74 61 69 6c 73 3b 0a 20 20 20 20 7d 65 6c 73 65  tails;.    }else
10000 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
10010 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 52 65 73  s &= ~SQLITE_Res
10020 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20 20  ultDetails;.    
10030 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
10040 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
10050 4c 65 66 74 2c 20 22 63 6f 75 6e 74 5f 63 68 61  Left, "count_cha
10060 6e 67 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  nges")==0 ){.   
10070 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
10080 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
10090 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
100a0 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a  LITE_CountRows;.
100b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
100c0 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
100d0 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b  QLITE_CountRows;
100e0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
100f0 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
10100 43 6d 70 28 7a 4c 65 66 74 2c 20 22 65 6d 70 74  Cmp(zLeft, "empt
10110 79 5f 72 65 73 75 6c 74 5f 63 61 6c 6c 62 61 63  y_result_callbac
10120 6b 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ks")==0 ){.    i
10130 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  f( getBoolean(zR
10140 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64  ight) ){.      d
10150 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
10160 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b  TE_NullCallback;
10170 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10180 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
10190 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62  SQLITE_NullCallb
101a0 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ack;.    }.  }el
101b0 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
101c0 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
101d0 74 61 62 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30 20  table_info")==0 
101e0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
101f0 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b  ab;.    Vdbe *v;
10200 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
10210 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  teFindTable(db, 
10220 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  zRight);.    if(
10230 20 70 54 61 62 20 29 20 76 20 3d 20 73 71 6c 69   pTab ) v = sqli
10240 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
10250 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
10260 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73 74  && v ){.      st
10270 61 74 69 63 20 56 64 62 65 4f 70 20 74 61 62 6c  atic VdbeOp tabl
10280 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d  eInfoPreface[] =
10290 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
102a0 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 35 2c 20  ColumnCount, 5, 
102b0 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  0,       0},.   
102c0 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
102d0 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
102e0 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20     "cid"},.     
102f0 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
10300 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20  me,  1, 0,      
10310 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20   "name"},.      
10320 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
10330 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20  e,  2, 0,       
10340 22 74 79 70 65 22 7d 2c 0a 20 20 20 20 20 20 20  "type"},.       
10350 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
10360 2c 20 20 33 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  3, 0,       "
10370 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20 20  notnull"},.     
10380 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
10390 6d 65 2c 20 20 34 2c 20 30 2c 20 20 20 20 20 20  me,  4, 0,      
103a0 20 22 64 66 6c 74 5f 76 61 6c 75 65 22 7d 2c 0a   "dflt_value"},.
103b0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
103c0 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt i;.      sqli
103d0 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
103e0 76 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61 62  v, ArraySize(tab
103f0 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c 20  leInfoPreface), 
10400 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65  tableInfoPreface
10410 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
10420 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
10430 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  s(pParse, pTab);
10440 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
10450 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
10460 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
10470 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
10480 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29  P_Integer, i, 0)
10490 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
104a0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
104b0 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
104c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
104d0 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
104e0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
104f0 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
10500 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10510 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10520 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
10530 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
10540 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
10550 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61   .           pTa
10560 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  b->aCol[i].zType
10570 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d   ? pTab->aCol[i]
10580 2e 7a 54 79 70 65 20 3a 20 22 74 65 78 74 22 2c  .zType : "text",
10590 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
105a0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
105b0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
105c0 65 72 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  er, pTab->aCol[i
105d0 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29 3b 0a 20  ].notNull, 0);. 
105e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
105f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
10600 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
10610 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
10620 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
10630 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  ab->aCol[i].zDfl
10640 74 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  t, P3_STATIC);. 
10650 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
10660 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
10670 6c 62 61 63 6b 2c 20 35 2c 20 30 29 3b 0a 20 20  lback, 5, 0);.  
10680 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
10690 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
106a0 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
106b0 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29 3d 3d 30  "index_info")==0
106c0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
106d0 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Idx;.    Table *
106e0 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a  pTab;.    Vdbe *
106f0 76 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71  v;.    pIdx = sq
10700 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62  liteFindIndex(db
10710 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69  , zRight);.    i
10720 66 28 20 70 49 64 78 20 29 20 76 20 3d 20 73 71  f( pIdx ) v = sq
10730 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
10740 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  se);.    if( pId
10750 78 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20  x && v ){.      
10760 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 74 61  static VdbeOp ta
10770 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d  bleInfoPreface[]
10780 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f   = {.        { O
10790 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33  P_ColumnCount, 3
107a0 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 0,       0},. 
107b0 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
107c0 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
107d0 20 20 20 20 20 22 73 65 71 6e 6f 22 7d 2c 0a 20       "seqno"},. 
107e0 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
107f0 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20  mnName,  1, 0,  
10800 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20       "cid"},.   
10810 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
10820 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20  Name,  2, 0,    
10830 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20     "name"},.    
10840 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69    };.      int i
10850 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
10860 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  Idx->pTable;.   
10870 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10880 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
10890 69 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65  ize(tableInfoPre
108a0 66 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f  face), tableInfo
108b0 50 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20  Preface);.      
108c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
108d0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
108e0 20 20 20 20 20 20 20 20 69 6e 74 20 63 6e 75 6d          int cnum
108f0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
10900 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  n[i];.        sq
10910 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
10920 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
10930 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
10940 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
10950 50 5f 49 6e 74 65 67 65 72 2c 20 63 6e 75 6d 2c  P_Integer, cnum,
10960 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
10970 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10980 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
10990 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
109a0 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 63 6e 75  ( pTab->nCol>cnu
109b0 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  m );.        sql
109c0 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
109d0 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f  v, -1, pTab->aCo
109e0 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 50  l[cnum].zName, P
109f0 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
10a00 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10a10 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
10a20 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20 20 20  k, 3, 0);.      
10a30 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
10a40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
10a50 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64  ICmp(zLeft, "ind
10a60 65 78 5f 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a  ex_list")==0 ){.
10a70 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
10a80 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
10a90 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
10aa0 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
10ab0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52  FindTable(db, zR
10ac0 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ight);.    if( p
10ad0 54 61 62 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  Tab ){.      v =
10ae0 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
10af0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 49  Parse);.      pI
10b00 64 78 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  dx = pTab->pInde
10b10 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
10b20 20 70 54 61 62 20 26 26 20 70 49 64 78 20 26 26   pTab && pIdx &&
10b30 20 76 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20   v ){.      int 
10b40 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 73 74  i = 0; .      st
10b50 61 74 69 63 20 56 64 62 65 4f 70 20 69 6e 64 65  atic VdbeOp inde
10b60 78 4c 69 73 74 50 72 65 66 61 63 65 5b 5d 20 3d  xListPreface[] =
10b70 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
10b80 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20  ColumnCount, 3, 
10b90 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  0,       0},.   
10ba0 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
10bb0 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
10bc0 20 20 20 22 73 65 71 22 7d 2c 0a 20 20 20 20 20     "seq"},.     
10bd0 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
10be0 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20  me,  1, 0,      
10bf0 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20   "name"},.      
10c00 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
10c10 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20  e,  2, 0,       
10c20 22 75 6e 69 71 75 65 22 7d 2c 0a 20 20 20 20 20  "unique"},.     
10c30 20 7d 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74   };..      sqlit
10c40 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
10c50 2c 20 41 72 72 61 79 53 69 7a 65 28 69 6e 64 65  , ArraySize(inde
10c60 78 4c 69 73 74 50 72 65 66 61 63 65 29 2c 20 69  xListPreface), i
10c70 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 29  ndexListPreface)
10c80 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 70 49  ;.      while(pI
10c90 64 78 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  dx){.        sql
10ca0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10cb0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
10cc0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10cd0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
10ce0 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
10cf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
10d00 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
10d10 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50  , pIdx->zName, P
10d20 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
10d30 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10d40 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
10d50 2c 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  , pIdx->onError!
10d60 3d 4f 45 5f 4e 6f 6e 65 2c 20 30 29 3b 0a 20 20  =OE_None, 0);.  
10d70 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
10d80 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
10d90 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20  back, 3, 0);.   
10da0 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20       ++i;.      
10db0 20 20 70 49 64 78 20 3d 20 70 49 64 78 2d 3e 70    pIdx = pIdx->p
10dc0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
10dd0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66    }.  }else..#if
10de0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66  ndef NDEBUG.  if
10df0 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
10e00 7a 4c 65 66 74 2c 20 22 70 61 72 73 65 72 5f 74  zLeft, "parser_t
10e10 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  race")==0 ){.   
10e20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c   extern void sql
10e30 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28 46  iteParserTrace(F
10e40 49 4c 45 2a 2c 20 63 68 61 72 20 2a 29 3b 0a 20  ILE*, char *);. 
10e50 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61     if( getBoolea
10e60 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
10e70 20 20 20 73 71 6c 69 74 65 50 61 72 73 65 72 54     sqliteParserT
10e80 72 61 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61  race(stdout, "pa
10e90 72 73 65 72 3a 20 22 29 3b 0a 20 20 20 20 7d 65  rser: ");.    }e
10ea0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
10eb0 65 50 61 72 73 65 72 54 72 61 63 65 28 30 2c 20  eParserTrace(0, 
10ec0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
10ed0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
10ee0 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
10ef0 65 66 74 2c 20 22 69 6e 74 65 67 72 69 74 79 5f  eft, "integrity_
10f00 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20  check")==0 ){.  
10f10 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
10f20 63 68 65 63 6b 44 62 5b 5d 20 3d 20 7b 0a 20 20  checkDb[] = {.  
10f30 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65      { OP_SetInse
10f40 72 74 2c 20 20 20 30 2c 20 30 2c 20 20 20 20 20  rt,   0, 0,     
10f50 20 20 20 22 32 22 7d 2c 0a 20 20 20 20 20 20 7b     "2"},.      {
10f60 20 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20   OP_Open,       
10f70 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d   0, 2,        0}
10f80 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77  ,.      { OP_Rew
10f90 69 6e 64 2c 20 20 20 20 20 20 30 2c 20 36 2c 20  ind,      0, 6, 
10fa0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
10fb0 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
10fc0 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20     0, 3,        
10fd0 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20  0},    /* 3 */. 
10fe0 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73       { OP_SetIns
10ff0 65 72 74 2c 20 20 20 30 2c 20 30 2c 20 20 20 20  ert,   0, 0,    
11000 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
11010 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 20  OP_Next,        
11020 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 3,        0},
11030 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
11040 67 72 69 74 79 43 6b 2c 20 30 2c 20 30 2c 20 20  grityCk, 0, 0,  
11050 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
11060 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  6 */.      { OP_
11070 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20  ColumnCount, 1, 
11080 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
11090 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
110a0 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
110b0 20 20 20 22 69 6e 74 65 67 72 69 74 79 5f 63 68     "integrity_ch
110c0 65 63 6b 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  eck"},.      { O
110d0 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31  P_Callback,    1
110e0 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
110f0 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e        { OP_SetIn
11100 73 65 72 74 2c 20 20 20 31 2c 20 30 2c 20 20 20  sert,   1, 0,   
11110 20 20 20 20 20 22 32 22 7d 2c 0a 20 20 20 20 20       "2"},.     
11120 20 7b 20 4f 50 5f 4f 70 65 6e 41 75 78 2c 20 20   { OP_OpenAux,  
11130 20 20 20 31 2c 20 32 2c 20 20 20 20 20 20 20 20     1, 2,        
11140 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  0},.      { OP_R
11150 65 77 69 6e 64 2c 20 20 20 20 20 20 31 2c 20 31  ewind,      1, 1
11160 36 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  6,       0},.   
11170 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20     { OP_Column, 
11180 20 20 20 20 20 31 2c 20 33 2c 20 20 20 20 20 20       1, 3,      
11190 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 33 20 2a    0},    /* 13 *
111a0 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74  /.      { OP_Set
111b0 49 6e 73 65 72 74 2c 20 20 20 31 2c 20 30 2c 20  Insert,   1, 0, 
111c0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
111d0 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20   { OP_Next,     
111e0 20 20 20 31 2c 20 31 33 2c 20 20 20 20 20 20 20     1, 13,       
111f0 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  0},.      { OP_I
11200 6e 74 65 67 72 69 74 79 43 6b 2c 20 31 2c 20 31  ntegrityCk, 1, 1
11210 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
11220 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 7b  /* 16 */.      {
11230 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20   OP_Callback,   
11240 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
11250 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62  ,.    };.    Vdb
11260 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74  e *v = sqliteGet
11270 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
11280 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
11290 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  urn;.    sqliteV
112a0 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
112b0 41 72 72 61 79 53 69 7a 65 28 63 68 65 63 6b 44  ArraySize(checkD
112c0 62 29 2c 20 63 68 65 63 6b 44 62 29 3b 0a 20 20  b), checkDb);.  
112d0 7d 65 6c 73 65 0a 0a 20 20 7b 7d 0a 20 20 73 71  }else..  {}.  sq
112e0 6c 69 74 65 46 72 65 65 28 7a 4c 65 66 74 29 3b  liteFree(zLeft);
112f0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52  .  sqliteFree(zR
11300 69 67 68 74 29 3b 0a 7d 0a                       ight);.}.