/ Hex Artifact Content
Login

Artifact b367b4a839f978c0225d984e327287852835948e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02a0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02b0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02c0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02d0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02e0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
02f0: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0300: 69 6c 64 2e 63 2c 76 20 31 2e 31 31 30 20 32 30  ild.c,v 1.110 20
0310: 30 32 2f 30 38 2f 32 34 20 31 38 3a 32 34 3a 35  02/08/24 18:24:5
0320: 33 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  3 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 69 66 28 20 70 50 61 72 73 65 2d  M;.  if( pParse-
3910: 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  >db->file_format
3920: 3e 3d 34 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=4 ){.    for(i
3930: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
3940: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 7a 5b        switch( z[
3950: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  i] ){.        ca
3960: 73 65 20 27 62 27 3a 0a 20 20 20 20 20 20 20 20  se 'b':.        
3970: 63 61 73 65 20 27 42 27 3a 20 7b 0a 20 20 20 20  case 'B': {.    
3980: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
3990: 53 74 72 4e 49 43 6d 70 28 26 7a 5b 69 5d 2c 22  StrNICmp(&z[i],"
39a0: 62 6c 6f 62 22 2c 34 29 3d 3d 30 20 29 7b 0a 20  blob",4)==0 ){. 
39b0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
39c0: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c  >sortOrder = SQL
39d0: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20  ITE_SO_TEXT;.   
39e0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
39f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3a00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3a10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3a20: 63 61 73 65 20 27 63 27 3a 0a 20 20 20 20 20 20  case 'c':.      
3a30: 20 20 63 61 73 65 20 27 43 27 3a 20 7b 0a 20 20    case 'C': {.  
3a40: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
3a50: 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 5b 69 5d  teStrNICmp(&z[i]
3a60: 2c 22 63 68 61 72 22 2c 34 29 3d 3d 30 20 7c 7c  ,"char",4)==0 ||
3a70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3a80: 20 20 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d     sqliteStrNICm
3a90: 70 28 26 7a 5b 69 5d 2c 22 63 6c 6f 62 22 2c 34  p(&z[i],"clob",4
3aa0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3ab0: 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72      pCol->sortOr
3ac0: 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  der = SQLITE_SO_
3ad0: 54 45 58 54 3b 0a 20 20 20 20 20 20 20 20 20 20  TEXT;.          
3ae0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
3af0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3b00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
3b10: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 78  .        case 'x
3b20: 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ':.        case 
3b30: 27 58 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  'X': {.         
3b40: 20 69 66 28 20 69 3e 3d 32 20 26 26 20 73 71 6c   if( i>=2 && sql
3b50: 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 5b 69  iteStrNICmp(&z[i
3b60: 2d 32 5d 2c 22 74 65 78 74 22 2c 34 29 3d 3d 30  -2],"text",4)==0
3b70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3b80: 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20  pCol->sortOrder 
3b90: 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  = SQLITE_SO_TEXT
3ba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
3bb0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  turn;.          
3bc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
3bd0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
3be0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
3bf0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
3c00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3c10: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
3c20: 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20  /*.** The given 
3c30: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66  token is the def
3c40: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
3c50: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
3c60: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  dded to.** the t
3c70: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
3c80: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
3c90: 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61  n.  If "minusFla
3ca0: 67 22 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a  g" is true, it.*
3cb0: 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75  * means the valu
3cc0: 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63  e token was prec
3cd0: 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20  eded by a minus 
3ce0: 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sign..**.** This
3cf0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
3d00: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
3d10: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
3d20: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
3d30: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
3d40: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  E statement..*/.
3d50: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 44 65  void sqliteAddDe
3d60: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
3d70: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
3d80: 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73  *pVal, int minus
3d90: 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Flag){.  Table *
3da0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
3db0: 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28  ar **pz;.  if( (
3dc0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
3dd0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
3de0: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
3df0: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29  l-1;.  if( i<0 )
3e00: 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20   return;.  pz = 
3e10: 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  &p->aCol[i].zDfl
3e20: 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c  t;.  if( minusFl
3e30: 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ag ){.    sqlite
3e40: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22  SetNString(pz, "
3e50: 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20  -", 1, pVal->z, 
3e60: 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d  pVal->n, 0);.  }
3e70: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
3e80: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
3e90: 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c  Val->z, pVal->n,
3ea0: 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
3eb0: 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d  eDequote(*pz);.}
3ec0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
3ed0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
3ee0: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
3ef0: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
3f00: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
3f10: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
3f20: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
3f30: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
3f40: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
3f50: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
3f60: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
3f70: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
3f80: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
3f90: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
3fa0: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
3fb0: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
3fc0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
3fd0: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
3fe0: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
3ff0: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
4000: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
4010: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
4020: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
4030: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
4040: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
4050: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
4060: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
4070: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
4080: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
4090: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
40a0: 20 72 6f 77 20 69 64 2e 20 20 28 45 78 63 65 70   row id.  (Excep
40b0: 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63  tion:.** For bac
40c0: 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
40d0: 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
40e0: 64 61 74 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f  databases, do no
40f0: 74 20 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20  t do this.** if 
4100: 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  the file format 
4110: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
4120: 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2e 29 20  s less than 1.) 
4130: 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69   Set the Table.i
4140: 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  PKey.** field of
4150: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
4160: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f   construction to
4170: 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66   be the index of
4180: 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20   the.** INTEGER 
4190: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
41a0: 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79  mn.  Table.iPKey
41b0: 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66   is set to -1 if
41c0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
41d0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
41e0: 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  KEY..**.** If th
41f0: 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20  e key is not an 
4200: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4210: 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65  KEY, then create
4220: 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64   a unique.** ind
4230: 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20  ex for the key. 
4240: 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65   No index is cre
4250: 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52  ated for INTEGER
4260: 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a   PRIMARY KEYs..*
4270: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64  /.void sqliteAdd
4280: 50 72 69 6d 61 72 79 4b 65 79 28 50 61 72 73 65  PrimaryKey(Parse
4290: 20 2a 70 50 61 72 73 65 2c 20 49 64 4c 69 73 74   *pParse, IdList
42a0: 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 6f 6e 45   *pList, int onE
42b0: 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rror){.  Table *
42c0: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
42d0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72  NewTable;.  char
42e0: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
42f0: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  nt iCol = -1;.  
4300: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
4310: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62  turn;.  if( pTab
4320: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a  ->hasPrimKey ){.
4330: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
4340: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
4350: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 5c 22 22  rMsg, "table \""
4360: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a  , pTab->zName, .
4370: 20 20 20 20 20 20 20 20 22 5c 22 20 68 61 73 20          "\" has 
4380: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
4390: 69 6d 61 72 79 20 6b 65 79 22 2c 20 30 29 3b 0a  imary key", 0);.
43a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
43b0: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
43c0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50    }.  pTab->hasP
43d0: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66  rimKey = 1;.  if
43e0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
43f0: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    iCol = pTab->n
4400: 43 6f 6c 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65  Col - 1;.  }else
4410: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3d   if( pList->nId=
4420: 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 43  =1 ){.    for(iC
4430: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
4440: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
4450: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
4460: 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
4470: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  [0].zName, pTab-
4480: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
4490: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
44a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
44b0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
44c0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
44d0: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
44e0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
44f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
4500: 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  e->db->file_form
4510: 61 74 3e 3d 31 20 26 26 20 0a 20 20 20 20 20 20  at>=1 && .      
4520: 20 20 20 20 20 7a 54 79 70 65 20 26 26 20 73 71       zType && sq
4530: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 54 79 70  liteStrICmp(zTyp
4540: 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30  e, "INTEGER")==0
4550: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   ){.    pTab->iP
4560: 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Key = iCol;.    
4570: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20  pTab->keyConf = 
4580: 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65  onError;.  }else
4590: 7b 0a 20 20 20 20 73 71 6c 69 74 65 43 72 65 61  {.    sqliteCrea
45a0: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
45b0: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
45c0: 72 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  rror, 0, 0);.  }
45d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
45e0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
45f0: 20 63 6f 6c 6c 61 74 69 6e 67 20 74 79 70 65 20   collating type 
4600: 67 69 76 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74  given the collat
4610: 69 6f 6e 20 74 79 70 65 20 74 6f 6b 65 6e 2e 0a  ion type token..
4620: 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  ** Report an err
4630: 6f 72 20 69 66 20 74 68 65 20 74 79 70 65 20 69  or if the type i
4640: 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
4650: 69 6e 74 20 73 71 6c 69 74 65 43 6f 6c 6c 61 74  int sqliteCollat
4660: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
4670: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70  rse, Token *pTyp
4680: 65 29 7b 0a 20 20 69 66 28 20 70 54 79 70 65 3d  e){.  if( pType=
4690: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
46a0: 54 45 5f 53 4f 5f 55 4e 4b 3b 0a 20 20 69 66 28  TE_SO_UNK;.  if(
46b0: 20 70 54 79 70 65 2d 3e 6e 3d 3d 34 20 26 26 20   pType->n==4 && 
46c0: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70  sqliteStrNICmp(p
46d0: 54 79 70 65 2d 3e 7a 2c 20 22 74 65 78 74 22 2c  Type->z, "text",
46e0: 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   4)==0 ){.    re
46f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54  turn SQLITE_SO_T
4700: 45 58 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  EXT;.  }.  if( p
4710: 54 79 70 65 2d 3e 6e 3d 3d 37 20 26 26 20 73 71  Type->n==7 && sq
4720: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70 54 79  liteStrNICmp(pTy
4730: 70 65 2d 3e 7a 2c 20 22 6e 75 6d 65 72 69 63 22  pe->z, "numeric"
4740: 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  , 7)==0 ){.    r
4750: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
4760: 4e 55 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  NUM;.  }.  sqlit
4770: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
4780: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
4790: 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67  nknown collating
47a0: 20 74 79 70 65 3a 20 22 2c 20 2d 31 2c 0a 20 20   type: ", -1,.  
47b0: 20 20 70 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70    pType->z, pTyp
47c0: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 70 50 61 72  e->n, 0);.  pPar
47d0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 72 65  se->nErr++;.  re
47e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 55  turn SQLITE_SO_U
47f0: 4e 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  NK;.}../*.** Thi
4800: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
4810: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
4820: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
4830: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
4840: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
4850: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  LE statement.  A
4860: 20 22 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73   "COLLATE" claus
4870: 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  e has.** been se
4880: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
4890: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
48a0: 74 73 20 74 68 65 20 43 6f 6c 75 6d 6e 2e 73 6f  ts the Column.so
48b0: 72 74 4f 72 64 65 72 20 6f 6e 0a 2a 2a 20 74 68  rtOrder on.** th
48c0: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
48d0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
48e0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
48f0: 71 6c 69 74 65 41 64 64 43 6f 6c 6c 61 74 65 54  qliteAddCollateT
4900: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
4910: 65 2c 20 69 6e 74 20 63 6f 6c 6c 54 79 70 65 29  e, int collType)
4920: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
4930: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
4940: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4950: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4960: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
4970: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
4980: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 73 6f 72 74 4f  p->aCol[i].sortO
4990: 72 64 65 72 20 3d 20 63 6f 6c 6c 54 79 70 65 3b  rder = collType;
49a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75  .}../*.** Come u
49b0: 70 20 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e  p with a new ran
49c0: 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  dom value for th
49d0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
49e0: 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74    Make sure.** t
49f0: 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20  he new value is 
4a00: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
4a10: 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  he old..**.** Th
4a20: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
4a30: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
4a40: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
4a50: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
4a60: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
4a70: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
4a80: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
4a90: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
4aa0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
4ab0: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
4ac0: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
4ad0: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
4ae0: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
4af0: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
4b00: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
4b10: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
4b20: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
4b30: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
4b40: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
4b50: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
4b60: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
4b70: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
4b80: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
4b90: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
4ba0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
4bb0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
4bc0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
4bd0: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
4be0: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
4bf0: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
4c00: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
4c10: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
4c20: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
4c30: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
4c40: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
4c50: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
4c60: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
4c70: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
4c80: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
4c90: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
4ca0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
4cb0: 69 64 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43  id sqliteChangeC
4cc0: 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64 62  ookie(sqlite *db
4cd0: 2c 20 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66  , Vdbe *v){.  if
4ce0: 28 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  ( db->next_cooki
4cf0: 65 3d 3d 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f  e==db->schema_co
4d00: 6f 6b 69 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  okie ){.    db->
4d10: 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62  next_cookie = db
4d20: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20  ->schema_cookie 
4d30: 2b 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42 79  + sqliteRandomBy
4d40: 74 65 28 29 20 2b 20 31 3b 0a 20 20 20 20 64 62  te() + 1;.    db
4d50: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
4d60: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
4d70: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4d80: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
4d90: 65 72 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  er, db->next_coo
4da0: 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  kie, 0);.    sql
4db0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4dc0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c  OP_SetCookie, 0,
4dd0: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
4de0: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
4df0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
4e00: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
4e10: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
4e20: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
4e30: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
4e40: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
4e50: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
4e60: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
4e70: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
4e80: 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  inator..*/.stati
4e90: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
4ea0: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
4eb0: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  {.  int n;.  int
4ec0: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 30 3b 0a   needQuote = 0;.
4ed0: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
4ee0: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
4ef0: 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b  ( *z=='\'' ){ n+
4f00: 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b 20  +; needQuote=1; 
4f10: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
4f20: 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a   + needQuote*2;.
4f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
4f40: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74  n identifier ont
4f50: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
4f60: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20   given string.  
4f70: 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61  Add.** quote cha
4f80: 72 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65  racters as neede
4f90: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
4fa0: 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20  d identPut(char 
4fb0: 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63  *z, int *pIdx, c
4fc0: 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20  har *zIdent){.  
4fd0: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
4fe0: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
4ff0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
5000: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
5010: 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a    if( !isalnum(z
5020: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
5030: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
5040: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
5050: 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a  uote =  zIdent[j
5060: 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28  ]!=0 || isdigit(
5070: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
5090: 73 71 6c 69 74 65 4b 65 79 77 6f 72 64 43 6f 64  sqliteKeywordCod
50a0: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
50b0: 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51  _ID;.  if( needQ
50c0: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
50d0: 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  '\'';.  for(j=0;
50e0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
50f0: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
5100: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
5110: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27  ( zIdent[j]=='\'
5120: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27  ' ) z[i++] = '\'
5130: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
5140: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
5150: 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d  = '\'';.  z[i] =
5160: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
5170: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
5180: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
5190: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
51a0: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
51b0: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
51c0: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
51d0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
51e0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
51f0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
5200: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
5210: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
5220: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
5230: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
5240: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
5250: 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70  bleStmt(Table *p
5260: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
5270: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
5280: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
5290: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20  zSep2, *zEnd;.  
52a0: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  n = 0;.  for(i=0
52b0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
52c0: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e  ){.    n += iden
52d0: 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c 5b  tLength(p->aCol[
52e0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
52f0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
5300: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
5310: 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a  f( n<40 ){.    z
5320: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53  Sep = "";.    zS
5330: 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a  ep2 = ",";.    z
5340: 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c  End = ")";.  }el
5350: 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  se{.    zSep = "
5360: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32  \n  ";.    zSep2
5370: 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20   = ",\n  ";.    
5380: 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20  zEnd = "\n)";.  
5390: 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a  }.  n += 35 + 6*
53a0: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74  p->nCol;.  zStmt
53b0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
53c0: 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d   n );.  if( zStm
53d0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
53e0: 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c  .  strcpy(zStmt,
53f0: 20 70 2d 3e 69 73 54 65 6d 70 20 3f 20 22 43 52   p->isTemp ? "CR
5400: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
5410: 22 20 3a 20 22 43 52 45 41 54 45 20 54 41 42 4c  " : "CREATE TABL
5420: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c  E ");.  k = strl
5430: 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  en(zStmt);.  ide
5440: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
5450: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
5460: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
5470: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5480: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
5490: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
54a0: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
54b0: 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b  = strlen(&zStmt[
54c0: 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  k]);.    zSep = 
54d0: 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74  zSep2;.    ident
54e0: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
54f0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
5500: 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26  ;.  }.  strcpy(&
5510: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b  zStmt[k], zEnd);
5520: 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b  .  return zStmt;
5530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
5540: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5550: 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66   to report the f
5560: 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65  inal ")" that te
5570: 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52  rminates.** a CR
5580: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5590: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
55a0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
55b0: 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f  that other actio
55c0: 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  n routines have 
55d0: 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a  been building.**
55e0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
55f0: 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
5600: 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20  ables, assuming 
5610: 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a  no errors have.*
5620: 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a  * occurred..**.*
5630: 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  * An entry for t
5640: 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65  he table is made
5650: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74   in the master t
5660: 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 0a 2a 2a  able on disk,.**
5670: 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20   unless this is 
5680: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
5690: 65 20 6f 72 20 69 6e 69 74 46 6c 61 67 3d 3d 31  e or initFlag==1
56a0: 2e 20 20 57 68 65 6e 20 69 6e 69 74 46 6c 61 67  .  When initFlag
56b0: 3d 3d 31 2c 0a 2a 2a 20 69 74 20 6d 65 61 6e 73  ==1,.** it means
56c0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
56d0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
56e0: 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20  r table because 
56f0: 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65  we just.** conne
5700: 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  cted to the data
5710: 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20  base or because 
5720: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
5730: 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72  r table has.** r
5740: 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c  ecently changes,
5750: 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f   so the entry fo
5760: 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72  r this table alr
5770: 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a  eady exists in.*
5780: 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
5790: 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64  ter table.  We d
57a0: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72  o not want to cr
57b0: 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a  eate it again..*
57c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c  *.** If the pSel
57d0: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ect argument is 
57e0: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  not NULL, it mea
57f0: 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ns that this rou
5800: 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c  tine.** was call
5810: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ed to create a t
5820: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66  able generated f
5830: 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54  rom a .** "CREAT
5840: 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53  E TABLE ... AS S
5850: 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65  ELECT ..." state
5860: 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d  ment.  The colum
5870: 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  n names of.** th
5880: 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c  e new table will
5890: 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c   match the resul
58a0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
58b0: 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
58c0: 69 74 65 45 6e 64 54 61 62 6c 65 28 50 61 72 73  iteEndTable(Pars
58d0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
58e0: 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a   *pEnd, Select *
58f0: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
5900: 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a  e *p;.  sqlite *
5910: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5920: 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30  ..  if( (pEnd==0
5930: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20   && pSelect==0) 
5940: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
5950: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
5960: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
5970: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
5980: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
5990: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
59a0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
59b0: 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
59c0: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
59d0: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
59e0: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ase..  */.  asse
59f0: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65  rt( pParse->name
5a00: 43 6c 61 73 68 3d 3d 30 20 7c 7c 20 70 50 61 72  Clash==0 || pPar
5a10: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 31 20  se->initFlag==1 
5a20: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
5a30: 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70  >explain==0 && p
5a40: 50 61 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68  Parse->nameClash
5a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ==0 ){.    Table
5a60: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 70 4f 6c 64   *pOld;.    pOld
5a70: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73   = sqliteHashIns
5a80: 65 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68  ert(&db->tblHash
5a90: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  , p->zName, strl
5aa0: 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  en(p->zName)+1, 
5ab0: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
5ac0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
5ad0: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
5ae0: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
5af0: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
5b00: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
5b10: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
5b20: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
5b30: 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
5b40: 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b     db->nTable++;
5b50: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
5b60: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
5b70: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f  hanges;.  }..  /
5b80: 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  * If the table i
5b90: 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  s generated from
5ba0: 20 61 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20   a SELECT, then 
5bb0: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 0a 20 20  construct the.  
5bc0: 2a 2a 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  ** list of colum
5bd0: 6e 73 20 61 6e 64 20 74 68 65 20 74 65 78 74 20  ns and the text 
5be0: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
5bf0: 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  */.  if( pSelect
5c00: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
5c10: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 52  SelTab = sqliteR
5c20: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
5c30: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c  (pParse, 0, pSel
5c40: 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 70 53  ect);.    if( pS
5c50: 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  elTab==0 ) retur
5c60: 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  n;.    assert( p
5c70: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
5c80: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
5c90: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d  ab->nCol;.    p-
5ca0: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
5cb0: 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54  >aCol;.    pSelT
5cc0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
5cd0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
5ce0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  = 0;.    sqliteD
5cf0: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
5d00: 65 6c 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f  elTab);.  }..  /
5d10: 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61  * If the initFla
5d20: 67 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  g is 1 it means 
5d30: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
5d40: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
5d50: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
5d60: 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
5d70: 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
5d80: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
5d90: 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
5da0: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
5db0: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
5dc0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
5dd0: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
5de0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
5df0: 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d   pParse->newTnum
5e00: 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61   field.  (The pa
5e10: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73  ge number.  ** s
5e20: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
5e30: 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65  put there by the
5e40: 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f   sqliteOpenCb ro
5e50: 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69  utine.).  */.  i
5e60: 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  f( pParse->initF
5e70: 6c 61 67 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  lag ){.    p->tn
5e80: 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77  um = pParse->new
5e90: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
5ea0: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
5eb0: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
5ec0: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
5ed0: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
5ee0: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
5ef0: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
5f00: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
5f10: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a  e record number.
5f20: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77    ** for the new
5f30: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f   table entry sho
5f40: 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f  uld already be o
5f50: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  n the stack..  *
5f60: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
5f70: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
5f80: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
5f90: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
5fa0: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
5fb0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
5fc0: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
5fd0: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
5fe0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e   if( !pParse->in
5ff0: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 6e  itFlag ){.    in
6000: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
6010: 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  ;..    v = sqlit
6020: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
6030: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
6040: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
6050: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
6060: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
6070: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
6080: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6090: 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  dOp(v, OP_Create
60a0: 54 61 62 6c 65 2c 20 30 2c 20 70 2d 3e 69 73 54  Table, 0, p->isT
60b0: 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  emp);.      sqli
60c0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
60d0: 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 26 70  , -1, (char *)&p
60e0: 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54  ->tnum, P3_POINT
60f0: 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ER);.    }else{.
6100: 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
6110: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  */.      sqliteV
6120: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6130: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
6140: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d     }.    p->tnum
6150: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
6160: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6170: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
6180: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6190: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
61a0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 0);.    if( p-
61b0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
61c0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
61d0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
61e0: 74 61 62 6c 65 22 2c 20 50 33 5f 53 54 41 54 49  table", P3_STATI
61f0: 43 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  C);.    }else{. 
6200: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
6210: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
6220: 76 69 65 77 22 2c 20 50 33 5f 53 54 41 54 49 43  view", P3_STATIC
6230: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6240: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6250: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
6260: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
6270: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
6280: 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  p->zName, P3_STA
6290: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
62a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
62b0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
62c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
62d0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e  ngeP3(v, -1, p->
62e0: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
62f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
6300: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
6310: 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 4, 0);.    sql
6320: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6330: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
6340: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
6350: 74 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  t ){.      char 
6360: 2a 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65  *z = createTable
6370: 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 6e  Stmt(p);.      n
6380: 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29   = z ? strlen(z)
6390: 20 3a 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   : 0;.      sqli
63a0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
63b0: 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  , -1, z, n);.   
63c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
63d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
63e0: 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21     assert( pEnd!
63f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  =0 );.      n = 
6400: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
6410: 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73 46 69  Addr(pParse->sFi
6420: 72 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b  rstToken.z) + 1;
6430: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6440: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
6450: 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54   pParse->sFirstT
6460: 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20  oken.z, n);.    
6470: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
6480: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
6490: 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20  Record, 5, 0);. 
64a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
64b0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
64c0: 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ey, 0, 0);.    i
64d0: 66 28 20 21 70 2d 3e 69 73 54 65 6d 70 20 29 7b  f( !p->isTemp ){
64e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61  .      sqliteCha
64f0: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29  ngeCookie(db, v)
6500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6510: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6520: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
6530: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
6540: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  ){.      int op 
6550: 3d 20 70 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50  = p->isTemp ? OP
6560: 5f 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f  _OpenWrAux : OP_
6570: 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
6580: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6590: 28 76 2c 20 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  (v, op, 1, 0);. 
65a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
65b0: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
65c0: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
65d0: 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54  , pSelect, SRT_T
65e0: 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30  able, 1, 0, 0, 0
65f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6600: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
6610: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
6620: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  }.}../*.** The p
6630: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
6640: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
6650: 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
6660: 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
6670: 71 6c 69 74 65 43 72 65 61 74 65 56 69 65 77 28  qliteCreateView(
6680: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6690: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  ,     /* The par
66a0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
66b0: 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c    Token *pBegin,
66c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
66d0: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
66e0: 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  gins the stateme
66f0: 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
6700: 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  Name,      /* Th
6710: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
6720: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
6730: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c  he view */.  Sel
6740: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
6750: 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
6760: 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
6770: 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
6780: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
6790: 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54  emp         /* T
67a0: 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
67b0: 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20  ARY view */.){. 
67c0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
67d0: 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
67e0: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
67f0: 64 3b 0a 0a 20 20 73 71 6c 69 74 65 53 74 61 72  d;..  sqliteStar
6800: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
6810: 42 65 67 69 6e 2c 20 70 4e 61 6d 65 2c 20 69 73  Begin, pName, is
6820: 54 65 6d 70 29 3b 0a 20 20 70 20 3d 20 70 50 61  Temp);.  p = pPa
6830: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
6840: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
6850: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
6860: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
6870: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6880: 20 2f 2a 20 49 67 6e 6f 72 65 20 4f 52 44 45 52   /* Ignore ORDER
6890: 20 42 59 20 63 6c 61 75 73 65 73 20 6f 6e 20 61   BY clauses on a
68a0: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
68b0: 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72   pSelect->pOrder
68c0: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
68d0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
68e0: 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79  Select->pOrderBy
68f0: 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e  );.    pSelect->
6900: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
6910: 7d 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  }.  /* Make a co
6920: 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  py of the entire
6930: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6940: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
6950: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68  he view..  ** Th
6960: 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c  is will force al
6970: 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  l the Expr.token
6980: 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  .z values to be 
6990: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
69a0: 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65   allocated rathe
69b0: 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20  r than point to 
69c0: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
69d0: 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74   - which means t
69e0: 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69  hat.  ** they wi
69f0: 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72  ll persist after
6a00: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c   the current sql
6a10: 69 74 65 5f 65 78 65 63 28 29 20 63 61 6c 6c 20  ite_exec() call 
6a20: 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20  returns..  */.  
6a30: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  p->pSelect = sql
6a40: 69 74 65 53 65 6c 65 63 74 44 75 70 28 70 53 65  iteSelectDup(pSe
6a50: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 53  lect);.  sqliteS
6a60: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
6a70: 65 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ect);.  if( !pPa
6a80: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b  rse->initFlag ){
6a90: 0a 20 20 20 20 73 71 6c 69 74 65 56 69 65 77 47  .    sqliteViewG
6aa0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
6ab0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20  arse, p);.  }.. 
6ac0: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
6ad0: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
6ae0: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
6af0: 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
6b00: 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
6b10: 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
6b20: 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
6b30: 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  ken;.  if( sEnd.
6b40: 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e  z[0]!=0 && sEnd.
6b50: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
6b60: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
6b70: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
6b80: 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74  = 0;.  n = ((int
6b90: 29 73 45 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29  )sEnd.z) - (int)
6ba0: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d  pBegin->z;.  z =
6bb0: 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68   pBegin->z;.  wh
6bc0: 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e  ile( n>0 && (z[n
6bd0: 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70  -1]==';' || issp
6be0: 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20  ace(z[n-1])) ){ 
6bf0: 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20  n--; }.  sEnd.z 
6c00: 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e  = &z[n-1];.  sEn
6c10: 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55  d.n = 1;..  /* U
6c20: 73 65 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c  se sqliteEndTabl
6c30: 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
6c40: 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
6c50: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
6c60: 2f 0a 20 20 73 71 6c 69 74 65 45 6e 64 54 61 62  /.  sqliteEndTab
6c70: 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45 6e 64  le(pParse, &sEnd
6c80: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  , 0);.  return;.
6c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  }../*.** The Tab
6ca0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
6cb0: 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
6cc0: 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
6cd0: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
6ce0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
6cf0: 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
6d00: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
6d10: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
6d20: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
6d30: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
6d40: 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
6d50: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
6d60: 70 50 61 72 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  pPare->zErrMsg..
6d70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 56 69 65  */.int sqliteVie
6d80: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
6d90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
6da0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
6db0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6dc0: 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  t;.  Select *pSe
6dd0: 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  l;.  Table *pSel
6de0: 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20  Tab;.  int nErr 
6df0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
6e00: 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  pTable );..  /* 
6e10: 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
6e20: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
6e30: 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
6e40: 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
6e50: 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
6e60: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
6e70: 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
6e80: 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
6e90: 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
6ea0: 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
6eb0: 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
6ec0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
6ed0: 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
6ee0: 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
6ef0: 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
6f00: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
6f10: 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
6f20: 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
6f30: 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
6f40: 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
6f50: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
6f60: 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
6f70: 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
6f80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
6f90: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
6fa0: 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
6fb0: 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
6fc0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
6fd0: 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69  ly, this error i
6fe0: 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75  s caught previou
6ff0: 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66  sly and so the f
7000: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20  ollowing test.  
7010: 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  ** should always
7020: 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77   fail.  But we w
7030: 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20  ill leave it in 
7040: 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65  place just to be
7050: 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   safe..  */.  if
7060: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
7070: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
7080: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
7090: 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69 65 77 20  >zErrMsg, "view 
70a0: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
70b0: 2c 0a 20 20 20 20 20 20 20 20 20 22 20 69 73 20  ,.         " is 
70c0: 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
70d0: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
70e0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
70f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
7100: 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
7110: 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
7120: 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
7130: 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
7140: 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ames..  */.  ass
7150: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65  ert( pTable->pSe
7160: 6c 65 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43  lect ); /* If nC
7170: 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61 62  ol==0, then pTab
7180: 6c 65 20 6d 75 73 74 20 62 65 20 61 20 56 49 45  le must be a VIE
7190: 57 20 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54  W */.  pSel = pT
71a0: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a  able->pSelect;..
71b0: 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    /* Note that t
71c0: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
71d0: 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  eResultSetOfSele
71e0: 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
71f0: 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
7200: 65 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c  ements in this l
7210: 69 73 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c  ist.  But we wil
7220: 6c 20 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72  l need to restor
7230: 65 20 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20  e the list.  ** 
7240: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
7250: 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69  inal configurati
7260: 6f 6e 20 61 66 74 65 72 77 61 72 64 73 2c 20 73  on afterwards, s
7270: 6f 20 77 65 20 73 61 76 65 20 61 20 63 6f 70 79  o we save a copy
7280: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69   of.  ** the ori
7290: 67 69 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e  ginal in pEList.
72a0: 0a 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  .  */.  pEList =
72b0: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20   pSel->pEList;. 
72c0: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
72d0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75  sqliteExprListDu
72e0: 70 28 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28  p(pEList);.  if(
72f0: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30   pSel->pEList==0
7300: 20 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45   ){.    pSel->pE
7310: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
7320: 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a     return 1;  /*
7330: 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a   Malloc failed *
7340: 2f 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  /.  }.  pTable->
7350: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65  nCol = -1;.  pSe
7360: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 52 65 73  lTab = sqliteRes
7370: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
7380: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
7390: 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29  .  if( pSelTab )
73a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
73b0: 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
73c0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
73d0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
73e0: 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  l;.    pTable->a
73f0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
7400: 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  Col;.    pSelTab
7410: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
7420: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
7430: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c  0;.    sqliteDel
7440: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c  eteTable(0, pSel
7450: 54 61 62 29 3b 0a 20 20 20 20 70 50 61 72 73 65  Tab);.    pParse
7460: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53  ->db->flags |= S
7470: 51 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65  QLITE_UnresetVie
7480: 77 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ws;.  }else{.   
7490: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
74a0: 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  0;.    nErr++;. 
74b0: 20 7d 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63   }.  sqliteSelec
74c0: 74 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20  tUnbind(pSel);. 
74d0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
74e0: 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69  elete(pSel->pELi
74f0: 73 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c  st);.  pSel->pEL
7500: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
7510: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
7520: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
7530: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
7540: 72 6f 6d 20 74 68 65 20 56 49 45 57 20 70 54 61  rom the VIEW pTa
7550: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ble..**.** This 
7560: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7570: 64 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 6f  d whenever any o
7580: 74 68 65 72 20 74 61 62 6c 65 20 6f 72 20 76 69  ther table or vi
7590: 65 77 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a  ew is modified..
75a0: 2a 2a 20 54 68 65 20 76 69 65 77 20 70 61 73 73  ** The view pass
75b0: 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
75c0: 74 69 6e 65 20 6d 69 67 68 74 20 64 65 70 65 6e  tine might depen
75d0: 64 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e  d directly or in
75e0: 64 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74  directly.** on t
75f0: 68 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64  he modified or d
7600: 65 6c 65 74 65 64 20 74 61 62 6c 65 20 73 6f 20  eleted table so 
7610: 77 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72  we need to clear
7620: 20 74 68 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a   the old column.
7630: 2a 2a 20 6e 61 6d 65 73 20 73 6f 20 74 68 61 74  ** names so that
7640: 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65   they will be re
7650: 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  computed..*/.sta
7660: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
7670: 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iewResetColumnNa
7680: 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c  mes(Table *pTabl
7690: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
76a0: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 7c 7c 20  f( pTable==0 || 
76b0: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d  pTable->pSelect=
76c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
76d0: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d  f( pTable->nCol=
76e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
76f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
7700: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
7710: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
7720: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  ble->aCol[i].zNa
7730: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
7740: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
7750: 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  [i].zDflt);.    
7760: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
7770: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  e->aCol[i].zType
7780: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
7790: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
77a0: 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  );.  pTable->aCo
77b0: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
77c0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nCol = 0;.}../*
77d0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
77e0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
77f0: 65 76 65 72 79 20 56 49 45 57 2e 0a 2a 2f 0a 76  every VIEW..*/.v
7800: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
7810: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64  setAll(sqlite *d
7820: 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  b){.  HashElem *
7830: 69 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  i;.  if( (db->fl
7840: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 55 6e 72  ags & SQLITE_Unr
7850: 65 73 65 74 56 69 65 77 73 29 3d 3d 30 20 29 20  esetViews)==0 ) 
7860: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
7870: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
7880: 26 64 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69  &db->tblHash); i
7890: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
78a0: 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
78b0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
78c0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
78d0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
78e0: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
78f0: 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d  teViewResetColum
7900: 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20  nNames(pTab);.  
7910: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c    }.  }.  db->fl
7920: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 55  ags &= ~SQLITE_U
7930: 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 7d 0a 0a  nresetViews;.}..
7940: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
7950: 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74  ken, look up a t
7960: 61 62 6c 65 20 77 69 74 68 20 74 68 61 74 20 6e  able with that n
7970: 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75  ame.  If not fou
7980: 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20  nd, leave.** an 
7990: 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20 70 61  error for the pa
79a0: 72 73 65 72 20 74 6f 20 66 69 6e 64 20 61 6e 64  rser to find and
79b0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
79c0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 54 61  .Table *sqliteTa
79d0: 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72  bleFromToken(Par
79e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
79f0: 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72  n *pTok){.  char
7a00: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65   *zName;.  Table
7a10: 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20   *pTab;.  zName 
7a20: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d  = sqliteTableNam
7a30: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29  eFromToken(pTok)
7a40: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
7a50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
7a60: 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  Tab = sqliteFind
7a70: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
7a80: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
7a90: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
7aa0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
7ab0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
7ac0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
7ad0: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
7ae0: 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20  table: ", 0, .  
7af0: 20 20 20 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70        pTok->z, p
7b00: 54 6f 6b 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  Tok->n, 0);.    
7b10: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
7b20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61    }.  return pTa
7b30: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  b;.}../*.** This
7b40: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7b50: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
7b60: 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
7b70: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
7b80: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
7b90: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
7ba0: 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
7bb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70  .void sqliteDrop
7bc0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
7bd0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
7be0: 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a  e, int isView){.
7bf0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
7c00: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
7c10: 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65  t base;.  sqlite
7c20: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
7c30: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
7c40: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
7c50: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
7c60: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c   return;.  pTabl
7c70: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 46  e = sqliteTableF
7c80: 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  romToken(pParse,
7c90: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70   pName);.  if( p
7ca0: 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72  Table==0 ) retur
7cb0: 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  n;.  if( pTable-
7cc0: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
7cd0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
7ce0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
7cf0: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61  g, "table ", pTa
7d00: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20  ble->zName, .   
7d10: 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65      " may not be
7d20: 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
7d30: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
7d40: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
7d50: 20 7d 0a 20 20 69 66 28 20 69 73 56 69 65 77 20   }.  if( isView 
7d60: 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  && pTable->pSele
7d70: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
7d80: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
7d90: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
7da0: 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
7db0: 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 22  o delete table "
7dc0: 2c 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ,.      pTable->
7dd0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70  zName, 0);.    p
7de0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
7df0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
7e00: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
7e10: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
7e20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
7e30: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
7e40: 7a 45 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52  zErrMsg, "use DR
7e50: 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
7e60: 65 20 76 69 65 77 20 22 2c 0a 20 20 20 20 20 20  e view ",.      
7e70: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30  pTable->zName, 0
7e80: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
7e90: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
7ea0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  n;.  }..  /* Gen
7eb0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
7ec0: 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
7ed0: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
7ee0: 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
7ef0: 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
7f00: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
7f10: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
7f20: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
7f30: 70 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20  p dropTable[] = 
7f40: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77  {.      { OP_Rew
7f50: 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52  ind,     0, ADDR
7f60: 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20  (8),  0},.      
7f70: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
7f80: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
7f90: 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20  , /* 1 */.      
7fa0: 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20  { OP_MemStore,  
7fb0: 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d   1, 1,        0}
7fc0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  ,.      { OP_Mem
7fd0: 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20  Load,    1, 0,  
7fe0: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a        0}, /* 3 *
7ff0: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  /.      { OP_Col
8000: 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20 20  umn,     0, 2,  
8010: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
8020: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
8030: 20 30 2c 20 41 44 44 52 28 37 29 2c 20 20 30 7d   0, ADDR(7),  0}
8040: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c  ,.      { OP_Del
8050: 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ete,     0, 0,  
8060: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
8070: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
8080: 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d   0, ADDR(3),  0}
8090: 2c 20 2f 2a 20 37 20 2a 2f 0a 20 20 20 20 7d 3b  , /* 7 */.    };
80a0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
80b0: 3b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70  ;.    Trigger *p
80c0: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71 6c  Trigger;.    sql
80d0: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
80e0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
80f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65  );.    sqliteOpe
8100: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
8110: 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b  pTable->isTemp);
8120: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
8130: 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
8140: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
8150: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
8160: 64 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65  d */.    pTrigge
8170: 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69  r = pTable->pTri
8180: 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  gger;.    while(
8190: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
81a0: 20 20 20 54 6f 6b 65 6e 20 74 74 3b 0a 20 20 20     Token tt;.   
81b0: 20 20 20 74 74 2e 7a 20 3d 20 70 54 61 62 6c 65     tt.z = pTable
81c0: 2d 3e 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65  ->pTrigger->name
81d0: 3b 0a 20 20 20 20 20 20 74 74 2e 6e 20 3d 20 73  ;.      tt.n = s
81e0: 74 72 6c 65 6e 28 70 54 61 62 6c 65 2d 3e 70 54  trlen(pTable->pT
81f0: 72 69 67 67 65 72 2d 3e 6e 61 6d 65 29 3b 0a 20  rigger->name);. 
8200: 20 20 20 20 20 73 71 6c 69 74 65 44 72 6f 70 54       sqliteDropT
8210: 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 26  rigger(pParse, &
8220: 74 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  tt, 1);.      if
8230: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
8240: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  n ){.        pTr
8250: 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
8260: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
8270: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
8280: 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c 65 2d  rigger = pTable-
8290: 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20  >pTrigger;.     
82a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 61 73   }.    }.    bas
82b0: 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  e = sqliteVdbeAd
82c0: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
82d0: 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65 29 2c  Size(dropTable),
82e0: 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20   dropTable);.   
82f0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
8300: 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70  eP3(v, base+1, p
8310: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Table->zName, 0)
8320: 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 6c  ;.    if( !pTabl
8330: 65 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  e->isTemp ){.   
8340: 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43     sqliteChangeC
8350: 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20  ookie(db, v);.  
8360: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
8370: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
8380: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
8390: 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
83a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
83b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
83c0: 6f 79 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75 6d  oy, pTable->tnum
83d0: 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70  , pTable->isTemp
83e0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  );.      for(pId
83f0: 78 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  x=pTable->pIndex
8400: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
8410: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
8420: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8430: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
8440: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 54  , pIdx->tnum, pT
8450: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20  able->isTemp);. 
8460: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8470: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
8480: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
8490: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
84a0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
84b0: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
84c0: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  the table..  **.
84d0: 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
84e0: 69 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  if the SQL state
84f0: 6d 65 6e 74 20 62 65 67 61 6e 20 77 69 74 68 20  ment began with 
8500: 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77  the EXPLAIN keyw
8510: 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e  ord,.  ** then n
8520: 6f 20 63 68 61 6e 67 65 73 20 73 68 6f 75 6c 64  o changes should
8530: 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20   be made..  */. 
8540: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78   if( !pParse->ex
8550: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c  plain ){.    sql
8560: 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  iteUnlinkAndDele
8570: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
8580: 6c 65 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  le);.    db->fla
8590: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
85a0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
85b0: 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
85c0: 74 41 6c 6c 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a  tAll(db);.}../*.
85d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
85e0: 63 6f 6e 73 74 72 75 63 74 73 20 61 20 50 33 20  constructs a P3 
85f0: 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
8600: 66 6f 72 20 61 6e 20 4f 50 5f 4d 61 6b 65 49 64  for an OP_MakeId
8610: 78 4b 65 79 0a 2a 2a 20 6f 70 63 6f 64 65 20 61  xKey.** opcode a
8620: 6e 64 20 61 64 64 73 20 74 68 61 74 20 50 33 20  nd adds that P3 
8630: 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20 6d 6f  string to the mo
8640: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
8650: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
8660: 0a 2a 2a 20 69 6e 20 74 68 65 20 76 69 72 74 75  .** in the virtu
8670: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 65  al machine.  The
8680: 20 50 33 20 73 74 72 69 6e 67 20 63 6f 6e 73 69   P3 string consi
8690: 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
86a0: 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 66 6f 72  character.** for
86b0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20   each column in 
86c0: 74 68 65 20 69 6e 64 65 78 20 70 49 64 78 20 6f  the index pIdx o
86d0: 66 20 74 61 62 6c 65 20 70 54 61 62 2e 20 20 49  f table pTab.  I
86e0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65  f the column use
86f0: 73 0a 2a 2a 20 61 20 6e 75 6d 65 72 69 63 20 73  s.** a numeric s
8700: 6f 72 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20  ort order, then 
8710: 74 68 65 20 50 33 20 73 74 72 69 6e 67 20 63 68  the P3 string ch
8720: 61 72 61 63 74 65 72 20 63 6f 72 72 65 73 70 6f  aracter correspo
8730: 6e 64 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 61 74  nding to.** that
8740: 20 63 6f 6c 75 6d 6e 20 69 73 20 27 6e 27 2e 20   column is 'n'. 
8750: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 75   If the column u
8760: 73 65 73 20 61 20 74 65 78 74 20 73 6f 72 74 20  ses a text sort 
8770: 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 0a  order, then the.
8780: 2a 2a 20 50 33 20 73 74 72 69 6e 67 20 69 73 20  ** P3 string is 
8790: 27 74 27 2e 20 20 53 65 65 20 74 68 65 20 4f 50  't'.  See the OP
87a0: 5f 4d 61 6b 65 49 64 78 4b 65 79 20 6f 70 63 6f  _MakeIdxKey opco
87b0: 64 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  de documentation
87c0: 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e   for.** addition
87d0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  al information. 
87e0: 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 73 71   See also the sq
87f0: 6c 69 74 65 41 64 64 4b 65 79 54 79 70 65 28 29  liteAddKeyType()
8800: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69   routine..*/.voi
8810: 64 20 73 71 6c 69 74 65 41 64 64 49 64 78 4b 65  d sqliteAddIdxKe
8820: 79 54 79 70 65 28 56 64 62 65 20 2a 76 2c 20 49  yType(Vdbe *v, I
8830: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 63  ndex *pIdx){.  c
8840: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 54 61  har *zType;.  Ta
8850: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
8860: 20 69 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28   i, n;.  assert(
8870: 20 70 49 64 78 21 3d 30 20 26 26 20 70 49 64 78   pIdx!=0 && pIdx
8880: 2d 3e 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20  ->pTable!=0 );. 
8890: 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54   pTab = pIdx->pT
88a0: 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 70 49 64 78  able;.  n = pIdx
88b0: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7a 54 79  ->nColumn;.  zTy
88c0: 70 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  pe = sqliteMallo
88d0: 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20  c( n+1 );.  if( 
88e0: 7a 54 79 70 65 3d 3d 30 20 29 20 72 65 74 75 72  zType==0 ) retur
88f0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
8900: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
8910: 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69   iCol = pIdx->ai
8920: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61  Column[i];.    a
8930: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26  ssert( iCol>=0 &
8940: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
8950: 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  l );.    if( (pT
8960: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
8970: 6f 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49 54  ortOrder & SQLIT
8980: 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d 3d  E_SO_TYPEMASK)==
8990: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20 29  SQLITE_SO_TEXT )
89a0: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 5b 69 5d  {.      zType[i]
89b0: 20 3d 20 27 74 27 3b 0a 20 20 20 20 7d 65 6c 73   = 't';.    }els
89c0: 65 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 5b 69  e{.      zType[i
89d0: 5d 20 3d 20 27 6e 27 3b 0a 20 20 20 20 7d 0a 20  ] = 'n';.    }. 
89e0: 20 7d 0a 20 20 7a 54 79 70 65 5b 6e 5d 20 3d 20   }.  zType[n] = 
89f0: 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 43  0;.  sqliteVdbeC
8a00: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
8a10: 54 79 70 65 2c 20 6e 29 3b 0a 20 20 73 71 6c 69  Type, n);.  sqli
8a20: 74 65 46 72 65 65 28 7a 54 79 70 65 29 3b 0a 7d  teFree(zType);.}
8a30: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
8a40: 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61   new index for a
8a50: 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49  n SQL table.  pI
8a60: 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65  ndex is the name
8a70: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
8a80: 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20  * and pTable is 
8a90: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
8aa0: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
8ab0: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
8ac0: 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
8ad0: 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
8ae0: 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
8af0: 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
8b00: 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
8b10: 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
8b20: 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
8b30: 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
8b40: 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
8b50: 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
8b60: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
8b70: 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
8b80: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
8b90: 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
8ba0: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
8bb0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
8bc0: 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
8bd0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
8be0: 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
8bf0: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
8c00: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
8c10: 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
8c20: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
8c30: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
8c40: 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
8c50: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
8c60: 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
8c70: 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
8c80: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
8c90: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
8ca0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
8cb0: 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
8cc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
8cd0: 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
8ce0: 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
8cf0: 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
8d00: 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  Name,    /* Name
8d10: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
8d20: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
8d30: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
8d40: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8d50: 20 74 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   table to index.
8d60: 20 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e    Use pParse->pN
8d70: 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
8d80: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c    IdList *pList,
8d90: 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
8da0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
8db0: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
8dc0: 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f  nError,     /* O
8dd0: 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
8de0: 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
8df0: 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
8e00: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
8e10: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
8e20: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
8e30: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8e40: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
8e50: 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20  oken *pEnd      
8e60: 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20  /* The ")" that 
8e70: 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54  closes the CREAT
8e80: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
8e90: 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
8ea0: 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61  *pTab;     /* Ta
8eb0: 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
8ec0: 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
8ed0: 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20 69  ndex;   /* The i
8ee0: 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
8ef0: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
8f00: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
8f10: 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
8f20: 6c 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lId;            
8f30: 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66   /* Fake token f
8f40: 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c  or an empty ID l
8f50: 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20  ist */.  sqlite 
8f60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
8f70: 3b 0a 20 20 69 6e 74 20 68 69 64 65 4e 61 6d 65  ;.  int hideName
8f80: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
8f90: 20 44 6f 20 6e 6f 74 20 70 75 74 20 74 61 62 6c   Do not put tabl
8fa0: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 68 61  e name in the ha
8fb0: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69  sh table */..  i
8fc0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
8fd0: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
8fe0: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
8ff0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
9000: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
9010: 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
9020: 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
9030: 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
9040: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
9050: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
9060: 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
9070: 74 28 20 70 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  t( pName!=0 );. 
9080: 20 20 20 70 54 61 62 20 3d 20 20 73 71 6c 69 74     pTab =  sqlit
9090: 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28  eTableFromToken(
90a0: 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b  pParse, pTable);
90b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
90c0: 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
90d0: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50  ;.    pTab =  pP
90e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
90f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 3d  .  }.  if( pTab=
9100: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
9110: 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  rr ) goto exit_c
9120: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69  reate_index;.  i
9130: 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
9140: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
9150: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
9160: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
9170: 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  e ", pTab->zName
9180: 2c 20 0a 20 20 20 20 20 20 22 20 6d 61 79 20 6e  , .      " may n
9190: 6f 74 20 68 61 76 65 20 6e 65 77 20 69 6e 64 69  ot have new indi
91a0: 63 65 73 20 61 64 64 65 64 22 2c 20 30 29 3b 0a  ces added", 0);.
91b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
91c0: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ++;.    goto exi
91d0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
91e0: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
91f0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
9200: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
9210: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
9220: 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
9230: 62 65 20 69 6e 64 65 78 65 64 22 2c 20 30 29 3b  be indexed", 0);
9240: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
9250: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  r++;.    goto ex
9260: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
9270: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
9280: 69 73 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  is index is crea
9290: 74 65 64 20 77 68 69 6c 65 20 72 65 2d 72 65 61  ted while re-rea
92a0: 64 69 6e 67 20 74 68 65 20 73 63 68 65 6d 61 20  ding the schema 
92b0: 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
92c0: 65 72 0a 20 20 2a 2a 20 62 75 74 20 74 68 65 20  er.  ** but the 
92d0: 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
92e0: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
92f0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
9300: 74 61 62 6c 65 2c 20 69 74 20 63 61 6e 0a 20 20  table, it can.  
9310: 2a 2a 20 6f 6e 6c 79 20 6d 65 61 6e 20 74 68 61  ** only mean tha
9320: 74 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  t the table that
9330: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 72   this index is r
9340: 65 61 6c 6c 79 20 61 73 73 6f 63 69 61 74 65 64  eally associated
9350: 20 77 69 74 68 20 69 73 0a 20 20 2a 2a 20 6f 6e   with is.  ** on
9360: 65 20 77 68 6f 73 65 20 6e 61 6d 65 20 69 73 20  e whose name is 
9370: 68 69 64 64 65 6e 20 62 65 68 69 6e 64 20 61 20  hidden behind a 
9380: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
9390: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
93a0: 6d 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 69  me..  ** Since i
93b0: 74 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65  ts table has bee
93c0: 6e 20 73 75 70 70 72 65 73 73 65 64 2c 20 77 65  n suppressed, we
93d0: 20 6e 65 65 64 20 74 6f 20 61 6c 73 6f 20 73 75   need to also su
93e0: 70 70 72 65 73 73 20 74 68 65 0a 20 20 2a 2a 20  ppress the.  ** 
93f0: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66  index..  */.  if
9400: 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  ( pParse->initFl
9410: 61 67 20 26 26 20 21 70 50 61 72 73 65 2d 3e 69  ag && !pParse->i
9420: 73 54 65 6d 70 20 26 26 20 70 54 61 62 2d 3e 69  sTemp && pTab->i
9430: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 67 6f 74  sTemp ){.    got
9440: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
9450: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dex;.  }..  /*. 
9460: 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
9470: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
9480: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
9490: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
94a0: 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
94b0: 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
94c0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
94d0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
94e0: 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
94f0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
9500: 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
9510: 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
9520: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
9530: 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
9540: 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
9550: 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
9560: 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
9570: 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
9580: 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
9590: 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
95a0: 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
95b0: 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
95c0: 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
95d0: 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
95e0: 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
95f0: 78 2c 20 62 75 74 20 77 65 20 77 69 6c 6c 20 6e  x, but we will n
9600: 6f 74 0a 20 20 2a 2a 20 73 74 6f 72 65 20 69 74  ot.  ** store it
9610: 73 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 68 61  s name in the ha
9620: 73 68 20 74 61 62 6c 65 2e 20 20 53 65 74 20 74  sh table.  Set t
9630: 68 65 20 68 69 64 65 4e 61 6d 65 20 66 6c 61 67  he hideName flag
9640: 20 74 6f 20 61 63 63 6f 6d 70 6c 69 73 68 0a 20   to accomplish. 
9650: 20 2a 2a 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20   ** this..  **. 
9660: 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20   ** If pName==0 
9670: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
9680: 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e   are.  ** dealin
9690: 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79  g with a primary
96a0: 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63   key or UNIQUE c
96b0: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68  onstraint.  We h
96c0: 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75  ave to invent ou
96d0: 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e  r.  ** own name.
96e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d  .  */.  if( pNam
96f0: 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  e ){.    Index *
9700: 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f  pISameName;    /
9710: 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20  * Another index 
9720: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
9730: 6d 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  me */.    Table 
9740: 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20  *pTSameName;    
9750: 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68 20  /* A table with 
9760: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
9770: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e   index */.    zN
9780: 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ame = sqliteTabl
9790: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
97a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
97b0: 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
97c0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
97d0: 3b 0a 20 20 20 20 69 66 28 20 28 70 49 53 61 6d  ;.    if( (pISam
97e0: 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69  eName = sqliteFi
97f0: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
9800: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  e))!=0 ){.      
9810: 69 66 28 20 70 49 53 61 6d 65 4e 61 6d 65 2d 3e  if( pISameName->
9820: 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26  pTable->isTemp &
9830: 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  & pParse->initFl
9840: 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68 69  ag ){.        hi
9850: 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20  deName = 1;.    
9860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9870: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
9880: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
9890: 67 2c 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e 61  g, "index ", zNa
98a0: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  me, .           
98b0: 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  " already exists
98c0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ", 0);.        p
98d0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
98e0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
98f0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
9900: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9910: 20 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65   if( (pTSameName
9920: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
9930: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d  le(db, zName))!=
9940: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
9950: 54 53 61 6d 65 4e 61 6d 65 2d 3e 69 73 54 65 6d  TSameName->isTem
9960: 70 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69  p && pParse->ini
9970: 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  tFlag ){.       
9980: 20 68 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20   hideName = 1;. 
9990: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
99a0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
99b0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
99c0: 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73 20  rMsg, "there is 
99d0: 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
99e0: 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20 20 20 20  named ",.       
99f0: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20      zName, 0);. 
9a00: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
9a10: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67  Err++;.        g
9a20: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
9a30: 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
9a40: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
9a50: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
9a60: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
9a70: 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
9a80: 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
9a90: 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
9aa0: 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
9ab0: 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
9ac0: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
9ad0: 66 2c 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20  f,"%d)",n);.    
9ae0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  zName = 0;.    s
9af0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
9b00: 7a 4e 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62  zName, "(", pTab
9b10: 2d 3e 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69  ->zName, " autoi
9b20: 6e 64 65 78 20 22 2c 20 7a 42 75 66 2c 20 30 29  ndex ", zBuf, 0)
9b30: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
9b40: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
9b50: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
9b60: 20 68 69 64 65 4e 61 6d 65 20 3d 20 73 71 6c 69   hideName = sqli
9b70: 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  teFindIndex(db, 
9b80: 7a 4e 61 6d 65 29 21 3d 30 3b 0a 20 20 7d 0a 0a  zName)!=0;.  }..
9b90: 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30    /* If pList==0
9ba0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  , it means this 
9bb0: 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
9bc0: 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69  ed to make a pri
9bd0: 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75  mary.  ** key ou
9be0: 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f  t of the last co
9bf0: 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68  lumn added to th
9c00: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
9c10: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
9c20: 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
9c30: 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
9c40: 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
9c50: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
9c60: 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70      nullId.z = p
9c70: 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
9c80: 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol-1].zName;. 
9c90: 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74     nullId.n = st
9ca0: 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a  rlen(nullId.z);.
9cb0: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
9cc0: 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30  teIdListAppend(0
9cd0: 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20  , &nullId);.    
9ce0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67  if( pList==0 ) g
9cf0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
9d00: 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
9d10: 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
9d20: 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
9d30: 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e  ure. .  */.  pIn
9d40: 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  dex = sqliteMall
9d50: 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78  oc( sizeof(Index
9d60: 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  ) + strlen(zName
9d70: 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20  ) + 1 +.        
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73  sizeof(int)*pLis
9da0: 74 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20  t->nId );.  if( 
9db0: 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f  pIndex==0 ) goto
9dc0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
9dd0: 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69  ex;.  pIndex->ai
9de0: 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
9df0: 70 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e  pIndex[1];.  pIn
9e00: 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  dex->zName = (ch
9e10: 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43  ar*)&pIndex->aiC
9e20: 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64  olumn[pList->nId
9e30: 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64  ];.  strcpy(pInd
9e40: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
9e50: 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
9e60: 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
9e70: 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  ndex->nColumn = 
9e80: 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49  pList->nId;.  pI
9e90: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
9ea0: 70 49 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75 65  pIndex->isUnique
9eb0: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49   = onError;.  pI
9ec0: 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
9ed0: 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 0a 20 20 2f  = pName==0;..  /
9ee0: 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73  * Scan the names
9ef0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
9f00: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
9f10: 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20  be indexed and. 
9f20: 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c   ** load the col
9f30: 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f  umn indices into
9f40: 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
9f50: 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  ture.  Report an
9f60: 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61   error.  ** if a
9f70: 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  ny column is not
9f80: 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66   found..  */.  f
9f90: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
9fa0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
9fb0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
9fc0: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
9fd0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
9fe0: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
9ff0: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
a000: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ol[j].zName)==0 
a010: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
a020: 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
a030: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
a040: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
a050: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
a060: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e  "table ", pTab->
a070: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
a080: 22 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20  " has no column 
a090: 6e 61 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e  named ", pList->
a0a0: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  a[i].zName, 0);.
a0b0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
a0c0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  rr++;.      sqli
a0d0: 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a  teFree(pIndex);.
a0e0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
a0f0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
a100: 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
a110: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
a120: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
a130: 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
a140: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
a150: 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
a160: 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
a170: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
a180: 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
a190: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
a1a0: 78 70 6c 61 69 6e 20 26 26 20 21 68 69 64 65 4e  xplain && !hideN
a1b0: 61 6d 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ame ){.    Index
a1c0: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
a1d0: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
a1e0: 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 49 6e 64  b->idxHash, pInd
a1f0: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ex->zName, strle
a200: 6e 28 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64  n(zName)+1, pInd
a210: 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  ex);.    if( p )
a220: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a230: 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
a240: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
a250: 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
a260: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e    sqliteFree(pIn
a270: 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  dex);.      goto
a280: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
a290: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ex;.    }.    db
a2a0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
a2b0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
a2c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
a2d0: 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
a2e0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
a2f0: 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
a300: 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
a310: 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
a320: 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
a330: 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
a340: 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
a350: 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
a360: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
a370: 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
a380: 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55  t operation of U
a390: 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49  PDATE.  ** and I
a3a0: 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  NSERT..  */.  if
a3b0: 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
a3c0: 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
a3d0: 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
a3e0: 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
a3f0: 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
a400: 6c 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65  lace){.    pInde
a410: 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
a420: 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61  >pIndex;.    pTa
a430: 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
a440: 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
a450: 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
a460: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
a470: 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
a480: 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
a490: 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
a4a0: 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
a4b0: 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20  .      pOther = 
a4c0: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
a4d0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
a4e0: 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
a4f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68  >pNext;.    pOth
a500: 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
a510: 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ex;.  }..  /* If
a520: 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   the initFlag is
a530: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
a540: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
a550: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
a560: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
a570: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
a580: 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72  k.  So do not wr
a590: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a  ite to the disk.
a5a0: 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74    ** again.  Ext
a5b0: 72 61 63 74 20 74 68 65 20 74 61 62 6c 65 20 6e  ract the table n
a5c0: 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20 70  umber from the p
a5d0: 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66  Parse->newTnum f
a5e0: 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ield..  */.  if(
a5f0: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
a600: 67 20 26 26 20 70 54 61 62 6c 65 21 3d 30 20 29  g && pTable!=0 )
a610: 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e  {.    pIndex->tn
a620: 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77  um = pParse->new
a630: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
a640: 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20  If the initFlag 
a650: 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65  is 0 then create
a660: 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69   the index on di
a670: 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69  sk.  This.  ** i
a680: 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20  nvolves writing 
a690: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  the index into t
a6a0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
a6b0: 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  and filling in t
a6c0: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  he.  ** index wi
a6d0: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
a6e0: 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20  able contents.. 
a6f0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69   **.  ** The ini
a700: 74 46 6c 61 67 20 69 73 20 30 20 77 68 65 6e 20  tFlag is 0 when 
a710: 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65  the user first e
a720: 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49  nters a CREATE I
a730: 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61  NDEX .  ** comma
a740: 6e 64 2e 20 20 54 68 65 20 69 6e 69 74 46 6c 61  nd.  The initFla
a750: 67 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61  g is 1 when a da
a760: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
a770: 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54   and .  ** CREAT
a780: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
a790: 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20  ts are read out 
a7a0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  of the master ta
a7b0: 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68  ble.  In.  ** th
a7c0: 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68  e latter case th
a7d0: 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
a7e0: 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
a7f0: 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a  which is why.  *
a800: 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  * we don't want 
a810: 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a  to recreate it..
a820: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61    **.  ** If pTa
a830: 62 6c 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ble==0 it means 
a840: 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
a850: 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69  nerated as a pri
a860: 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72  mary key.  ** or
a870: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
a880: 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54  nt of a CREATE T
a890: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
a8a0: 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
a8b0: 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
a8c0: 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
a8d0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
a8e0: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
a8f0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
a900: 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
a910: 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
a920: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
a930: 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20  initFlag==0 ){. 
a940: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
a950: 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c  be *v;.    int l
a960: 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69  bl1, lbl2;.    i
a970: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 64  nt i;.    int ad
a980: 64 72 3b 0a 20 20 20 20 69 6e 74 20 69 73 54 65  dr;.    int isTe
a990: 6d 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d  mp = pTab->isTem
a9a0: 70 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  p;..    v = sqli
a9b0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
a9c0: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
a9d0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
a9e0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
a9f0: 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  ( pTable!=0 ){. 
aa00: 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e       sqliteBegin
aa10: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
aa20: 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 20  Parse, 0);.     
aa30: 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65   sqliteOpenMaste
aa40: 72 54 61 62 6c 65 28 76 2c 20 69 73 54 65 6d 70  rTable(v, isTemp
aa50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
aa60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
aa70: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20  OP_NewRecno, 0, 
aa80: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
aa90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
aaa0: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
aab0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
aac0: 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65  eP3(v, -1, "inde
aad0: 78 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  x", P3_STATIC);.
aae0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
aaf0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
ab00: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
ab10: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
ab20: 76 2c 20 2d 31 2c 20 70 49 6e 64 65 78 2d 3e 7a  v, -1, pIndex->z
ab30: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
ab40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
ab50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
ab60: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ng, 0, 0);.    s
ab70: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
ab80: 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a  3(v, -1, pTab->z
ab90: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
aba0: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
abb0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
abc0: 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
abd0: 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  0, isTemp);.    
abe0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
abf0: 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P3(v, addr, (cha
ac00: 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  r*)&pIndex->tnum
ac10: 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20  , P3_POINTER);. 
ac20: 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
ac30: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54 61  = 0;.    if( pTa
ac40: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
ac50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ac60: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
ac70: 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20       if( isTemp 
ac80: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ac90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
aca0: 5f 4f 70 65 6e 57 72 41 75 78 2c 20 31 2c 20 30  _OpenWrAux, 1, 0
acb0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
acc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
acd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
ace0: 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a  enWrite, 1, 0);.
acf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ad00: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
ad10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
ad20: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
ad30: 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20    if( pStart && 
ad40: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 6e 20  pEnd ){.      n 
ad50: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
ad60: 2d 20 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a  - Addr(pStart->z
ad70: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
ad80: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
ad90: 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d  v, addr, pStart-
ada0: 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >z, n);.    }.  
adb0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
adc0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
add0: 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 73  rd, 5, 0);.    s
ade0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
adf0: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
ae00: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
ae10: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  Table ){.      s
ae20: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ae30: 2c 20 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70  , isTemp ? OP_Op
ae40: 65 6e 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 2c  enAux : OP_Open,
ae50: 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b   2, pTab->tnum);
ae60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
ae70: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
ae80: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pTab->zName, P3
ae90: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
aea0: 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 56 64 62  lbl2 = sqliteVdb
aeb0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
aec0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
aed0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
aee0: 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  d, 2, lbl2);.   
aef0: 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65     lbl1 = sqlite
af00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
af10: 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20  Recno, 2, 0);.  
af20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
af30: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
af40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
af50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
af60: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70   OP_Column, 2, p
af70: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
af80: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
af90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
afa0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78  Op(v, OP_MakeIdx
afb0: 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  Key, pIndex->nCo
afc0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
afd0: 69 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  if( db->file_for
afe0: 6d 61 74 3e 3d 34 20 29 20 73 71 6c 69 74 65 41  mat>=4 ) sqliteA
aff0: 64 64 49 64 78 4b 65 79 54 79 70 65 28 76 2c 20  ddIdxKeyType(v, 
b000: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 73  pIndex);.      s
b010: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
b020: 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20  , OP_IdxPut, 1, 
b030: 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
b040: 3d 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20  =OE_None);.     
b050: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
b060: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20  (v, OP_Next, 2, 
b070: 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  lbl1);.      sql
b080: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
b090: 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20  bel(v, lbl2);.  
b0a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b0b0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
b0c0: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   2, 0);.      sq
b0d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b0e0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29   OP_Close, 1, 0)
b0f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b100: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
b110: 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29     if( !isTemp )
b120: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b130: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
b140: 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   v);.      }.   
b150: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
b160: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
b170: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
b180: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
b190: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
b1a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c    }.  }..  /* Cl
b1b0: 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
b1c0: 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
b1d0: 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71  eate_index:.  sq
b1e0: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
b1f0: 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  (pList);.  sqlit
b200: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
b210: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
b220: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
b230: 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
b240: 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
b250: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
b260: 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
b270: 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
b280: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
b290: 71 6c 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50  qliteDropIndex(P
b2a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
b2b0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49  ken *pName){.  I
b2c0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
b2d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56  char *zName;.  V
b2e0: 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
b2f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b300: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
b310: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
b320: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
b330: 20 72 65 74 75 72 6e 3b 0a 20 20 7a 4e 61 6d 65   return;.  zName
b340: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
b350: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
b360: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  e);.  if( zName=
b370: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
b380: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 46 69  Index = sqliteFi
b390: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
b3a0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
b3b0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  (zName);.  if( p
b3c0: 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
b3d0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
b3e0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
b3f0: 67 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  g, "no such inde
b400: 78 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20  x: ", 0, .      
b410: 20 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d    pName->z, pNam
b420: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50  e->n, 0);.    pP
b430: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
b440: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b450: 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  if( pIndex->auto
b460: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
b470: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
b480: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
b490: 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
b4a0: 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
b4b0: 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
b4c0: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
b4d0: 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
b4e0: 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  d", 0);.    pPar
b4f0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
b500: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
b510: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
b520: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
b530: 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
b540: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
b550: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
b560: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
b570: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61  if( v ){.    sta
b580: 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70 49  tic VdbeOp dropI
b590: 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndex[] = {.     
b5a0: 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
b5b0: 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d    0, ADDR(9), 0}
b5c0: 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  , .      { OP_St
b5d0: 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20  ring,     0, 0, 
b5e0: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a        0}, /* 1 *
b5f0: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  /.      { OP_Mem
b600: 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20  Store,   1, 1,  
b610: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
b620: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20   OP_MemLoad,    
b630: 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  1, 0,       0}, 
b640: 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
b650: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
b660: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
b670: 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20       { OP_Eq,   
b680: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29        0, ADDR(8)
b690: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
b6a0: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
b6b0: 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(3), 0},.   
b6c0: 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20     { OP_Goto,   
b6d0: 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
b6e0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
b6f0: 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
b700: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38 20         0}, /* 8 
b710: 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
b720: 74 20 62 61 73 65 3b 0a 20 20 20 20 54 61 62 6c  t base;.    Tabl
b730: 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
b740: 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 20 20 73  ->pTable;..    s
b750: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
b760: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
b770: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f   0);.    sqliteO
b780: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
b790: 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b  , pTab->isTemp);
b7a0: 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69  .    base = sqli
b7b0: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
b7c0: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
b7d0: 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64  pIndex), dropInd
b7e0: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  ex);.    sqliteV
b7f0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
b800: 61 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a  ase+1, pIndex->z
b810: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Name, 0);.    if
b820: 28 20 21 70 54 61 62 2d 3e 69 73 54 65 6d 70 20  ( !pTab->isTemp 
b830: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43  ){.      sqliteC
b840: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
b850: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
b860: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
b870: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
b880: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
b890: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
b8a0: 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  roy, pIndex->tnu
b8b0: 6d 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29  m, pTab->isTemp)
b8c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  ;.    sqliteEndW
b8d0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
b8e0: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
b8f0: 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d   Delete the in-m
b900: 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f  emory descriptio
b910: 6e 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e  n of this index.
b920: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
b930: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
b940: 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b      sqliteUnlink
b950: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64  AndDeleteIndex(d
b960: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  b, pIndex);.    
b970: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
b980: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
b990: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
b9a0: 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
b9b0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
b9c0: 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
b9d0: 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
b9e0: 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
b9f0: 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
ba00: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
ba10: 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
ba20: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
ba30: 73 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74  st *sqliteIdList
ba40: 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70  Append(IdList *p
ba50: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
ba60: 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
ba70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
ba80: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
ba90: 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  ( sizeof(IdList)
baa0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
bab0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
bac0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73  .  }.  if( (pLis
bad0: 74 2d 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20 29  t->nId & 7)==0 )
bae0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
baf0: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
bb00: 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c   a = sqliteReall
bb10: 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c  oc(pList->a, (pL
bb20: 69 73 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65  ist->nId+8)*size
bb30: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
bb40: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
bb50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49  ){.      sqliteI
bb60: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
bb70: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
bb80: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
bb90: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
bba0: 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
bbb0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20  >a[pList->nId], 
bbc0: 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
bbd0: 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
bbe0: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  Token ){.    cha
bbf0: 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d  r **pz = &pList-
bc00: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a  >a[pList->nId].z
bc10: 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Name;.    sqlite
bc20: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
bc30: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
bc40: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ->n, 0);.    if(
bc50: 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20   *pz==0 ){.     
bc60: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
bc70: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
bc80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
bc90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
bca0: 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  iteDequote(*pz);
bcb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69  .    }.  }.  pLi
bcc0: 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74  st->nId++;.  ret
bcd0: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
bce0: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
bcf0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
bd00: 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
bd10: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
bd20: 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
bd30: 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
bd40: 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
bd50: 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
bd60: 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20  en if pToken is 
bd70: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  NULL..**.** A ne
bd80: 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74  w SrcList is ret
bd90: 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
bda0: 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
bdb0: 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
bdc0: 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e  liteSrcListAppen
bdd0: 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  d(SrcList *pList
bde0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
bdf0: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
be00: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
be10: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
be20: 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
be30: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
be40: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
be50: 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e  .  if( (pList->n
be60: 53 72 63 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20  Src & 7)==0 ){. 
be70: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
be80: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61  t_item *a;.    a
be90: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
bea0: 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73  (pList->a, (pLis
beb0: 74 2d 3e 6e 53 72 63 2b 38 29 2a 73 69 7a 65 6f  t->nSrc+8)*sizeo
bec0: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
bed0: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
bee0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 72  {.      sqliteSr
bef0: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  cListDelete(pLis
bf00: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
bf10: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
bf20: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
bf30: 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
bf40: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c  >a[pList->nSrc],
bf50: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
bf60: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
bf70: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68  pToken ){.    ch
bf80: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74  ar **pz = &pList
bf90: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
bfa0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69  .zName;.    sqli
bfb0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
bfc0: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
bfd0: 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69  en->n, 0);.    i
bfe0: 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20  f( *pz==0 ){.   
bff0: 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74     sqliteSrcList
c000: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
c010: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c020: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c030: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70  sqliteDequote(*p
c040: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
c050: 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20  pList->nSrc++;. 
c060: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
c070: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61  ../*.** Add an a
c080: 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74  lias to the last
c090: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74   identifier on t
c0a0: 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66  he given identif
c0b0: 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ier list..*/.voi
c0c0: 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41  d sqliteSrcListA
c0d0: 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20  ddAlias(SrcList 
c0e0: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
c0f0: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
c100: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53  ist && pList->nS
c110: 72 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  rc>0 ){.    int 
c120: 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20  i = pList->nSrc 
c130: 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  - 1;.    sqliteS
c140: 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74  etNString(&pList
c150: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70  ->a[i].zAlias, p
c160: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
c170: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ->n, 0);.    sql
c180: 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74  iteDequote(pList
c190: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a  ->a[i].zAlias);.
c1a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
c1b0: 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
c1c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c  /.void sqliteIdL
c1d0: 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74  istDelete(IdList
c1e0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
c1f0: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
c200: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
c210: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
c220: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
c230: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
c240: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
c250: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
c260: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
c270: 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
c280: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
c290: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
c2a0: 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
c2b0: 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
c2c0: 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
c2d0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
c2e0: 74 20 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e  t sqliteIdListIn
c2f0: 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
c300: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
c310: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
c320: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
c330: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
c340: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
c350: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
c360: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
c370: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
c380: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
c390: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
c3a0: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
c3b0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
c3c0: 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63  tire SrcList inc
c3d0: 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73  luding all its s
c3e0: 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  ubstructure..*/.
c3f0: 76 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69  void sqliteSrcLi
c400: 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
c410: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
c420: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
c430: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
c440: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
c450: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
c460: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
c470: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
c480: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
c490: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
c4a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
c4b0: 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70  ->a[i].pTab && p
c4c0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d  List->a[i].pTab-
c4d0: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
c4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
c4f0: 74 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74  teTable(0, pList
c500: 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20  ->a[i].pTab);.  
c510: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 53 65    }.    sqliteSe
c520: 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74  lectDelete(pList
c530: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
c540: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44  .    sqliteExprD
c550: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
c560: 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ].pOn);.    sqli
c570: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
c580: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e  List->a[i].pUsin
c590: 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
c5a0: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
c5b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
c5c0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  st);.}../*.** Th
c5d0: 65 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 69  e COPY command i
c5e0: 73 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c  s for compatibil
c5f0: 69 74 79 20 77 69 74 68 20 50 6f 73 74 67 72 65  ity with Postgre
c600: 53 51 4c 20 61 6e 64 20 73 70 65 63 69 66 69 63  SQL and specific
c610: 69 61 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68 65  ially.** for the
c620: 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65 61 64   ability to read
c630: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 70   the output of p
c640: 67 5f 64 75 6d 70 2e 20 20 54 68 65 20 66 6f 72  g_dump.  The for
c650: 6d 61 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c  mat is as.** fol
c660: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43  lows:.**.**    C
c670: 4f 50 59 20 74 61 62 6c 65 20 46 52 4f 4d 20 66  OPY table FROM f
c680: 69 6c 65 20 5b 55 53 49 4e 47 20 44 45 4c 49 4d  ile [USING DELIM
c690: 49 54 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a 2a  ITERS string].**
c6a0: 0a 2a 2a 20 22 74 61 62 6c 65 22 20 69 73 20 61  .** "table" is a
c6b0: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
c6c0: 20 6e 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c 20   name.  We will 
c6d0: 72 65 61 64 20 6c 69 6e 65 73 20 6f 66 20 63 6f  read lines of co
c6e0: 64 65 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20  de from.** file 
c6f0: 74 6f 20 66 69 6c 6c 20 74 68 69 73 20 74 61 62  to fill this tab
c700: 6c 65 20 77 69 74 68 20 64 61 74 61 2e 20 20 46  le with data.  F
c710: 69 6c 65 20 6d 69 67 68 74 20 62 65 20 22 73 74  ile might be "st
c720: 64 69 6e 22 2e 20 20 54 68 65 20 6f 70 74 69 6f  din".  The optio
c730: 6e 61 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65 72  nal.** delimiter
c740: 20 73 74 72 69 6e 67 20 69 64 65 6e 74 69 66 69   string identifi
c750: 65 73 20 74 68 65 20 66 69 65 6c 64 20 73 65 70  es the field sep
c760: 61 72 61 74 6f 72 73 2e 20 20 54 68 65 20 64 65  arators.  The de
c770: 66 61 75 6c 74 20 69 73 20 61 20 74 61 62 2e 0a  fault is a tab..
c780: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f  */.void sqliteCo
c790: 70 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  py(.  Parse *pPa
c7a0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
c7b0: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
c7c0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
c7d0: 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 54 68  bleName,   /* Th
c7e0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
c7f0: 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  ble into which w
c800: 65 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a 2f  e will insert */
c810: 0a 20 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e  .  Token *pFilen
c820: 61 6d 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 66  ame,    /* The f
c830: 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ile from which t
c840: 6f 20 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61  o obtain informa
c850: 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
c860: 2a 70 44 65 6c 69 6d 69 74 65 72 2c 20 20 20 2f  *pDelimiter,   /
c870: 2a 20 55 73 65 20 74 68 69 73 20 61 73 20 74 68  * Use this as th
c880: 65 20 66 69 65 6c 64 20 64 65 6c 69 6d 69 74 65  e field delimite
c890: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  r */.  int onErr
c8a0: 6f 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  or          /* W
c8b0: 68 61 74 20 74 6f 20 64 6f 20 69 66 20 61 20 63  hat to do if a c
c8c0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 73 20  onstraint fails 
c8d0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
c8e0: 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61  Tab;.  char *zTa
c8f0: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  b;.  int i;.  Vd
c900: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64  be *v;.  int add
c910: 72 2c 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20  r, end;.  Index 
c920: 2a 70 49 64 78 3b 0a 20 20 73 71 6c 69 74 65 20  *pIdx;.  sqlite 
c930: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c940: 3b 0a 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69  ;..  zTab = sqli
c950: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
c960: 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29  oken(pTableName)
c970: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d  ;.  if( sqlite_m
c980: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20  alloc_failed || 
c990: 7a 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63  zTab==0 ) goto c
c9a0: 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70  opy_cleanup;.  p
c9b0: 54 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  Tab = sqliteTabl
c9c0: 65 4e 61 6d 65 54 6f 54 61 62 6c 65 28 70 50 61  eNameToTable(pPa
c9d0: 72 73 65 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71  rse, zTab);.  sq
c9e0: 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a  liteFree(zTab);.
c9f0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
ca00: 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75  goto copy_cleanu
ca10: 70 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  p;.  v = sqliteG
ca20: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
ca30: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69    if( v ){.    i
ca40: 6e 74 20 6f 70 65 6e 4f 70 3b 0a 20 20 20 20 73  nt openOp;.    s
ca50: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
ca60: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
ca70: 20 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20   1);.    addr = 
ca80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
ca90: 76 2c 20 4f 50 5f 46 69 6c 65 4f 70 65 6e 2c 20  v, OP_FileOpen, 
caa0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
cab0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
cac0: 20 61 64 64 72 2c 20 70 46 69 6c 65 6e 61 6d 65   addr, pFilename
cad0: 2d 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e  ->z, pFilename->
cae0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  n);.    sqliteVd
caf0: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61  beDequoteP3(v, a
cb00: 64 64 72 29 3b 0a 20 20 20 20 6f 70 65 6e 4f 70  ddr);.    openOp
cb10: 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 20   = pTab->isTemp 
cb20: 3f 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78 20 3a  ? OP_OpenWrAux :
cb30: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
cb40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
cb50: 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 30 2c  Op(v, openOp, 0,
cb60: 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pTab->tnum);.  
cb70: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
cb80: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
cb90: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
cba0: 49 43 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  IC);.    for(i=1
cbb0: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
cbc0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
cbd0: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b  pIdx->pNext, i++
cbe0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
cbf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e  dbeAddOp(v, open
cc00: 4f 70 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75  Op, i, pIdx->tnu
cc10: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
cc20: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
cc30: 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  -1, pIdx->zName,
cc40: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
cc50: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66   }.    if( db->f
cc60: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
cc70: 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20  untRows ){.     
cc80: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
cc90: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
cca0: 30 2c 20 30 29 3b 20 20 2f 2a 20 49 6e 69 74 69  0, 0);  /* Initi
ccb0: 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 20 63 6f  alize the row co
ccc0: 75 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  unt */.    }.   
ccd0: 20 65 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62   end = sqliteVdb
cce0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
ccf0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
cd00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cd10: 46 69 6c 65 52 65 61 64 2c 20 70 54 61 62 2d 3e  FileRead, pTab->
cd20: 6e 43 6f 6c 2c 20 65 6e 64 29 3b 0a 20 20 20 20  nCol, end);.    
cd30: 69 66 28 20 70 44 65 6c 69 6d 69 74 65 72 20 29  if( pDelimiter )
cd40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
cd50: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
cd60: 64 72 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e  dr, pDelimiter->
cd70: 7a 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e  z, pDelimiter->n
cd80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
cd90: 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20  dbeDequoteP3(v, 
cda0: 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  addr);.    }else
cdb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
cdc0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
cdd0: 64 72 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20  dr, "\t", 1);.  
cde0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
cdf0: 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
ce00: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
ce10: 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f  dOp(v, OP_FileCo
ce20: 6c 75 6d 6e 2c 20 70 54 61 62 2d 3e 69 50 4b 65  lumn, pTab->iPKe
ce30: 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  y, 0);.      sql
ce40: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ce50: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c  OP_MustBeInt, 0,
ce60: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
ce70: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
ce80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
ce90: 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ecno, 0, 0);.   
cea0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
ceb0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
cec0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  +){.      if( i=
ced0: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
cee0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
cef0: 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
cf00: 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20 66 69 6c  ey column is fil
cf10: 6c 65 64 20 77 69 74 68 20 4e 55 4c 4c 20 73 69  led with NULL si
cf20: 6e 63 65 20 69 74 73 0a 20 20 20 20 20 20 20 20  nce its.        
cf30: 2a 2a 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61  ** value is alwa
cf40: 79 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74  ys pulled from t
cf50: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
cf60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
cf70: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
cf80: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
cf90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
cfa0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
cfb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65  AddOp(v, OP_File
cfc0: 43 6f 6c 75 6d 6e 2c 20 69 2c 20 30 29 3b 0a 20  Column, i, 0);. 
cfd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cfe0: 20 73 71 6c 69 74 65 47 65 6e 65 72 61 74 65 43   sqliteGenerateC
cff0: 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
d000: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c  pParse, pTab, 0,
d010: 20 30 2c 20 30 2c 20 30 2c 20 6f 6e 45 72 72 6f   0, 0, 0, onErro
d020: 72 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71  r, addr);.    sq
d030: 6c 69 74 65 43 6f 6d 70 6c 65 74 65 49 6e 73 65  liteCompleteInse
d040: 72 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  rtion(pParse, pT
d050: 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  ab, 0, 0, 0, 0);
d060: 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  .    if( (db->fl
d070: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
d080: 6e 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20  ntRows)!=0 ){.  
d090: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d0a0: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
d0b0: 2c 20 31 2c 20 30 29 3b 20 20 2f 2a 20 49 6e 63  , 1, 0);  /* Inc
d0c0: 72 65 6d 65 6e 74 20 72 6f 77 20 63 6f 75 6e 74  rement row count
d0d0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   */.    }.    sq
d0e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d0f0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
d100: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  r);.    sqliteVd
d110: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d120: 2c 20 65 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69  , end);.    sqli
d130: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d140: 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  P_Noop, 0, 0);. 
d150: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
d160: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
d170: 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  e);.    if( db->
d180: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
d190: 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20  ountRows ){.    
d1a0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d1b0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f  p(v, OP_ColumnCo
d1c0: 75 6e 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  unt, 1, 0);.    
d1d0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d1e0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p(v, OP_ColumnNa
d1f0: 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  me, 0, 0);.     
d200: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
d210: 65 50 33 28 76 2c 20 2d 31 2c 20 22 72 6f 77 73  eP3(v, -1, "rows
d220: 20 69 6e 73 65 72 74 65 64 22 2c 20 50 33 5f 53   inserted", P3_S
d230: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
d240: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d250: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 31 2c   OP_Callback, 1,
d260: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
d270: 20 0a 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3a 0a   .copy_cleanup:.
d280: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
d290: 2a 2a 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64  ** The non-stand
d2a0: 61 72 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61  ard VACUUM comma
d2b0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c  nd is used to cl
d2c0: 65 61 6e 20 75 70 20 74 68 65 20 64 61 74 61 62  ean up the datab
d2d0: 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65  ase,.** collapse
d2e0: 20 66 72 65 65 20 73 70 61 63 65 2c 20 65 74 63   free space, etc
d2f0: 2e 20 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65  .  It is modelle
d300: 64 20 61 66 74 65 72 20 74 68 65 20 56 41 43 55  d after the VACU
d310: 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e  UM command.** in
d320: 20 50 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a   PostgreSQL..**.
d330: 2a 2a 20 49 6e 20 76 65 72 73 69 6f 6e 20 31 2e  ** In version 1.
d340: 30 2e 78 20 6f 66 20 53 51 4c 69 74 65 2c 20 74  0.x of SQLite, t
d350: 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e  he VACUUM comman
d360: 64 20 77 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20  d would call.** 
d370: 67 64 62 6d 5f 72 65 6f 72 67 61 6e 69 7a 65 28  gdbm_reorganize(
d380: 29 20 6f 6e 20 61 6c 6c 20 74 68 65 20 64 61 74  ) on all the dat
d390: 61 62 61 73 65 20 74 61 62 6c 65 73 2e 20 20 42  abase tables.  B
d3a0: 75 74 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  ut beginning.** 
d3b0: 77 69 74 68 20 32 2e 30 2e 30 2c 20 53 51 4c 69  with 2.0.0, SQLi
d3c0: 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65  te no longer use
d3d0: 73 20 47 44 42 4d 20 73 6f 20 74 68 69 73 20 63  s GDBM so this c
d3e0: 6f 6d 6d 61 6e 64 20 68 61 73 0a 2a 2a 20 62 65  ommand has.** be
d3f0: 63 6f 6d 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  come a no-op..*/
d400: 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 61 63 75  .void sqliteVacu
d410: 75 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  um(Parse *pParse
d420: 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e  , Token *pTableN
d430: 61 6d 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f  ame){.  /* Do no
d440: 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  thing */.}../*.*
d450: 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
d460: 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
d470: 6c 69 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63  liteBeginTransac
d480: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
d490: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
d4a0: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
d4b0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
d4c0: 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
d4d0: 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42  db)==0 || db->pB
d4e0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
d4f0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
d500: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
d510: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
d520: 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c  rn;.  if( db->fl
d530: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
d540: 72 61 6e 73 20 29 7b 0a 20 20 20 20 70 50 61 72  rans ){.    pPar
d550: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
d560: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
d570: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
d580: 2c 20 22 63 61 6e 6e 6f 74 20 73 74 61 72 74 20  , "cannot start 
d590: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 22 0a  a transaction ".
d5a0: 20 20 20 20 20 20 20 22 77 69 74 68 69 6e 20 61         "within a
d5b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 30   transaction", 0
d5c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
d5d0: 20 7d 0a 20 20 73 71 6c 69 74 65 42 65 67 69 6e   }.  sqliteBegin
d5e0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
d5f0: 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 64 62 2d  Parse, 0);.  db-
d600: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
d610: 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e  _InTrans;.  db->
d620: 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f  onError = onErro
d630: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  r;.}../*.** Comm
d640: 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  it a transaction
d650: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
d660: 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
d670: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
d680: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a  .  sqlite *db;..
d690: 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
d6a0: 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
d6b0: 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65  b)==0 || db->pBe
d6c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d6d0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
d6e0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
d6f0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
d700: 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  n;.  if( (db->fl
d710: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
d720: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
d730: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
d740: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
d750: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
d760: 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 22 63  rMsg, .       "c
d770: 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20 6e  annot commit - n
d780: 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  o transaction is
d790: 20 61 63 74 69 76 65 22 2c 20 30 29 3b 0a 20 20   active", 0);.  
d7a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
d7b0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
d7c0: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20  LITE_InTrans;.  
d7d0: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
d7e0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
d7f0: 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d  .  db->onError =
d800: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a   OE_Default;.}..
d810: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
d820: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
d830: 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62  void sqliteRollb
d840: 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ackTransaction(P
d850: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
d860: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56   sqlite *db;.  V
d870: 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
d880: 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
d890: 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
d8a0: 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72  | db->pBe==0 ) r
d8b0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
d8c0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
d8d0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
d8e0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
d8f0: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
d900: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
d910: 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
d920: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nErr++;.    sql
d930: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
d940: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 0a 20  arse->zErrMsg,. 
d950: 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 72 6f        "cannot ro
d960: 6c 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e  llback - no tran
d970: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
d980: 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
d990: 72 6e 3b 20 0a 20 20 7d 0a 20 20 76 20 3d 20 73  rn; .  }.  v = s
d9a0: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
d9b0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
d9c0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
d9d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62  ddOp(v, OP_Rollb
d9e0: 61 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ack, 0, 0);.  }.
d9f0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
da00: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
da10: 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20    db->onError = 
da20: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f  OE_Default;.}../
da30: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
da40: 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
da50: 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
da60: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
da70: 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
da80: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
da90: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
daa0: 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
dab0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
dac0: 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
dad0: 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
dae0: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
daf0: 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
db00: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
db10: 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
db20: 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
db30: 69 66 20 74 68 65 20 73 65 74 43 68 65 63 6b 70  if the setCheckp
db40: 6f 69 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  oint parameter i
db50: 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
db60: 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
db70: 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
db80: 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
db90: 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
dba0: 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
dbb0: 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
dbc0: 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
dbd0: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
dbe0: 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
dbf0: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
dc00: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
dc10: 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
dc20: 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
dc30: 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
dc40: 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
dc50: 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
dc60: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
dc70: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
dc80: 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
dc90: 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
dca0: 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
dcb0: 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
dcc0: 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
dcd0: 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  be set..*/.void 
dce0: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
dcf0: 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
dd00: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
dd10: 43 68 65 63 6b 70 6f 69 6e 74 29 7b 0a 20 20 56  Checkpoint){.  V
dd20: 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71  dbe *v;.  v = sq
dd30: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
dd40: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
dd50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
dd60: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
dd70: 6b 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69  k ) return; /* i
dd80: 66 20 74 68 69 73 20 69 73 20 69 6e 20 61 20 74  f this is in a t
dd90: 72 69 67 67 65 72 20 2a 2f 0a 20 20 69 66 28 20  rigger */.  if( 
dda0: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
ddb0: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
ddc0: 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ans)==0 ){.    s
ddd0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
dde0: 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
ddf0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
de00: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
de10: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
de20: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 73 63 68   pParse->db->sch
de30: 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a  ema_cookie, 0);.
de40: 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65      pParse->sche
de50: 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a  maVerified = 1;.
de60: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 74 43    }else if( setC
de70: 68 65 63 6b 70 6f 69 6e 74 20 29 7b 0a 20 20 20  heckpoint ){.   
de80: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
de90: 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  (v, OP_Checkpoin
dea0: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 0, 0);.  }.}.
deb0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
dec0: 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63 6c 75  code that conclu
ded0: 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  des an operation
dee0: 20 74 68 61 74 20 6d 61 79 20 68 61 76 65 20 63   that may have c
def0: 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20 64 61  hanged.** the da
df00: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
df10: 20 61 20 63 6f 6d 70 61 6e 69 6f 6e 20 66 75 6e   a companion fun
df20: 63 74 69 6f 6e 20 74 6f 20 42 65 67 69 6e 57 72  ction to BeginWr
df30: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 2e 0a  iteOperation()..
df40: 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
df50: 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2c  ion was started,
df60: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 69 74 2e   then commit it.
df70: 20 20 49 66 20 61 20 63 68 65 63 6b 70 6f 69 6e    If a checkpoin
df80: 74 20 77 61 73 0a 2a 2a 20 73 74 61 72 74 65 64  t was.** started
df90: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 61   then commit tha
dfa0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
dfb0: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
dfc0: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
dfd0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
dfe0: 69 66 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67  if( pParse->trig
dff0: 53 74 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20  Stack ) return; 
e000: 2f 2a 20 69 66 20 74 68 69 73 20 69 73 20 69 6e  /* if this is in
e010: 20 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20   a trigger */.  
e020: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
e030: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
e040: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
e050: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
e060: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
e070: 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  _InTrans ){.    
e080: 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e 67 20 2a 2f  /* Do Nothing */
e090: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
e0a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
e0b0: 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30   OP_Commit, 0, 0
e0c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
e0d0: 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 67   Interpret the g
e0e0: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
e0f0: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a   boolean value..
e100: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
e110: 74 42 6f 6f 6c 65 61 6e 28 63 68 61 72 20 2a 7a  tBoolean(char *z
e120: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
e130: 20 2a 61 7a 54 72 75 65 5b 5d 20 3d 20 7b 20 22   *azTrue[] = { "
e140: 79 65 73 22 2c 20 22 6f 6e 22 2c 20 22 74 72 75  yes", "on", "tru
e150: 65 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e" };.  int i;. 
e160: 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72   if( z[0]==0 ) r
e170: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 69  eturn 0;.  if( i
e180: 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20  sdigit(z[0]) || 
e190: 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73  (z[0]=='-' && is
e1a0: 64 69 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a  digit(z[1])) ){.
e1b0: 20 20 20 20 72 65 74 75 72 6e 20 61 74 6f 69 28      return atoi(
e1c0: 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  z);.  }.  for(i=
e1d0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 54 72  0; i<sizeof(azTr
e1e0: 75 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54 72 75  ue)/sizeof(azTru
e1f0: 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  e[0]); i++){.   
e200: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
e210: 6d 70 28 7a 2c 61 7a 54 72 75 65 5b 69 5d 29 3d  mp(z,azTrue[i])=
e220: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
e230: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
e240: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
e250: 61 20 70 72 61 67 6d 61 20 73 74 61 74 65 6d 65  a pragma stateme
e260: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67  nt.  .**.** Prag
e270: 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69 73 20  mas are of this 
e280: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
e290: 20 50 52 41 47 4d 41 20 69 64 20 3d 20 76 61 6c   PRAGMA id = val
e2a0: 75 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 64 65  ue.**.** The ide
e2b0: 6e 74 69 66 69 65 72 20 6d 69 67 68 74 20 61 6c  ntifier might al
e2c0: 73 6f 20 62 65 20 61 20 73 74 72 69 6e 67 2e 20  so be a string. 
e2d0: 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 61 20   The value is a 
e2e0: 73 74 72 69 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69  string, and.** i
e2f0: 64 65 6e 74 69 66 69 65 72 2c 20 6f 72 20 61 20  dentifier, or a 
e300: 6e 75 6d 62 65 72 2e 20 20 49 66 20 6d 69 6e 75  number.  If minu
e310: 73 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  sFlag is true, t
e320: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 69 73  hen the value is
e330: 0a 2a 2a 20 61 20 6e 75 6d 62 65 72 20 74 68 61  .** a number tha
e340: 74 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62  t was preceded b
e350: 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a  y a minus sign..
e360: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 50 72  */.void sqlitePr
e370: 61 67 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  agma(Parse *pPar
e380: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74  se, Token *pLeft
e390: 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 2c  , Token *pRight,
e3a0: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b   int minusFlag){
e3b0: 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d  .  char *zLeft =
e3c0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 69 67   0;.  char *zRig
e3d0: 68 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ht = 0;.  sqlite
e3e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
e3f0: 62 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71  b;..  zLeft = sq
e400: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4c 65 66  liteStrNDup(pLef
e410: 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e 6e 29 3b  t->z, pLeft->n);
e420: 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
e430: 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 6d  (zLeft);.  if( m
e440: 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20  inusFlag ){.    
e450: 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  zRight = 0;.    
e460: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
e470: 28 26 7a 52 69 67 68 74 2c 20 22 2d 22 2c 20 31  (&zRight, "-", 1
e480: 2c 20 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69  , pRight->z, pRi
e490: 67 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65  ght->n, 0);.  }e
e4a0: 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68 74 20  lse{.    zRight 
e4b0: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
e4c0: 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68  pRight->z, pRigh
e4d0: 74 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  t->n);.    sqlit
e4e0: 65 44 65 71 75 6f 74 65 28 7a 52 69 67 68 74 29  eDequote(zRight)
e4f0: 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 0a 20 20 2a  ;.  }. .  /*.  *
e500: 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c  *  PRAGMA defaul
e510: 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a  t_cache_size.  *
e520: 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c  *  PRAGMA defaul
e530: 74 5f 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20  t_cache_size=N. 
e540: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
e550: 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20  st form reports 
e560: 74 68 65 20 63 75 72 72 65 6e 74 20 70 65 72 73  the current pers
e570: 69 73 74 65 6e 74 20 73 65 74 74 69 6e 67 20 66  istent setting f
e580: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  or the.  ** page
e590: 20 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68   cache size.  Th
e5a0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
e5b0: 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
e5c0: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70  number of.  ** p
e5d0: 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
e5e0: 20 63 61 63 68 65 2e 20 20 54 68 65 20 73 65 63   cache.  The sec
e5f0: 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 62 6f  ond form sets bo
e600: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  th the current. 
e610: 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20 73   ** page cache s
e620: 69 7a 65 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ize value and th
e630: 65 20 70 65 72 73 69 73 74 65 6e 74 20 70 61 67  e persistent pag
e640: 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  e cache size val
e650: 75 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  ue.  ** stored i
e660: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
e670: 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ile..  **.  ** T
e680: 68 65 20 64 65 66 61 75 6c 74 20 63 61 63 68 65  he default cache
e690: 20 73 69 7a 65 20 69 73 20 73 74 6f 72 65 64 20   size is stored 
e6a0: 69 6e 20 6d 65 74 61 2d 76 61 6c 75 65 20 32 20  in meta-value 2 
e6b0: 6f 66 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  of page 1 of the
e6c0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
e6d0: 69 6c 65 2e 20 20 54 68 65 20 63 61 63 68 65 20  ile.  The cache 
e6e0: 73 69 7a 65 20 69 73 20 61 63 74 75 61 6c 6c 79  size is actually
e6f0: 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76 61   the absolute va
e700: 6c 75 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  lue of.  ** this
e710: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
e720: 2e 20 20 54 68 65 20 73 69 67 6e 20 6f 66 20 6d  .  The sign of m
e730: 65 74 61 2d 76 61 6c 75 65 20 32 20 64 65 74 65  eta-value 2 dete
e740: 72 6d 69 6e 65 73 20 74 68 65 0a 20 20 2a 2a 20  rmines the.  ** 
e750: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74  synchronous sett
e760: 69 6e 67 2e 20 20 41 20 6e 65 67 61 74 69 76 65  ing.  A negative
e770: 20 76 61 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e   value means syn
e780: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 0a  chronous is off.
e790: 20 20 2a 2a 20 61 6e 64 20 61 20 70 6f 73 69 74    ** and a posit
e7a0: 69 76 65 20 76 61 6c 75 65 20 6d 65 61 6e 73 20  ive value means 
e7b0: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
e7c0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  n..  */.  if( sq
e7d0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
e7e0: 74 2c 22 64 65 66 61 75 6c 74 5f 63 61 63 68 65  t,"default_cache
e7f0: 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20  _size")==0 ){.  
e800: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
e810: 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d  getCacheSize[] =
e820: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65   {.      { OP_Re
e830: 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c  adCookie,  0, 2,
e840: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
e850: 20 20 7b 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c    { OP_AbsValue,
e860: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
e870: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
e880: 44 75 70 2c 20 20 20 20 20 20 20 20 20 30 2c 20  Dup,         0, 
e890: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
e8a0: 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
e8b0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
e8c0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
e8d0: 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 20 30  P_Ne,          0
e8e0: 2c 20 36 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 6,        0},.
e8f0: 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
e900: 65 72 2c 20 20 20 20 20 4d 41 58 5f 50 41 47 45  er,     MAX_PAGE
e910: 53 2c 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  S,0, 0},.      {
e920: 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c   OP_ColumnCount,
e930: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
e940: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  ,.      { OP_Col
e950: 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
e960: 20 20 20 20 20 20 20 22 63 61 63 68 65 5f 73 69         "cache_si
e970: 7a 65 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  ze"},.      { OP
e980: 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c  _Callback,    1,
e990: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
e9a0: 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a     };.    Vdbe *
e9b0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
e9c0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
e9d0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
e9e0: 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  ;.    if( pRight
e9f0: 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b  ->z==pLeft->z ){
ea00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
ea10: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
ea20: 72 61 79 53 69 7a 65 28 67 65 74 43 61 63 68 65  raySize(getCache
ea30: 53 69 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53  Size), getCacheS
ea40: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
ea50: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
ea60: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
ea70: 3d 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a  = atoi(zRight);.
ea80: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30        if( size<0
ea90: 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b   ) size = -size;
eaa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67  .      sqliteBeg
eab0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
eac0: 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20  (pParse, 0);.   
ead0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
eae0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
eaf0: 2c 20 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  , size, 0);.    
eb00: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
eb10: 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b  p(v, OP_ReadCook
eb20: 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20  ie, 0, 2);.     
eb30: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
eb40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
eb50: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
eb60: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
eb70: 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c  dOp(v, OP_Ge, 0,
eb80: 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20   addr+3);.      
eb90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
eba0: 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20  v, OP_Negative, 
ebb0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
ebc0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ebd0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c  OP_SetCookie, 0,
ebe0: 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
ebf0: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
ec00: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  on(pParse);.    
ec10: 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65    db->cache_size
ec20: 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a   = db->cache_siz
ec30: 65 3c 30 20 3f 20 2d 73 69 7a 65 20 3a 20 73 69  e<0 ? -size : si
ec40: 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
ec50: 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
ec60: 65 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63  e(db->pBe, db->c
ec70: 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20  ache_size);.    
ec80: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a  }.  }else..  /*.
ec90: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63    **  PRAGMA cac
eca0: 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  he_size.  **  PR
ecb0: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3d  AGMA cache_size=
ecc0: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
ecd0: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
ece0: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ts the current l
ecf0: 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 66 6f 72  ocal setting for
ed00: 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63   the.  ** page c
ed10: 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20  ache size.  The 
ed20: 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 63 61  local setting ca
ed30: 6e 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 66  n be different f
ed40: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  rom.  ** the per
ed50: 73 69 73 74 65 6e 74 20 63 61 63 68 65 20 73 69  sistent cache si
ed60: 7a 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 73  ze value that is
ed70: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
ed80: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c  atabase.  ** fil
ed90: 65 20 69 74 73 65 6c 66 2e 20 20 54 68 65 20 76  e itself.  The v
eda0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
edb0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
edc0: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65  ber of.  ** page
edd0: 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
ede0: 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  che.  The second
edf0: 20 66 6f 72 6d 20 73 65 74 73 20 74 68 65 20 6c   form sets the l
ee00: 6f 63 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63  ocal.  ** page c
ee10: 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 2e  ache size value.
ee20: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 68    It does not ch
ee30: 61 6e 67 65 20 74 68 65 20 70 65 72 73 69 73 74  ange the persist
ee40: 65 6e 74 0a 20 20 2a 2a 20 63 61 63 68 65 20 73  ent.  ** cache s
ee50: 69 7a 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68  ize stored on th
ee60: 65 20 64 69 73 6b 20 73 6f 20 74 68 65 20 63 61  e disk so the ca
ee70: 63 68 65 20 73 69 7a 65 20 77 69 6c 6c 20 72 65  che size will re
ee80: 76 65 72 74 0a 20 20 2a 2a 20 74 6f 20 69 74 73  vert.  ** to its
ee90: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77   default value w
eea0: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
eeb0: 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 72   is closed and r
eec0: 65 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 20 4e 20  eopened..  ** N 
eed0: 73 68 6f 75 6c 64 20 62 65 20 61 20 70 6f 73 69  should be a posi
eee0: 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a 20 20  tive integer..  
eef0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  */.  if( sqliteS
ef00: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 63 61  trICmp(zLeft,"ca
ef10: 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b  che_size")==0 ){
ef20: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
ef30: 4f 70 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  Op getCacheSize[
ef40: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
ef50: 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c  _ColumnCount, 1,
ef60: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
ef70: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
ef80: 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
ef90: 20 20 20 20 22 63 61 63 68 65 5f 73 69 7a 65 22      "cache_size"
efa0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61  },.      { OP_Ca
efb0: 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c  llback,    1, 0,
efc0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
efd0: 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  };.    Vdbe *v =
efe0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
eff0: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
f000: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
f010: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a     if( pRight->z
f020: 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20  ==pLeft->z ){.  
f030: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64      int size = d
f040: 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 3b 0a  b->cache_size;;.
f050: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30        if( size<0
f060: 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b   ) size = -size;
f070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
f080: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
f090: 65 67 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a  eger, size, 0);.
f0a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
f0b0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
f0c0: 61 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53  aySize(getCacheS
f0d0: 69 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69  ize), getCacheSi
f0e0: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
f0f0: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
f100: 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20   atoi(zRight);. 
f110: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20       if( size<0 
f120: 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
f130: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 63 61        if( db->ca
f140: 63 68 65 5f 73 69 7a 65 3c 30 20 29 20 73 69 7a  che_size<0 ) siz
f150: 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
f160: 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20   db->cache_size 
f170: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  = size;.      sq
f180: 6c 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68  liteBtreeSetCach
f190: 65 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 64  eSize(db->pBe, d
f1a0: 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  b->cache_size);.
f1b0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
f1c0: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
f1d0: 20 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f   default_synchro
f1e0: 6e 6f 75 73 0a 20 20 2a 2a 20 20 50 52 41 47 4d  nous.  **  PRAGM
f1f0: 41 20 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72  A default_synchr
f200: 6f 6e 6f 75 73 3d 42 4f 4f 4c 45 41 4e 0a 20 20  onous=BOOLEAN.  
f210: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
f220: 74 20 66 6f 72 6d 20 72 65 74 75 72 6e 73 20 74  t form returns t
f230: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 76 61  he persistent va
f240: 6c 75 65 20 6f 66 20 74 68 65 20 22 73 79 6e 63  lue of the "sync
f250: 68 72 6f 6e 6f 75 73 22 20 73 65 74 74 69 6e 67  hronous" setting
f260: 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 73 74  .  ** that is st
f270: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
f280: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 74  base.  This is t
f290: 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73  he synchronous s
f2a0: 65 74 74 69 6e 67 20 74 68 61 74 0a 20 20 2a 2a  etting that.  **
f2b0: 20 69 73 20 75 73 65 64 20 77 68 65 6e 65 76 65   is used wheneve
f2c0: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  r the database i
f2d0: 73 20 6f 70 65 6e 65 64 20 75 6e 6c 65 73 73 20  s opened unless 
f2e0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20  overridden by a 
f2f0: 73 65 70 61 72 61 74 65 0a 20 20 2a 2a 20 22 73  separate.  ** "s
f300: 79 6e 63 68 72 6f 6e 6f 75 73 22 20 70 72 61 67  ynchronous" prag
f310: 6d 61 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  ma.  The second 
f320: 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65  form changes the
f330: 20 70 65 72 73 69 73 74 65 6e 74 20 61 6e 64 20   persistent and 
f340: 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 61 6c 20 73  the.  ** local s
f350: 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69  ynchronous setti
f360: 6e 67 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ng to the value 
f370: 67 69 76 65 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  given..  **.  **
f380: 20 49 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   If synchronous 
f390: 69 73 20 6f 6e 2c 20 53 51 4c 69 74 65 20 77 69  is on, SQLite wi
f3a0: 6c 6c 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  ll do an fsync()
f3b0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 74 20   system call at 
f3c0: 73 74 72 61 74 65 67 69 63 0a 20 20 2a 2a 20 70  strategic.  ** p
f3d0: 6f 69 6e 74 73 20 74 6f 20 69 6e 73 75 72 65 20  oints to insure 
f3e0: 74 68 61 74 20 61 6c 6c 20 70 72 65 76 69 6f 75  that all previou
f3f0: 73 6c 79 20 77 72 69 74 74 65 6e 20 64 61 74 61  sly written data
f400: 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65   has actually be
f410: 65 6e 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  en.  ** written 
f420: 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75  onto the disk su
f430: 72 66 61 63 65 20 62 65 66 6f 72 65 20 63 6f 6e  rface before con
f440: 74 69 6e 75 69 6e 67 2e 20 20 54 68 69 73 20 6d  tinuing.  This m
f450: 6f 64 65 20 69 6e 73 75 72 65 73 20 74 68 61 74  ode insures that
f460: 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
f470: 73 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  se will always b
f480: 65 20 69 6e 20 61 20 63 6f 6e 73 69 73 74 65 6e  e in a consisten
f490: 74 20 73 74 61 74 65 20 65 76 65 6e 74 20 69 66  t state event if
f4a0: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 0a 20   the operating. 
f4b0: 20 2a 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68   ** system crash
f4c0: 65 73 20 6f 72 20 70 6f 77 65 72 20 74 6f 20 74  es or power to t
f4d0: 68 65 20 63 6f 6d 70 75 74 65 72 20 69 73 20 69  he computer is i
f4e0: 6e 74 65 72 72 75 70 74 65 64 20 75 6e 65 78 70  nterrupted unexp
f4f0: 65 63 74 65 64 6c 79 2e 0a 20 20 2a 2a 20 57 68  ectedly..  ** Wh
f500: 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
f510: 73 20 6f 66 66 2c 20 53 51 4c 69 74 65 20 77 69  s off, SQLite wi
f520: 6c 6c 20 6e 6f 74 20 77 61 69 74 20 66 6f 72 20  ll not wait for 
f530: 63 68 61 6e 67 65 73 20 74 6f 20 61 63 74 75 61  changes to actua
f540: 6c 6c 79 0a 20 20 2a 2a 20 62 65 20 77 72 69 74  lly.  ** be writ
f550: 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
f560: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
f570: 67 2e 20 20 41 73 20 73 6f 6f 6e 20 61 73 20 69  g.  As soon as i
f580: 74 20 68 61 6e 64 73 20 63 68 61 6e 67 65 73 0a  t hands changes.
f590: 20 20 2a 2a 20 74 6f 20 74 68 65 20 6f 70 65 72    ** to the oper
f5a0: 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 69 74  ating system, it
f5b0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
f5c0: 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 70 65  e changes are pe
f5d0: 72 6d 61 6e 65 6e 74 20 61 6e 64 0a 20 20 2a 2a  rmanent and.  **
f5e0: 20 69 74 20 63 6f 6e 74 69 6e 75 65 73 20 67 6f   it continues go
f5f0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 62 61  ing.  The databa
f600: 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
f610: 72 75 70 74 65 64 20 62 79 20 61 20 70 72 6f 67  rupted by a prog
f620: 72 61 6d 20 63 72 61 73 68 0a 20 20 2a 2a 20 65  ram crash.  ** e
f630: 76 65 6e 20 77 69 74 68 20 73 79 6e 63 68 72 6f  ven with synchro
f640: 6e 6f 75 73 20 6f 66 66 2c 20 62 75 74 20 61 6e  nous off, but an
f650: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
f660: 6d 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  m crash or power
f670: 20 6c 6f 73 73 0a 20 20 2a 2a 20 63 6f 75 6c 64   loss.  ** could
f680: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 63 6f 72   potentially cor
f690: 72 75 70 74 20 64 61 74 61 2e 20 20 4f 6e 20 74  rupt data.  On t
f6a0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 73  he other hand, s
f6b0: 79 6e 63 68 72 6f 6e 6f 75 73 20 6f 66 66 20 69  ynchronous off i
f6c0: 73 0a 20 20 2a 2a 20 66 61 73 74 65 72 20 74 68  s.  ** faster th
f6d0: 61 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6f  an synchronous o
f6e0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  n..  */.  if( sq
f6f0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
f700: 74 2c 22 64 65 66 61 75 6c 74 5f 73 79 6e 63 68  t,"default_synch
f710: 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20  ronous")==0 ){. 
f720: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
f730: 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20   getSync[] = {. 
f740: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
f750: 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  r,     0, 0,    
f760: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
f770: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20  OP_ReadCookie,  
f780: 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
f790: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
f7a0: 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ger,     0, 0,  
f7b0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
f7c0: 7b 20 4f 50 5f 4c 74 2c 20 20 20 20 20 20 20 20  { OP_Lt,        
f7d0: 20 20 30 2c 20 35 2c 20 20 20 20 20 20 20 20 30    0, 5,        0
f7e0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 41 64  },.      { OP_Ad
f7f0: 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c  dImm,      1, 0,
f800: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
f810: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75    { OP_ColumnCou
f820: 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20  nt, 1, 0,       
f830: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
f840: 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20  ColumnName,  0, 
f850: 30 2c 20 20 20 20 20 20 20 20 22 73 79 6e 63 68  0,        "synch
f860: 72 6f 6e 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20  ronous"},.      
f870: 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20  { OP_Callback,  
f880: 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30    1, 0,        0
f890: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64  },.    };.    Vd
f8a0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65  be *v = sqliteGe
f8b0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
f8c0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
f8d0: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52  turn;.    if( pR
f8e0: 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e  ight->z==pLeft->
f8f0: 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  z ){.      sqlit
f900: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
f910: 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 53  , ArraySize(getS
f920: 79 6e 63 29 2c 20 67 65 74 53 79 6e 63 29 3b 0a  ync), getSync);.
f930: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f940: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
f950: 20 69 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e   int size = db->
f960: 63 61 63 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20  cache_size;.    
f970: 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73    if( size<0 ) s
f980: 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20  ize = -size;.   
f990: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
f9a0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
f9b0: 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  rse, 0);.      s
f9c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f9d0: 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  , OP_ReadCookie,
f9e0: 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71   0, 2);.      sq
f9f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
fa00: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
fa10: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
fa20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
fa30: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
fa40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
fa50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
fa60: 65 2c 20 30 2c 20 61 64 64 72 2b 33 29 3b 0a 20  e, 0, addr+3);. 
fa70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
fa80: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d  ddOp(v, OP_AddIm
fa90: 6d 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 30 29  m, MAX_PAGES, 0)
faa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
fab0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 62  beAddOp(v, OP_Ab
fac0: 73 56 61 6c 75 65 2c 20 30 2c 20 30 29 3b 0a 20  sValue, 0, 0);. 
fad0: 20 20 20 20 20 69 66 28 20 21 67 65 74 42 6f 6f       if( !getBoo
fae0: 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
faf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
fb00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
fb10: 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20  gative, 0, 0);. 
fb20: 20 20 20 20 20 20 20 73 69 7a 65 20 3d 20 2d 73         size = -s
fb30: 69 7a 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ize;.      }.   
fb40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
fb50: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
fb60: 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20  ie, 0, 2);.     
fb70: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
fb80: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
fb90: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63 61 63 68  ;.      db->cach
fba0: 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20  e_size = size;. 
fbb0: 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65       sqliteBtree
fbc0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d  SetCacheSize(db-
fbd0: 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f  >pBe, db->cache_
fbe0: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  size);.    }.  }
fbf0: 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  else..  /*.  ** 
fc00: 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f    PRAGMA synchro
fc10: 6e 6f 75 73 0a 20 20 2a 2a 20 20 20 50 52 41 47  nous.  **   PRAG
fc20: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 42  MA synchronous=B
fc30: 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a  OOLEAN.  **.  **
fc40: 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20 74   Return or set t
fc50: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f  he local value o
fc60: 66 20 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75  f the synchronou
fc70: 73 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e  s flag.  Changin
fc80: 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c  g.  ** the local
fc90: 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20   value does not 
fca0: 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f 20  make changes to 
fcb0: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 6e  the disk file an
fcc0: 64 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75  d the.  ** defau
fcd0: 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
fce0: 20 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e 65   restored the ne
fcf0: 78 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  xt time the data
fd00: 62 61 73 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65  base is.  ** ope
fd10: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
fd20: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
fd30: 65 66 74 2c 22 73 79 6e 63 68 72 6f 6e 6f 75 73  eft,"synchronous
fd40: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  ")==0 ){.    sta
fd50: 74 69 63 20 56 64 62 65 4f 70 20 67 65 74 53 79  tic VdbeOp getSy
fd60: 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  nc[] = {.      {
fd70: 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c   OP_ColumnCount,
fd80: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
fd90: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  ,.      { OP_Col
fda0: 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
fdb0: 20 20 20 20 20 20 20 22 73 79 6e 63 68 72 6f 6e         "synchron
fdc0: 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ous"},.      { O
fdd0: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31  P_Callback,    1
fde0: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
fdf0: 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20      };.    Vdbe 
fe00: 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64  *v = sqliteGetVd
fe10: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
fe20: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
fe30: 6e 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  n;.    if( pRigh
fe40: 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29  t->z==pLeft->z )
fe50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
fe60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
fe70: 74 65 67 65 72 2c 20 64 62 2d 3e 63 61 63 68 65  teger, db->cache
fe80: 5f 73 69 7a 65 3e 3d 30 2c 20 30 29 3b 0a 20 20  _size>=0, 0);.  
fe90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
fea0: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
feb0: 53 69 7a 65 28 67 65 74 53 79 6e 63 29 2c 20 67  Size(getSync), g
fec0: 65 74 53 79 6e 63 29 3b 0a 20 20 20 20 7d 65 6c  etSync);.    }el
fed0: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  se{.      int si
fee0: 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73  ze = db->cache_s
fef0: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ize;.      if( s
ff00: 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d  ize<0 ) size = -
ff10: 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
ff20: 21 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67  !getBoolean(zRig
ff30: 68 74 29 20 29 20 73 69 7a 65 20 3d 20 2d 73 69  ht) ) size = -si
ff40: 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63 61  ze;.      db->ca
ff50: 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b  che_size = size;
ff60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72  .      sqliteBtr
ff70: 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 64  eeSetCacheSize(d
ff80: 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63 68  b->pBe, db->cach
ff90: 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  e_size);.    }. 
ffa0: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
ffb0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
ffc0: 74 2c 20 22 74 72 69 67 67 65 72 5f 6f 76 65 72  t, "trigger_over
ffd0: 68 65 61 64 5f 74 65 73 74 22 29 3d 3d 30 20 29  head_test")==0 )
ffe0: 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f  {.    if( getBoo
fff0: 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
10000 20 20 20 20 20 20 61 6c 77 61 79 73 5f 63 6f 64        always_cod
10010 65 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70 20  e_trigger_setup 
10020 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
10030 20 20 20 20 20 20 61 6c 77 61 79 73 5f 63 6f 64        always_cod
10040 65 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70 20  e_trigger_setup 
10050 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
10060 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
10070 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
10080 76 64 62 65 5f 74 72 61 63 65 22 29 3d 3d 30 20  vdbe_trace")==0 
10090 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
100a0 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
100b0 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
100c0 20 7c 3d 20 53 51 4c 49 54 45 5f 56 64 62 65 54   |= SQLITE_VdbeT
100d0 72 61 63 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  race;.    }else{
100e0 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
100f0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 56 64 62 65   &= ~SQLITE_Vdbe
10100 54 72 61 63 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  Trace;.    }.  }
10110 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
10120 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
10130 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61   "full_column_na
10140 6d 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mes")==0 ){.    
10150 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a  if( getBoolean(z
10160 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
10170 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
10180 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
10190 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
101a0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
101b0 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e  ~SQLITE_FullColN
101c0 61 6d 65 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ames;.    }.  }e
101d0 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
101e0 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
101f0 22 73 68 6f 77 5f 64 61 74 61 74 79 70 65 73 22  "show_datatypes"
10200 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
10210 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68  getBoolean(zRigh
10220 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  t) ){.      db->
10230 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
10240 52 65 70 6f 72 74 54 79 70 65 73 3b 0a 20 20 20  ReportTypes;.   
10250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
10260 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
10270 54 45 5f 52 65 70 6f 72 74 54 79 70 65 73 3b 0a  TE_ReportTypes;.
10280 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
10290 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
102a0 6d 70 28 7a 4c 65 66 74 2c 20 22 72 65 73 75 6c  mp(zLeft, "resul
102b0 74 5f 73 65 74 5f 64 65 74 61 69 6c 73 22 29 3d  t_set_details")=
102c0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
102d0 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
102e0 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   ){.      db->fl
102f0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65  ags |= SQLITE_Re
10300 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20  sultDetails;.   
10310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
10320 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
10330 54 45 5f 52 65 73 75 6c 74 44 65 74 61 69 6c 73  TE_ResultDetails
10340 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
10350 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
10360 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 63 6f 75  ICmp(zLeft, "cou
10370 6e 74 5f 63 68 61 6e 67 65 73 22 29 3d 3d 30 20  nt_changes")==0 
10380 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
10390 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
103a0 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
103b0 20 7c 3d 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74   |= SQLITE_Count
103c0 52 6f 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Rows;.    }else{
103d0 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
103e0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 43 6f 75 6e   &= ~SQLITE_Coun
103f0 74 52 6f 77 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  tRows;.    }.  }
10400 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
10410 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
10420 20 22 65 6d 70 74 79 5f 72 65 73 75 6c 74 5f 63   "empty_result_c
10430 61 6c 6c 62 61 63 6b 73 22 29 3d 3d 30 20 29 7b  allbacks")==0 ){
10440 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c  .    if( getBool
10450 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
10460 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
10470 3d 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c  = SQLITE_NullCal
10480 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  lback;.    }else
10490 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
104a0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4e 75 6c  s &= ~SQLITE_Nul
104b0 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d  lCallback;.    }
104c0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
104d0 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
104e0 65 66 74 2c 20 22 74 61 62 6c 65 5f 69 6e 66 6f  eft, "table_info
104f0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62  ")==0 ){.    Tab
10500 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64  le *pTab;.    Vd
10510 62 65 20 2a 76 3b 0a 20 20 20 20 70 54 61 62 20  be *v;.    pTab 
10520 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c  = sqliteFindTabl
10530 65 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20  e(db, zRight);. 
10540 20 20 20 69 66 28 20 70 54 61 62 20 29 20 76 20     if( pTab ) v 
10550 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
10560 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
10570 20 70 54 61 62 20 26 26 20 76 20 29 7b 0a 20 20   pTab && v ){.  
10580 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
10590 70 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61  p tableInfoPrefa
105a0 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ce[] = {.       
105b0 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e   { OP_ColumnCoun
105c0 74 2c 20 35 2c 20 30 2c 20 20 20 20 20 20 20 30  t, 5, 0,       0
105d0 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  },.        { OP_
105e0 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20  ColumnName,  0, 
105f0 30 2c 20 20 20 20 20 20 20 22 63 69 64 22 7d 2c  0,       "cid"},
10600 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
10610 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c  lumnName,  1, 0,
10620 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a         "name"},.
10630 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
10640 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20  umnName,  2, 0, 
10650 20 20 20 20 20 20 22 74 79 70 65 22 7d 2c 0a 20        "type"},. 
10660 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
10670 6d 6e 4e 61 6d 65 2c 20 20 33 2c 20 30 2c 20 20  mnName,  3, 0,  
10680 20 20 20 20 20 22 6e 6f 74 6e 75 6c 6c 22 7d 2c       "notnull"},
10690 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
106a0 6c 75 6d 6e 4e 61 6d 65 2c 20 20 34 2c 20 30 2c  lumnName,  4, 0,
106b0 20 20 20 20 20 20 20 22 64 66 6c 74 5f 76 61 6c         "dflt_val
106c0 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20  ue"},.      };. 
106d0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
106e0 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
106f0 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
10700 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66  ze(tableInfoPref
10710 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50  ace), tableInfoP
10720 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20 73  reface);.      s
10730 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75  qliteViewGetColu
10740 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
10750 70 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  pTab);.      for
10760 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
10770 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
10780 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10790 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
107a0 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   i, 0);.        
107b0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
107c0 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
107d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
107e0 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
107f0 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f  v, -1, pTab->aCo
10800 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53  l[i].zName, P3_S
10810 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
10820 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10830 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
10840 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
10850 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
10860 76 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  v, -1, .        
10870 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d     pTab->aCol[i]
10880 2e 7a 54 79 70 65 20 3f 20 70 54 61 62 2d 3e 61  .zType ? pTab->a
10890 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3a 20 22  Col[i].zType : "
108a0 74 65 78 74 22 2c 20 50 33 5f 53 54 41 54 49 43  text", P3_STATIC
108b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
108c0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
108d0 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e  _Integer, pTab->
108e0 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c  aCol[i].notNull,
108f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
10900 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10910 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
10920 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10930 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
10940 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  -1, pTab->aCol[i
10950 5d 2e 7a 44 66 6c 74 2c 20 50 33 5f 53 54 41 54  ].zDflt, P3_STAT
10960 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
10970 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10980 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 35 2c 20  OP_Callback, 5, 
10990 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
109a0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
109b0 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
109c0 4c 65 66 74 2c 20 22 69 6e 64 65 78 5f 69 6e 66  Left, "index_inf
109d0 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  o")==0 ){.    In
109e0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54  dex *pIdx;.    T
109f0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
10a00 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 70 49 64  Vdbe *v;.    pId
10a10 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  x = sqliteFindIn
10a20 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74 29 3b  dex(db, zRight);
10a30 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 29 20  .    if( pIdx ) 
10a40 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
10a50 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
10a60 66 28 20 70 49 64 78 20 26 26 20 76 20 29 7b 0a  f( pIdx && v ){.
10a70 20 20 20 20 20 20 73 74 61 74 69 63 20 56 64 62        static Vdb
10a80 65 4f 70 20 74 61 62 6c 65 49 6e 66 6f 50 72 65  eOp tableInfoPre
10a90 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  face[] = {.     
10aa0 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f     { OP_ColumnCo
10ab0 75 6e 74 2c 20 33 2c 20 30 2c 20 20 20 20 20 20  unt, 3, 0,      
10ac0 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f   0},.        { O
10ad0 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30  P_ColumnName,  0
10ae0 2c 20 30 2c 20 20 20 20 20 20 20 22 73 65 71 6e  , 0,       "seqn
10af0 6f 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  o"},.        { O
10b00 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31  P_ColumnName,  1
10b10 2c 20 30 2c 20 20 20 20 20 20 20 22 63 69 64 22  , 0,       "cid"
10b20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  },.        { OP_
10b30 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20  ColumnName,  2, 
10b40 30 2c 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d  0,       "name"}
10b50 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ,.      };.     
10b60 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 54   int i;.      pT
10b70 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
10b80 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  e;.      sqliteV
10b90 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
10ba0 41 72 72 61 79 53 69 7a 65 28 74 61 62 6c 65 49  ArraySize(tableI
10bb0 6e 66 6f 50 72 65 66 61 63 65 29 2c 20 74 61 62  nfoPreface), tab
10bc0 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a  leInfoPreface);.
10bd0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
10be0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
10bf0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
10c00 74 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61  t cnum = pIdx->a
10c10 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
10c20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10c30 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
10c40 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, i, 0);.      
10c50 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10c60 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
10c70 20 63 6e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20   cnum, 0);.     
10c80 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10c90 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
10ca0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
10cb0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
10cc0 6f 6c 3e 63 6e 75 6d 20 29 3b 0a 20 20 20 20 20  ol>cnum );.     
10cd0 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
10ce0 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
10cf0 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e  b->aCol[cnum].zN
10d00 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
10d10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
10d20 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
10d30 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a  allback, 3, 0);.
10d40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10d50 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
10d60 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
10d70 2c 20 22 69 6e 64 65 78 5f 6c 69 73 74 22 29 3d  , "index_list")=
10d80 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  =0 ){.    Index 
10d90 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65  *pIdx;.    Table
10da0 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65   *pTab;.    Vdbe
10db0 20 2a 76 3b 0a 20 20 20 20 70 54 61 62 20 3d 20   *v;.    pTab = 
10dc0 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
10dd0 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20  db, zRight);.   
10de0 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
10df0 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74     v = sqliteGet
10e00 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10e10 20 20 20 20 70 49 64 78 20 3d 20 70 54 61 62 2d      pIdx = pTab-
10e20 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  >pIndex;.    }. 
10e30 20 20 20 69 66 28 20 70 54 61 62 20 26 26 20 70     if( pTab && p
10e40 49 64 78 20 26 26 20 76 20 29 7b 0a 20 20 20 20  Idx && v ){.    
10e50 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20    int i = 0; .  
10e60 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
10e70 70 20 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61  p indexListPrefa
10e80 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ce[] = {.       
10e90 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e   { OP_ColumnCoun
10ea0 74 2c 20 33 2c 20 30 2c 20 20 20 20 20 20 20 30  t, 3, 0,       0
10eb0 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  },.        { OP_
10ec0 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20  ColumnName,  0, 
10ed0 30 2c 20 20 20 20 20 20 20 22 73 65 71 22 7d 2c  0,       "seq"},
10ee0 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
10ef0 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c  lumnName,  1, 0,
10f00 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a         "name"},.
10f10 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
10f20 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20  umnName,  2, 0, 
10f30 20 20 20 20 20 20 22 75 6e 69 71 75 65 22 7d 2c        "unique"},
10f40 0a 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20  .      };..     
10f50 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
10f60 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
10f70 65 28 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61  e(indexListPrefa
10f80 63 65 29 2c 20 69 6e 64 65 78 4c 69 73 74 50 72  ce), indexListPr
10f90 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20 77 68  eface);.      wh
10fa0 69 6c 65 28 70 49 64 78 29 7b 0a 20 20 20 20 20  ile(pIdx){.     
10fb0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10fc0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
10fd0 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
10fe0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
10ff0 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
11000 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
11010 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
11020 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e  (v, -1, pIdx->zN
11030 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
11040 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
11050 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
11060 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 6f 6e  nteger, pIdx->on
11070 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 20  Error!=OE_None, 
11080 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
11090 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
110a0 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30  P_Callback, 3, 0
110b0 29 3b 0a 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a  );.        ++i;.
110c0 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 70          pIdx = p
110d0 49 64 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Idx->pNext;.    
110e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
110f0 65 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  e..#ifndef NDEBU
11100 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  G.  if( sqliteSt
11110 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 70 61  rICmp(zLeft, "pa
11120 72 73 65 72 5f 74 72 61 63 65 22 29 3d 3d 30 20  rser_trace")==0 
11130 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f  ){.    extern vo
11140 69 64 20 73 71 6c 69 74 65 50 61 72 73 65 72 54  id sqliteParserT
11150 72 61 63 65 28 46 49 4c 45 2a 2c 20 63 68 61 72  race(FILE*, char
11160 20 2a 29 3b 0a 20 20 20 20 69 66 28 20 67 65 74   *);.    if( get
11170 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
11180 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 50  ){.      sqliteP
11190 61 72 73 65 72 54 72 61 63 65 28 73 74 64 6f 75  arserTrace(stdou
111a0 74 2c 20 22 70 61 72 73 65 72 3a 20 22 29 3b 0a  t, "parser: ");.
111b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
111c0 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61   sqliteParserTra
111d0 63 65 28 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ce(0, 0);.    }.
111e0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
111f0 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
11200 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 74 65  Cmp(zLeft, "inte
11210 67 72 69 74 79 5f 63 68 65 63 6b 22 29 3d 3d 30  grity_check")==0
11220 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
11230 64 62 65 4f 70 20 63 68 65 63 6b 44 62 5b 5d 20  dbeOp checkDb[] 
11240 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  = {.      { OP_S
11250 65 74 49 6e 73 65 72 74 2c 20 20 20 30 2c 20 30  etInsert,   0, 0
11260 2c 20 20 20 20 20 20 20 20 22 32 22 7d 2c 0a 20  ,        "2"},. 
11270 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20       { OP_Open, 
11280 20 20 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20         0, 2,    
11290 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
112a0 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20  OP_Rewind,      
112b0 30 2c 20 36 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 6,        0},
112c0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
112d0 6d 6e 2c 20 20 20 20 20 20 30 2c 20 33 2c 20 20  mn,      0, 3,  
112e0 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
112f0 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  3 */.      { OP_
11300 53 65 74 49 6e 73 65 72 74 2c 20 20 20 30 2c 20  SetInsert,   0, 
11310 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
11320 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20      { OP_Next,  
11330 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20        0, 3,     
11340 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
11350 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 30  P_IntegrityCk, 0
11360 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
11370 20 20 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20     /* 6 */.     
11380 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e   { OP_ColumnCoun
11390 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20  t, 1, 0,        
113a0 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
113b0 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
113c0 2c 20 20 20 20 20 20 20 20 22 69 6e 74 65 67 72  ,        "integr
113d0 69 74 79 5f 63 68 65 63 6b 22 7d 2c 0a 20 20 20  ity_check"},.   
113e0 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
113f0 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
11400 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
11410 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20 31 2c  _SetInsert,   1,
11420 20 30 2c 20 20 20 20 20 20 20 20 22 32 22 7d 2c   0,        "2"},
11430 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e  .      { OP_Open
11440 41 75 78 2c 20 20 20 20 20 31 2c 20 32 2c 20 20  Aux,     1, 2,  
11450 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
11460 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20  { OP_Rewind,    
11470 20 20 31 2c 20 31 36 2c 20 20 20 20 20 20 20 30    1, 16,       0
11480 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  },.      { OP_Co
11490 6c 75 6d 6e 2c 20 20 20 20 20 20 31 2c 20 33 2c  lumn,      1, 3,
114a0 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f          0},    /
114b0 2a 20 31 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  * 13 */.      { 
114c0 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20  OP_SetInsert,   
114d0 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
114e0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
114f0 2c 20 20 20 20 20 20 20 20 31 2c 20 31 33 2c 20  ,        1, 13, 
11500 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
11510 7b 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b  { OP_IntegrityCk
11520 2c 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30  , 1, 1,        0
11530 7d 2c 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20  },    /* 16 */. 
11540 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61       { OP_Callba
11550 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ck,    1, 0,    
11560 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20      0},.    };. 
11570 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
11580 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
11590 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
115a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
115b0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
115c0 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
115d0 63 68 65 63 6b 44 62 29 2c 20 63 68 65 63 6b 44  checkDb), checkD
115e0 62 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b  b);.  }else..  {
115f0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  }.  sqliteFree(z
11600 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  Left);.  sqliteF
11610 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 7d 0a     ree(zRight);.}.