/ Hex Artifact Content
Login

Artifact ea4a3bc15d6338294e68100f642edf48e4082403:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02a0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02b0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02c0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02d0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02e0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
02f0: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0300: 69 6c 64 2e 63 2c 76 20 31 2e 31 30 31 20 32 30  ild.c,v 1.101 20
0310: 30 32 2f 30 37 2f 30 35 20 32 31 3a 34 32 3a 33  02/07/05 21:42:3
0320: 36 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  6 drh Exp $.*/.#
0330: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0340: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0350: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0360: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0380: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0390: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
03a0: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 43  ** be parsed.  C
03b0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
03c0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
03d0: 65 20 64 61 74 61 62 61 73 65 20 6e 65 65 64 73  e database needs
03e0: 0a 2a 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66  .** to be read f
03f0: 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  rom the SQLITE_M
0400: 41 53 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45  ASTER and SQLITE
0410: 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62  _TEMP_MASTER tab
0420: 6c 65 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  les..** If it do
0430: 65 73 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74  es, then read it
0440: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0450: 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65  BeginParse(Parse
0460: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78   *pParse, int ex
0470: 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71  plainFlag){.  sq
0480: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
0490: 65 2d 3e 64 62 3b 0a 20 20 70 50 61 72 73 65 2d  e->db;.  pParse-
04a0: 3e 65 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61  >explain = expla
04b0: 69 6e 46 6c 61 67 3b 0a 20 20 69 66 28 28 64 62  inFlag;.  if((db
04c0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
04d0: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30  _Initialized)==0
04e0: 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   && pParse->init
04f0: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Flag==0 ){.    i
0500: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e  nt rc = sqliteIn
0510: 69 74 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e  it(db, &pParse->
0520: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
0530: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
0540: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
0550: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
0560: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
0570: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0580: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0590: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
05a0: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
05b0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
05c0: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 77 65  ** parsed and we
05d0: 20 77 61 6e 74 20 74 6f 20 65 78 65 63 75 74 65   want to execute
05e0: 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 74   the VDBE code t
05f0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20  o implement .** 
0600: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2e 20  that statement. 
0610: 20 50 72 69 6f 72 20 61 63 74 69 6f 6e 20 72 6f   Prior action ro
0620: 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61  utines should ha
0630: 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 63 6f  ve already.** co
0640: 6e 73 74 72 75 63 74 65 64 20 56 44 42 45 20 63  nstructed VDBE c
0650: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  ode to do the wo
0660: 72 6b 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  rk of the SQL st
0670: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73  atement..** This
0680: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61   routine just ha
0690: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
06a0: 20 56 44 42 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a   VDBE code..**.*
06b0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
06c0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
06d0: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
06e0: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
06f0: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0700: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0710: 69 64 20 73 71 6c 69 74 65 45 78 65 63 28 50 61  id sqliteExec(Pa
0720: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
0730: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
0740: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  OK;.  sqlite *db
0750: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0760: 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   if( sqlite_mall
0770: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
0780: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
0790: 2d 3e 70 56 64 62 65 20 26 26 20 70 50 61 72 73  ->pVdbe && pPars
07a0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
07b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
07c0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 72  plain ){.      r
07d0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4c 69  c = sqliteVdbeLi
07e0: 73 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  st(pParse->pVdbe
07f0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
0800: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
0810: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0830: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b  Parse->zErrMsg);
0840: 0a 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f  .      db->next_
0850: 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68  cookie = db->sch
0860: 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20  ema_cookie;.    
0870: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49 4c  }else{.      FIL
0880: 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e  E *trace = (db->
0890: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
08a0: 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73  dbeTrace)!=0 ? s
08b0: 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 20  tdout : 0;.     
08c0: 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63 65   sqliteVdbeTrace
08d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
08e0: 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72 63  trace);.      rc
08f0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78 65   = sqliteVdbeExe
0900: 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  c(pParse->pVdbe,
0910: 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61   pParse->xCallba
0920: 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72 67  ck, pParse->pArg
0930: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 50               &pP
0950: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  arse->zErrMsg, d
0960: 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20 20  b->pBusyArg,.   
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73 79         db->xBusy
0990: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  Callback);.     
09a0: 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73 65   if( rc ) pParse
09b0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nErr++;.    }.
09c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
09d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56 64  lete(pParse->pVd
09e0: 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  be);.    pParse-
09f0: 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20 20  >pVdbe = 0;.    
0a00: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
0a10: 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Set = 0;.    pPa
0a20: 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
0a30: 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61    pParse->schema
0a40: 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20 20  Verified = 0;.  
0a50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  }.}../*.** Locat
0a60: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0a70: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0a80: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0a90: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0aa0: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0ab0: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0ac0: 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  at table.  Retur
0ad0: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
0ae0: 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  und..*/.Table *s
0af0: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73  qliteFindTable(s
0b00: 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74  qlite *db, const
0b10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
0b20: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d   Table *p;.  p =
0b30: 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28   sqliteHashFind(
0b40: 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  &db->tblHash, zN
0b50: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
0b60: 65 29 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  e)+1);.  return 
0b70: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
0b80: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0b90: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0ba0: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0bb0: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
0bc0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
0bd0: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a  of that index..*
0be0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
0bf0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49   not found..*/.I
0c00: 6e 64 65 78 20 2a 73 71 6c 69 74 65 46 69 6e 64  ndex *sqliteFind
0c10: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
0c20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
0c30: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
0c40: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61  ;.  p = sqliteHa
0c50: 73 68 46 69 6e 64 28 26 64 62 2d 3e 69 64 78 48  shFind(&db->idxH
0c60: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
0c70: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
0c80: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0c90: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
0ca0: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
0cb0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
0cc0: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
0cd0: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
0ce0: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
0cf0: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
0d00: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
0d10: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
0d20: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
0d30: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
0d40: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
0d50: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
0d60: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
0d70: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
0d80: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
0d90: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
0da0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
0db0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
0dc0: 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20  lite *db, Index 
0dd0: 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f  *p){.  Index *pO
0de0: 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  ld;.  assert( db
0df0: 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21  !=0 && p->zName!
0e00: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
0e10: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
0e20: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 2d  &db->idxHash, p-
0e30: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
0e40: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
0e50: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26    if( pOld!=0 &&
0e60: 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20   pOld!=p ){.    
0e70: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
0e80: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70  (&db->idxHash, p
0e90: 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  Old->zName, strl
0ea0: 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b  en(pOld->zName)+
0eb0: 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20  1, pOld);.  }.  
0ec0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
0ed0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
0ee0: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
0ef0: 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74  rom its table, t
0f00: 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68  hen remove.** th
0f10: 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  e index from the
0f20: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
0f30: 65 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d  e and free its m
0f40: 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75  emory.** structu
0f50: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
0f60: 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  iteUnlinkAndDele
0f70: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  teIndex(sqlite *
0f80: 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  db, Index *pInde
0f90: 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  x){.  if( pIndex
0fa0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
0fb0: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
0fc0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
0fd0: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
0fe0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
0ff0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
1000: 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d     for(p=pIndex-
1010: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
1020: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d   p && p->pNext!=
1030: 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65  pIndex; p=p->pNe
1040: 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 20  xt){}.    if( p 
1050: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
1060: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  dex ){.      p->
1070: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
1080: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
1090: 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  .  sqliteDeleteI
10a0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
10b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
10c0: 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f   all schema info
10d0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
10e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
10f0: 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 64 61 74  tables of.** dat
1100: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1110: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1120: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63  is called to rec
1130: 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62  laim memory.** b
1140: 65 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65 63  efore the connec
1150: 74 69 6f 6e 20 63 6c 6f 73 65 73 2e 20 20 49 74  tion closes.  It
1160: 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20   is also called 
1170: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
1180: 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65  k.** if there we
1190: 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  re schema change
11a0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  s during the tra
11b0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nsaction..*/.voi
11c0: 64 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74  d sqliteResetInt
11d0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69  ernalSchema(sqli
11e0: 74 65 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  te *db){.  HashE
11f0: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
1200: 73 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68  sh temp1;.  Hash
1210: 20 74 65 6d 70 32 3b 0a 0a 20 20 74 65 6d 70 31   temp2;..  temp1
1220: 20 3d 20 64 62 2d 3e 74 62 6c 48 61 73 68 3b 0a   = db->tblHash;.
1230: 20 20 74 65 6d 70 32 20 3d 20 64 62 2d 3e 74 72    temp2 = db->tr
1240: 69 67 48 61 73 68 3b 0a 20 20 73 71 6c 69 74 65  igHash;.  sqlite
1250: 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 74 72  HashInit(&db->tr
1260: 69 67 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48  igHash, SQLITE_H
1270: 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a  ASH_STRING, 0);.
1280: 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61    sqliteHashClea
1290: 72 28 26 64 62 2d 3e 69 64 78 48 61 73 68 29 3b  r(&db->idxHash);
12a0: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
12b0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65  iteHashFirst(&te
12c0: 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  mp2); pElem; pEl
12d0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
12e0: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
12f0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
1300: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
1310: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71  a(pElem);.    sq
1320: 6c 69 74 65 44 65 6c 65 74 65 54 72 69 67 67 65  liteDeleteTrigge
1330: 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 7d  r(pTrigger);.  }
1340: 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65  .  sqliteHashCle
1350: 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 73 71  ar(&temp2);.  sq
1360: 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62  liteHashInit(&db
1370: 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54  ->tblHash, SQLIT
1380: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
1390: 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  );.  for(pElem=s
13a0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
13b0: 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70  temp1); pElem; p
13c0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
13d0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
13e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
13f0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
1400: 6c 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lem);.    sqlite
1410: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
1420: 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pTab);.  }.  sql
1430: 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 65  iteHashClear(&te
1440: 6d 70 31 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  mp1);.  db->flag
1450: 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 49 6e  s &= ~(SQLITE_In
1460: 69 74 69 61 6c 69 7a 65 64 7c 53 51 4c 49 54 45  itialized|SQLITE
1470: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
1480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1490: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
14a0: 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
14b0: 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66  back occurs.  If
14c0: 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73   there were.** s
14d0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
14e0: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
14f0: 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61  tion, then we ha
1500: 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a  ve to reset the.
1510: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  ** internal hash
1520: 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f   tables and relo
1530: 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73  ad them from dis
1540: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
1550: 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61  eRollbackInterna
1560: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
1570: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1580: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
1590: 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a  nternChanges ){.
15a0: 20 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 49      sqliteResetI
15b0: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
15c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15e0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f  called when a co
15f0: 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  mmit occurs..*/.
1600: 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69  void sqliteCommi
1610: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
1620: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
1630: 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  db->schema_cooki
1640: 65 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  e = db->next_coo
1650: 6b 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  kie;.  db->flags
1660: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
1670: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
1680: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d  .** Remove the m
1690: 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63  emory data struc
16a0: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
16b0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a   with the given.
16c0: 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68  ** Table.  No ch
16d0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
16e0: 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72  o disk by this r
16f0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
1700: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
1710: 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61  deletes the data
1720: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
1730: 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a  does not unlink.
1740: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74  ** the table dat
1750: 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  a structure from
1760: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
1770: 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65    But it does de
1780: 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20  stroy.** memory 
1790: 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68  structures of th
17a0: 65 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  e indices associ
17b0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
17c0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63  ble..**.** Indic
17d0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
17e0: 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  th the table are
17f0: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
1800: 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20  he "db".** data 
1810: 73 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21  structure if db!
1820: 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e  =NULL.  If db==N
1830: 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74  ULL, indices att
1840: 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  ached to.** the 
1850: 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65  table are delete
1860: 64 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73  d, but it is ass
1870: 75 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61  umed they have a
1880: 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75  lready been.** u
1890: 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64  nlinked..*/.void
18a0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
18b0: 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54  le(sqlite *db, T
18c0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
18d0: 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20   int i;.  Index 
18e0: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
18f0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
1900: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1910: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
1920: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1930: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
1940: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  e->aCol[i].zName
1950: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
1960: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
1970: 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71  ].zDflt);.    sq
1980: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
1990: 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b  >aCol[i].zType);
19a0: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 49 6e 64 65  .  }.  for(pInde
19b0: 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x = pTable->pInd
19c0: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
19d0: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ex=pNext){.    p
19e0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
19f0: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
1a00: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
1a10: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
1a20: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
1a30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
1a40: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
1a50: 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 53 65  Col);.  sqliteSe
1a60: 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c  lectDelete(pTabl
1a70: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  e->pSelect);.  s
1a80: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
1a90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
1aa0: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
1ab0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
1ac0: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
1ad0: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
1ae0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
1af0: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
1b00: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
1b10: 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41  id sqliteUnlinkA
1b20: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  ndDeleteTable(sq
1b30: 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20  lite *db, Table 
1b40: 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f  *p){.  Table *pO
1b50: 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  ld;.  assert( db
1b60: 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  !=0 );.  pOld = 
1b70: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
1b80: 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70  (&db->tblHash, p
1b90: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
1ba0: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b  p->zName)+1, 0);
1bb0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d  .  assert( pOld=
1bc0: 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b  =0 || pOld==p );
1bd0: 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54  .  sqliteDeleteT
1be0: 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  able(db, p);.}..
1bf0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
1c00: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 75 73  the name of a us
1c10: 65 72 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  er table or inde
1c20: 78 20 66 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a  x from a token..
1c30: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
1c40: 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 69 73 20  old the name is 
1c50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1c60: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
1c70: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72 65 65   must.** be free
1c80: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
1c90: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68   function..*/.ch
1ca0: 61 72 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e  ar *sqliteTableN
1cb0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b  ameFromToken(Tok
1cc0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
1cd0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
1ce0: 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d  teStrNDup(pName-
1cf0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
1d00: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
1d10: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1d20: 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zName;.}../*.** 
1d30: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1d40: 20 6f 70 65 6e 20 74 68 65 20 61 70 70 72 6f 70   open the approp
1d50: 72 69 61 74 65 20 6d 61 73 74 65 72 20 74 61 62  riate master tab
1d60: 6c 65 2e 20 20 54 68 65 20 74 61 62 6c 65 0a 2a  le.  The table.*
1d70: 2a 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  * opened will be
1d80: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 66   SQLITE_MASTER f
1d90: 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 74 61  or persistent ta
1da0: 62 6c 65 73 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  bles and .** SQL
1db0: 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20  ITE_TEMP_MASTER 
1dc0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61  for temporary ta
1dd0: 62 6c 65 73 2e 20 20 54 68 65 20 74 61 62 6c 65  bles.  The table
1de0: 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
1df0: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
1e00: 69 64 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73  id sqliteOpenMas
1e10: 74 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76  terTable(Vdbe *v
1e20: 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20  , int isTemp){. 
1e30: 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
1e40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1e50: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 41  Op(v, OP_OpenWrA
1e60: 75 78 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 73  ux, 0, 2);.    s
1e70: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
1e80: 33 28 76 2c 20 2d 31 2c 20 54 45 4d 50 5f 4d 41  3(v, -1, TEMP_MA
1e90: 53 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54  STER_NAME, P3_ST
1ea0: 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ATIC);.  }else{.
1eb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
1ec0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
1ed0: 69 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20  ite, 0, 2);.    
1ee0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
1ef0: 50 33 28 76 2c 20 2d 31 2c 20 4d 41 53 54 45 52  P3(v, -1, MASTER
1f00: 5f 4e 41 4d 45 2c 20 50 33 5f 53 54 41 54 49 43  _NAME, P3_STATIC
1f10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1f20: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
1f30: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
1f40: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
1f50: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
1f60: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
1f70: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
1f80: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
1f90: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
1fa0: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
1fb0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1fc0: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
1fd0: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
1fe0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
1ff0: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
2000: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
2010: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
2020: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
2030: 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65  e.** pStart toke
2040: 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20  n is the CREATE 
2050: 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65  and pName is the
2060: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
2070: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
2080: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
2090: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
20a0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
20b0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
20c0: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
20d0: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
20e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
20f0: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
2100: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
2110: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
2120: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
2130: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
2140: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
2150: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
2160: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
2170: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
2180: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
2190: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
21a0: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
21b0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
21c0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
21d0: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
21e0: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
21f0: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
2200: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
2210: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
2220: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
2230: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2240: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
2250: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
2260: 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20 72 6f  iteEndTable() ro
2270: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
2280: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
2290: 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  he construction 
22a0: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
22b0: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64   record..*/.void
22c0: 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c   sqliteStartTabl
22d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
22e0: 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
22f0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e  Token *pName, in
2300: 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 54 61 62  t isTemp){.  Tab
2310: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e  le *pTable;.  In
2320: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61  dex *pIdx;.  cha
2330: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69  r *zName;.  sqli
2340: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
2350: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
2360: 0a 20 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73  .  pParse->sFirs
2370: 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74  tToken = *pStart
2380: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
2390: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
23a0: 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69  oken(pName);.  i
23b0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
23c0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f  turn;..  /* Befo
23d0: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63 72 65  re trying to cre
23e0: 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
23f0: 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65  table, make sure
2400: 20 74 68 65 20 42 74 72 65 65 20 66 6f 72 0a 20   the Btree for. 
2410: 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70   ** holding temp
2420: 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69 73 20  orary tables is 
2430: 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  open..  */.  if(
2440: 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d 3e 70   isTemp && db->p
2450: 42 65 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20  BeTemp==0 ){.   
2460: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2470: 42 74 72 65 65 4f 70 65 6e 28 30 2c 20 30 2c 20  BtreeOpen(0, 0, 
2480: 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e  MAX_PAGES, &db->
2490: 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20 69 66  pBeTemp);.    if
24a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
24c0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
24d0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62  ->zErrMsg, "unab
24e0: 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
24f0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
2500: 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
2510: 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
2520: 6f 72 61 72 79 20 74 61 62 6c 65 73 22 2c 20 30  orary tables", 0
2530: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
2540: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
2550: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
2560: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
2570: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20   SQLITE_InTrans 
2580: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2590: 6c 69 74 65 42 74 72 65 65 42 65 67 69 6e 54 72  liteBtreeBeginTr
25a0: 61 6e 73 28 64 62 2d 3e 70 42 65 54 65 6d 70 29  ans(db->pBeTemp)
25b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
25c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25d0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
25e0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
25f0: 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20  ErrMsg, "unable 
2600: 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c  to get a write l
2610: 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20  ock on ".       
2620: 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72     "the temporar
2630: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22  y database file"
2640: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
2650: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
2660: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2670: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2680: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
2690: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
26a0: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
26b0: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
26c0: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
26d0: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  or table name.  
26e0: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
26f0: 65 73 73 61 67 65 20 69 66 20 69 74 20 64 6f 65  essage if it doe
2700: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  s..  **.  ** If 
2710: 77 65 20 61 72 65 20 72 65 2d 72 65 61 64 69 6e  we are re-readin
2720: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
2730: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
2740: 65 20 6f 66 20 61 20 73 63 68 65 6d 61 0a 20 20  e of a schema.  
2750: 2a 2a 20 63 68 61 6e 67 65 20 61 6e 64 20 61 20  ** change and a 
2760: 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61  new permanent ta
2770: 62 6c 65 20 69 73 20 66 6f 75 6e 64 20 77 68 6f  ble is found who
2780: 73 65 20 6e 61 6d 65 20 63 6f 6c 6c 69 64 65 73  se name collides
2790: 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 78   with.  ** an ex
27a0: 69 73 74 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  isting temporary
27b0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 69 67 6e   table, then ign
27c0: 6f 72 65 20 74 68 65 20 6e 65 77 20 70 65 72 6d  ore the new perm
27d0: 61 6e 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a  anent table..  *
27e0: 2a 20 57 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  * We will contin
27f0: 75 65 20 70 61 72 73 69 6e 67 2c 20 62 75 74 20  ue parsing, but 
2800: 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65  the pParse->name
2810: 43 6c 61 73 68 20 66 6c 61 67 20 77 69 6c 6c 20  Clash flag will 
2820: 62 65 20 73 65 74 0a 20 20 2a 2a 20 73 6f 20 77  be set.  ** so w
2830: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f 20 64  e will know to d
2840: 69 73 63 61 72 64 20 74 68 65 20 74 61 62 6c 65  iscard the table
2850: 20 72 65 63 6f 72 64 20 6f 6e 63 65 20 70 61 72   record once par
2860: 73 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65  sing has finishe
2870: 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65  d..  */.  pTable
2880: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
2890: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  le(db, zName);. 
28a0: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29   if( pTable!=0 )
28b0: 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  {.    if( pTable
28c0: 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50 61 72  ->isTemp && pPar
28d0: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
28e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 61        pParse->na
28f0: 6d 65 43 6c 61 73 68 20 3d 20 31 3b 0a 20 20 20  meClash = 1;.   
2900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2910: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
2920: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
2930: 20 22 74 61 62 6c 65 20 22 2c 20 30 2c 20 70 4e   "table ", 0, pN
2940: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
2950: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 61 6c  ,.          " al
2960: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 30  ready exists", 0
2970: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
2980: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
2990: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
29a0: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
29b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  n;.    }.  }else
29c0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 61  {.    pParse->na
29d0: 6d 65 43 6c 61 73 68 20 3d 20 30 3b 0a 20 20 7d  meClash = 0;.  }
29e0: 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73  .  if( (pIdx = s
29f0: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
2a00: 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 26 26  b, zName))!=0 &&
2a10: 0a 20 20 20 20 20 20 20 20 20 20 28 21 70 49 64  .          (!pId
2a20: 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  x->pTable->isTem
2a30: 70 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69 6e  p || !pParse->in
2a40: 69 74 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 73  itFlag) ){.    s
2a50: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
2a60: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
2a70: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
2a80: 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65  dy an index name
2a90: 64 20 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e 61  d ", .       zNa
2aa0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
2ab0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
2ac0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
2ad0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
2ae0: 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71   }.  pTable = sq
2af0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
2b00: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
2b10: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
2b20: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
2b30: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
2b40: 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  n;.  }.  pTable-
2b50: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
2b60: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
2b70: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43   0;.  pTable->aC
2b80: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
2b90: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
2ba0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
2bb0: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 73   0;.  pTable->is
2bc0: 54 65 6d 70 20 3d 20 69 73 54 65 6d 70 3b 0a 20  Temp = isTemp;. 
2bd0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
2be0: 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 44  wTable ) sqliteD
2bf0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
2c00: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
2c10: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  );.  pParse->pNe
2c20: 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  wTable = pTable;
2c30: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
2c40: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
2c50: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
2c60: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
2c70: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
2c80: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
2c90: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
2ca0: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
2cb0: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
2cc0: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
2cd0: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
2ce0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
2cf0: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
2d00: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
2d10: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
2d20: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
2d30: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
2d40: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
2d50: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
2d60: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
2d70: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
2d80: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
2d90: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
2da0: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
2db0: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
2dc0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
2dd0: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
2de0: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
2df0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
2e00: 69 6e 69 74 46 6c 61 67 20 26 26 20 28 76 20 3d  initFlag && (v =
2e10: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
2e20: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
2e30: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
2e40: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
2e50: 73 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  se, 0);.    if( 
2e60: 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  !isTemp ){.     
2e70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2e80: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2e90: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c  db->file_format,
2ea0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2eb0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2ec0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 31  _SetCookie, 0, 1
2ed0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2ee0: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
2ef0: 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20  le(v, isTemp);. 
2f00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
2f10: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
2f20: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  o, 0, 0);.    sq
2f30: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2f40: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
2f50: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2f60: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
2f70: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
2f80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2f90: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
2fa0: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
2fb0: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
2fc0: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
2fd0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
2fe0: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
2ff0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
3000: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
3010: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
3020: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
3030: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
3040: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
3050: 2e 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  .  sqliteStartTa
3060: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
3070: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
3080: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
3090: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
30a0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
30b0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
30c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
30d0: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
30e0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
30f0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
3100: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
3110: 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c  ar *z = 0;.  Col
3120: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
3130: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
3140: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
3150: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 53 65  turn;.  sqliteSe
3160: 74 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61  tNString(&z, pNa
3170: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c  me->z, pName->n,
3180: 20 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20   0);.  if( z==0 
3190: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
31a0: 74 65 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  teDequote(z);.  
31b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
31c0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
31d0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
31e0: 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  z, p->aCol[i].zN
31f0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
3200: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
3210: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
3220: 67 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f  g, "duplicate co
3230: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c  lumn name: ", z,
3240: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
3250: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3260: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
3270: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
3280: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
3290: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30  ->nCol & 0x7)==0
32a0: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a   ){.    Column *
32b0: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
32c0: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20   sqliteRealloc( 
32d0: 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f  p->aCol, (p->nCo
32e0: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
32f0: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
3300: 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( aNew==0 ) retu
3310: 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20  rn;.    p->aCol 
3320: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
3330: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
3340: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
3350: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
3360: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
3370: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
3380: 3b 0a 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72  ;.  pCol->sortOr
3390: 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  der = SQLITE_SO_
33a0: 4e 55 4d 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  NUM;.  p->nCol++
33b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
33c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
33d0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
33e0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
33f0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
3400: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
3410: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
3420: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
3430: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
3440: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
3450: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
3460: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
3470: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
3480: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
3490: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
34a0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
34b0: 6c 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  liteAddNotNull(P
34c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
34d0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
34e0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
34f0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
3500: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
3510: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
3520: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
3530: 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f  f( i>=0 ) p->aCo
3540: 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f  l[i].notNull = o
3550: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
3560: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3570: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
3580: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
3590: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
35a0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
35b0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
35c0: 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f  .  The pFirst to
35d0: 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74  ken is the first
35e0: 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  .** token in the
35f0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b   sequence of tok
3600: 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ens that describ
3610: 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68  e the type of th
3620: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72  e.** column curr
3630: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
3640: 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73  truction.   pLas
3650: 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f  t is the last to
3660: 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65  ken.** in the se
3670: 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69  quence.  Use thi
3680: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  s information to
3690: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72   construct a str
36a0: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74  ing.** that cont
36b0: 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d  ains the typenam
36c0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
36d0: 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73  and store that s
36e0: 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70  tring.** in zTyp
36f0: 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  e..*/ .void sqli
3700: 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  teAddColumnType(
3710: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
3720: 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f  oken *pFirst, To
3730: 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54  ken *pLast){.  T
3740: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
3750: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  , j;.  int n;.  
3760: 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20  char *z, **pz;. 
3770: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
3780: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
3790: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
37a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
37b0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
37c0: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
37d0: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
37e0: 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f  [i];.  pz = &pCo
37f0: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20  l->zType;.  n = 
3800: 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28  pLast->n + Addr(
3810: 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72  pLast->z) - Addr
3820: 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73  (pFirst->z);.  s
3830: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
3840: 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e  pz, pFirst->z, n
3850: 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b  , 0);.  z = *pz;
3860: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
3870: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  turn;.  for(i=j=
3880: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
3890: 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b     int c = z[i];
38a0: 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65  .    if( isspace
38b0: 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (c) ) continue;.
38c0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
38d0: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
38e0: 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65    pCol->sortOrde
38f0: 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  r = SQLITE_SO_NU
3900: 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  M;.  for(i=0; z[
3910: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77  i]; i++){.    sw
3920: 69 74 63 68 28 20 7a 5b 69 5d 20 29 7b 0a 20 20  itch( z[i] ){.  
3930: 20 20 20 20 63 61 73 65 20 27 62 27 3a 0a 20 20      case 'b':.  
3940: 20 20 20 20 63 61 73 65 20 27 42 27 3a 20 7b 0a      case 'B': {.
3950: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
3960: 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 5b 69 5d  teStrNICmp(&z[i]
3970: 2c 22 62 6c 6f 62 22 2c 34 29 3d 3d 30 20 29 7b  ,"blob",4)==0 ){
3980: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
3990: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c  >sortOrder = SQL
39a0: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20  ITE_SO_TEXT;.   
39b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
39c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
39d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
39e0: 20 20 20 20 20 20 63 61 73 65 20 27 63 27 3a 0a        case 'c':.
39f0: 20 20 20 20 20 20 63 61 73 65 20 27 43 27 3a 20        case 'C': 
3a00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
3a10: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 5b  liteStrNICmp(&z[
3a20: 69 5d 2c 22 63 68 61 72 22 2c 34 29 3d 3d 30 20  i],"char",4)==0 
3a30: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
3a40: 20 20 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d     sqliteStrNICm
3a50: 70 28 26 7a 5b 69 5d 2c 22 63 6c 6f 62 22 2c 34  p(&z[i],"clob",4
3a60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3a70: 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65    pCol->sortOrde
3a80: 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45  r = SQLITE_SO_TE
3a90: 58 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  XT;.          re
3aa0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
3ab0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
3ad0: 65 20 27 78 27 3a 0a 20 20 20 20 20 20 63 61 73  e 'x':.      cas
3ae0: 65 20 27 58 27 3a 20 7b 0a 20 20 20 20 20 20 20  e 'X': {.       
3af0: 20 69 66 28 20 69 3e 3d 32 20 26 26 20 73 71 6c   if( i>=2 && sql
3b00: 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 5b 69  iteStrNICmp(&z[i
3b10: 2d 32 5d 2c 22 74 65 78 74 22 2c 34 29 3d 3d 30  -2],"text",4)==0
3b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
3b30: 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  ol->sortOrder = 
3b40: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
3b50: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3b60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3b70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3b80: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
3b90: 3a 20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61  : {.        brea
3ba0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3bb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3bc0: 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73  e given token is
3bd0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
3be0: 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20  ue for the last 
3bf0: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a  column added to.
3c00: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ** the table cur
3c10: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
3c20: 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22  struction.  If "
3c30: 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72  minusFlag" is tr
3c40: 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ue, it.** means 
3c50: 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20  the value token 
3c60: 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20  was preceded by 
3c70: 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a  a minus sign..**
3c80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3c90: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
3ca0: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
3cb0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
3cc0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
3cd0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
3ce0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
3cf0: 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c  iteAddDefaultVal
3d00: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
3d10: 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69  , Token *pVal, i
3d20: 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20  nt minusFlag){. 
3d30: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
3d40: 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b   i;.  char **pz;
3d50: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
3d60: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
3d70: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
3d80: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
3d90: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
3da0: 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c  .  pz = &p->aCol
3db0: 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28  [i].zDflt;.  if(
3dc0: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
3dd0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
3de0: 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70  ng(pz, "-", 1, p
3df0: 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c  Val->z, pVal->n,
3e00: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
3e10: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
3e20: 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20  ng(pz, pVal->z, 
3e30: 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d  pVal->n, 0);.  }
3e40: 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
3e50: 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (*pz);.}../*.** 
3e60: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
3e70: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
3e80: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
3e90: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
3ea0: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
3eb0: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
3ec0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
3ed0: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
3ee0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
3ef0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
3f00: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
3f10: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
3f20: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
3f30: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
3f40: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
3f50: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
3f60: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
3f70: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
3f80: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
3f90: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
3fa0: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
3fb0: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
3fc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
3fd0: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
3fe0: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
3ff0: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
4000: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
4010: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
4020: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
4030: 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e  n as the row id.
4040: 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a    (Exception:.**
4050: 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   For backwards c
4060: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
4070: 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65  h older database
4080: 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  s, do not do thi
4090: 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65  s.** if the file
40a0: 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20   format version 
40b0: 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
40c0: 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65  han 1.)  Set the
40d0: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
40e0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
40f0: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
4100: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
4110: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
4120: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4130: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
4140: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
4150: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
4160: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
4170: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
4180: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
4190: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
41a0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
41b0: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
41c0: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
41d0: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
41e0: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
41f0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
4200: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
4210: 71 6c 69 74 65 41 64 64 50 72 69 6d 61 72 79 4b  qliteAddPrimaryK
4220: 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
4230: 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  , IdList *pList,
4240: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
4250: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
4260: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
4270: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
4280: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
4290: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54 61 62  = -1;.  if( pTab
42a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
42b0: 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69  if( pTab->hasPri
42c0: 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  mKey ){.    sqli
42d0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
42e0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
42f0: 61 62 6c 65 20 5c 22 22 2c 20 70 54 61 62 2d 3e  able \"", pTab->
4300: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
4310: 22 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  "\" has more tha
4320: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
4330: 79 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  y", 0);.    pPar
4340: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
4350: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
4360: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d  ab->hasPrimKey =
4370: 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   1;.  if( pList=
4380: 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  =0 ){.    iCol =
4390: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b   pTab->nCol - 1;
43a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69  .  }else if( pLi
43b0: 73 74 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a 20 20  st->nId==1 ){.  
43c0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
43d0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
43e0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Col++){.      if
43f0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
4400: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pList->a[0].zNam
4410: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
4420: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  ol].zName)==0 ) 
4430: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4440: 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26  .  if( iCol>=0 &
4450: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
4460: 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  l ){.    zType =
4470: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
4480: 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69  ].zType;.  }.  i
4490: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
44a0: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 31 20 26 26  ile_format>=1 &&
44b0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a 54 79   .           zTy
44c0: 70 65 20 26 26 20 73 71 6c 69 74 65 53 74 72 49  pe && sqliteStrI
44d0: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
44e0: 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  GER")==0 ){.    
44f0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
4500: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
4510: 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b  yConf = onError;
4520: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
4530: 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28  liteCreateIndex(
4540: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 70 4c  pParse, 0, 0, pL
4550: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
4560: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
4570: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
4580: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
4590: 6e 67 20 74 79 70 65 20 67 69 76 65 6e 20 74 68  ng type given th
45a0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  e collation type
45b0: 20 74 6f 6b 65 6e 2e 0a 2a 2a 20 52 65 70 6f 72   token..** Repor
45c0: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  t an error if th
45d0: 65 20 74 79 70 65 20 69 73 20 75 6e 64 65 66 69  e type is undefi
45e0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
45f0: 74 65 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61  teCollateType(Pa
4600: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
4610: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 69 66  en *pType){.  if
4620: 28 20 70 54 79 70 65 3d 3d 30 20 29 20 72 65 74  ( pType==0 ) ret
4630: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e  urn SQLITE_SO_UN
4640: 4b 3b 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e  K;.  if( pType->
4650: 6e 3d 3d 34 20 26 26 20 73 71 6c 69 74 65 53 74  n==4 && sqliteSt
4660: 72 4e 49 43 6d 70 28 70 54 79 70 65 2d 3e 7a 2c  rNICmp(pType->z,
4670: 20 22 74 65 78 74 22 2c 20 34 29 3d 3d 30 20 29   "text", 4)==0 )
4680: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
4690: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 7d  ITE_SO_TEXT;.  }
46a0: 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d  .  if( pType->n=
46b0: 3d 37 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e  =7 && sqliteStrN
46c0: 49 43 6d 70 28 70 54 79 70 65 2d 3e 7a 2c 20 22  ICmp(pType->z, "
46d0: 6e 75 6d 65 72 69 63 22 2c 20 37 29 3d 3d 30 20  numeric", 7)==0 
46e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
46f0: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 7d  LITE_SO_NUM;.  }
4700: 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72  .  sqliteSetNStr
4710: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
4720: 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e 20 63  rMsg, "unknown c
4730: 6f 6c 6c 61 74 69 6e 67 20 74 79 70 65 3a 20 22  ollating type: "
4740: 2c 20 2d 31 2c 0a 20 20 20 20 70 54 79 70 65 2d  , -1,.    pType-
4750: 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 2c 20 30 29  >z, pType->n, 0)
4760: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  ;.  pParse->nErr
4770: 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ++;.  return SQL
4780: 49 54 45 5f 53 4f 5f 55 4e 4b 3b 0a 7d 0a 0a 2f  ITE_SO_UNK;.}../
4790: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
47a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
47b0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
47c0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
47d0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
47e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
47f0: 6d 65 6e 74 2e 20 20 41 20 22 43 4f 4c 4c 41 54  ment.  A "COLLAT
4800: 45 22 20 63 6c 61 75 73 65 20 68 61 73 0a 2a 2a  E" clause has.**
4810: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
4820: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
4830: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 43  utine sets the C
4840: 6f 6c 75 6d 6e 2e 73 6f 72 74 4f 72 64 65 72 20  olumn.sortOrder 
4850: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
4860: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
4870: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
4880: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64  /.void sqliteAdd
4890: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
48a0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 63  e *pParse, int c
48b0: 6f 6c 6c 54 79 70 65 29 7b 0a 20 20 54 61 62 6c  ollType){.  Tabl
48c0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
48d0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
48e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
48f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
4900: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
4910: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
4920: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 63  i].sortOrder = c
4930: 6f 6c 6c 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ollType;.}../*.*
4940: 2a 20 43 6f 6d 65 20 75 70 20 77 69 74 68 20 61  * Come up with a
4950: 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75   new random valu
4960: 65 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61  e for the schema
4970: 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73   cookie.  Make s
4980: 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76  ure.** the new v
4990: 61 6c 75 65 20 69 73 20 64 69 66 66 65 72 65 6e  alue is differen
49a0: 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a  t from the old..
49b0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
49c0: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
49d0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
49e0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
49f0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
4a00: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
4a10: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
4a20: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
4a30: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
4a40: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
4a50: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
4a60: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
4a70: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
4a80: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
4a90: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
4aa0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
4ab0: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
4ac0: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
4ad0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
4ae0: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
4af0: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
4b00: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
4b10: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
4b20: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
4b30: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
4b40: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
4b50: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
4b60: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
4b70: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
4b80: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
4b90: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
4ba0: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
4bb0: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
4bc0: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
4bd0: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
4be0: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
4bf0: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
4c00: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
4c10: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
4c20: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
4c30: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
4c40: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
4c50: 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71  eChangeCookie(sq
4c60: 6c 69 74 65 20 2a 64 62 2c 20 56 64 62 65 20 2a  lite *db, Vdbe *
4c70: 76 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65  v){.  if( db->ne
4c80: 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 73  xt_cookie==db->s
4c90: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a  chema_cookie ){.
4ca0: 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f      db->next_coo
4cb0: 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d 61  kie = db->schema
4cc0: 5f 63 6f 6f 6b 69 65 20 2b 20 73 71 6c 69 74 65  _cookie + sqlite
4cd0: 52 61 6e 64 6f 6d 42 79 74 65 28 29 20 2b 20 31  RandomByte() + 1
4ce0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
4cf0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
4d00: 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 73 71 6c  Changes;.    sql
4d10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4d20: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
4d30: 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b  next_cookie, 0);
4d40: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4d50: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
4d60: 6f 6b 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  okie, 0, 0);.  }
4d70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
4d80: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
4d90: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
4da0: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
4db0: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
4dc0: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
4dd0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
4de0: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
4df0: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
4e00: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
4e10: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
4e20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
4e30: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
4e40: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
4e50: 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f  n;.  int needQuo
4e60: 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d  te = 0;.  for(n=
4e70: 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29  0; *z; n++, z++)
4e80: 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c  {.    if( *z=='\
4e90: 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51  '' ){ n++; needQ
4ea0: 75 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20  uote=1; }.  }.  
4eb0: 72 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51  return n + needQ
4ec0: 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uote*2;.}../*.**
4ed0: 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69   Write an identi
4ee0: 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e  fier onto the en
4ef0: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73  d of the given s
4f00: 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71  tring.  Add.** q
4f10: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
4f20: 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  as needed..*/.st
4f30: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
4f40: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
4f50: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64  *pIdx, char *zId
4f60: 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  ent){.  int i, j
4f70: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
4f80: 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28   = *pIdx;.  for(
4f90: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
4fa0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  j++){.    if( !i
4fb0: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
4fc0: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
4fd0: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
4fe0: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20  .  needQuote =  
4ff0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20  zIdent[j]!=0 || 
5000: 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  isdigit(zIdent[0
5010: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
5020: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 4b 65       || sqliteKe
5030: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
5040: 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69  , j)!=TK_ID;.  i
5050: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
5060: 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [i++] = '\'';.  
5070: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
5080: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
5090: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
50a0: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
50b0: 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b  [j]=='\'' ) z[i+
50c0: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20  +] = '\'';.  }. 
50d0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
50e0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[i++] = '\'';.
50f0: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
5100: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
5110: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
5120: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5130: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
5140: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
5150: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
5160: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
5170: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
5180: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
5190: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
51a0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
51b0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
51c0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
51d0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
51e0: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
51f0: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
5200: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
5210: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
5220: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
5230: 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  zEnd;.  n = 0;. 
5240: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5250: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  Col; i++){.    n
5260: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
5270: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
5280: 29 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64  );.  }.  n += id
5290: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
52a0: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20  me);.  if( n<40 
52b0: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
52c0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
52d0: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
52e0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
52f0: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
5300: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
5310: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
5320: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
5330: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
5340: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
5350: 65 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20  eMalloc( n );.  
5360: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72  if( zStmt==0 ) r
5370: 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70  eturn 0;.  strcp
5380: 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 73 54 65  y(zStmt, p->isTe
5390: 6d 70 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d  mp ? "CREATE TEM
53a0: 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43 52 45  P TABLE " : "CRE
53b0: 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20  ATE TABLE ");.  
53c0: 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74  k = strlen(zStmt
53d0: 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53  );.  identPut(zS
53e0: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d  tmt, &k, p->zNam
53f0: 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d  e);.  zStmt[k++]
5400: 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d   = '(';.  for(i=
5410: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
5420: 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26  +){.    strcpy(&
5430: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
5440: 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e  .    k += strlen
5450: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
5460: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
5470: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
5480: 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69  t, &k, p->aCol[i
5490: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
54a0: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
54b0: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
54c0: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
54d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
54e0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f  s called to repo
54f0: 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22  rt the final ")"
5500: 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
5510: 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42  .** a CREATE TAB
5520: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
5530: 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74  .** The table st
5540: 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68  ructure that oth
5550: 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  er action routin
5560: 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69  es have been bui
5570: 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65  lding.** is adde
5580: 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
5590: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61  l hash tables, a
55a0: 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
55b0: 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72  s have.** occurr
55c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74  ed..**.** An ent
55d0: 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ry for the table
55e0: 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20   is made in the 
55f0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20  master table on 
5600: 64 69 73 6b 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20  disk,.** unless 
5610: 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
5620: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 69 6e 69  ary table or ini
5630: 74 46 6c 61 67 3d 3d 31 2e 20 20 57 68 65 6e 20  tFlag==1.  When 
5640: 69 6e 69 74 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20  initFlag==1,.** 
5650: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
5660: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
5670: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
5680: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
5690: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
56a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
56b0: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
56c0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
56d0: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
56e0: 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68 65 20  changes, so the 
56f0: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
5700: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
5710: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
5720: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
5730: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
5740: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
5750: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
5760: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
5770: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
5780: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
5790: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
57a0: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
57b0: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
57c0: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
57d0: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
57e0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
57f0: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
5800: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
5810: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
5820: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
5830: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
5840: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
5850: 76 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 54 61  void sqliteEndTa
5860: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
5870: 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  e, Token *pEnd, 
5880: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
5890: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
58a0: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
58b0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
58c0: 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c  (pEnd==0 && pSel
58d0: 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73  ect==0) || pPars
58e0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
58f0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
5900: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
5910: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5920: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
5930: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 41 64  return;..  /* Ad
5940: 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
5950: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
5960: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
5970: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
5980: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
5990: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d 30  se->nameClash==0
59a0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   || pParse->init
59b0: 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Flag==1 );.  if(
59c0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
59d0: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ==0 && pParse->n
59e0: 61 6d 65 43 6c 61 73 68 3d 3d 30 20 29 7b 0a 20  ameClash==0 ){. 
59f0: 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
5a00: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
5a10: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
5a20: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
5a30: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
5a40: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
5a50: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
5a60: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
5a70: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
5a80: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
5a90: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
5aa0: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65  rt() */.      re
5ab0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
5ac0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5ad0: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  e = 0;.    db->n
5ae0: 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d  Table++;.    db-
5af0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
5b00: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
5b10: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
5b20: 20 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61   table is genera
5b30: 74 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43  ted from a SELEC
5b40: 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63  T, then construc
5b50: 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20  t the.  ** list 
5b60: 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  of columns and t
5b70: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 74  he text of the t
5b80: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
5b90: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
5ba0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d  Table *pSelTab =
5bb0: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
5bc0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
5bd0: 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20   0, pSelect);.  
5be0: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
5bf0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61   ) return;.    a
5c00: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d  ssert( p->aCol==
5c10: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  0 );.    p->nCol
5c20: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
5c30: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  ;.    p->aCol = 
5c40: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
5c50: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
5c60: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
5c70: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
5c80: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
5c90: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
5ca0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
5cb0: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69   initFlag is 1 i
5cc0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
5cd0: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
5ce0: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
5cf0: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
5d00: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
5d10: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
5d20: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
5d30: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
5d40: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
5d50: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
5d60: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
5d70: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
5d80: 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73 65 2d  from the pParse-
5d90: 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  >newTnum field. 
5da0: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
5db0: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
5dc0: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
5dd0: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
5de0: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
5df0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
5e00: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
5e10: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50 61     p->tnum = pPa
5e20: 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20  rse->newTnum;.  
5e30: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
5e40: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
5e50: 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
5e60: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
5e70: 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
5e80: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
5e90: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
5ea0: 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64  ase.  The record
5eb0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
5ec0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65   the new table e
5ed0: 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65  ntry should alre
5ee0: 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74  ady be on the st
5ef0: 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ack..  **.  ** I
5f00: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
5f10: 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
5f20: 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
5f30: 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
5f40: 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
5f50: 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
5f60: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
5f70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
5f80: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
5f90: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
5fa0: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76   Vdbe *v;..    v
5fb0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
5fc0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
5fd0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
5fe0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
5ff0: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
6000: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
6010: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  le */.      sqli
6020: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6030: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30  P_CreateTable, 0
6040: 2c 20 70 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20  , p->isTemp);.  
6050: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6060: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63  angeP3(v, -1, (c
6070: 68 61 72 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20  har *)&p->tnum, 
6080: 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
6090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
60a0: 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
60b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
60c0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
60d0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
60e0: 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20   p->tnum = 0;.  
60f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6100: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
6110: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
6120: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
6130: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
6140: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
6150: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
6160: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6170: 76 2c 20 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20  v, -1, "table", 
6180: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
6190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
61a0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
61b0: 76 2c 20 2d 31 2c 20 22 76 69 65 77 22 2c 20 50  v, -1, "view", P
61c0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  3_STATIC);.    }
61d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
61e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
61f0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
6200: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
6210: 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65  (v, -1, p->zName
6220: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
6230: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6240: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
6250: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
6260: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
6270: 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50   -1, p->zName, P
6280: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
6290: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
62a0: 2c 20 4f 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b  , OP_Dup, 4, 0);
62b0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
62c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
62d0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  g, 0, 0);.    if
62e0: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
62f0: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65     char *z = cre
6300: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b  ateTableStmt(p);
6310: 0a 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73  .      n = z ? s
6320: 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20  trlen(z) : 0;.  
6330: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6340: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c  angeP3(v, -1, z,
6350: 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
6360: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65  eFree(z);.    }e
6370: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
6380: 74 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  t( pEnd!=0 );.  
6390: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
63a0: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61  d->z) - Addr(pPa
63b0: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
63c0: 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73  .z) + 1;.      s
63d0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
63e0: 33 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d  3(v, -1, pParse-
63f0: 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20  >sFirstToken.z, 
6400: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  n);.    }.    sq
6410: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6420: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6430: 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  5, 0);.    sqlit
6440: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6450: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
6460: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69  );.    if( !p->i
6470: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73  sTemp ){.      s
6480: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
6490: 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a  e(db, v);.    }.
64a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
64b0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
64c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
64d0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
64e0: 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 69 73 54   int op = p->isT
64f0: 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41  emp ? OP_OpenWrA
6500: 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74  ux : OP_OpenWrit
6510: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  e;.      sqliteV
6520: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
6530: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  1, 0);.      pPa
6540: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
6550: 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63       sqliteSelec
6560: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
6570: 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c  t, SRT_Table, 1,
6580: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
6590: 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72  .    sqliteEndWr
65a0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
65b0: 72 73 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rse);.  }.}../*.
65c0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
65d0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
65e0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
65f0: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
6600: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65  /.void sqliteCre
6610: 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
6620: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
6630: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
6640: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
6650: 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
6660: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
6670: 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
6680: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
6690: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
66a0: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
66b0: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
66c0: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
66d0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
66e0: 6c 65 63 74 20 20 20 20 2f 2a 20 41 20 53 45 4c  lect    /* A SEL
66f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
6700: 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
6710: 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 29  he new view */.)
6720: 7b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  {.  Token sEnd;.
6730: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 63 6f    Table *p;.  co
6740: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
6750: 6e 74 20 6e 2c 20 6f 66 66 73 65 74 3b 0a 0a 20  nt n, offset;.. 
6760: 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c   sqliteStartTabl
6770: 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e  e(pParse, pBegin
6780: 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 70  , pName, 0);.  p
6790: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
67a0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
67b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
67c0: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
67d0: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
67e0: 0a 20 20 7d 0a 20 20 2f 2a 20 49 67 6e 6f 72 65  .  }.  /* Ignore
67f0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
6800: 73 20 6f 6e 20 61 20 53 45 4c 45 43 54 20 2a 2f  s on a SELECT */
6810: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
6820: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
6830: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
6840: 6c 65 74 65 28 70 53 65 6c 65 63 74 2d 3e 70 4f  lete(pSelect->pO
6850: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 53 65  rderBy);.    pSe
6860: 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d  lect->pOrderBy =
6870: 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 53 65   0;.  }.  p->pSe
6880: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a  lect = pSelect;.
6890: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69    if( !pParse->i
68a0: 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 69  nitFlag ){.    i
68b0: 66 28 20 73 71 6c 69 74 65 56 69 65 77 47 65 74  f( sqliteViewGet
68c0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
68d0: 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20  se, p) ){.      
68e0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
68f0: 7d 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  }.  sEnd = pPars
6900: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
6910: 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
6920: 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  0 && sEnd.z[0]!=
6930: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
6940: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
6950: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
6960: 20 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e   n = ((int)sEnd.
6970: 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69 6e  z) - (int)pBegin
6980: 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69  ->z;.  z = pBegi
6990: 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  n->z;.  while( n
69a0: 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27  >0 && (z[n-1]=='
69b0: 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b  ;' || isspace(z[
69c0: 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d  n-1])) ){ n--; }
69d0: 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
69e0: 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
69f0: 31 3b 0a 20 20 7a 20 3d 20 70 2d 3e 70 53 65 6c  1;.  z = p->pSel
6a00: 65 63 74 2d 3e 7a 53 65 6c 65 63 74 20 3d 20 73  ect->zSelect = s
6a10: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 2c 20  qliteStrNDup(z, 
6a20: 6e 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20  n);.  if( z ){. 
6a30: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 69 6e     offset = ((in
6a40: 74 29 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67  t)z) - (int)pBeg
6a50: 69 6e 2d 3e 7a 3b 0a 20 20 20 20 73 71 6c 69 74  in->z;.    sqlit
6a60: 65 53 65 6c 65 63 74 4d 6f 76 65 53 74 72 69 6e  eSelectMoveStrin
6a70: 67 73 28 70 2d 3e 70 53 65 6c 65 63 74 2c 20 6f  gs(p->pSelect, o
6a80: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
6a90: 74 65 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73  teEndTable(pPars
6aa0: 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20  e, &sEnd, 0);.  
6ab0: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
6ac0: 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
6ad0: 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20  tructure pTable 
6ae0: 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57  is really a VIEW
6af0: 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e  .  Fill in the n
6b00: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63  ames of.** the c
6b10: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69  olumns of the vi
6b20: 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65  ew in the pTable
6b30: 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74   structure.  Ret
6b40: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  urn the number.*
6b50: 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  * of errors.  If
6b60: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
6b70: 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  n leave an error
6b80: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
6b90: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
6ba0: 6e 74 20 73 71 6c 69 74 65 56 69 65 77 47 65 74  nt sqliteViewGet
6bb0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73  ColumnNames(Pars
6bc0: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
6bd0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78 70   *pTable){.  Exp
6be0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
6bf0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
6c00: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
6c10: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
6c20: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
6c30: 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f  le );..  /* A po
6c40: 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
6c50: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
6c60: 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
6c70: 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
6c80: 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
6c90: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
6ca0: 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
6cb0: 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
6cc0: 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
6cd0: 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
6ce0: 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
6cf0: 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
6d00: 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
6d10: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
6d20: 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
6d30: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
6d40: 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
6d50: 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
6d60: 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
6d70: 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
6d80: 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
6d90: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
6da0: 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
6db0: 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
6dc0: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
6dd0: 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
6de0: 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
6df0: 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
6e00: 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61  this error is ca
6e10: 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20  ught previously 
6e20: 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  and so the follo
6e30: 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73  wing test.  ** s
6e40: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69  hould always fai
6e50: 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  l.  But we will 
6e60: 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63  leave it in plac
6e70: 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  e just to be saf
6e80: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  e..  */.  if( pT
6e90: 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a  able->nCol<0 ){.
6ea0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
6eb0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
6ec0: 72 4d 73 67 2c 20 22 76 69 65 77 20 22 2c 20 70  rMsg, "view ", p
6ed0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Table->zName,.  
6ee0: 20 20 20 20 20 20 20 22 20 69 73 20 63 69 72 63         " is circ
6ef0: 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
6f00: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
6f10: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
6f20: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
6f30: 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
6f40: 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65  far, it means we
6f50: 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
6f60: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73   the table names
6f70: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
6f80: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
6f90: 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d   ); /* If nCol==
6fa0: 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d  0, then pTable m
6fb0: 75 73 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f  ust be a VIEW */
6fc0: 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65  .  pSel = pTable
6fd0: 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
6fe0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
6ff0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 52 65 73  all to sqliteRes
7000: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
7010: 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
7020: 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
7030: 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e  ts in this list.
7040: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65    But we will ne
7050: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
7060: 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b  e list.  ** back
7070: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
7080: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61   configuration a
7090: 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65  fterwards, so we
70a0: 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a   save a copy of.
70b0: 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
70c0: 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a  l in pEList..  *
70d0: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  /.  pEList = pSe
70e0: 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65  l->pEList;.  pSe
70f0: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  l->pEList = sqli
7100: 74 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 45  teExprListDup(pE
7110: 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65  List);.  if( pSe
7120: 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  l->pEList==0 ){.
7130: 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74      pSel->pEList
7140: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72   = pEList;.    r
7150: 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c  eturn 1;  /* Mal
7160: 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
7170: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  }.  pTable->nCol
7180: 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62   = -1;.  pSelTab
7190: 20 3d 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53   = sqliteResultS
71a0: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
71b0: 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69  e, 0, pSel);.  i
71c0: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
71d0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
71e0: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
71f0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
7200: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
7210: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
7220: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
7230: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43  .    pSelTab->nC
7240: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  ol = 0;.    pSel
7250: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
7260: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
7270: 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29  able(0, pSelTab)
7280: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  ;.    pParse->db
7290: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
72a0: 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a  E_UnresetViews;.
72b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
72c0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
72d0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20     nErr++;.  }. 
72e0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62   sqliteSelectUnb
72f0: 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c  ind(pSel);.  sql
7300: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
7310: 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b  e(pSel->pEList);
7320: 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20  .  pSel->pEList 
7330: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75  = pEList;.  retu
7340: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a  rn nErr;  .}../*
7350: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
7360: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
7370: 74 68 65 20 56 49 45 57 20 70 54 61 62 6c 65 2e  the VIEW pTable.
7380: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7390: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
73a0: 65 6e 65 76 65 72 20 61 6e 79 20 6f 74 68 65 72  enever any other
73b0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69   table or view i
73c0: 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54  s modified..** T
73d0: 68 65 20 76 69 65 77 20 70 61 73 73 65 64 20 69  he view passed i
73e0: 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
73f0: 20 6d 69 67 68 74 20 64 65 70 65 6e 64 20 64 69   might depend di
7400: 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65  rectly or indire
7410: 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d  ctly.** on the m
7420: 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c 65 74  odified or delet
7430: 65 64 20 74 61 62 6c 65 20 73 6f 20 77 65 20 6e  ed table so we n
7440: 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65  eed to clear the
7450: 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e   old column.** n
7460: 61 6d 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  ames so that the
7470: 79 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70  y will be recomp
7480: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
7490: 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
74a0: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
74b0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
74c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
74d0: 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 54 61 62  Table==0 || pTab
74e0: 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  le->pSelect==0 )
74f0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
7500: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30 20 29  Table->nCol==0 )
7510: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
7520: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
7530: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ol; i++){.    sq
7540: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
7550: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
7560: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
7570: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
7580: 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69  zDflt);.    sqli
7590: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
75a0: 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20  Col[i].zType);. 
75b0: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
75c0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
75d0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
75e0: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  0;.  pTable->nCo
75f0: 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l = 0;.}../*.** 
7600: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
7610: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
7620: 79 20 56 49 45 57 2e 0a 2a 2f 0a 76 6f 69 64 20  y VIEW..*/.void 
7630: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
7640: 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a  ll(sqlite *db){.
7650: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
7660: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
7670: 26 20 53 51 4c 49 54 45 5f 55 6e 72 65 73 65 74  & SQLITE_Unreset
7680: 56 69 65 77 73 29 3d 3d 30 20 29 20 72 65 74 75  Views)==0 ) retu
7690: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  rn;.  for(i=sqli
76a0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
76b0: 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d  >tblHash); i; i=
76c0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
76d0: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
76e0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
76f0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
7700: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
7710: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 69  {.      sqliteVi
7720: 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ewResetColumnNam
7730: 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  es(pTab);.    }.
7740: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
7750: 26 3d 20 7e 53 51 4c 49 54 45 5f 55 6e 72 65 73  &= ~SQLITE_Unres
7760: 65 74 56 69 65 77 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  etViews;.}../*.*
7770: 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c  * Given a token,
7780: 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c 65   look up a table
7790: 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d 65 2e   with that name.
77a0: 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20    If not found, 
77b0: 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72 6f  leave.** an erro
77c0: 72 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72  r for the parser
77d0: 20 74 6f 20 66 69 6e 64 20 61 6e 64 20 72 65 74   to find and ret
77e0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62  urn NULL..*/.Tab
77f0: 6c 65 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 46  le *sqliteTableF
7800: 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a  romToken(Parse *
7810: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
7820: 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  Tok){.  char *zN
7830: 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ame;.  Table *pT
7840: 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ab;.  zName = sq
7850: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f  liteTableNameFro
7860: 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20  mToken(pTok);.  
7870: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
7880: 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61 62 20  eturn 0;.  pTab 
7890: 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c  = sqliteFindTabl
78a0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
78b0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
78c0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ee(zName);.  if(
78d0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
78e0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
78f0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
7900: 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  g, "no such tabl
7910: 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20  e: ", 0, .      
7920: 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d    pTok->z, pTok-
7930: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  >n, 0);.    pPar
7940: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a  se->nErr++;.  }.
7950: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
7960: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7970: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
7980: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
7990: 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
79a0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
79b0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
79c0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
79d0: 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
79e0: 64 20 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c  d sqliteDropTabl
79f0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
7a00: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69   Token *pName, i
7a10: 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61  nt isView){.  Ta
7a20: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56  ble *pTable;.  V
7a30: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61  dbe *v;.  int ba
7a40: 73 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  se;.  sqlite *db
7a50: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
7a60: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
7a70: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
7a80: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
7a90: 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  urn;.  pTable = 
7aa0: 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54  sqliteTableFromT
7ab0: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 4e 61  oken(pParse, pNa
7ac0: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  me);.  if( pTabl
7ad0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
7ae0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 72 65 61   if( pTable->rea
7af0: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
7b00: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
7b10: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
7b20: 74 61 62 6c 65 20 22 2c 20 70 54 61 62 6c 65 2d  table ", pTable-
7b30: 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  >zName, .       
7b40: 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  " may not be dro
7b50: 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70  pped", 0);.    p
7b60: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
7b70: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
7b80: 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
7b90: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d  Table->pSelect==
7ba0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
7bb0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
7bc0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73 65 20  ->zErrMsg, "use 
7bd0: 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
7be0: 6c 65 74 65 20 74 61 62 6c 65 20 22 2c 0a 20 20  lete table ",.  
7bf0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d      pTable->zNam
7c00: 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  e, 0);.    pPars
7c10: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
7c20: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
7c30: 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
7c40: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  le->pSelect ){. 
7c50: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
7c60: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
7c70: 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50 20 56  Msg, "use DROP V
7c80: 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
7c90: 65 77 20 22 2c 0a 20 20 20 20 20 20 70 54 61 62  ew ",.      pTab
7ca0: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  le->zName, 0);. 
7cb0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
7cc0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
7cd0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
7ce0: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
7cf0: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
7d00: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
7d10: 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
7d20: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
7d30: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
7d40: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
7d50: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 72  static VdbeOp dr
7d60: 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20  opTable[] = {.  
7d70: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
7d80: 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c       0, ADDR(8),
7d90: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
7da0: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20  _String,     0, 
7db0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  0,        0}, /*
7dc0: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
7dd0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20  _MemStore,   1, 
7de0: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  1,        0},.  
7df0: 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64      { OP_MemLoad
7e00: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
7e10: 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
7e20: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
7e30: 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
7e40: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
7e50: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Ne,         0, 
7e60: 41 44 44 52 28 37 29 2c 20 20 30 7d 2c 0a 20 20  ADDR(7),  0},.  
7e70: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
7e80: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
7e90: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
7ea0: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
7eb0: 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a  ADDR(3),  0}, /*
7ec0: 20 37 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20   7 */.    };.   
7ed0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
7ee0: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
7ef0: 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 42  ger;.    sqliteB
7f00: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
7f10: 6f 6e 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20  on(pParse, 0);. 
7f20: 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73     sqliteOpenMas
7f30: 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54 61 62  terTable(v, pTab
7f40: 6c 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20  le->isTemp);.   
7f50: 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
7f60: 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
7f70: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
7f80: 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 2a 2f  being dropped */
7f90: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
7fa0: 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72  pTable->pTrigger
7fb0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72  ;.    while( pTr
7fc0: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 54  igger ){.      T
7fd0: 6f 6b 65 6e 20 74 74 3b 0a 20 20 20 20 20 20 74  oken tt;.      t
7fe0: 74 2e 7a 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54  t.z = pTable->pT
7ff0: 72 69 67 67 65 72 2d 3e 6e 61 6d 65 3b 0a 20 20  rigger->name;.  
8000: 20 20 20 20 74 74 2e 6e 20 3d 20 73 74 72 6c 65      tt.n = strle
8010: 6e 28 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67  n(pTable->pTrigg
8020: 65 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  er->name);.     
8030: 20 73 71 6c 69 74 65 44 72 6f 70 54 72 69 67 67   sqliteDropTrigg
8040: 65 72 28 70 50 61 72 73 65 2c 20 26 74 74 2c 20  er(pParse, &tt, 
8050: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  1);.      if( pP
8060: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
8070: 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65  .        pTrigge
8080: 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
8090: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
80a0: 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67  {.        pTrigg
80b0: 65 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72  er = pTable->pTr
80c0: 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20  igger;.      }. 
80d0: 20 20 20 7d 0a 20 20 20 20 62 61 73 65 20 3d 20     }.    base = 
80e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
80f0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
8100: 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f  (dropTable), dro
8110: 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c  pTable);.    sql
8120: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
8130: 76 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62 6c  v, base+1, pTabl
8140: 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  e->zName, 0);.  
8150: 20 20 69 66 28 20 21 70 54 61 62 6c 65 2d 3e 69    if( !pTable->i
8160: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73  sTemp ){.      s
8170: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
8180: 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a  e(db, v);.    }.
8190: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
81a0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
81b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
81c0: 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20  !isView ){.     
81d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
81e0: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
81f0: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54  pTable->tnum, pT
8200: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20  able->isTemp);. 
8210: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
8220: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
8230: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
8240: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73  Next){.        s
8250: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8260: 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49  , OP_Destroy, pI
8270: 64 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65  dx->tnum, pTable
8280: 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 20  ->isTemp);.     
8290: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
82a0: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
82b0: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
82c0: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  }..  /* Delete t
82d0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73  he in-memory des
82e0: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
82f0: 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  table..  **.  **
8300: 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20 74   Exception: if t
8310: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
8320: 20 62 65 67 61 6e 20 77 69 74 68 20 74 68 65 20   began with the 
8330: 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c  EXPLAIN keyword,
8340: 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68  .  ** then no ch
8350: 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20  anges should be 
8360: 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  made..  */.  if(
8370: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
8380: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55  n ){.    sqliteU
8390: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61  nlinkAndDeleteTa
83a0: 62 6c 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ble(db, pTable);
83b0: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
83c0: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
83d0: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20 73 71  hanges;.  }.  sq
83e0: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
83f0: 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  (db);.}../*.** T
8400: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 73  his routine cons
8410: 74 72 75 63 74 73 20 61 20 50 33 20 73 74 72 69  tructs a P3 stri
8420: 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ng suitable for 
8430: 61 6e 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79  an OP_MakeIdxKey
8440: 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20 61  .** opcode and a
8450: 64 64 73 20 74 68 61 74 20 50 33 20 73 74 72 69  dds that P3 stri
8460: 6e 67 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72  ng to the most r
8470: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
8480: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20   instruction.** 
8490: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
84a0: 61 63 68 69 6e 65 2e 20 20 54 68 65 20 50 33 20  achine.  The P3 
84b0: 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 73 20  string consists 
84c0: 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72  of a single char
84d0: 61 63 74 65 72 0a 2a 2a 20 66 6f 72 20 65 61 63  acter.** for eac
84e0: 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  h column in the 
84f0: 69 6e 64 65 78 20 70 49 64 78 20 6f 66 20 74 61  index pIdx of ta
8500: 62 6c 65 20 70 54 61 62 2e 20 20 49 66 20 74 68  ble pTab.  If th
8510: 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 0a 2a 2a  e column uses.**
8520: 20 61 20 6e 75 6d 65 72 69 63 20 73 6f 72 74 20   a numeric sort 
8530: 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20  order, then the 
8540: 50 33 20 73 74 72 69 6e 67 20 63 68 61 72 61 63  P3 string charac
8550: 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ter correspondin
8560: 67 20 74 6f 0a 2a 2a 20 74 68 61 74 20 63 6f 6c  g to.** that col
8570: 75 6d 6e 20 69 73 20 27 6e 27 2e 20 20 49 66 20  umn is 'n'.  If 
8580: 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 20  the column uses 
8590: 61 20 74 65 78 74 20 73 6f 72 74 20 6f 72 64 65  a text sort orde
85a0: 72 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 50  r, then the.** P
85b0: 33 20 73 74 72 69 6e 67 20 69 73 20 27 74 27 2e  3 string is 't'.
85c0: 20 20 53 65 65 20 74 68 65 20 4f 50 5f 4d 61 6b    See the OP_Mak
85d0: 65 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 20 64  eIdxKey opcode d
85e0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  ocumentation for
85f0: 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  .** additional i
8600: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 65 65  nformation.  See
8610: 20 61 6c 73 6f 20 74 68 65 20 73 71 6c 69 74 65   also the sqlite
8620: 41 64 64 4b 65 79 54 79 70 65 28 29 20 72 6f 75  AddKeyType() rou
8630: 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tine..*/.void sq
8640: 6c 69 74 65 41 64 64 49 64 78 4b 65 79 54 79 70  liteAddIdxKeyTyp
8650: 65 28 56 64 62 65 20 2a 76 2c 20 49 6e 64 65 78  e(Vdbe *v, Index
8660: 20 2a 70 49 64 78 29 7b 0a 20 20 63 68 61 72 20   *pIdx){.  char 
8670: 2a 7a 54 79 70 65 3b 0a 20 20 54 61 62 6c 65 20  *zType;.  Table 
8680: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
8690: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  n;.  assert( pId
86a0: 78 21 3d 30 20 26 26 20 70 49 64 78 2d 3e 70 54  x!=0 && pIdx->pT
86b0: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 70 54 61  able!=0 );.  pTa
86c0: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
86d0: 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 6e 43  ;.  n = pIdx->nC
86e0: 6f 6c 75 6d 6e 3b 0a 20 20 7a 54 79 70 65 20 3d  olumn;.  zType =
86f0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
8700: 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 54 79 70  +1 );.  if( zTyp
8710: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
8720: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
8730: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  ++){.    int iCo
8740: 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
8750: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  mn[i];.    asser
8760: 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  t( iCol>=0 && iC
8770: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ol<pTab->nCol );
8780: 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
8790: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 6f 72 74 4f  aCol[iCol].sortO
87a0: 72 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f  rder & SQLITE_SO
87b0: 5f 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49  _TYPEMASK)==SQLI
87c0: 54 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20  TE_SO_TEXT ){.  
87d0: 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27      zType[i] = '
87e0: 74 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t';.    }else{. 
87f0: 20 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20       zType[i] = 
8800: 27 6e 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  'n';.    }.  }. 
8810: 20 7a 54 79 70 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zType[n] = 0;. 
8820: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
8830: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65  eP3(v, -1, zType
8840: 2c 20 6e 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  , n);.  sqliteFr
8850: 65 65 28 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a  ee(zType);.}../*
8860: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
8870: 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
8880: 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78  L table.  pIndex
8890: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
88a0: 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
88b0: 64 20 70 54 61 62 6c 65 20 69 73 20 74 68 65 20  d pTable is the 
88c0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
88d0: 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
88e0: 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
88f0: 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
8900: 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
8910: 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
8920: 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
8930: 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
8940: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
8950: 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
8960: 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
8970: 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
8980: 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
8990: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
89a0: 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
89b0: 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
89c0: 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
89d0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
89e0: 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
89f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8a00: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
8a10: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
8a20: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
8a30: 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
8a40: 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
8a50: 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
8a60: 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
8a70: 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
8a80: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
8a90: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
8aa0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
8ab0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
8ac0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
8ad0: 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74  void sqliteCreat
8ae0: 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
8af0: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c  *pParse,   /* Al
8b00: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
8b10: 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
8b20: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
8b30: 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ,    /* Name of 
8b40: 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 79 20  the index.  May 
8b50: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  be NULL */.  Tok
8b60: 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 2f 2a  en *pTable,   /*
8b70: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
8b80: 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 20 55 73  le to index.  Us
8b90: 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
8ba0: 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 49 64  ble if 0 */.  Id
8bb0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
8bc0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
8bd0: 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
8be0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
8bf0: 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  or,     /* OE_Ab
8c00: 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
8c10: 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
8c20: 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
8c30: 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20  n *pStart,   /* 
8c40: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
8c50: 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20 43   that begins a C
8c60: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8c70: 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
8c80: 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54   *pEnd      /* T
8c90: 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73  he ")" that clos
8ca0: 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  es the CREATE IN
8cb0: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
8cc0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
8cd0: 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
8ce0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
8cf0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
8d00: 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ;   /* The index
8d10: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a   to be created *
8d20: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
8d30: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
8d40: 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b  .  Token nullId;
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8d60: 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61  Fake token for a
8d70: 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20  n empty ID list 
8d80: 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  */.  sqlite *db 
8d90: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
8da0: 69 6e 74 20 68 69 64 65 4e 61 6d 65 20 3d 20 30  int hideName = 0
8db0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ;         /* Do 
8dc0: 6e 6f 74 20 70 75 74 20 74 61 62 6c 65 20 6e 61  not put table na
8dd0: 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  me in the hash t
8de0: 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  able */..  if( p
8df0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
8e00: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
8e10: 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
8e20: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
8e30: 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
8e40: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
8e50: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
8e60: 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
8e70: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
8e80: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
8e90: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8ea0: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 70  Name!=0 );.    p
8eb0: 54 61 62 20 3d 20 20 73 71 6c 69 74 65 54 61 62  Tab =  sqliteTab
8ec0: 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  leFromToken(pPar
8ed0: 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d  se, pTable);.  }
8ee0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
8ef0: 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ( pName==0 );.  
8f00: 20 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65    pTab =  pParse
8f10: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d  ->pNewTable;.  }
8f20: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c  .  if( pTab==0 |
8f30: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
8f40: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
8f50: 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70  e_index;.  if( p
8f60: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  Tab->readOnly ){
8f70: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
8f80: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
8f90: 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c  rrMsg, "table ",
8fa0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20   pTab->zName, . 
8fb0: 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 68       " may not h
8fc0: 61 76 65 20 6e 65 77 20 69 6e 64 69 63 65 73 20  ave new indices 
8fd0: 61 64 64 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  added", 0);.    
8fe0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
8ff0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
9000: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
9010: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
9020: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
9030: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
9040: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69  se->zErrMsg, "vi
9050: 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
9060: 6e 64 65 78 65 64 22 2c 20 30 29 3b 0a 20 20 20  ndexed", 0);.   
9070: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
9080: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
9090: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
90a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
90b0: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
90c0: 77 68 69 6c 65 20 72 65 2d 72 65 61 64 69 6e 67  while re-reading
90d0: 20 74 68 65 20 73 63 68 65 6d 61 20 66 72 6f 6d   the schema from
90e0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
90f0: 20 2a 2a 20 62 75 74 20 74 68 65 20 74 61 62 6c   ** but the tabl
9100: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
9110: 68 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  h this index is 
9120: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
9130: 65 2c 20 69 74 20 63 61 6e 0a 20 20 2a 2a 20 6f  e, it can.  ** o
9140: 6e 6c 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68  nly mean that th
9150: 65 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 69  e table that thi
9160: 73 20 69 6e 64 65 78 20 69 73 20 72 65 61 6c 6c  s index is reall
9170: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
9180: 68 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 20 77 68  h is.  ** one wh
9190: 6f 73 65 20 6e 61 6d 65 20 69 73 20 68 69 64 64  ose name is hidd
91a0: 65 6e 20 62 65 68 69 6e 64 20 61 20 74 65 6d 70  en behind a temp
91b0: 6f 72 61 72 79 20 74 61 62 6c 65 20 77 69 74 68  orary table with
91c0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 0a   the same name..
91d0: 20 20 2a 2a 20 53 69 6e 63 65 20 69 74 73 20 74    ** Since its t
91e0: 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 73 75  able has been su
91f0: 70 70 72 65 73 73 65 64 2c 20 77 65 20 6e 65 65  ppressed, we nee
9200: 64 20 74 6f 20 61 6c 73 6f 20 73 75 70 70 72 65  d to also suppre
9210: 73 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  ss the.  ** inde
9220: 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  x..  */.  if( pP
9230: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26  arse->initFlag &
9240: 26 20 21 70 50 61 72 73 65 2d 3e 69 73 54 65 6d  & !pParse->isTem
9250: 70 20 26 26 20 70 54 61 62 2d 3e 69 73 54 65 6d  p && pTab->isTem
9260: 70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  p ){.    goto ex
9270: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
9280: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
9290: 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
92a0: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
92b0: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
92c0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
92d0: 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
92e0: 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
92f0: 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
9300: 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
9310: 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
9320: 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
9330: 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
9340: 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
9350: 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
9360: 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
9370: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
9380: 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
9390: 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
93a0: 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
93b0: 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
93c0: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
93d0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
93e0: 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
93f0: 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
9400: 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
9410: 73 73 20 74 68 69 73 20 69 6e 64 65 78 2c 20 62  ss this index, b
9420: 75 74 20 77 65 20 77 69 6c 6c 20 6e 6f 74 0a 20  ut we will not. 
9430: 20 2a 2a 20 73 74 6f 72 65 20 69 74 73 20 6e 61   ** store its na
9440: 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  me in the hash t
9450: 61 62 6c 65 2e 20 20 53 65 74 20 74 68 65 20 68  able.  Set the h
9460: 69 64 65 4e 61 6d 65 20 66 6c 61 67 20 74 6f 20  ideName flag to 
9470: 61 63 63 6f 6d 70 6c 69 73 68 0a 20 20 2a 2a 20  accomplish.  ** 
9480: 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this..  **.  ** 
9490: 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
94a0: 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
94b0: 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
94c0: 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
94d0: 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
94e0: 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
94f0: 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
9500: 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
9510: 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  /.  if( pName ){
9520: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61  .    Index *pISa
9530: 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e  meName;    /* An
9540: 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68  other index with
9550: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a   the same name *
9560: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53  /.    Table *pTS
9570: 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41  ameName;    /* A
9580: 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65   table with same
9590: 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64   name as the ind
95a0: 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65 20  ex */.    zName 
95b0: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d  = sqliteTableNam
95c0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
95d0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
95e0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
95f0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
9600: 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d    if( (pISameNam
9610: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  e = sqliteFindIn
9620: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21  dex(db, zName))!
9630: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
9640: 70 49 53 61 6d 65 4e 61 6d 65 2d 3e 70 54 61 62  pISameName->pTab
9650: 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50  le->isTemp && pP
9660: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
9670: 7b 0a 20 20 20 20 20 20 20 20 68 69 64 65 4e 61  {.        hideNa
9680: 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  me = 1;.      }e
9690: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
96a0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
96b0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
96c0: 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20  index ", zName, 
96d0: 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 61 6c  .           " al
96e0: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 30  ready exists", 0
96f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
9700: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
9710: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
9720: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
9730: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9740: 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pTSameName = s
9750: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
9760: 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b  b, zName))!=0 ){
9770: 0a 20 20 20 20 20 20 69 66 28 20 70 54 53 61 6d  .      if( pTSam
9780: 65 4e 61 6d 65 2d 3e 69 73 54 65 6d 70 20 26 26  eName->isTemp &&
9790: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
97a0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68 69 64  g ){.        hid
97b0: 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20  eName = 1;.     
97c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
97d0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
97e0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
97f0: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
9800: 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
9810: 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d ",.           
9820: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
9830: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
9840: 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  +;.        goto 
9850: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
9860: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
9870: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
9880: 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
9890: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
98a0: 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
98b0: 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
98c0: 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
98d0: 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
98e0: 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
98f0: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 25   sprintf(zBuf,"%
9900: 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d  d)",n);.    zNam
9910: 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
9920: 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  eSetString(&zNam
9930: 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e 7a 4e  e, "(", pTab->zN
9940: 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64 65 78  ame, " autoindex
9950: 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20   ", zBuf, 0);.  
9960: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
9970: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
9980: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 68 69 64  e_index;.    hid
9990: 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69  eName = sqliteFi
99a0: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
99b0: 65 29 21 3d 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e)!=0;.  }..  /*
99c0: 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
99d0: 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
99e0: 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
99f0: 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
9a00: 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
9a10: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
9a20: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
9a30: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
9a40: 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
9a50: 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
9a60: 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
9a70: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
9a80: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
9a90: 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d  nullId.z = pTab-
9aa0: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
9ab0: 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
9ac0: 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e  ullId.n = strlen
9ad0: 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20  (nullId.z);.    
9ae0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49 64  pList = sqliteId
9af0: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e  ListAppend(0, &n
9b00: 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
9b10: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
9b20: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
9b30: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20  x;.  }..  /* .  
9b40: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
9b50: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
9b60: 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20   .  */.  pIndex 
9b70: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
9b80: 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
9b90: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
9ba0: 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1 +.            
9bb0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
9bc0: 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e  of(int)*pList->n
9bd0: 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  Id );.  if( pInd
9be0: 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ex==0 ) goto exi
9bf0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
9c00: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
9c10: 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64  mn = (int*)&pInd
9c20: 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78 2d  ex[1];.  pIndex-
9c30: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
9c40: 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
9c50: 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20  n[pList->nId];. 
9c60: 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e   strcpy(pIndex->
9c70: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  zName, zName);. 
9c80: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
9c90: 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
9ca0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73  ->nColumn = pLis
9cb0: 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78  t->nId;.  pIndex
9cc0: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
9cd0: 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d 20 6f  ex->isUnique = o
9ce0: 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53 63  nError;..  /* Sc
9cf0: 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
9d00: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
9d10: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
9d20: 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
9d30: 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
9d40: 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
9d50: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
9d60: 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
9d70: 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
9d80: 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
9d90: 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
9da0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
9db0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28  ; i++){.    for(
9dc0: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
9dd0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
9de0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
9df0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
9e00: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  me, pTab->aCol[j
9e10: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
9e20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
9e30: 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
9e40: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9e50: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
9e60: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
9e70: 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  le ", pTab->zNam
9e80: 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20 68 61  e, .        " ha
9e90: 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
9ea0: 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  d ", pList->a[i]
9eb0: 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  .zName, 0);.    
9ec0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
9ed0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
9ee0: 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ee(pIndex);.    
9ef0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
9f00: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
9f10: 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
9f20: 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d  lumn[i] = j;.  }
9f30: 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
9f40: 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
9f50: 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
9f60: 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
9f70: 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
9f80: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
9f90: 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ures. .  */.  if
9fa0: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
9fb0: 69 6e 20 26 26 20 21 68 69 64 65 4e 61 6d 65 20  in && !hideName 
9fc0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
9fd0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48  .    p = sqliteH
9fe0: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 69  ashInsert(&db->i
9ff0: 64 78 48 61 73 68 2c 20 70 49 6e 64 65 78 2d 3e  dxHash, pIndex->
a000: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
a010: 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
a020: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
a030: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
a040: 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
a050: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
a060: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 71  iled */.      sq
a070: 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78 29  liteFree(pIndex)
a080: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
a090: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
a0a0: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
a0b0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
a0c0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
a0d0: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
a0e0: 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
a0f0: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
a100: 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
a110: 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
a120: 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
a130: 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
a140: 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
a150: 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
a160: 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
a170: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
a180: 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  r the correct op
a190: 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54  eration of UPDAT
a1a0: 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52  E.  ** and INSER
a1b0: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 6e  T..  */.  if( on
a1c0: 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
a1d0: 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
a1e0: 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70  x==0.       || p
a1f0: 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
a200: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
a210: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  ){.    pIndex->p
a220: 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
a230: 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70  dex;.    pTab->p
a240: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
a250: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
a260: 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
a270: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 77  b->pIndex;.    w
a280: 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
a290: 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
a2a0: 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
a2b0: 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
a2c0: 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
a2d0: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
a2e0: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65  .    pIndex->pNe
a2f0: 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
a300: 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d 3e  xt;.    pOther->
a310: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
a320: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
a330: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69   initFlag is 1 i
a340: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
a350: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
a360: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
a370: 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  ite_master" tabl
a380: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20  e on the disk.  
a390: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
a3a0: 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a  to the disk.  **
a3b0: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
a3c0: 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65   the table numbe
a3d0: 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73  r from the pPars
a3e0: 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  e->newTnum field
a3f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
a400: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26  rse->initFlag &&
a410: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
a420: 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
a430: 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d   pParse->newTnum
a440: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
a450: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30  he initFlag is 0
a460: 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
a470: 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
a480: 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
a490: 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
a4a0: 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
a4b0: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
a4c0: 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
a4d0: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
a4e0: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
a4f0: 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
a500: 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c 61    ** The initFla
a510: 67 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  g is 0 when the 
a520: 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
a530: 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
a540: 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
a550: 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   The initFlag is
a560: 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
a570: 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
a580: 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
a590: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
a5a0: 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
a5b0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
a5c0: 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
a5d0: 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
a5e0: 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
a5f0: 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
a600: 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
a610: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
a620: 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
a630: 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c 65 3d  .  ** If pTable=
a640: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
a650: 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
a660: 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79  ted as a primary
a670: 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49   key.  ** or UNI
a680: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
a690: 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  f a CREATE TABLE
a6a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
a6b0: 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
a6c0: 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
a6d0: 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
a6e0: 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
a6f0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
a700: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
a710: 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
a720: 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
a730: 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74  if( pParse->init
a740: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Flag==0 ){.    i
a750: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
a760: 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c  v;.    int lbl1,
a770: 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69   lbl2;.    int i
a780: 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  ;.    int addr;.
a790: 20 20 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d      int isTemp =
a7a0: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 3b 0a 0a   pTab->isTemp;..
a7b0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65      v = sqliteGe
a7c0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
a7d0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
a7e0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
a7f0: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54  ndex;.    if( pT
a800: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  able!=0 ){.     
a810: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
a820: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
a830: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  e, 0);.      sql
a840: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
a850: 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20  le(v, isTemp);. 
a860: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
a870: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
a880: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
a890: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a8a0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
a8b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
a8c0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
a8d0: 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78 22 2c 20  v, -1, "index", 
a8e0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
a8f0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
a900: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
a910: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
a920: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
a930: 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  1, pIndex->zName
a940: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
a950: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
a960: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
a970: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
a980: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
a990: 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   -1, pTab->zName
a9a0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
a9b0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
a9c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
a9d0: 72 65 61 74 65 49 6e 64 65 78 2c 20 30 2c 20 69  reateIndex, 0, i
a9e0: 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  sTemp);.    sqli
a9f0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
aa00: 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 26  , addr, (char*)&
aa10: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 50 33  pIndex->tnum, P3
aa20: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 70  _POINTER);.    p
aa30: 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b  Index->tnum = 0;
aa40: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20  .    if( pTable 
aa50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
aa60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
aa70: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
aa80: 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
aa90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
aaa0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
aab0: 6e 57 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a 20  nWrAux, 1, 0);. 
aac0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aad0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
aae0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
aaf0: 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ite, 1, 0);.    
ab00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 64    }.    }.    ad
ab10: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
ab20: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
ab30: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  g, 0, 0);.    if
ab40: 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64  ( pStart && pEnd
ab50: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64   ){.      n = Ad
ab60: 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64  dr(pEnd->z) - Ad
ab70: 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b 20  dr(pStart->z) + 
ab80: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  1;.      sqliteV
ab90: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
aba0: 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c 20  ddr, pStart->z, 
abb0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  n);.    }.    sq
abc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
abd0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
abe0: 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  5, 0);.    sqlit
abf0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ac00: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
ac10: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
ac20: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
ac30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 69 73  eVdbeAddOp(v, is
ac40: 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41 75  Temp ? OP_OpenAu
ac50: 78 20 3a 20 4f 50 5f 4f 70 65 6e 2c 20 32 2c 20  x : OP_Open, 2, 
ac60: 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pTab->tnum);.   
ac70: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
ac80: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61  ngeP3(v, -1, pTa
ac90: 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  b->zName, P3_STA
aca0: 54 49 43 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32  TIC);.      lbl2
acb0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
acc0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
acd0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ace0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32  (v, OP_Rewind, 2
acf0: 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c  , lbl2);.      l
ad00: 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65  bl1 = sqliteVdbe
ad10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e  AddOp(v, OP_Recn
ad20: 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 2, 0);.      
ad30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
ad40: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
ad50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ad60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ad70: 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e 64 65  Column, 2, pInde
ad80: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 3b  x->aiColumn[i]);
ad90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
ada0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
adb0: 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c  , OP_MakeIdxKey,
adc0: 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
add0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
ade0: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  db->file_format>
adf0: 3d 33 20 29 20 73 71 6c 69 74 65 41 64 64 49 64  =3 ) sqliteAddId
ae00: 78 4b 65 79 54 79 70 65 28 76 2c 20 70 49 6e 64  xKeyType(v, pInd
ae10: 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
ae20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ae30: 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e 64  _IdxPut, 1, pInd
ae40: 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
ae50: 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  None);.      sql
ae60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
ae70: 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c 31  OP_Next, 2, lbl1
ae80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
ae90: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
aea0: 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20  v, lbl2);.      
aeb0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
aec0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c 20  v, OP_Close, 2, 
aed0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
aee0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
aef0: 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Close, 1, 0);.  
af00: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
af10: 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  le!=0 ){.      i
af20: 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20  f( !isTemp ){.  
af30: 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e        sqliteChan
af40: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b  geCookie(db, v);
af50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
af60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
af70: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
af80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
af90: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
afa0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
afb0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
afc0: 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
afd0: 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
afe0: 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
aff0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
b000: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  st);.  sqliteFre
b010: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
b020: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
b030: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
b040: 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
b050: 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
b060: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
b070: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
b080: 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
b090: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
b0a0: 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  eDropIndex(Parse
b0b0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
b0c0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  *pName){.  Index
b0d0: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 63 68 61 72   *pIndex;.  char
b0e0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65 20   *zName;.  Vdbe 
b0f0: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  *v;.  sqlite *db
b100: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
b110: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
b120: 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c  rr || sqlite_mal
b130: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
b140: 75 72 6e 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  urn;.  zName = s
b150: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
b160: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
b170: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
b180: 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e 64 65   return;.  pInde
b190: 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  x = sqliteFindIn
b1a0: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  dex(db, zName);.
b1b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
b1c0: 6d 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  me);.  if( pInde
b1d0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
b1e0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
b1f0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
b200: 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 22  no such index: "
b210: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70 4e  , 0, .        pN
b220: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
b230: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
b240: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
b250: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
b260: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
b270: 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
b280: 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d  x and from the m
b290: 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
b2a0: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
b2b0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
b2c0: 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ( v ){.    stati
b2d0: 63 20 56 64 62 65 4f 70 20 64 72 6f 70 49 6e 64  c VdbeOp dropInd
b2e0: 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ex[] = {.      {
b2f0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
b300: 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 20  0, ADDR(9), 0}, 
b310: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
b320: 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  ng,     0, 0,   
b330: 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a      0}, /* 1 */.
b340: 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74        { OP_MemSt
b350: 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20  ore,   1, 1,    
b360: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
b370: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c  P_MemLoad,    1,
b380: 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a   0,       0}, /*
b390: 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   3 */.      { OP
b3a0: 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20  _Column,     0, 
b3b0: 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  1,       0},.   
b3c0: 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20     { OP_Eq,     
b3d0: 20 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20      0, ADDR(8), 
b3e0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
b3f0: 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44  ext,       0, AD
b400: 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20  DR(3), 0},.     
b410: 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20   { OP_Goto,     
b420: 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d    0, ADDR(9), 0}
b430: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c  ,.      { OP_Del
b440: 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ete,     0, 0,  
b450: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f       0}, /* 8 */
b460: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
b470: 62 61 73 65 3b 0a 20 20 20 20 54 61 62 6c 65 20  base;.    Table 
b480: 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
b490: 70 54 61 62 6c 65 3b 0a 0a 20 20 20 20 73 71 6c  pTable;..    sql
b4a0: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
b4b0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
b4c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65  );.    sqliteOpe
b4d0: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
b4e0: 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b 0a 20  pTab->isTemp);. 
b4f0: 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
b500: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
b510: 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49   ArraySize(dropI
b520: 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78  ndex), dropIndex
b530: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
b540: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
b550: 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  e+1, pIndex->zNa
b560: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  me, 0);.    if( 
b570: 21 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b  !pTab->isTemp ){
b580: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61  .      sqliteCha
b590: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29  ngeCookie(db, v)
b5a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
b5b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b5c0: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
b5d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b5e0: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
b5f0: 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  y, pIndex->tnum,
b600: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b 0a   pTab->isTemp);.
b610: 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69      sqliteEndWri
b620: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
b630: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  se);.  }..  /* D
b640: 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  elete the in-mem
b650: 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ory description 
b660: 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  of this index.. 
b670: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
b680: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
b690: 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e    sqliteUnlinkAn
b6a0: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  dDeleteIndex(db,
b6b0: 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64 62   pIndex);.    db
b6c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
b6d0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
b6e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  .  }.}../*.** Ap
b6f0: 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
b700: 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
b710: 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
b720: 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
b730: 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
b740: 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
b750: 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
b760: 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
b770: 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
b780: 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70   *sqliteIdListAp
b790: 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69  pend(IdList *pLi
b7a0: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
b7b0: 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  n){.  if( pList=
b7c0: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
b7d0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
b7e0: 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
b7f0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
b800: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b810: 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d   }.  if( (pList-
b820: 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20 29 7b 0a  >nId & 7)==0 ){.
b830: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
b840: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61  t_item *a;.    a
b850: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
b860: 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73  (pList->a, (pLis
b870: 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66  t->nId+8)*sizeof
b880: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b  (pList->a[0]) );
b890: 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  .    if( a==0 ){
b8a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c  .      sqliteIdL
b8b0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
b8c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
b8d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
b8e0: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
b8f0: 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61  memset(&pList->a
b900: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c  [pList->nId], 0,
b910: 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
b920: 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f  [0]));.  if( pTo
b930: 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ken ){.    char 
b940: 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61  **pz = &pList->a
b950: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61  [pList->nId].zNa
b960: 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  me;.    sqliteSe
b970: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f  tNString(pz, pTo
b980: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
b990: 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a  n, 0);.    if( *
b9a0: 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  pz==0 ){.      s
b9b0: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
b9c0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
b9d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
b9e0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
b9f0: 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20  eDequote(*pz);. 
ba00: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74     }.  }.  pList
ba10: 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72  ->nId++;.  retur
ba20: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
ba30: 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74  * Append a new t
ba40: 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65  able name to the
ba50: 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20   given SrcList. 
ba60: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72   Create a new Sr
ba70: 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  cList if.** need
ba80: 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   be.  A new entr
ba90: 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  y is created in 
baa0: 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e  the SrcList even
bab0: 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55   if pToken is NU
bac0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  LL..**.** A new 
bad0: 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
bae0: 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
baf0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
bb00: 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
bb10: 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  teSrcListAppend(
bb20: 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
bb30: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
bb40: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
bb50: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
bb60: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
bb70: 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
bb80: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
bb90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
bba0: 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 53 72   if( (pList->nSr
bbb0: 63 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  c & 7)==0 ){.   
bbc0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
bbd0: 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d  item *a;.    a =
bbe0: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
bbf0: 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d  List->a, (pList-
bc00: 3e 6e 53 72 63 2b 38 29 2a 73 69 7a 65 6f 66 28  >nSrc+8)*sizeof(
bc10: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a  pList->a[0]) );.
bc20: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
bc30: 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c        sqliteSrcL
bc40: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
bc50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
bc60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
bc70: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
bc80: 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61  memset(&pList->a
bc90: 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c 20 30  [pList->nSrc], 0
bca0: 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
bcb0: 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54  a[0]));.  if( pT
bcc0: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  oken ){.    char
bcd0: 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e   **pz = &pList->
bce0: 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a  a[pList->nSrc].z
bcf0: 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Name;.    sqlite
bd00: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
bd10: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
bd20: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ->n, 0);.    if(
bd30: 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20   *pz==0 ){.     
bd40: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65   sqliteSrcListDe
bd50: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
bd60: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
bd70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
bd80: 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29  liteDequote(*pz)
bd90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c  ;.    }.  }.  pL
bda0: 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72  ist->nSrc++;.  r
bdb0: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
bdc0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69  /*.** Add an ali
bdd0: 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69  as to the last i
bde0: 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65  dentifier on the
bdf0: 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65   given identifie
be00: 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
be10: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41 64 64  sqliteSrcListAdd
be20: 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70  Alias(SrcList *p
be30: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
be40: 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
be50: 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63  t && pList->nSrc
be60: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  >0 ){.    int i 
be70: 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 2d 20  = pList->nSrc - 
be80: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  1;.    sqliteSet
be90: 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e  NString(&pList->
bea0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f  a[i].zAlias, pTo
beb0: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
bec0: 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 0);.    sqlit
bed0: 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e  eDequote(pList->
bee0: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
bef0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
bf00: 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
bf10: 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73  void sqliteIdLis
bf20: 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a  tDelete(IdList *
bf30: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
bf40: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
bf50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
bf60: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
bf70: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
bf80: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
bf90: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
bfa0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
bfb0: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
bfc0: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
bfd0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
bfe0: 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
bff0: 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
c000: 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
c010: 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
c020: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
c030: 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e 64 65  sqliteIdListInde
c040: 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
c050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
c060: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
c070: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
c080: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
c090: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
c0a0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
c0b0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70   sqliteStrICmp(p
c0c0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
c0d0: 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  , zName)==0 ) re
c0e0: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
c0f0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
c100: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
c110: 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
c120: 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
c130: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
c140: 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74  id sqliteSrcList
c150: 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a  Delete(SrcList *
c160: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
c170: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
c180: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
c190: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
c1a0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  rc; i++){.    sq
c1b0: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
c1c0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
c1d0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
c1e0: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b  t->a[i].zAlias);
c1f0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
c200: 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69  a[i].pTab && pLi
c210: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69  st->a[i].pTab->i
c220: 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
c230: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
c240: 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e  Table(0, pList->
c250: 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20  a[i].pTab);.    
c260: 7d 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65  }.    sqliteSele
c270: 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e  ctDelete(pList->
c280: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
c290: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
c2a0: 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ete(pList->a[i].
c2b0: 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
c2c0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
c2d0: 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29  st->a[i].pUsing)
c2e0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
c2f0: 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
c300: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
c310: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
c320: 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 69 73 20  COPY command is 
c330: 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  for compatibilit
c340: 79 20 77 69 74 68 20 50 6f 73 74 67 72 65 53 51  y with PostgreSQ
c350: 4c 20 61 6e 64 20 73 70 65 63 69 66 69 63 69 61  L and specificia
c360: 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68 65 20 61  lly.** for the a
c370: 62 69 6c 69 74 79 20 74 6f 20 72 65 61 64 20 74  bility to read t
c380: 68 65 20 6f 75 74 70 75 74 20 6f 66 20 70 67 5f  he output of pg_
c390: 64 75 6d 70 2e 20 20 54 68 65 20 66 6f 72 6d 61  dump.  The forma
c3a0: 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f  t is as.** follo
c3b0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50  ws:.**.**    COP
c3c0: 59 20 74 61 62 6c 65 20 46 52 4f 4d 20 66 69 6c  Y table FROM fil
c3d0: 65 20 5b 55 53 49 4e 47 20 44 45 4c 49 4d 49 54  e [USING DELIMIT
c3e0: 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a  ERS string].**.*
c3f0: 2a 20 22 74 61 62 6c 65 22 20 69 73 20 61 6e 20  * "table" is an 
c400: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6e  existing table n
c410: 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c 20 72 65  ame.  We will re
c420: 61 64 20 6c 69 6e 65 73 20 6f 66 20 63 6f 64 65  ad lines of code
c430: 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f   from.** file to
c440: 20 66 69 6c 6c 20 74 68 69 73 20 74 61 62 6c 65   fill this table
c450: 20 77 69 74 68 20 64 61 74 61 2e 20 20 46 69 6c   with data.  Fil
c460: 65 20 6d 69 67 68 74 20 62 65 20 22 73 74 64 69  e might be "stdi
c470: 6e 22 2e 20 20 54 68 65 20 6f 70 74 69 6f 6e 61  n".  The optiona
c480: 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65 72 20 73  l.** delimiter s
c490: 74 72 69 6e 67 20 69 64 65 6e 74 69 66 69 65 73  tring identifies
c4a0: 20 74 68 65 20 66 69 65 6c 64 20 73 65 70 61 72   the field separ
c4b0: 61 74 6f 72 73 2e 20 20 54 68 65 20 64 65 66 61  ators.  The defa
c4c0: 75 6c 74 20 69 73 20 61 20 74 61 62 2e 0a 2a 2f  ult is a tab..*/
c4d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 70 79  .void sqliteCopy
c4e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c4f0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
c500: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
c510: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
c520: 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 54 68 65 20  eName,   /* The 
c530: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
c540: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
c550: 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a 2f 0a 20  will insert */. 
c560: 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e 61 6d   Token *pFilenam
c570: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c  e,    /* The fil
c580: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
c590: 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69  obtain informati
c5a0: 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
c5b0: 44 65 6c 69 6d 69 74 65 72 2c 20 20 20 2f 2a 20  Delimiter,   /* 
c5c0: 55 73 65 20 74 68 69 73 20 61 73 20 74 68 65 20  Use this as the 
c5d0: 66 69 65 6c 64 20 64 65 6c 69 6d 69 74 65 72 20  field delimiter 
c5e0: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
c5f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
c600: 74 20 74 6f 20 64 6f 20 69 66 20 61 20 63 6f 6e  t to do if a con
c610: 73 74 72 61 69 6e 74 20 66 61 69 6c 73 20 2a 2f  straint fails */
c620: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
c630: 62 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 3b  b;.  char *zTab;
c640: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
c650: 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64 72 2c   *v;.  int addr,
c660: 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a 70   end;.  Index *p
c670: 49 64 78 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  Idx;.  sqlite *d
c680: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c690: 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65  .  zTab = sqlite
c6a0: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
c6b0: 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  en(pTableName);.
c6c0: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c    if( sqlite_mal
c6d0: 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 7a 54  loc_failed || zT
c6e0: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63 6f 70  ab==0 ) goto cop
c6f0: 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 61  y_cleanup;.  pTa
c700: 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  b = sqliteTableN
c710: 61 6d 65 54 6f 54 61 62 6c 65 28 70 50 61 72 73  ameToTable(pPars
c720: 65 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69  e, zTab);.  sqli
c730: 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20  teFree(zTab);.  
c740: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
c750: 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b  to copy_cleanup;
c760: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
c770: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
c780: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74  if( v ){.    int
c790: 20 6f 70 65 6e 4f 70 3b 0a 20 20 20 20 73 71 6c   openOp;.    sql
c7a0: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
c7b0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
c7c0: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  );.    addr = sq
c7d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c7e0: 20 4f 50 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c   OP_FileOpen, 0,
c7f0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
c800: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
c810: 64 64 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e  ddr, pFilename->
c820: 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29  z, pFilename->n)
c830: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
c840: 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64  DequoteP3(v, add
c850: 72 29 3b 0a 20 20 20 20 6f 70 65 6e 4f 70 20 3d  r);.    openOp =
c860: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 3f 20   pTab->isTemp ? 
c870: 4f 50 5f 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f  OP_OpenWrAux : O
c880: 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20  P_OpenWrite;.   
c890: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c8a0: 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 30 2c 20 70  (v, openOp, 0, p
c8b0: 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Tab->tnum);.    
c8c0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
c8d0: 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P3(v, -1, pTab->
c8e0: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
c8f0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  );.    for(i=1, 
c900: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
c910: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
c920: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
c930: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
c940: 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70  eAddOp(v, openOp
c950: 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29  , i, pIdx->tnum)
c960: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
c970: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
c980: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50  , pIdx->zName, P
c990: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  3_STATIC);.    }
c9a0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
c9b0: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e  gs & SQLITE_Coun
c9c0: 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73  tRows ){.      s
c9d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c9e0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
c9f0: 20 30 29 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c   0);  /* Initial
ca00: 69 7a 65 20 74 68 65 20 72 6f 77 20 63 6f 75 6e  ize the row coun
ca10: 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65  t */.    }.    e
ca20: 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  nd = sqliteVdbeM
ca30: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
ca40: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
ca50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69  beAddOp(v, OP_Fi
ca60: 6c 65 52 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43  leRead, pTab->nC
ca70: 6f 6c 2c 20 65 6e 64 29 3b 0a 20 20 20 20 69 66  ol, end);.    if
ca80: 28 20 70 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a  ( pDelimiter ){.
ca90: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
caa0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
cab0: 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c  , pDelimiter->z,
cac0: 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b   pDelimiter->n);
cad0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
cae0: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64  eDequoteP3(v, ad
caf0: 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dr);.    }else{.
cb00: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
cb10: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
cb20: 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20  , "\t", 1);.    
cb30: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  }.    if( pTab->
cb40: 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
cb50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cb60: 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75  p(v, OP_FileColu
cb70: 6d 6e 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 2c  mn, pTab->iPKey,
cb80: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
cb90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
cba0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30  _MustBeInt, 0, 0
cbb0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
cbc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
cbd0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
cbe0: 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  no, 0, 0);.    }
cbf0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
cc00: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
cc10: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70  {.      if( i==p
cc20: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
cc30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
cc40: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
cc50: 20 63 6f 6c 75 6d 6e 20 69 73 20 66 69 6c 6c 65   column is fille
cc60: 64 20 77 69 74 68 20 4e 55 4c 4c 20 73 69 6e 63  d with NULL sinc
cc70: 65 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  e its.        **
cc80: 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73   value is always
cc90: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65   pulled from the
cca0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a   record number *
ccb0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
ccc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ccd0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
cce0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ccf0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
cd00: 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f  dOp(v, OP_FileCo
cd10: 6c 75 6d 6e 2c 20 69 2c 20 30 29 3b 0a 20 20 20  lumn, i, 0);.   
cd20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
cd30: 71 6c 69 74 65 47 65 6e 65 72 61 74 65 43 6f 6e  qliteGenerateCon
cd40: 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 70 50  straintChecks(pP
cd50: 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30  arse, pTab, 0, 0
cd60: 2c 20 30 2c 20 30 2c 20 6f 6e 45 72 72 6f 72 2c  , 0, 0, onError,
cd70: 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69   addr);.    sqli
cd80: 74 65 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74  teCompleteInsert
cd90: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
cda0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
cdb0: 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67     if( (db->flag
cdc0: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
cdd0: 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20 20 20  Rows)!=0 ){.    
cde0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cdf0: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
ce00: 31 2c 20 30 29 3b 20 20 2f 2a 20 49 6e 63 72 65  1, 0);  /* Incre
ce10: 6d 65 6e 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a  ment row count *
ce20: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  /.    }.    sqli
ce30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ce40: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29  P_Goto, 0, addr)
ce50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
ce60: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
ce70: 65 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  end);.    sqlite
ce80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ce90: 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Noop, 0, 0);.   
cea0: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
ceb0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
cec0: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  ;.    if( db->fl
ced0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
cee0: 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20  ntRows ){.      
cef0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
cf00: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e  v, OP_ColumnCoun
cf10: 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
cf20: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
cf30: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65  v, OP_ColumnName
cf40: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
cf50: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
cf60: 33 28 76 2c 20 2d 31 2c 20 22 72 6f 77 73 20 69  3(v, -1, "rows i
cf70: 6e 73 65 72 74 65 64 22 2c 20 50 33 5f 53 54 41  nserted", P3_STA
cf80: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
cf90: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
cfa0: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 31 2c 20 30  P_Callback, 1, 0
cfb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
cfc0: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  copy_cleanup:.  
cfd0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
cfe0: 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72   The non-standar
cff0: 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64  d VACUUM command
d000: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c 65 61   is used to clea
d010: 6e 20 75 70 20 74 68 65 20 64 61 74 61 62 61 73  n up the databas
d020: 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66  e,.** collapse f
d030: 72 65 65 20 73 70 61 63 65 2c 20 65 74 63 2e 20  ree space, etc. 
d040: 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20   It is modelled 
d050: 61 66 74 65 72 20 74 68 65 20 56 41 43 55 55 4d  after the VACUUM
d060: 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50   command.** in P
d070: 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a 2a  ostgreSQL..**.**
d080: 20 49 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30 2e   In version 1.0.
d090: 78 20 6f 66 20 53 51 4c 69 74 65 2c 20 74 68 65  x of SQLite, the
d0a0: 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20   VACUUM command 
d0b0: 77 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67 64  would call.** gd
d0c0: 62 6d 5f 72 65 6f 72 67 61 6e 69 7a 65 28 29 20  bm_reorganize() 
d0d0: 6f 6e 20 61 6c 6c 20 74 68 65 20 64 61 74 61 62  on all the datab
d0e0: 61 73 65 20 74 61 62 6c 65 73 2e 20 20 42 75 74  ase tables.  But
d0f0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
d100: 74 68 20 32 2e 30 2e 30 2c 20 53 51 4c 69 74 65  th 2.0.0, SQLite
d110: 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20   no longer uses 
d120: 47 44 42 4d 20 73 6f 20 74 68 69 73 20 63 6f 6d  GDBM so this com
d130: 6d 61 6e 64 20 68 61 73 0a 2a 2a 20 62 65 63 6f  mand has.** beco
d140: 6d 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76  me a no-op..*/.v
d150: 6f 69 64 20 73 71 6c 69 74 65 56 61 63 75 75 6d  oid sqliteVacuum
d160: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d170: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
d180: 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  e){.  /* Do noth
d190: 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ing */.}../*.** 
d1a0: 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
d1b0: 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
d1c0: 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  teBeginTransacti
d1d0: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
d1e0: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
d1f0: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20    sqlite *db;.. 
d200: 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
d210: 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
d220: 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d  )==0 || db->pBe=
d230: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
d240: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
d250: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
d260: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
d270: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  ;.  if( db->flag
d280: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
d290: 6e 73 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ns ) return;.  s
d2a0: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
d2b0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
d2c0: 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73   0);.  db->flags
d2d0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 54 72 61   |= SQLITE_InTra
d2e0: 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f  ns;.  db->onErro
d2f0: 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  r = onError;.}..
d300: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74  /*.** Commit a t
d310: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
d320: 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54  id sqliteCommitT
d330: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
d340: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
d350: 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  ite *db;..  if( 
d360: 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
d370: 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
d380: 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20  || db->pBe==0 ) 
d390: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
d3a0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
d3b0: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
d3c0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
d3d0: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
d3e0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
d3f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  =0 ) return;.  d
d400: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
d410: 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 73  ITE_InTrans;.  s
d420: 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
d430: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
d440: 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20    db->onError = 
d450: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f  OE_Default;.}../
d460: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
d470: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
d480: 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61  oid sqliteRollba
d490: 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  ckTransaction(Pa
d4a0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
d4b0: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64  sqlite *db;.  Vd
d4c0: 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
d4d0: 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
d4e0: 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
d4f0: 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65   db->pBe==0 ) re
d500: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
d510: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
d520: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
d530: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
d540: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
d550: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30  LITE_InTrans)==0
d560: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d   ) return;.  v =
d570: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
d580: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
d590: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
d5a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c  eAddOp(v, OP_Rol
d5b0: 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20  lback, 0, 0);.  
d5c0: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  }.  db->flags &=
d5d0: 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73   ~SQLITE_InTrans
d5e0: 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20  ;.  db->onError 
d5f0: 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a  = OE_Default;.}.
d600: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
d610: 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
d620: 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
d630: 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
d640: 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
d650: 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
d660: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
d670: 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
d680: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
d690: 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
d6a0: 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
d6b0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
d6c0: 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
d6d0: 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
d6e0: 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
d6f0: 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
d700: 74 20 69 66 20 74 68 65 20 73 65 74 43 68 65 63  t if the setChec
d710: 6b 70 6f 69 6e 74 20 70 61 72 61 6d 65 74 65 72  kpoint parameter
d720: 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
d730: 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
d740: 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
d750: 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
d760: 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
d770: 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
d780: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
d790: 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
d7a0: 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
d7b0: 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
d7c0: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
d7d0: 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
d7e0: 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
d7f0: 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
d800: 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
d810: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
d820: 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
d830: 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
d840: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
d850: 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
d860: 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
d870: 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
d880: 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
d890: 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
d8a0: 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  t be set..*/.voi
d8b0: 64 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69  d sqliteBeginWri
d8c0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
d8d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
d8e0: 65 74 43 68 65 63 6b 70 6f 69 6e 74 29 7b 0a 20  etCheckpoint){. 
d8f0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20   Vdbe *v;.  v = 
d900: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
d910: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
d920: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
d930: 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  ( pParse->trigSt
d940: 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  ack ) return; /*
d950: 20 69 66 20 74 68 69 73 20 69 73 20 69 6e 20 61   if this is in a
d960: 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 69 66   trigger */.  if
d970: 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  ( (pParse->db->f
d980: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
d990: 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20  Trans)==0 ){.   
d9a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d9b0: 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
d9c0: 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  on, 0, 0);.    s
d9d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d9e0: 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69  , OP_VerifyCooki
d9f0: 65 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 73  e, pParse->db->s
da00: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30 29  chema_cookie, 0)
da10: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 73 63  ;.    pParse->sc
da20: 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d 20 31  hemaVerified = 1
da30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65  ;.  }else if( se
da40: 74 43 68 65 63 6b 70 6f 69 6e 74 20 29 7b 0a 20  tCheckpoint ){. 
da50: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
da60: 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b 70 6f  Op(v, OP_Checkpo
da70: 69 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  int, 0, 0);.  }.
da80: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
da90: 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63  e code that conc
daa0: 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69  ludes an operati
dab0: 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76 65  on that may have
dac0: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20   changed.** the 
dad0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
dae0: 69 73 20 61 20 63 6f 6d 70 61 6e 69 6f 6e 20 66  is a companion f
daf0: 75 6e 63 74 69 6f 6e 20 74 6f 20 42 65 67 69 6e  unction to Begin
db00: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29  WriteOperation()
db10: 2e 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  ..** If a transa
db20: 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
db30: 64 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 69  d, then commit i
db40: 74 2e 20 20 49 66 20 61 20 63 68 65 63 6b 70 6f  t.  If a checkpo
db50: 69 6e 74 20 77 61 73 0a 2a 2a 20 73 74 61 72 74  int was.** start
db60: 65 64 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  ed then commit t
db70: 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  hat..*/.void sql
db80: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
db90: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
dba0: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  se){.  Vdbe *v;.
dbb0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 74 72    if( pParse->tr
dbc0: 69 67 53 74 61 63 6b 20 29 20 72 65 74 75 72 6e  igStack ) return
dbd0: 3b 20 2f 2a 20 69 66 20 74 68 69 73 20 69 73 20  ; /* if this is 
dbe0: 69 6e 20 61 20 74 72 69 67 67 65 72 20 2a 2f 0a  in a trigger */.
dbf0: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
dc00: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
dc10: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
dc20: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
dc30: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
dc40: 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20  TE_InTrans ){.  
dc50: 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e 67 20    /* Do Nothing 
dc60: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
dc70: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
dc80: 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c  v, OP_Commit, 0,
dc90: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a   0);.  }.}.../*.
dca0: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
dcb0: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
dcc0: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
dcd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dce0: 67 65 74 42 6f 6f 6c 65 61 6e 28 63 68 61 72 20  getBoolean(char 
dcf0: 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  *z){.  static ch
dd00: 61 72 20 2a 61 7a 54 72 75 65 5b 5d 20 3d 20 7b  ar *azTrue[] = {
dd10: 20 22 79 65 73 22 2c 20 22 6f 6e 22 2c 20 22 74   "yes", "on", "t
dd20: 72 75 65 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  rue" };.  int i;
dd30: 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29  .  if( z[0]==0 )
dd40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
dd50: 20 69 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 7c   isdigit(z[0]) |
dd60: 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  | (z[0]=='-' && 
dd70: 69 73 64 69 67 69 74 28 7a 5b 31 5d 29 29 20 29  isdigit(z[1])) )
dd80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 74 6f  {.    return ato
dd90: 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  i(z);.  }.  for(
dda0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
ddb0: 54 72 75 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54  True)/sizeof(azT
ddc0: 72 75 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  rue[0]); i++){. 
ddd0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
dde0: 49 43 6d 70 28 7a 2c 61 7a 54 72 75 65 5b 69 5d  ICmp(z,azTrue[i]
ddf0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
de00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
de10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73  .}../*.** Proces
de20: 73 20 61 20 70 72 61 67 6d 61 20 73 74 61 74 65  s a pragma state
de30: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 50 72  ment.  .**.** Pr
de40: 61 67 6d 61 73 20 61 72 65 20 6f 66 20 74 68 69  agmas are of thi
de50: 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  s form:.**.**   
de60: 20 20 20 50 52 41 47 4d 41 20 69 64 20 3d 20 76     PRAGMA id = v
de70: 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  alue.**.** The i
de80: 64 65 6e 74 69 66 69 65 72 20 6d 69 67 68 74 20  dentifier might 
de90: 61 6c 73 6f 20 62 65 20 61 20 73 74 72 69 6e 67  also be a string
dea0: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 20  .  The value is 
deb0: 61 20 73 74 72 69 6e 67 2c 20 61 6e 64 0a 2a 2a  a string, and.**
dec0: 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f 72 20   identifier, or 
ded0: 61 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 6d 69  a number.  If mi
dee0: 6e 75 73 46 6c 61 67 20 69 73 20 74 72 75 65 2c  nusFlag is true,
def0: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
df00: 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65 72 20 74  is.** a number t
df10: 68 61 74 20 77 61 73 20 70 72 65 63 65 64 65 64  hat was preceded
df20: 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e   by a minus sign
df30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
df40: 50 72 61 67 6d 61 28 50 61 72 73 65 20 2a 70 50  Pragma(Parse *pP
df50: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65  arse, Token *pLe
df60: 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68  ft, Token *pRigh
df70: 74 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67  t, int minusFlag
df80: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65 66 74  ){.  char *zLeft
df90: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52   = 0;.  char *zR
dfa0: 69 67 68 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ight = 0;.  sqli
dfb0: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
dfc0: 3e 64 62 3b 0a 0a 20 20 7a 4c 65 66 74 20 3d 20  >db;..  zLeft = 
dfd0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4c  sqliteStrNDup(pL
dfe0: 65 66 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d 3e 6e  eft->z, pLeft->n
dff0: 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f  );.  sqliteDequo
e000: 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69 66 28  te(zLeft);.  if(
e010: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
e020: 20 20 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20    zRight = 0;.  
e030: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
e040: 6e 67 28 26 7a 52 69 67 68 74 2c 20 22 2d 22 2c  ng(&zRight, "-",
e050: 20 31 2c 20 70 52 69 67 68 74 2d 3e 7a 2c 20 70   1, pRight->z, p
e060: 52 69 67 68 74 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Right->n, 0);.  
e070: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69 67 68  }else{.    zRigh
e080: 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  t = sqliteStrNDu
e090: 70 28 70 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69  p(pRight->z, pRi
e0a0: 67 68 74 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c  ght->n);.    sql
e0b0: 69 74 65 44 65 71 75 6f 74 65 28 7a 52 69 67 68  iteDequote(zRigh
e0c0: 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 0a 20  t);.  }. .  /*. 
e0d0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61   **  PRAGMA defa
e0e0: 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a 20  ult_cache_size. 
e0f0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61   **  PRAGMA defa
e100: 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 3d 4e  ult_cache_size=N
e110: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
e120: 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74  irst form report
e130: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 65  s the current pe
e140: 72 73 69 73 74 65 6e 74 20 73 65 74 74 69 6e 67  rsistent setting
e150: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61   for the.  ** pa
e160: 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20 20  ge cache size.  
e170: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
e180: 65 64 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ed is the maximu
e190: 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a  m number of.  **
e1a0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
e1b0: 67 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 73  ge cache.  The s
e1c0: 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20  econd form sets 
e1d0: 62 6f 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  both the current
e1e0: 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65  .  ** page cache
e1f0: 20 73 69 7a 65 20 76 61 6c 75 65 20 61 6e 64 20   size value and 
e200: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 70  the persistent p
e210: 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76  age cache size v
e220: 61 6c 75 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64  alue.  ** stored
e230: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
e240: 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   file..  **.  **
e250: 20 54 68 65 20 64 65 66 61 75 6c 74 20 63 61 63   The default cac
e260: 68 65 20 73 69 7a 65 20 69 73 20 73 74 6f 72 65  he size is store
e270: 64 20 69 6e 20 6d 65 74 61 2d 76 61 6c 75 65 20  d in meta-value 
e280: 32 20 6f 66 20 70 61 67 65 20 31 20 6f 66 20 74  2 of page 1 of t
e290: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
e2a0: 20 66 69 6c 65 2e 20 20 54 68 65 20 63 61 63 68   file.  The cach
e2b0: 65 20 73 69 7a 65 20 69 73 20 61 63 74 75 61 6c  e size is actual
e2c0: 6c 79 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20  ly the absolute 
e2d0: 76 61 6c 75 65 20 6f 66 0a 20 20 2a 2a 20 74 68  value of.  ** th
e2e0: 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
e2f0: 6f 6e 2e 20 20 54 68 65 20 73 69 67 6e 20 6f 66  on.  The sign of
e300: 20 6d 65 74 61 2d 76 61 6c 75 65 20 32 20 64 65   meta-value 2 de
e310: 74 65 72 6d 69 6e 65 73 20 74 68 65 0a 20 20 2a  termines the.  *
e320: 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65  * synchronous se
e330: 74 74 69 6e 67 2e 20 20 41 20 6e 65 67 61 74 69  tting.  A negati
e340: 76 65 20 76 61 6c 75 65 20 6d 65 61 6e 73 20 73  ve value means s
e350: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
e360: 66 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 6f 73  f.  ** and a pos
e370: 69 74 69 76 65 20 76 61 6c 75 65 20 6d 65 61 6e  itive value mean
e380: 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  s synchronous is
e390: 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   on..  */.  if( 
e3a0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
e3b0: 65 66 74 2c 22 64 65 66 61 75 6c 74 5f 63 61 63  eft,"default_cac
e3c0: 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  he_size")==0 ){.
e3d0: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
e3e0: 70 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d  p getCacheSize[]
e3f0: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
e400: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20  ReadCookie,  0, 
e410: 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  2,        0},.  
e420: 20 20 20 20 7b 20 4f 50 5f 41 62 73 56 61 6c 75      { OP_AbsValu
e430: 65 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  e,    0, 0,     
e440: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
e450: 50 5f 44 75 70 2c 20 20 20 20 20 20 20 20 20 30  P_Dup,         0
e460: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
e470: 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67        { OP_Integ
e480: 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  er,     0, 0,   
e490: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
e4a0: 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20   OP_Ne,         
e4b0: 20 30 2c 20 36 2c 20 20 20 20 20 20 20 20 30 7d   0, 6,        0}
e4c0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74  ,.      { OP_Int
e4d0: 65 67 65 72 2c 20 20 20 20 20 4d 41 58 5f 50 41  eger,     MAX_PA
e4e0: 47 45 53 2c 30 2c 20 30 7d 2c 0a 20 20 20 20 20  GES,0, 0},.     
e4f0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e   { OP_ColumnCoun
e500: 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20  t, 1, 0,        
e510: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
e520: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
e530: 2c 20 20 20 20 20 20 20 20 22 63 61 63 68 65 5f  ,        "cache_
e540: 73 69 7a 65 22 7d 2c 0a 20 20 20 20 20 20 7b 20  size"},.      { 
e550: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20  OP_Callback,    
e560: 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
e570: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65  .    };.    Vdbe
e580: 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56   *v = sqliteGetV
e590: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
e5a0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
e5b0: 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67  rn;.    if( pRig
e5c0: 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20  ht->z==pLeft->z 
e5d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
e5e0: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
e5f0: 41 72 72 61 79 53 69 7a 65 28 67 65 74 43 61 63  ArraySize(getCac
e600: 68 65 53 69 7a 65 29 2c 20 67 65 74 43 61 63 68  heSize), getCach
e610: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  eSize);.    }els
e620: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  e{.      int add
e630: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  r;.      int siz
e640: 65 20 3d 20 61 74 6f 69 28 7a 52 69 67 68 74 29  e = atoi(zRight)
e650: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
e660: 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a  <0 ) size = -siz
e670: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  e;.      sqliteB
e680: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
e690: 6f 6e 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20  on(pParse, 0);. 
e6a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
e6b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
e6c0: 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a 20 20  er, size, 0);.  
e6d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
e6e0: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  dOp(v, OP_ReadCo
e6f0: 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20  okie, 0, 2);.   
e700: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
e710: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e720: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
e730: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
e740: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20  AddOp(v, OP_Ge, 
e750: 30 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20  0, addr+3);.    
e760: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
e770: 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65  p(v, OP_Negative
e780: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
e790: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
e7a0: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
e7b0: 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 2);.      sql
e7c0: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
e7d0: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
e7e0: 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69      db->cache_si
e7f0: 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73  ze = db->cache_s
e800: 69 7a 65 3c 30 20 3f 20 2d 73 69 7a 65 20 3a 20  ize<0 ? -size : 
e810: 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
e820: 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65 53  teBtreeSetCacheS
e830: 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d  ize(db->pBe, db-
e840: 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
e850: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f    }.  }else..  /
e860: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63  *.  **  PRAGMA c
e870: 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20  ache_size.  **  
e880: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
e890: 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e=N.  **.  ** Th
e8a0: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70  e first form rep
e8b0: 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  orts the current
e8c0: 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 66   local setting f
e8d0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  or the.  ** page
e8e0: 20 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68   cache size.  Th
e8f0: 65 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20  e local setting 
e900: 63 61 6e 20 62 65 20 64 69 66 66 65 72 65 6e 74  can be different
e910: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 70   from.  ** the p
e920: 65 72 73 69 73 74 65 6e 74 20 63 61 63 68 65 20  ersistent cache 
e930: 73 69 7a 65 20 76 61 6c 75 65 20 74 68 61 74 20  size value that 
e940: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
e950: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66   database.  ** f
e960: 69 6c 65 20 69 74 73 65 6c 66 2e 20 20 54 68 65  ile itself.  The
e970: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
e980: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  is the maximum n
e990: 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61  umber of.  ** pa
e9a0: 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
e9b0: 63 61 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f  cache.  The seco
e9c0: 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74 68 65  nd form sets the
e9d0: 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70 61 67 65   local.  ** page
e9e0: 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75   cache size valu
e9f0: 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  e.  It does not 
ea00: 63 68 61 6e 67 65 20 74 68 65 20 70 65 72 73 69  change the persi
ea10: 73 74 65 6e 74 0a 20 20 2a 2a 20 63 61 63 68 65  stent.  ** cache
ea20: 20 73 69 7a 65 20 73 74 6f 72 65 64 20 6f 6e 20   size stored on 
ea30: 74 68 65 20 64 69 73 6b 20 73 6f 20 74 68 65 20  the disk so the 
ea40: 63 61 63 68 65 20 73 69 7a 65 20 77 69 6c 6c 20  cache size will 
ea50: 72 65 76 65 72 74 0a 20 20 2a 2a 20 74 6f 20 69  revert.  ** to i
ea60: 74 73 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ts default value
ea70: 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
ea80: 73 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  se is closed and
ea90: 20 72 65 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 20   reopened..  ** 
eaa0: 4e 20 73 68 6f 75 6c 64 20 62 65 20 61 20 70 6f  N should be a po
eab0: 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a  sitive integer..
eac0: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
ead0: 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22  eStrICmp(zLeft,"
eae0: 63 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20  cache_size")==0 
eaf0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
eb00: 62 65 4f 70 20 67 65 74 43 61 63 68 65 53 69 7a  beOp getCacheSiz
eb10: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  e[] = {.      { 
eb20: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
eb30: 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
eb40: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
eb50: 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
eb60: 20 20 20 20 20 20 22 63 61 63 68 65 5f 73 69 7a        "cache_siz
eb70: 65 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  e"},.      { OP_
eb80: 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20  Callback,    1, 
eb90: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
eba0: 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76    };.    Vdbe *v
ebb0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
ebc0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
ebd0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
ebe0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
ebf0: 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a  >z==pLeft->z ){.
ec00: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
ec10: 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b   db->cache_size;
ec20: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
ec30: 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a  <0 ) size = -siz
ec40: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  e;.      sqliteV
ec50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
ec60: 6e 74 65 67 65 72 2c 20 73 69 7a 65 2c 20 30 29  nteger, size, 0)
ec70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
ec80: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
ec90: 72 72 61 79 53 69 7a 65 28 67 65 74 43 61 63 68  rraySize(getCach
eca0: 65 53 69 7a 65 29 2c 20 67 65 74 43 61 63 68 65  eSize), getCache
ecb0: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Size);.    }else
ecc0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
ecd0: 20 3d 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b   = atoi(zRight);
ece0: 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c  .      if( size<
ecf0: 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65  0 ) size = -size
ed00: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
ed10: 63 61 63 68 65 5f 73 69 7a 65 3c 30 20 29 20 73  cache_size<0 ) s
ed20: 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20  ize = -size;.   
ed30: 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a     db->cache_siz
ed40: 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e = size;.      
ed50: 73 71 6c 69 74 65 42 74 72 65 65 53 65 74 43 61  sqliteBtreeSetCa
ed60: 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c  cheSize(db->pBe,
ed70: 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29   db->cache_size)
ed80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
ed90: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
eda0: 4d 41 20 64 65 66 61 75 6c 74 5f 73 79 6e 63 68  MA default_synch
edb0: 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 50 52 41  ronous.  **  PRA
edc0: 47 4d 41 20 64 65 66 61 75 6c 74 5f 73 79 6e 63  GMA default_sync
edd0: 68 72 6f 6e 6f 75 73 3d 42 4f 4f 4c 45 41 4e 0a  hronous=BOOLEAN.
ede0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
edf0: 72 73 74 20 66 6f 72 6d 20 72 65 74 75 72 6e 73  rst form returns
ee00: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
ee10: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 73 79  value of the "sy
ee20: 6e 63 68 72 6f 6e 6f 75 73 22 20 73 65 74 74 69  nchronous" setti
ee30: 6e 67 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  ng.  ** that is 
ee40: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
ee50: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
ee60: 20 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73   the synchronous
ee70: 20 73 65 74 74 69 6e 67 20 74 68 61 74 0a 20 20   setting that.  
ee80: 2a 2a 20 69 73 20 75 73 65 64 20 77 68 65 6e 65  ** is used whene
ee90: 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ver the database
eea0: 20 69 73 20 6f 70 65 6e 65 64 20 75 6e 6c 65 73   is opened unles
eeb0: 73 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  s overridden by 
eec0: 61 20 73 65 70 61 72 61 74 65 0a 20 20 2a 2a 20  a separate.  ** 
eed0: 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 20 70 72  "synchronous" pr
eee0: 61 67 6d 61 2e 20 20 54 68 65 20 73 65 63 6f 6e  agma.  The secon
eef0: 64 20 66 6f 72 6d 20 63 68 61 6e 67 65 73 20 74  d form changes t
ef00: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 61 6e  he persistent an
ef10: 64 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 61 6c  d the.  ** local
ef20: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74   synchronous set
ef30: 74 69 6e 67 20 74 6f 20 74 68 65 20 76 61 6c 75  ting to the valu
ef40: 65 20 67 69 76 65 6e 2e 0a 20 20 2a 2a 0a 20 20  e given..  **.  
ef50: 2a 2a 20 49 66 20 73 79 6e 63 68 72 6f 6e 6f 75  ** If synchronou
ef60: 73 20 69 73 20 6f 6e 2c 20 53 51 4c 69 74 65 20  s is on, SQLite 
ef70: 77 69 6c 6c 20 64 6f 20 61 6e 20 66 73 79 6e 63  will do an fsync
ef80: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  () system call a
ef90: 74 20 73 74 72 61 74 65 67 69 63 0a 20 20 2a 2a  t strategic.  **
efa0: 20 70 6f 69 6e 74 73 20 74 6f 20 69 6e 73 75 72   points to insur
efb0: 65 20 74 68 61 74 20 61 6c 6c 20 70 72 65 76 69  e that all previ
efc0: 6f 75 73 6c 79 20 77 72 69 74 74 65 6e 20 64 61  ously written da
efd0: 74 61 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  ta has actually 
efe0: 62 65 65 6e 0a 20 20 2a 2a 20 77 72 69 74 74 65  been.  ** writte
eff0: 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
f000: 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 20 63  surface before c
f010: 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 68 69 73  ontinuing.  This
f020: 20 6d 6f 64 65 20 69 6e 73 75 72 65 73 20 74 68   mode insures th
f030: 61 74 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  at.  ** the data
f040: 62 61 73 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  base will always
f050: 20 62 65 20 69 6e 20 61 20 63 6f 6e 73 69 73 74   be in a consist
f060: 65 6e 74 20 73 74 61 74 65 20 65 76 65 6e 74 20  ent state event 
f070: 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
f080: 0a 20 20 2a 2a 20 73 79 73 74 65 6d 20 63 72 61  .  ** system cra
f090: 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 74 6f  shes or power to
f0a0: 20 74 68 65 20 63 6f 6d 70 75 74 65 72 20 69 73   the computer is
f0b0: 20 69 6e 74 65 72 72 75 70 74 65 64 20 75 6e 65   interrupted une
f0c0: 78 70 65 63 74 65 64 6c 79 2e 0a 20 20 2a 2a 20  xpectedly..  ** 
f0d0: 57 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  When synchronous
f0e0: 20 69 73 20 6f 66 66 2c 20 53 51 4c 69 74 65 20   is off, SQLite 
f0f0: 77 69 6c 6c 20 6e 6f 74 20 77 61 69 74 20 66 6f  will not wait fo
f100: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 61 63 74  r changes to act
f110: 75 61 6c 6c 79 0a 20 20 2a 2a 20 62 65 20 77 72  ually.  ** be wr
f120: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
f130: 6b 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  k before continu
f140: 69 6e 67 2e 20 20 41 73 20 73 6f 6f 6e 20 61 73  ing.  As soon as
f150: 20 69 74 20 68 61 6e 64 73 20 63 68 61 6e 67 65   it hands change
f160: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6f 70  s.  ** to the op
f170: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20  erating system, 
f180: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
f190: 74 68 65 20 63 68 61 6e 67 65 73 20 61 72 65 20  the changes are 
f1a0: 70 65 72 6d 61 6e 65 6e 74 20 61 6e 64 0a 20 20  permanent and.  
f1b0: 2a 2a 20 69 74 20 63 6f 6e 74 69 6e 75 65 73 20  ** it continues 
f1c0: 67 6f 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  going.  The data
f1d0: 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  base cannot be c
f1e0: 6f 72 72 75 70 74 65 64 20 62 79 20 61 20 70 72  orrupted by a pr
f1f0: 6f 67 72 61 6d 20 63 72 61 73 68 0a 20 20 2a 2a  ogram crash.  **
f200: 20 65 76 65 6e 20 77 69 74 68 20 73 79 6e 63 68   even with synch
f210: 72 6f 6e 6f 75 73 20 6f 66 66 2c 20 62 75 74 20  ronous off, but 
f220: 61 6e 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  an operating sys
f230: 74 65 6d 20 63 72 61 73 68 20 6f 72 20 70 6f 77  tem crash or pow
f240: 65 72 20 6c 6f 73 73 0a 20 20 2a 2a 20 63 6f 75  er loss.  ** cou
f250: 6c 64 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 63  ld potentially c
f260: 6f 72 72 75 70 74 20 64 61 74 61 2e 20 20 4f 6e  orrupt data.  On
f270: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
f280: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6f 66 66   synchronous off
f290: 20 69 73 0a 20 20 2a 2a 20 66 61 73 74 65 72 20   is.  ** faster 
f2a0: 74 68 61 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  than synchronous
f2b0: 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   on..  */.  if( 
f2c0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
f2d0: 65 66 74 2c 22 64 65 66 61 75 6c 74 5f 73 79 6e  eft,"default_syn
f2e0: 63 68 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b  chronous")==0 ){
f2f0: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
f300: 4f 70 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b  Op getSync[] = {
f310: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
f320: 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ger,     0, 0,  
f330: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
f340: 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  { OP_ReadCookie,
f350: 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30    0, 2,        0
f360: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e  },.      { OP_In
f370: 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c  teger,     0, 0,
f380: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
f390: 20 20 7b 20 4f 50 5f 4c 74 2c 20 20 20 20 20 20    { OP_Lt,      
f3a0: 20 20 20 20 30 2c 20 35 2c 20 20 20 20 20 20 20      0, 5,       
f3b0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
f3c0: 41 64 64 49 6d 6d 2c 20 20 20 20 20 20 31 2c 20  AddImm,      1, 
f3d0: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
f3e0: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43      { OP_ColumnC
f3f0: 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20  ount, 1, 0,     
f400: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
f410: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30  P_ColumnName,  0
f420: 2c 20 30 2c 20 20 20 20 20 20 20 20 22 73 79 6e  , 0,        "syn
f430: 63 68 72 6f 6e 6f 75 73 22 7d 2c 0a 20 20 20 20  chronous"},.    
f440: 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c    { OP_Callback,
f450: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
f460: 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
f470: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
f480: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
f490: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
f4a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  return;.    if( 
f4b0: 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74  pRight->z==pLeft
f4c0: 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ->z ){.      sql
f4d0: 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
f4e0: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65  (v, ArraySize(ge
f4f0: 74 53 79 6e 63 29 2c 20 67 65 74 53 79 6e 63 29  tSync), getSync)
f500: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f510: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
f520: 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64 62     int size = db
f530: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 0a 20 20  ->cache_size;.  
f540: 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29      if( size<0 )
f550: 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20   size = -size;. 
f560: 20 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e       sqliteBegin
f570: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
f580: 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 20  Parse, 0);.     
f590: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f5a0: 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
f5b0: 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20  e, 0, 2);.      
f5c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
f5d0: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
f5e0: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
f5f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
f600: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
f610: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
f620: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
f630: 5f 4e 65 2c 20 30 2c 20 61 64 64 72 2b 33 29 3b  _Ne, 0, addr+3);
f640: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
f650: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
f660: 49 6d 6d 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  Imm, MAX_PAGES, 
f670: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f680: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f690: 41 62 73 56 61 6c 75 65 2c 20 30 2c 20 30 29 3b  AbsValue, 0, 0);
f6a0: 0a 20 20 20 20 20 20 69 66 28 20 21 67 65 74 42  .      if( !getB
f6b0: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
f6c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f6d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f6e0: 4e 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b  Negative, 0, 0);
f6f0: 0a 20 20 20 20 20 20 20 20 73 69 7a 65 20 3d 20  .        size = 
f700: 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 7d 0a 20  -size;.      }. 
f710: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
f720: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
f730: 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20  okie, 0, 2);.   
f740: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
f750: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
f760: 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63 61  e);.      db->ca
f770: 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b  che_size = size;
f780: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72  .      sqliteBtr
f790: 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 64  eeSetCacheSize(d
f7a0: 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63 68  b->pBe, db->cach
f7b0: 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  e_size);.    }. 
f7c0: 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a   }else..  /*.  *
f7d0: 2a 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68  *   PRAGMA synch
f7e0: 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 20 50 52  ronous.  **   PR
f7f0: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
f800: 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20  =BOOLEAN.  **.  
f810: 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74  ** Return or set
f820: 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   the local value
f830: 20 6f 66 20 74 68 65 20 73 79 6e 63 68 72 6f 6e   of the synchron
f840: 6f 75 73 20 66 6c 61 67 2e 20 20 43 68 61 6e 67  ous flag.  Chang
f850: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63  ing.  ** the loc
f860: 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f  al value does no
f870: 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74  t make changes t
f880: 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  o the disk file 
f890: 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 64 65 66  and the.  ** def
f8a0: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
f8b0: 62 65 20 72 65 73 74 6f 72 65 64 20 74 68 65 20  be restored the 
f8c0: 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 64 61  next time the da
f8d0: 74 61 62 61 73 65 20 69 73 0a 20 20 2a 2a 20 6f  tabase is.  ** o
f8e0: 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  pened..  */.  if
f8f0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
f900: 7a 4c 65 66 74 2c 22 73 79 6e 63 68 72 6f 6e 6f  zLeft,"synchrono
f910: 75 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  us")==0 ){.    s
f920: 74 61 74 69 63 20 56 64 62 65 4f 70 20 67 65 74  tatic VdbeOp get
f930: 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Sync[] = {.     
f940: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e   { OP_ColumnCoun
f950: 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20  t, 1, 0,        
f960: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
f970: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
f980: 2c 20 20 20 20 20 20 20 20 22 73 79 6e 63 68 72  ,        "synchr
f990: 6f 6e 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b  onous"},.      {
f9a0: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20   OP_Callback,   
f9b0: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
f9c0: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62  ,.    };.    Vdb
f9d0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74  e *v = sqliteGet
f9e0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
f9f0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
fa00: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52 69  urn;.    if( pRi
fa10: 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a  ght->z==pLeft->z
fa20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fa30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fa40: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 63 61 63  Integer, db->cac
fa50: 68 65 5f 73 69 7a 65 3e 3d 30 2c 20 30 29 3b 0a  he_size>=0, 0);.
fa60: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
fa70: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
fa80: 61 79 53 69 7a 65 28 67 65 74 53 79 6e 63 29 2c  aySize(getSync),
fa90: 20 67 65 74 53 79 6e 63 29 3b 0a 20 20 20 20 7d   getSync);.    }
faa0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
fab0: 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68 65  size = db->cache
fac0: 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  _size;.      if(
fad0: 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d   size<0 ) size =
fae0: 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66   -size;.      if
faf0: 28 20 21 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  ( !getBoolean(zR
fb00: 69 67 68 74 29 20 29 20 73 69 7a 65 20 3d 20 2d  ight) ) size = -
fb10: 73 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e  size;.      db->
fb20: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a  cache_size = siz
fb30: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  e;.      sqliteB
fb40: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
fb50: 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61  (db->pBe, db->ca
fb60: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
fb70: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
fb80: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
fb90: 65 66 74 2c 20 22 74 72 69 67 67 65 72 5f 6f 76  eft, "trigger_ov
fba0: 65 72 68 65 61 64 5f 74 65 73 74 22 29 3d 3d 30  erhead_test")==0
fbb0: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42   ){.    if( getB
fbc0: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
fbd0: 7b 0a 20 20 20 20 20 20 61 6c 77 61 79 73 5f 63  {.      always_c
fbe0: 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65 74 75  ode_trigger_setu
fbf0: 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 1;.    }else
fc00: 7b 0a 20 20 20 20 20 20 61 6c 77 61 79 73 5f 63  {.      always_c
fc10: 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65 74 75  ode_trigger_setu
fc20: 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  p = 0;.    }.  }
fc30: 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
fc40: 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
fc50: 20 22 76 64 62 65 5f 74 72 61 63 65 22 29 3d 3d   "vdbe_trace")==
fc60: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  0 ){.    if( get
fc70: 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
fc80: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  ){.      db->fla
fc90: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 56 64 62  gs |= SQLITE_Vdb
fca0: 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 65 6c 73  eTrace;.    }els
fcb0: 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  e{.      db->fla
fcc0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 56 64  gs &= ~SQLITE_Vd
fcd0: 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 0a 20  beTrace;.    }. 
fce0: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
fcf0: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
fd00: 74 2c 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f  t, "full_column_
fd10: 6e 61 6d 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  names")==0 ){.  
fd20: 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
fd30: 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
fd40: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
fd50: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
fd60: 65 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  es;.    }else{. 
fd70: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
fd80: 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
fd90: 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 0a 20 20  lNames;.    }.  
fda0: 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
fdb0: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
fdc0: 2c 20 22 72 65 73 75 6c 74 5f 73 65 74 5f 64 65  , "result_set_de
fdd0: 74 61 69 6c 73 22 29 3d 3d 30 20 29 7b 0a 20 20  tails")==0 ){.  
fde0: 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
fdf0: 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
fe00: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
fe10: 51 4c 49 54 45 5f 52 65 73 75 6c 74 44 65 74 61  QLITE_ResultDeta
fe20: 69 6c 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ils;.    }else{.
fe30: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
fe40: 26 3d 20 7e 53 51 4c 49 54 45 5f 52 65 73 75 6c  &= ~SQLITE_Resul
fe50: 74 44 65 74 61 69 6c 73 3b 0a 20 20 20 20 7d 0a  tDetails;.    }.
fe60: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
fe70: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
fe80: 66 74 2c 20 22 63 6f 75 6e 74 5f 63 68 61 6e 67  ft, "count_chang
fe90: 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  es")==0 ){.    i
fea0: 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  f( getBoolean(zR
feb0: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64  ight) ){.      d
fec0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
fed0: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a 20 20  TE_CountRows;.  
fee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
fef0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
ff00: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a 20  ITE_CountRows;. 
ff10: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
ff20: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
ff30: 70 28 7a 4c 65 66 74 2c 20 22 65 6d 70 74 79 5f  p(zLeft, "empty_
ff40: 72 65 73 75 6c 74 5f 63 61 6c 6c 62 61 63 6b 73  result_callbacks
ff50: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
ff60: 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67   getBoolean(zRig
ff70: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ht) ){.      db-
ff80: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
ff90: 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20  _NullCallback;. 
ffa0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ffb0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
ffc0: 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63  LITE_NullCallbac
ffd0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
ffe0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ..  if( sqliteSt
fff0: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 74 61  rICmp(zLeft, "ta
10000 62 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b  ble_info")==0 ){
10010 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
10020 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
10030 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
10040 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52  FindTable(db, zR
10050 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ight);.    if( p
10060 54 61 62 20 29 20 76 20 3d 20 73 71 6c 69 74 65  Tab ) v = sqlite
10070 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
10080 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26  .    if( pTab &&
10090 20 76 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74   v ){.      stat
100a0 69 63 20 56 64 62 65 4f 70 20 74 61 62 6c 65 49  ic VdbeOp tableI
100b0 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b  nfoPreface[] = {
100c0 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
100d0 6c 75 6d 6e 43 6f 75 6e 74 2c 20 35 2c 20 30 2c  lumnCount, 5, 0,
100e0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
100f0 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
10100 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  me,  0, 0,      
10110 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20 20 20   "cid"},.       
10120 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
10130 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  1, 0,       "
10140 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20 20  name"},.        
10150 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
10160 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22 74    2, 0,       "t
10170 79 70 65 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b  ype"},.        {
10180 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
10190 20 33 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 6f   3, 0,       "no
101a0 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20 20 20 20  tnull"},.       
101b0 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
101c0 2c 20 20 34 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  4, 0,       "
101d0 64 66 6c 74 5f 76 61 6c 75 65 22 7d 2c 0a 20 20  dflt_value"},.  
101e0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74      };.      int
101f0 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   i;.      sqlite
10200 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
10210 20 41 72 72 61 79 53 69 7a 65 28 74 61 62 6c 65   ArraySize(table
10220 49 6e 66 6f 50 72 65 66 61 63 65 29 2c 20 74 61  InfoPreface), ta
10230 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 3b  bleInfoPreface);
10240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 69 65  .      sqliteVie
10250 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
10260 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
10270 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
10280 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
10290 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
102a0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
102b0 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a  Integer, i, 0);.
102c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
102d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
102e0 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
102f0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
10300 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
10310 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
10320 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
10330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
10340 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
10350 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
10360 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
10370 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 0a  hangeP3(v, -1, .
10380 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
10390 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3f  >aCol[i].zType ?
103a0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
103b0 54 79 70 65 20 3a 20 22 74 65 78 74 22 2c 20 50  Type : "text", P
103c0 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
103d0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
103e0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
103f0 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  , pTab->aCol[i].
10400 6e 6f 74 4e 75 6c 6c 2c 20 30 29 3b 0a 20 20 20  notNull, 0);.   
10410 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
10420 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
10430 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
10440 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
10450 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
10460 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 2c  ->aCol[i].zDflt,
10470 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
10480 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
10490 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
104a0 61 63 6b 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20  ack, 5, 0);.    
104b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
104c0 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
104d0 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69  trICmp(zLeft, "i
104e0 6e 64 65 78 5f 69 6e 66 6f 22 29 3d 3d 30 20 29  ndex_info")==0 )
104f0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
10500 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  x;.    Table *pT
10510 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b  ab;.    Vdbe *v;
10520 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71 6c 69  .    pIdx = sqli
10530 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  teFindIndex(db, 
10540 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  zRight);.    if(
10550 20 70 49 64 78 20 29 20 76 20 3d 20 73 71 6c 69   pIdx ) v = sqli
10560 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
10570 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 20  );.    if( pIdx 
10580 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73 74  && v ){.      st
10590 61 74 69 63 20 56 64 62 65 4f 70 20 74 61 62 6c  atic VdbeOp tabl
105a0 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d  eInfoPreface[] =
105b0 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
105c0 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20  ColumnCount, 3, 
105d0 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  0,       0},.   
105e0 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
105f0 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
10600 20 20 20 22 73 65 71 6e 6f 22 7d 2c 0a 20 20 20     "seqno"},.   
10610 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
10620 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20  Name,  1, 0,    
10630 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20     "cid"},.     
10640 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
10650 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20  me,  2, 0,      
10660 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20   "name"},.      
10670 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  };.      int i;.
10680 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 64        pTab = pId
10690 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 20  x->pTable;.     
106a0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
106b0 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
106c0 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61  e(tableInfoPrefa
106d0 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72  ce), tableInfoPr
106e0 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20 66 6f  eface);.      fo
106f0 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
10700 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
10710 20 20 20 20 20 20 69 6e 74 20 63 6e 75 6d 20 3d        int cnum =
10720 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
10730 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  i];.        sqli
10740 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
10750 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29  P_Integer, i, 0)
10760 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10770 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10780 49 6e 74 65 67 65 72 2c 20 63 6e 75 6d 2c 20 30  Integer, cnum, 0
10790 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
107a0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
107b0 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
107c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
107d0 70 54 61 62 2d 3e 6e 43 6f 6c 3e 63 6e 75 6d 20  pTab->nCol>cnum 
107e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
107f0 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
10800 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   -1, pTab->aCol[
10810 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f  cnum].zName, P3_
10820 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
10830 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
10840 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
10850 20 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   3, 0);.      }.
10860 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
10870 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
10880 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65 78  mp(zLeft, "index
10890 5f 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20  _list")==0 ){.  
108a0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
108b0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
108c0 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
108d0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69   pTab = sqliteFi
108e0 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67  ndTable(db, zRig
108f0 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  ht);.    if( pTa
10900 62 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 73  b ){.      v = s
10910 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
10920 72 73 65 29 3b 0a 20 20 20 20 20 20 70 49 64 78  rse);.      pIdx
10930 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
10940 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10950 54 61 62 20 26 26 20 70 49 64 78 20 26 26 20 76  Tab && pIdx && v
10960 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 20   ){.      int i 
10970 3d 20 30 3b 20 0a 20 20 20 20 20 20 73 74 61 74  = 0; .      stat
10980 69 63 20 56 64 62 65 4f 70 20 69 6e 64 65 78 4c  ic VdbeOp indexL
10990 69 73 74 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b  istPreface[] = {
109a0 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
109b0 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20 30 2c  lumnCount, 3, 0,
109c0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
109d0 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
109e0 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  me,  0, 0,      
109f0 20 22 73 65 71 22 7d 2c 0a 20 20 20 20 20 20 20   "seq"},.       
10a00 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
10a10 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  1, 0,       "
10a20 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20 20 20  name"},.        
10a30 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
10a40 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22 75    2, 0,       "u
10a50 6e 69 71 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d  nique"},.      }
10a60 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ;..      sqliteV
10a70 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
10a80 41 72 72 61 79 53 69 7a 65 28 69 6e 64 65 78 4c  ArraySize(indexL
10a90 69 73 74 50 72 65 66 61 63 65 29 2c 20 69 6e 64  istPreface), ind
10aa0 65 78 4c 69 73 74 50 72 65 66 61 63 65 29 3b 0a  exListPreface);.
10ab0 20 20 20 20 20 20 77 68 69 6c 65 28 70 49 64 78        while(pIdx
10ac0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10ad0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
10ae0 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
10af0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
10b00 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
10b10 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
10b20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
10b30 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
10b40 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  pIdx->zName, P3_
10b50 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
10b60 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
10b70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10b80 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
10b90 45 5f 4e 6f 6e 65 2c 20 30 29 3b 0a 20 20 20 20  E_None, 0);.    
10ba0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10bb0 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
10bc0 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20 20  ck, 3, 0);.     
10bd0 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20 20 20     ++i;.        
10be0 70 49 64 78 20 3d 20 70 49 64 78 2d 3e 70 4e 65  pIdx = pIdx->pNe
10bf0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
10c00 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  }.  }else..#ifnd
10c10 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
10c20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
10c30 65 66 74 2c 20 22 70 61 72 73 65 72 5f 74 72 61  eft, "parser_tra
10c40 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65  ce")==0 ){.    e
10c50 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69 74  xtern void sqlit
10c60 65 50 61 72 73 65 72 54 72 61 63 65 28 46 49 4c  eParserTrace(FIL
10c70 45 2a 2c 20 63 68 61 72 20 2a 29 3b 0a 20 20 20  E*, char *);.   
10c80 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
10c90 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
10ca0 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61   sqliteParserTra
10cb0 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73  ce(stdout, "pars
10cc0 65 72 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73  er: ");.    }els
10cd0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 50  e{.      sqliteP
10ce0 61 72 73 65 72 54 72 61 63 65 28 30 2c 20 30 29  arserTrace(0, 0)
10cf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
10d00 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71  #endif..  if( sq
10d10 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
10d20 74 2c 20 22 69 6e 74 65 67 72 69 74 79 5f 63 68  t, "integrity_ch
10d30 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eck")==0 ){.    
10d40 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 63 68  static VdbeOp ch
10d50 65 63 6b 44 62 5b 5d 20 3d 20 7b 0a 20 20 20 20  eckDb[] = {.    
10d60 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65 72 74    { OP_SetInsert
10d70 2c 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  ,   0, 0,       
10d80 20 22 32 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f   "2"},.      { O
10d90 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 30  P_Open,        0
10da0 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
10db0 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e        { OP_Rewin
10dc0 64 2c 20 20 20 20 20 20 30 2c 20 36 2c 20 20 20  d,      0, 6,   
10dd0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
10de0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
10df0 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d   0, 3,        0}
10e00 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20  ,    /* 3 */.   
10e10 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65 72     { OP_SetInser
10e20 74 2c 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  t,   0, 0,      
10e30 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
10e40 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 20 30 2c  _Next,        0,
10e50 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   3,        0},. 
10e60 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 72       { OP_Integr
10e70 69 74 79 43 6b 2c 20 30 2c 20 30 2c 20 20 20 20  ityCk, 0, 0,    
10e80 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 36 20      0},    /* 6 
10e90 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
10ea0 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c  lumnCount, 1, 0,
10eb0 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
10ec0 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
10ed0 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
10ee0 20 22 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63   "integrity_chec
10ef0 6b 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  k"},.      { OP_
10f00 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20  Callback,    1, 
10f10 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
10f20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65      { OP_SetInse
10f30 72 74 2c 20 20 20 31 2c 20 30 2c 20 20 20 20 20  rt,   1, 0,     
10f40 20 20 20 22 32 22 7d 2c 0a 20 20 20 20 20 20 7b     "2"},.      {
10f50 20 4f 50 5f 4f 70 65 6e 41 75 78 2c 20 20 20 20   OP_OpenAux,    
10f60 20 31 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d   1, 2,        0}
10f70 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77  ,.      { OP_Rew
10f80 69 6e 64 2c 20 20 20 20 20 20 31 2c 20 31 36 2c  ind,      1, 16,
10f90 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
10fa0 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
10fb0 20 20 20 31 2c 20 33 2c 20 20 20 20 20 20 20 20     1, 3,        
10fc0 30 7d 2c 20 20 20 20 2f 2a 20 31 33 20 2a 2f 0a  0},    /* 13 */.
10fd0 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e        { OP_SetIn
10fe0 73 65 72 74 2c 20 20 20 31 2c 20 30 2c 20 20 20  sert,   1, 0,   
10ff0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
11000 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
11010 20 31 2c 20 31 33 2c 20 20 20 20 20 20 20 30 7d   1, 13,       0}
11020 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74  ,.      { OP_Int
11030 65 67 72 69 74 79 43 6b 2c 20 31 2c 20 31 2c 20  egrityCk, 1, 1, 
11040 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
11050 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f   16 */.      { O
11060 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31  P_Callback,    1
11070 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
11080 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20      };.    Vdbe 
11090 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64  *v = sqliteGetVd
110a0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
110b0 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
110c0 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  n;.    sqliteVdb
110d0 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
110e0 72 61 79 53 69 7a 65 28 63 68 65 63 6b 44 62 29  raySize(checkDb)
110f0 2c 20 63 68 65 63 6b 44 62 29 3b 0a 20 20 7d 65  , checkDb);.  }e
11100 6c 73 65 0a 0a 20 20 7b 7d 0a 20 20 73 71 6c 69  lse..  {}.  sqli
11110 74 65 46 72 65 65 28 7a 4c 65 66 74 29 3b 0a 20  teFree(zLeft);. 
11120 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52 69 67   sqliteFree(zRig
11130 68 74 29 3b 0a 7d 0a                             ht);.}.