/ Hex Artifact Content
Login

Artifact 2f81c837284840448f21c90ef7c9c6c6c0d4d8a0:


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 36 20 32 30  ild.c,v 1.106 20
0310: 30 32 2f 30 37 2f 31 38 20 30 30 3a 33 34 3a 31  02/07/18 00:34:1
0320: 31 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  1 drh Exp $.*/.#
0330: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0340: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0350: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0360: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0380: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0390: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
03a0: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 43  ** be parsed.  C
03b0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
03c0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
03d0: 65 20 64 61 74 61 62 61 73 65 20 6e 65 65 64 73  e database needs
03e0: 0a 2a 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66  .** to be read f
03f0: 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  rom the SQLITE_M
0400: 41 53 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45  ASTER and SQLITE
0410: 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62  _TEMP_MASTER tab
0420: 6c 65 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  les..** If it do
0430: 65 73 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74  es, then read it
0440: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0450: 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65  BeginParse(Parse
0460: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78   *pParse, int ex
0470: 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71  plainFlag){.  sq
0480: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
0490: 65 2d 3e 64 62 3b 0a 20 20 70 50 61 72 73 65 2d  e->db;.  pParse-
04a0: 3e 65 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61  >explain = expla
04b0: 69 6e 46 6c 61 67 3b 0a 20 20 69 66 28 28 64 62  inFlag;.  if((db
04c0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
04d0: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30  _Initialized)==0
04e0: 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   && pParse->init
04f0: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Flag==0 ){.    i
0500: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e  nt rc = sqliteIn
0510: 69 74 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e  it(db, &pParse->
0520: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
0530: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
0540: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
0550: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
0560: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
0570: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0580: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0590: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
05a0: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
05b0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
05c0: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 77 65  ** parsed and we
05d0: 20 77 61 6e 74 20 74 6f 20 65 78 65 63 75 74 65   want to execute
05e0: 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 74   the VDBE code t
05f0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20  o implement .** 
0600: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2e 20  that statement. 
0610: 20 50 72 69 6f 72 20 61 63 74 69 6f 6e 20 72 6f   Prior action ro
0620: 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61  utines should ha
0630: 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 63 6f  ve already.** co
0640: 6e 73 74 72 75 63 74 65 64 20 56 44 42 45 20 63  nstructed VDBE c
0650: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  ode to do the wo
0660: 72 6b 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  rk of the SQL st
0670: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73  atement..** This
0680: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61   routine just ha
0690: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
06a0: 20 56 44 42 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a   VDBE code..**.*
06b0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
06c0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
06d0: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
06e0: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
06f0: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0700: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0710: 69 64 20 73 71 6c 69 74 65 45 78 65 63 28 50 61  id sqliteExec(Pa
0720: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
0730: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
0740: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  OK;.  sqlite *db
0750: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0760: 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   if( sqlite_mall
0770: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
0780: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
0790: 2d 3e 70 56 64 62 65 20 26 26 20 70 50 61 72 73  ->pVdbe && pPars
07a0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
07b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
07c0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 72  plain ){.      r
07d0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4c 69  c = sqliteVdbeLi
07e0: 73 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  st(pParse->pVdbe
07f0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
0800: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
0810: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0830: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b  Parse->zErrMsg);
0840: 0a 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f  .      db->next_
0850: 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68  cookie = db->sch
0860: 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20  ema_cookie;.    
0870: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49 4c  }else{.      FIL
0880: 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e  E *trace = (db->
0890: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
08a0: 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73  dbeTrace)!=0 ? s
08b0: 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 20  tdout : 0;.     
08c0: 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63 65   sqliteVdbeTrace
08d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
08e0: 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72 63  trace);.      rc
08f0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78 65   = sqliteVdbeExe
0900: 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  c(pParse->pVdbe,
0910: 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61   pParse->xCallba
0920: 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72 67  ck, pParse->pArg
0930: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 50               &pP
0950: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  arse->zErrMsg, d
0960: 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20 20  b->pBusyArg,.   
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73 79         db->xBusy
0990: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  Callback);.     
09a0: 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73 65   if( rc ) pParse
09b0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nErr++;.    }.
09c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
09d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56 64  lete(pParse->pVd
09e0: 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  be);.    pParse-
09f0: 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20 20  >pVdbe = 0;.    
0a00: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
0a10: 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Set = 0;.    pPa
0a20: 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
0a30: 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61    pParse->schema
0a40: 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20 20  Verified = 0;.  
0a50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  }.}../*.** Locat
0a60: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0a70: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0a80: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0a90: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0aa0: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0ab0: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0ac0: 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  at table.  Retur
0ad0: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
0ae0: 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  und..*/.Table *s
0af0: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73  qliteFindTable(s
0b00: 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74  qlite *db, const
0b10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
0b20: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d   Table *p;.  p =
0b30: 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28   sqliteHashFind(
0b40: 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  &db->tblHash, zN
0b50: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
0b60: 65 29 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  e)+1);.  return 
0b70: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
0b80: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0b90: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0ba0: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0bb0: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
0bc0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
0bd0: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a  of that index..*
0be0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
0bf0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49   not found..*/.I
0c00: 6e 64 65 78 20 2a 73 71 6c 69 74 65 46 69 6e 64  ndex *sqliteFind
0c10: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
0c20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
0c30: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
0c40: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61  ;.  p = sqliteHa
0c50: 73 68 46 69 6e 64 28 26 64 62 2d 3e 69 64 78 48  shFind(&db->idxH
0c60: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
0c70: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
0c80: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0c90: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
0ca0: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
0cb0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
0cc0: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
0cd0: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
0ce0: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
0cf0: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
0d00: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
0d10: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
0d20: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
0d30: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
0d40: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
0d50: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
0d60: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
0d70: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
0d80: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
0d90: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
0da0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
0db0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
0dc0: 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20  lite *db, Index 
0dd0: 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f  *p){.  Index *pO
0de0: 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  ld;.  assert( db
0df0: 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21  !=0 && p->zName!
0e00: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
0e10: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
0e20: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 2d  &db->idxHash, p-
0e30: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
0e40: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
0e50: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26    if( pOld!=0 &&
0e60: 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20   pOld!=p ){.    
0e70: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
0e80: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70  (&db->idxHash, p
0e90: 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  Old->zName, strl
0ea0: 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b  en(pOld->zName)+
0eb0: 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20  1, pOld);.  }.  
0ec0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
0ed0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
0ee0: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
0ef0: 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74  rom its table, t
0f00: 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68  hen remove.** th
0f10: 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  e index from the
0f20: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
0f30: 65 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d  e and free its m
0f40: 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75  emory.** structu
0f50: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
0f60: 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  iteUnlinkAndDele
0f70: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  teIndex(sqlite *
0f80: 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  db, Index *pInde
0f90: 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  x){.  if( pIndex
0fa0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
0fb0: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
0fc0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
0fd0: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
0fe0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
0ff0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
1000: 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d     for(p=pIndex-
1010: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
1020: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d   p && p->pNext!=
1030: 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65  pIndex; p=p->pNe
1040: 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 20  xt){}.    if( p 
1050: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
1060: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  dex ){.      p->
1070: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
1080: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
1090: 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  .  sqliteDeleteI
10a0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
10b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
10c0: 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f   all schema info
10d0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
10e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
10f0: 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 64 61 74  tables of.** dat
1100: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1110: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1120: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63  is called to rec
1130: 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62  laim memory.** b
1140: 65 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65 63  efore the connec
1150: 74 69 6f 6e 20 63 6c 6f 73 65 73 2e 20 20 49 74  tion closes.  It
1160: 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20   is also called 
1170: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
1180: 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65  k.** if there we
1190: 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  re schema change
11a0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  s during the tra
11b0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nsaction..*/.voi
11c0: 64 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74  d sqliteResetInt
11d0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69  ernalSchema(sqli
11e0: 74 65 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  te *db){.  HashE
11f0: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
1200: 73 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68  sh temp1;.  Hash
1210: 20 74 65 6d 70 32 3b 0a 0a 20 20 74 65 6d 70 31   temp2;..  temp1
1220: 20 3d 20 64 62 2d 3e 74 62 6c 48 61 73 68 3b 0a   = db->tblHash;.
1230: 20 20 74 65 6d 70 32 20 3d 20 64 62 2d 3e 74 72    temp2 = db->tr
1240: 69 67 48 61 73 68 3b 0a 20 20 73 71 6c 69 74 65  igHash;.  sqlite
1250: 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 74 72  HashInit(&db->tr
1260: 69 67 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48  igHash, SQLITE_H
1270: 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a  ASH_STRING, 0);.
1280: 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61    sqliteHashClea
1290: 72 28 26 64 62 2d 3e 69 64 78 48 61 73 68 29 3b  r(&db->idxHash);
12a0: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
12b0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65  iteHashFirst(&te
12c0: 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  mp2); pElem; pEl
12d0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
12e0: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
12f0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
1300: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
1310: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71  a(pElem);.    sq
1320: 6c 69 74 65 44 65 6c 65 74 65 54 72 69 67 67 65  liteDeleteTrigge
1330: 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 7d  r(pTrigger);.  }
1340: 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65  .  sqliteHashCle
1350: 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 73 71  ar(&temp2);.  sq
1360: 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62  liteHashInit(&db
1370: 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54  ->tblHash, SQLIT
1380: 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30  E_HASH_STRING, 0
1390: 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  );.  for(pElem=s
13a0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
13b0: 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70  temp1); pElem; p
13c0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
13d0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
13e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
13f0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
1400: 6c 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  lem);.    sqlite
1410: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
1420: 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pTab);.  }.  sql
1430: 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 65  iteHashClear(&te
1440: 6d 70 31 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  mp1);.  db->flag
1450: 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 49 6e  s &= ~(SQLITE_In
1460: 69 74 69 61 6c 69 7a 65 64 7c 53 51 4c 49 54 45  itialized|SQLITE
1470: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
1480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1490: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
14a0: 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
14b0: 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66  back occurs.  If
14c0: 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73   there were.** s
14d0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
14e0: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
14f0: 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61  tion, then we ha
1500: 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a  ve to reset the.
1510: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  ** internal hash
1520: 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f   tables and relo
1530: 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73  ad them from dis
1540: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
1550: 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61  eRollbackInterna
1560: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
1570: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e  *db){.  if( db->
1580: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
1590: 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a  nternChanges ){.
15a0: 20 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 49      sqliteResetI
15b0: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
15c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15e0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f  called when a co
15f0: 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  mmit occurs..*/.
1600: 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69  void sqliteCommi
1610: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
1620: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
1630: 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  db->schema_cooki
1640: 65 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f  e = db->next_coo
1650: 6b 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  kie;.  db->flags
1660: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
1670: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
1680: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d  .** Remove the m
1690: 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63  emory data struc
16a0: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
16b0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a   with the given.
16c0: 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68  ** Table.  No ch
16d0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
16e0: 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72  o disk by this r
16f0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
1700: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
1710: 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61  deletes the data
1720: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
1730: 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a  does not unlink.
1740: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74  ** the table dat
1750: 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  a structure from
1760: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
1770: 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65    But it does de
1780: 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20  stroy.** memory 
1790: 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68  structures of th
17a0: 65 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  e indices associ
17b0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
17c0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63  ble..**.** Indic
17d0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
17e0: 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  th the table are
17f0: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
1800: 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20  he "db".** data 
1810: 73 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21  structure if db!
1820: 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e  =NULL.  If db==N
1830: 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74  ULL, indices att
1840: 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  ached to.** the 
1850: 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65  table are delete
1860: 64 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73  d, but it is ass
1870: 75 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61  umed they have a
1880: 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75  lready been.** u
1890: 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64  nlinked..*/.void
18a0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
18b0: 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54  le(sqlite *db, T
18c0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
18d0: 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20   int i;.  Index 
18e0: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
18f0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
1900: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1910: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
1920: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1930: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
1940: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  e->aCol[i].zName
1950: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
1960: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
1970: 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71  ].zDflt);.    sq
1980: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
1990: 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b  >aCol[i].zType);
19a0: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 49 6e 64 65  .  }.  for(pInde
19b0: 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  x = pTable->pInd
19c0: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
19d0: 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ex=pNext){.    p
19e0: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
19f0: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
1a00: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
1a10: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
1a20: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
1a30: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
1a40: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
1a50: 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 53 65  Col);.  sqliteSe
1a60: 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c  lectDelete(pTabl
1a70: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  e->pSelect);.  s
1a80: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
1a90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
1aa0: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
1ab0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
1ac0: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
1ad0: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
1ae0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
1af0: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
1b00: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
1b10: 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41  id sqliteUnlinkA
1b20: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  ndDeleteTable(sq
1b30: 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20  lite *db, Table 
1b40: 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f  *p){.  Table *pO
1b50: 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  ld;.  assert( db
1b60: 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  !=0 );.  pOld = 
1b70: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
1b80: 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70  (&db->tblHash, p
1b90: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
1ba0: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b  p->zName)+1, 0);
1bb0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d  .  assert( pOld=
1bc0: 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b  =0 || pOld==p );
1bd0: 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54  .  sqliteDeleteT
1be0: 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  able(db, p);.}..
1bf0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
1c00: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 75 73  the name of a us
1c10: 65 72 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  er table or inde
1c20: 78 20 66 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a  x from a token..
1c30: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
1c40: 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 69 73 20  old the name is 
1c50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1c60: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
1c70: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72 65 65   must.** be free
1c80: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
1c90: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68   function..*/.ch
1ca0: 61 72 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e  ar *sqliteTableN
1cb0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b  ameFromToken(Tok
1cc0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
1cd0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
1ce0: 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d  teStrNDup(pName-
1cf0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
1d00: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a   sqliteDequote(z
1d10: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1d20: 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zName;.}../*.** 
1d30: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1d40: 20 6f 70 65 6e 20 74 68 65 20 61 70 70 72 6f 70   open the approp
1d50: 72 69 61 74 65 20 6d 61 73 74 65 72 20 74 61 62  riate master tab
1d60: 6c 65 2e 20 20 54 68 65 20 74 61 62 6c 65 0a 2a  le.  The table.*
1d70: 2a 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  * opened will be
1d80: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 66   SQLITE_MASTER f
1d90: 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 74 61  or persistent ta
1da0: 62 6c 65 73 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  bles and .** SQL
1db0: 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20  ITE_TEMP_MASTER 
1dc0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61  for temporary ta
1dd0: 62 6c 65 73 2e 20 20 54 68 65 20 74 61 62 6c 65  bles.  The table
1de0: 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
1df0: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
1e00: 69 64 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73  id sqliteOpenMas
1e10: 74 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76  terTable(Vdbe *v
1e20: 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20  , int isTemp){. 
1e30: 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
1e40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1e50: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 41  Op(v, OP_OpenWrA
1e60: 75 78 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 73  ux, 0, 2);.    s
1e70: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
1e80: 33 28 76 2c 20 2d 31 2c 20 54 45 4d 50 5f 4d 41  3(v, -1, TEMP_MA
1e90: 53 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54  STER_NAME, P3_ST
1ea0: 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ATIC);.  }else{.
1eb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
1ec0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
1ed0: 69 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20  ite, 0, 2);.    
1ee0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
1ef0: 50 33 28 76 2c 20 2d 31 2c 20 4d 41 53 54 45 52  P3(v, -1, MASTER
1f00: 5f 4e 41 4d 45 2c 20 50 33 5f 53 54 41 54 49 43  _NAME, P3_STATIC
1f10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1f20: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
1f30: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
1f40: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
1f50: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
1f60: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
1f70: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
1f80: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
1f90: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
1fa0: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
1fb0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1fc0: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
1fd0: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
1fe0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
1ff0: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
2000: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
2010: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
2020: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
2030: 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65  e.** pStart toke
2040: 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20  n is the CREATE 
2050: 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65  and pName is the
2060: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
2070: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
2080: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
2090: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
20a0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
20b0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
20c0: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
20d0: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
20e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
20f0: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
2100: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
2110: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
2120: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
2130: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
2140: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
2150: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
2160: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
2170: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
2180: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
2190: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
21a0: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
21b0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
21c0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
21d0: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
21e0: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
21f0: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
2200: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
2210: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
2220: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
2230: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2240: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
2250: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
2260: 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20 72 6f  iteEndTable() ro
2270: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
2280: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
2290: 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  he construction 
22a0: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
22b0: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64   record..*/.void
22c0: 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c   sqliteStartTabl
22d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
22e0: 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
22f0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e  Token *pName, in
2300: 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 54 61 62  t isTemp){.  Tab
2310: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e  le *pTable;.  In
2320: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61  dex *pIdx;.  cha
2330: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69  r *zName;.  sqli
2340: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
2350: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
2360: 0a 20 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73  .  pParse->sFirs
2370: 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74  tToken = *pStart
2380: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
2390: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
23a0: 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69  oken(pName);.  i
23b0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
23c0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f  turn;..  /* Befo
23d0: 72 65 20 74 72 79 69 6e 67 20 74 6f 20 63 72 65  re trying to cre
23e0: 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
23f0: 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65  table, make sure
2400: 20 74 68 65 20 42 74 72 65 65 20 66 6f 72 0a 20   the Btree for. 
2410: 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70   ** holding temp
2420: 6f 72 61 72 79 20 74 61 62 6c 65 73 20 69 73 20  orary tables is 
2430: 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  open..  */.  if(
2440: 20 69 73 54 65 6d 70 20 26 26 20 64 62 2d 3e 70   isTemp && db->p
2450: 42 65 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20  BeTemp==0 ){.   
2460: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2470: 42 74 72 65 65 4f 70 65 6e 28 30 2c 20 30 2c 20  BtreeOpen(0, 0, 
2480: 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e  MAX_PAGES, &db->
2490: 70 42 65 54 65 6d 70 29 3b 0a 20 20 20 20 69 66  pBeTemp);.    if
24a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
24c0: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
24d0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62  ->zErrMsg, "unab
24e0: 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
24f0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
2500: 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
2510: 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
2520: 6f 72 61 72 79 20 74 61 62 6c 65 73 22 2c 20 30  orary tables", 0
2530: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
2540: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
2550: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
2560: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
2570: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20   SQLITE_InTrans 
2580: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2590: 6c 69 74 65 42 74 72 65 65 42 65 67 69 6e 54 72  liteBtreeBeginTr
25a0: 61 6e 73 28 64 62 2d 3e 70 42 65 54 65 6d 70 29  ans(db->pBeTemp)
25b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
25c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25d0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
25e0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
25f0: 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20  ErrMsg, "unable 
2600: 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c  to get a write l
2610: 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20  ock on ".       
2620: 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72     "the temporar
2630: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22  y database file"
2640: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
2650: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
2660: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2670: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2680: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
2690: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
26a0: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
26b0: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
26c0: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
26d0: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  or table name.  
26e0: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
26f0: 65 73 73 61 67 65 20 69 66 20 69 74 20 64 6f 65  essage if it doe
2700: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  s..  **.  ** If 
2710: 77 65 20 61 72 65 20 72 65 2d 72 65 61 64 69 6e  we are re-readin
2720: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
2730: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
2740: 65 20 6f 66 20 61 20 73 63 68 65 6d 61 0a 20 20  e of a schema.  
2750: 2a 2a 20 63 68 61 6e 67 65 20 61 6e 64 20 61 20  ** change and a 
2760: 6e 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61  new permanent ta
2770: 62 6c 65 20 69 73 20 66 6f 75 6e 64 20 77 68 6f  ble is found who
2780: 73 65 20 6e 61 6d 65 20 63 6f 6c 6c 69 64 65 73  se name collides
2790: 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 78   with.  ** an ex
27a0: 69 73 74 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  isting temporary
27b0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 69 67 6e   table, then ign
27c0: 6f 72 65 20 74 68 65 20 6e 65 77 20 70 65 72 6d  ore the new perm
27d0: 61 6e 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a  anent table..  *
27e0: 2a 20 57 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  * We will contin
27f0: 75 65 20 70 61 72 73 69 6e 67 2c 20 62 75 74 20  ue parsing, but 
2800: 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65  the pParse->name
2810: 43 6c 61 73 68 20 66 6c 61 67 20 77 69 6c 6c 20  Clash flag will 
2820: 62 65 20 73 65 74 0a 20 20 2a 2a 20 73 6f 20 77  be set.  ** so w
2830: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f 20 64  e will know to d
2840: 69 73 63 61 72 64 20 74 68 65 20 74 61 62 6c 65  iscard the table
2850: 20 72 65 63 6f 72 64 20 6f 6e 63 65 20 70 61 72   record once par
2860: 73 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65  sing has finishe
2870: 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65  d..  */.  pTable
2880: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
2890: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  le(db, zName);. 
28a0: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29   if( pTable!=0 )
28b0: 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  {.    if( pTable
28c0: 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50 61 72  ->isTemp && pPar
28d0: 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a  se->initFlag ){.
28e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 61        pParse->na
28f0: 6d 65 43 6c 61 73 68 20 3d 20 31 3b 0a 20 20 20  meClash = 1;.   
2900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2910: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
2920: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
2930: 20 22 74 61 62 6c 65 20 22 2c 20 30 2c 20 70 4e   "table ", 0, pN
2940: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
2950: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 61 6c  ,.          " al
2960: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 30  ready exists", 0
2970: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
2980: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
2990: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
29a0: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
29b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  n;.    }.  }else
29c0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 61  {.    pParse->na
29d0: 6d 65 43 6c 61 73 68 20 3d 20 30 3b 0a 20 20 7d  meClash = 0;.  }
29e0: 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73  .  if( (pIdx = s
29f0: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
2a00: 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 26 26  b, zName))!=0 &&
2a10: 0a 20 20 20 20 20 20 20 20 20 20 28 21 70 49 64  .          (!pId
2a20: 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  x->pTable->isTem
2a30: 70 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69 6e  p || !pParse->in
2a40: 69 74 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 73  itFlag) ){.    s
2a50: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
2a60: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
2a70: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
2a80: 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65  dy an index name
2a90: 64 20 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e 61  d ", .       zNa
2aa0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
2ab0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
2ac0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
2ad0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
2ae0: 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71   }.  pTable = sq
2af0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
2b00: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
2b10: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
2b20: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
2b30: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
2b40: 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  n;.  }.  pTable-
2b50: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
2b60: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
2b70: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43   0;.  pTable->aC
2b80: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
2b90: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
2ba0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
2bb0: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 73   0;.  pTable->is
2bc0: 54 65 6d 70 20 3d 20 69 73 54 65 6d 70 3b 0a 20  Temp = isTemp;. 
2bd0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
2be0: 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 44  wTable ) sqliteD
2bf0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
2c00: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
2c10: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  );.  pParse->pNe
2c20: 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  wTable = pTable;
2c30: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
2c40: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
2c50: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
2c60: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
2c70: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
2c80: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
2c90: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
2ca0: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
2cb0: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
2cc0: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
2cd0: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
2ce0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
2cf0: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
2d00: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
2d10: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
2d20: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
2d30: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
2d40: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
2d50: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
2d60: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
2d70: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
2d80: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
2d90: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
2da0: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
2db0: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
2dc0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
2dd0: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
2de0: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
2df0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
2e00: 69 6e 69 74 46 6c 61 67 20 26 26 20 28 76 20 3d  initFlag && (v =
2e10: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
2e20: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
2e30: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
2e40: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
2e50: 73 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  se, 0);.    if( 
2e60: 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  !isTemp ){.     
2e70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2e80: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2e90: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c  db->file_format,
2ea0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2eb0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2ec0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 31  _SetCookie, 0, 1
2ed0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2ee0: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
2ef0: 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20  le(v, isTemp);. 
2f00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
2f10: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
2f20: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  o, 0, 0);.    sq
2f30: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2f40: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
2f50: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2f60: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
2f70: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
2f80: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2f90: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
2fa0: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
2fb0: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
2fc0: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
2fd0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
2fe0: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
2ff0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
3000: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
3010: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
3020: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
3030: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
3040: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
3050: 2e 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  .  sqliteStartTa
3060: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
3070: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
3080: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
3090: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
30a0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
30b0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
30c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41  .*/.void sqliteA
30d0: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
30e0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
30f0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
3100: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
3110: 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c  ar *z = 0;.  Col
3120: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
3130: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
3140: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
3150: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 53 65  turn;.  sqliteSe
3160: 74 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61  tNString(&z, pNa
3170: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c  me->z, pName->n,
3180: 20 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20   0);.  if( z==0 
3190: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
31a0: 74 65 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  teDequote(z);.  
31b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
31c0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
31d0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
31e0: 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  z, p->aCol[i].zN
31f0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
3200: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
3210: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
3220: 67 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f  g, "duplicate co
3230: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c  lumn name: ", z,
3240: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
3250: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3260: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
3270: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
3280: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
3290: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30  ->nCol & 0x7)==0
32a0: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a   ){.    Column *
32b0: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
32c0: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20   sqliteRealloc( 
32d0: 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f  p->aCol, (p->nCo
32e0: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
32f0: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
3300: 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( aNew==0 ) retu
3310: 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20  rn;.    p->aCol 
3320: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
3330: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
3340: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
3350: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
3360: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
3370: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
3380: 3b 0a 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72  ;.  pCol->sortOr
3390: 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  der = SQLITE_SO_
33a0: 4e 55 4d 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  NUM;.  p->nCol++
33b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
33c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
33d0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
33e0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
33f0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
3400: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
3410: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
3420: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
3430: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
3440: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
3450: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
3460: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
3470: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
3480: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
3490: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
34a0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
34b0: 6c 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  liteAddNotNull(P
34c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
34d0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
34e0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
34f0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
3500: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
3510: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
3520: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
3530: 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f  f( i>=0 ) p->aCo
3540: 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f  l[i].notNull = o
3550: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
3560: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3570: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
3580: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
3590: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
35a0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
35b0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
35c0: 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f  .  The pFirst to
35d0: 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74  ken is the first
35e0: 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  .** token in the
35f0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b   sequence of tok
3600: 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ens that describ
3610: 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68  e the type of th
3620: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72  e.** column curr
3630: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
3640: 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73  truction.   pLas
3650: 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f  t is the last to
3660: 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65  ken.** in the se
3670: 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69  quence.  Use thi
3680: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  s information to
3690: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72   construct a str
36a0: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74  ing.** that cont
36b0: 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d  ains the typenam
36c0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
36d0: 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73  and store that s
36e0: 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70  tring.** in zTyp
36f0: 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  e..*/ .void sqli
3700: 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  teAddColumnType(
3710: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
3720: 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f  oken *pFirst, To
3730: 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54  ken *pLast){.  T
3740: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
3750: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  , j;.  int n;.  
3760: 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20  char *z, **pz;. 
3770: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
3780: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
3790: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
37a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
37b0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
37c0: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
37d0: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
37e0: 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f  [i];.  pz = &pCo
37f0: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20  l->zType;.  n = 
3800: 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28  pLast->n + Addr(
3810: 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72  pLast->z) - Addr
3820: 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73  (pFirst->z);.  s
3830: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
3840: 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e  pz, pFirst->z, n
3850: 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b  , 0);.  z = *pz;
3860: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
3870: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  turn;.  for(i=j=
3880: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
3890: 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b     int c = z[i];
38a0: 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65  .    if( isspace
38b0: 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (c) ) continue;.
38c0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
38d0: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
38e0: 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65    pCol->sortOrde
38f0: 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  r = SQLITE_SO_NU
3900: 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  M;.  for(i=0; z[
3910: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77  i]; i++){.    sw
3920: 69 74 63 68 28 20 7a 5b 69 5d 20 29 7b 0a 20 20  itch( z[i] ){.  
3930: 20 20 20 20 63 61 73 65 20 27 62 27 3a 0a 20 20      case 'b':.  
3940: 20 20 20 20 63 61 73 65 20 27 42 27 3a 20 7b 0a      case 'B': {.
3950: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
3960: 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 5b 69 5d  teStrNICmp(&z[i]
3970: 2c 22 62 6c 6f 62 22 2c 34 29 3d 3d 30 20 29 7b  ,"blob",4)==0 ){
3980: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
3990: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c  >sortOrder = SQL
39a0: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20  ITE_SO_TEXT;.   
39b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
39c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
39d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
39e0: 20 20 20 20 20 20 63 61 73 65 20 27 63 27 3a 0a        case 'c':.
39f0: 20 20 20 20 20 20 63 61 73 65 20 27 43 27 3a 20        case 'C': 
3a00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
3a10: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 5b  liteStrNICmp(&z[
3a20: 69 5d 2c 22 63 68 61 72 22 2c 34 29 3d 3d 30 20  i],"char",4)==0 
3a30: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
3a40: 20 20 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d     sqliteStrNICm
3a50: 70 28 26 7a 5b 69 5d 2c 22 63 6c 6f 62 22 2c 34  p(&z[i],"clob",4
3a60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3a70: 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65    pCol->sortOrde
3a80: 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45  r = SQLITE_SO_TE
3a90: 58 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  XT;.          re
3aa0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
3ab0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
3ad0: 65 20 27 78 27 3a 0a 20 20 20 20 20 20 63 61 73  e 'x':.      cas
3ae0: 65 20 27 58 27 3a 20 7b 0a 20 20 20 20 20 20 20  e 'X': {.       
3af0: 20 69 66 28 20 69 3e 3d 32 20 26 26 20 73 71 6c   if( i>=2 && sql
3b00: 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 5b 69  iteStrNICmp(&z[i
3b10: 2d 32 5d 2c 22 74 65 78 74 22 2c 34 29 3d 3d 30  -2],"text",4)==0
3b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
3b30: 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  ol->sortOrder = 
3b40: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
3b50: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3b60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3b70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3b80: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
3b90: 3a 20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61  : {.        brea
3ba0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3bb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3bc0: 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73  e given token is
3bd0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
3be0: 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20  ue for the last 
3bf0: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a  column added to.
3c00: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ** the table cur
3c10: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
3c20: 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22  struction.  If "
3c30: 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72  minusFlag" is tr
3c40: 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ue, it.** means 
3c50: 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20  the value token 
3c60: 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20  was preceded by 
3c70: 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a  a minus sign..**
3c80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3c90: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
3ca0: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
3cb0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
3cc0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
3cd0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
3ce0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
3cf0: 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c  iteAddDefaultVal
3d00: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
3d10: 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69  , Token *pVal, i
3d20: 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20  nt minusFlag){. 
3d30: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
3d40: 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b   i;.  char **pz;
3d50: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
3d60: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
3d70: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
3d80: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
3d90: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
3da0: 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c  .  pz = &p->aCol
3db0: 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28  [i].zDflt;.  if(
3dc0: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
3dd0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
3de0: 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70  ng(pz, "-", 1, p
3df0: 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c  Val->z, pVal->n,
3e00: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
3e10: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
3e20: 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20  ng(pz, pVal->z, 
3e30: 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d  pVal->n, 0);.  }
3e40: 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
3e50: 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (*pz);.}../*.** 
3e60: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
3e70: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
3e80: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
3e90: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
3ea0: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
3eb0: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
3ec0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
3ed0: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
3ee0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
3ef0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
3f00: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
3f10: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
3f20: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
3f30: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
3f40: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
3f50: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
3f60: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
3f70: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
3f80: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
3f90: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
3fa0: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
3fb0: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
3fc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
3fd0: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
3fe0: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
3ff0: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
4000: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
4010: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
4020: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
4030: 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e  n as the row id.
4040: 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a    (Exception:.**
4050: 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   For backwards c
4060: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
4070: 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65  h older database
4080: 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  s, do not do thi
4090: 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65  s.** if the file
40a0: 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20   format version 
40b0: 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
40c0: 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65  han 1.)  Set the
40d0: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
40e0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
40f0: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
4100: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
4110: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
4120: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4130: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
4140: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
4150: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
4160: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
4170: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
4180: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
4190: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
41a0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
41b0: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
41c0: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
41d0: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
41e0: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
41f0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
4200: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
4210: 71 6c 69 74 65 41 64 64 50 72 69 6d 61 72 79 4b  qliteAddPrimaryK
4220: 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
4230: 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  , IdList *pList,
4240: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
4250: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
4260: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
4270: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
4280: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
4290: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54 61 62  = -1;.  if( pTab
42a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
42b0: 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69  if( pTab->hasPri
42c0: 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  mKey ){.    sqli
42d0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
42e0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
42f0: 61 62 6c 65 20 5c 22 22 2c 20 70 54 61 62 2d 3e  able \"", pTab->
4300: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
4310: 22 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  "\" has more tha
4320: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
4330: 79 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  y", 0);.    pPar
4340: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
4350: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
4360: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d  ab->hasPrimKey =
4370: 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   1;.  if( pList=
4380: 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  =0 ){.    iCol =
4390: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b   pTab->nCol - 1;
43a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69  .  }else if( pLi
43b0: 73 74 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a 20 20  st->nId==1 ){.  
43c0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
43d0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
43e0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Col++){.      if
43f0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
4400: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pList->a[0].zNam
4410: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
4420: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  ol].zName)==0 ) 
4430: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4440: 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26  .  if( iCol>=0 &
4450: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
4460: 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  l ){.    zType =
4470: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
4480: 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69  ].zType;.  }.  i
4490: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
44a0: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 31 20 26 26  ile_format>=1 &&
44b0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7a 54 79   .           zTy
44c0: 70 65 20 26 26 20 73 71 6c 69 74 65 53 74 72 49  pe && sqliteStrI
44d0: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
44e0: 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  GER")==0 ){.    
44f0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
4500: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
4510: 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b  yConf = onError;
4520: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
4530: 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28  liteCreateIndex(
4540: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 70 4c  pParse, 0, 0, pL
4550: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
4560: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
4570: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
4580: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
4590: 6e 67 20 74 79 70 65 20 67 69 76 65 6e 20 74 68  ng type given th
45a0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  e collation type
45b0: 20 74 6f 6b 65 6e 2e 0a 2a 2a 20 52 65 70 6f 72   token..** Repor
45c0: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  t an error if th
45d0: 65 20 74 79 70 65 20 69 73 20 75 6e 64 65 66 69  e type is undefi
45e0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
45f0: 74 65 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61  teCollateType(Pa
4600: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
4610: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 69 66  en *pType){.  if
4620: 28 20 70 54 79 70 65 3d 3d 30 20 29 20 72 65 74  ( pType==0 ) ret
4630: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e  urn SQLITE_SO_UN
4640: 4b 3b 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e  K;.  if( pType->
4650: 6e 3d 3d 34 20 26 26 20 73 71 6c 69 74 65 53 74  n==4 && sqliteSt
4660: 72 4e 49 43 6d 70 28 70 54 79 70 65 2d 3e 7a 2c  rNICmp(pType->z,
4670: 20 22 74 65 78 74 22 2c 20 34 29 3d 3d 30 20 29   "text", 4)==0 )
4680: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
4690: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 7d  ITE_SO_TEXT;.  }
46a0: 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d  .  if( pType->n=
46b0: 3d 37 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e  =7 && sqliteStrN
46c0: 49 43 6d 70 28 70 54 79 70 65 2d 3e 7a 2c 20 22  ICmp(pType->z, "
46d0: 6e 75 6d 65 72 69 63 22 2c 20 37 29 3d 3d 30 20  numeric", 7)==0 
46e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
46f0: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 7d  LITE_SO_NUM;.  }
4700: 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72  .  sqliteSetNStr
4710: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
4720: 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e 20 63  rMsg, "unknown c
4730: 6f 6c 6c 61 74 69 6e 67 20 74 79 70 65 3a 20 22  ollating type: "
4740: 2c 20 2d 31 2c 0a 20 20 20 20 70 54 79 70 65 2d  , -1,.    pType-
4750: 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 2c 20 30 29  >z, pType->n, 0)
4760: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  ;.  pParse->nErr
4770: 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ++;.  return SQL
4780: 49 54 45 5f 53 4f 5f 55 4e 4b 3b 0a 7d 0a 0a 2f  ITE_SO_UNK;.}../
4790: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
47a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
47b0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
47c0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
47d0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
47e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
47f0: 6d 65 6e 74 2e 20 20 41 20 22 43 4f 4c 4c 41 54  ment.  A "COLLAT
4800: 45 22 20 63 6c 61 75 73 65 20 68 61 73 0a 2a 2a  E" clause has.**
4810: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
4820: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
4830: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 43  utine sets the C
4840: 6f 6c 75 6d 6e 2e 73 6f 72 74 4f 72 64 65 72 20  olumn.sortOrder 
4850: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
4860: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
4870: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
4880: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64  /.void sqliteAdd
4890: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
48a0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 63  e *pParse, int c
48b0: 6f 6c 6c 54 79 70 65 29 7b 0a 20 20 54 61 62 6c  ollType){.  Tabl
48c0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
48d0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
48e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
48f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
4900: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
4910: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
4920: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 63  i].sortOrder = c
4930: 6f 6c 6c 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ollType;.}../*.*
4940: 2a 20 43 6f 6d 65 20 75 70 20 77 69 74 68 20 61  * Come up with a
4950: 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75   new random valu
4960: 65 20 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61  e for the schema
4970: 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73   cookie.  Make s
4980: 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76  ure.** the new v
4990: 61 6c 75 65 20 69 73 20 64 69 66 66 65 72 65 6e  alue is differen
49a0: 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a  t from the old..
49b0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
49c0: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
49d0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
49e0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
49f0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
4a00: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
4a10: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
4a20: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
4a30: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
4a40: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
4a50: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
4a60: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
4a70: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
4a80: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
4a90: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
4aa0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
4ab0: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
4ac0: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
4ad0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
4ae0: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
4af0: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
4b00: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
4b10: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
4b20: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
4b30: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
4b40: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
4b50: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
4b60: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
4b70: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
4b80: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
4b90: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
4ba0: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
4bb0: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
4bc0: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
4bd0: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
4be0: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
4bf0: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
4c00: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
4c10: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
4c20: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
4c30: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
4c40: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
4c50: 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71  eChangeCookie(sq
4c60: 6c 69 74 65 20 2a 64 62 2c 20 56 64 62 65 20 2a  lite *db, Vdbe *
4c70: 76 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65  v){.  if( db->ne
4c80: 78 74 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 73  xt_cookie==db->s
4c90: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a  chema_cookie ){.
4ca0: 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f      db->next_coo
4cb0: 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d 61  kie = db->schema
4cc0: 5f 63 6f 6f 6b 69 65 20 2b 20 73 71 6c 69 74 65  _cookie + sqlite
4cd0: 52 61 6e 64 6f 6d 42 79 74 65 28 29 20 2b 20 31  RandomByte() + 1
4ce0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
4cf0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
4d00: 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 73 71 6c  Changes;.    sql
4d10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4d20: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
4d30: 6e 65 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b  next_cookie, 0);
4d40: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4d50: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
4d60: 6f 6b 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  okie, 0, 0);.  }
4d70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
4d80: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
4d90: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
4da0: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
4db0: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
4dc0: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
4dd0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
4de0: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
4df0: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
4e00: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
4e10: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
4e20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
4e30: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
4e40: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
4e50: 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f  n;.  int needQuo
4e60: 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d  te = 0;.  for(n=
4e70: 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29  0; *z; n++, z++)
4e80: 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c  {.    if( *z=='\
4e90: 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51  '' ){ n++; needQ
4ea0: 75 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20  uote=1; }.  }.  
4eb0: 72 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51  return n + needQ
4ec0: 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uote*2;.}../*.**
4ed0: 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69   Write an identi
4ee0: 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e  fier onto the en
4ef0: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73  d of the given s
4f00: 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71  tring.  Add.** q
4f10: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
4f20: 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  as needed..*/.st
4f30: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
4f40: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
4f50: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64  *pIdx, char *zId
4f60: 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  ent){.  int i, j
4f70: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
4f80: 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28   = *pIdx;.  for(
4f90: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
4fa0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  j++){.    if( !i
4fb0: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
4fc0: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
4fd0: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
4fe0: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20  .  needQuote =  
4ff0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20  zIdent[j]!=0 || 
5000: 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  isdigit(zIdent[0
5010: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]).             
5020: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 4b 65       || sqliteKe
5030: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
5040: 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69  , j)!=TK_ID;.  i
5050: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
5060: 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [i++] = '\'';.  
5070: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
5080: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
5090: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
50a0: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
50b0: 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b  [j]=='\'' ) z[i+
50c0: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20  +] = '\'';.  }. 
50d0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
50e0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[i++] = '\'';.
50f0: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
5100: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
5110: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
5120: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5130: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
5140: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
5150: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
5160: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
5170: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
5180: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
5190: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
51a0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
51b0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
51c0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
51d0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
51e0: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
51f0: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
5200: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
5210: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
5220: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
5230: 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  zEnd;.  n = 0;. 
5240: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5250: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  Col; i++){.    n
5260: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
5270: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
5280: 29 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64  );.  }.  n += id
5290: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
52a0: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20  me);.  if( n<40 
52b0: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
52c0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
52d0: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
52e0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
52f0: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
5300: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
5310: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
5320: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
5330: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
5340: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
5350: 65 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20  eMalloc( n );.  
5360: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72  if( zStmt==0 ) r
5370: 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70  eturn 0;.  strcp
5380: 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 73 54 65  y(zStmt, p->isTe
5390: 6d 70 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d  mp ? "CREATE TEM
53a0: 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43 52 45  P TABLE " : "CRE
53b0: 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20  ATE TABLE ");.  
53c0: 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74  k = strlen(zStmt
53d0: 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53  );.  identPut(zS
53e0: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d  tmt, &k, p->zNam
53f0: 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d  e);.  zStmt[k++]
5400: 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d   = '(';.  for(i=
5410: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
5420: 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26  +){.    strcpy(&
5430: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
5440: 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e  .    k += strlen
5450: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
5460: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
5470: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
5480: 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69  t, &k, p->aCol[i
5490: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
54a0: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
54b0: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
54c0: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
54d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
54e0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f  s called to repo
54f0: 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22  rt the final ")"
5500: 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
5510: 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42  .** a CREATE TAB
5520: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
5530: 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74  .** The table st
5540: 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68  ructure that oth
5550: 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  er action routin
5560: 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69  es have been bui
5570: 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65  lding.** is adde
5580: 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
5590: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61  l hash tables, a
55a0: 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
55b0: 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72  s have.** occurr
55c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74  ed..**.** An ent
55d0: 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ry for the table
55e0: 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20   is made in the 
55f0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20  master table on 
5600: 64 69 73 6b 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20  disk,.** unless 
5610: 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
5620: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 69 6e 69  ary table or ini
5630: 74 46 6c 61 67 3d 3d 31 2e 20 20 57 68 65 6e 20  tFlag==1.  When 
5640: 69 6e 69 74 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20  initFlag==1,.** 
5650: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
5660: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
5670: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
5680: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
5690: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
56a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
56b0: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
56c0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
56d0: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
56e0: 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68 65 20  changes, so the 
56f0: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
5700: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
5710: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
5720: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
5730: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
5740: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
5750: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
5760: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
5770: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
5780: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
5790: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
57a0: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
57b0: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
57c0: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
57d0: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
57e0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
57f0: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
5800: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
5810: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
5820: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
5830: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
5840: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
5850: 76 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 54 61  void sqliteEndTa
5860: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
5870: 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  e, Token *pEnd, 
5880: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
5890: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
58a0: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
58b0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
58c0: 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c  (pEnd==0 && pSel
58d0: 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73  ect==0) || pPars
58e0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
58f0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
5900: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
5910: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5920: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
5930: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 41 64  return;..  /* Ad
5940: 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
5950: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
5960: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
5970: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
5980: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
5990: 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d 30  se->nameClash==0
59a0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   || pParse->init
59b0: 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Flag==1 );.  if(
59c0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
59d0: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ==0 && pParse->n
59e0: 61 6d 65 43 6c 61 73 68 3d 3d 30 20 29 7b 0a 20  ameClash==0 ){. 
59f0: 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
5a00: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
5a10: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
5a20: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
5a30: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e  me, strlen(p->zN
5a40: 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20  ame)+1, p);.    
5a50: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
5a60: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
5a70: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
5a80: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
5a90: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
5aa0: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65  rt() */.      re
5ab0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
5ac0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5ad0: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  e = 0;.    db->n
5ae0: 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d  Table++;.    db-
5af0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
5b00: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
5b10: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
5b20: 20 74 61 62 6c 65 20 69 73 20 67 65 6e 65 72 61   table is genera
5b30: 74 65 64 20 66 72 6f 6d 20 61 20 53 45 4c 45 43  ted from a SELEC
5b40: 54 2c 20 74 68 65 6e 20 63 6f 6e 73 74 72 75 63  T, then construc
5b50: 74 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20  t the.  ** list 
5b60: 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  of columns and t
5b70: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 74  he text of the t
5b80: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
5b90: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
5ba0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d  Table *pSelTab =
5bb0: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
5bc0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
5bd0: 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20   0, pSelect);.  
5be0: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
5bf0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 61   ) return;.    a
5c00: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d  ssert( p->aCol==
5c10: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  0 );.    p->nCol
5c20: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
5c30: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  ;.    p->aCol = 
5c40: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
5c50: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
5c60: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
5c70: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
5c80: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
5c90: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
5ca0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
5cb0: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 69   initFlag is 1 i
5cc0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
5cd0: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
5ce0: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
5cf0: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
5d00: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
5d10: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
5d20: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
5d30: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
5d40: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
5d50: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
5d60: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
5d70: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
5d80: 66 72 6f 6d 20 74 68 65 20 70 50 61 72 73 65 2d  from the pParse-
5d90: 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  >newTnum field. 
5da0: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
5db0: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
5dc0: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
5dd0: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
5de0: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
5df0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
5e00: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
5e10: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 70 50 61     p->tnum = pPa
5e20: 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20  rse->newTnum;.  
5e30: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
5e40: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
5e50: 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
5e60: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
5e70: 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
5e80: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
5e90: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
5ea0: 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64  ase.  The record
5eb0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
5ec0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65   the new table e
5ed0: 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65  ntry should alre
5ee0: 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74  ady be on the st
5ef0: 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ack..  **.  ** I
5f00: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
5f10: 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
5f20: 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
5f30: 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
5f40: 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
5f50: 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
5f60: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
5f70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
5f80: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29  arse->initFlag )
5f90: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
5fa0: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76   Vdbe *v;..    v
5fb0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
5fc0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
5fd0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
5fe0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
5ff0: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
6000: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
6010: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  le */.      sqli
6020: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6030: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 30  P_CreateTable, 0
6040: 2c 20 70 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20  , p->isTemp);.  
6050: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6060: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63  angeP3(v, -1, (c
6070: 68 61 72 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20  har *)&p->tnum, 
6080: 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
6090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
60a0: 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
60b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
60c0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
60d0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
60e0: 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20   p->tnum = 0;.  
60f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6100: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
6110: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
6120: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
6130: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
6140: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
6150: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
6160: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
6170: 76 2c 20 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20  v, -1, "table", 
6180: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
6190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
61a0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
61b0: 76 2c 20 2d 31 2c 20 22 76 69 65 77 22 2c 20 50  v, -1, "view", P
61c0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d  3_STATIC);.    }
61d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
61e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
61f0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
6200: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
6210: 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65  (v, -1, p->zName
6220: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
6230: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6240: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
6250: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
6260: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
6270: 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50   -1, p->zName, P
6280: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
6290: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
62a0: 2c 20 4f 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b  , OP_Dup, 4, 0);
62b0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
62c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
62d0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  g, 0, 0);.    if
62e0: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
62f0: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65     char *z = cre
6300: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b  ateTableStmt(p);
6310: 0a 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73  .      n = z ? s
6320: 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20  trlen(z) : 0;.  
6330: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6340: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c  angeP3(v, -1, z,
6350: 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
6360: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65  eFree(z);.    }e
6370: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
6380: 74 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  t( pEnd!=0 );.  
6390: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
63a0: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61  d->z) - Addr(pPa
63b0: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
63c0: 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73  .z) + 1;.      s
63d0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
63e0: 33 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d  3(v, -1, pParse-
63f0: 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20  >sFirstToken.z, 
6400: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  n);.    }.    sq
6410: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6420: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6430: 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  5, 0);.    sqlit
6440: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6450: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
6460: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 69  );.    if( !p->i
6470: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73  sTemp ){.      s
6480: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
6490: 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a  e(db, v);.    }.
64a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
64b0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
64c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
64d0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
64e0: 20 69 6e 74 20 6f 70 20 3d 20 70 2d 3e 69 73 54   int op = p->isT
64f0: 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41  emp ? OP_OpenWrA
6500: 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74  ux : OP_OpenWrit
6510: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  e;.      sqliteV
6520: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
6530: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  1, 0);.      pPa
6540: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
6550: 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63       sqliteSelec
6560: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
6570: 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c  t, SRT_Table, 1,
6580: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
6590: 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72  .    sqliteEndWr
65a0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
65b0: 72 73 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rse);.  }.}../*.
65c0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
65d0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
65e0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
65f0: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
6600: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65  /.void sqliteCre
6610: 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
6620: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
6630: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
6640: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
6650: 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
6660: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
6670: 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
6680: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
6690: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
66a0: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
66b0: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
66c0: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
66d0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
66e0: 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
66f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
6700: 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
6710: 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
6720: 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20   int isTemp     
6730: 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
6740: 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
6750: 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 73   */.){.  Token s
6760: 45 6e 64 3b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  End;.  Table *p;
6770: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6780: 3b 0a 20 20 69 6e 74 20 6e 2c 20 6f 66 66 73 65  ;.  int n, offse
6790: 74 3b 0a 0a 20 20 73 71 6c 69 74 65 53 74 61 72  t;..  sqliteStar
67a0: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
67b0: 42 65 67 69 6e 2c 20 70 4e 61 6d 65 2c 20 69 73  Begin, pName, is
67c0: 54 65 6d 70 29 3b 0a 20 20 70 20 3d 20 70 50 61  Temp);.  p = pPa
67d0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
67e0: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
67f0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
6800: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
6810: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6820: 20 2f 2a 20 49 67 6e 6f 72 65 20 4f 52 44 45 52   /* Ignore ORDER
6830: 20 42 59 20 63 6c 61 75 73 65 73 20 6f 6e 20 61   BY clauses on a
6840: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28   SELECT */.  if(
6850: 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72   pSelect->pOrder
6860: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
6870: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
6880: 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79  Select->pOrderBy
6890: 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e  );.    pSelect->
68a0: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
68b0: 7d 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  }.  p->pSelect =
68c0: 20 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20   pSelect;.  if( 
68d0: 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61  !pParse->initFla
68e0: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  g ){.    if( sql
68f0: 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  iteViewGetColumn
6900: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
6910: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
6920: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 45  ;.    }.  }.  sE
6930: 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61  nd = pParse->sLa
6940: 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73  stToken;.  if( s
6950: 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73  End.z[0]!=0 && s
6960: 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b  End.z[0]!=';' ){
6970: 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73  .    sEnd.z += s
6980: 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e  End.n;.  }.  sEn
6990: 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28  d.n = 0;.  n = (
69a0: 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d 20 28  (int)sEnd.z) - (
69b0: 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  int)pBegin->z;. 
69c0: 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a   z = pBegin->z;.
69d0: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
69e0: 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20  (z[n-1]==';' || 
69f0: 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29  isspace(z[n-1]))
6a00: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
6a10: 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
6a20: 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 20 20 7a   sEnd.n = 1;.  z
6a30: 20 3d 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e 7a   = p->pSelect->z
6a40: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53  Select = sqliteS
6a50: 74 72 4e 44 75 70 28 7a 2c 20 6e 29 3b 0a 20 20  trNDup(z, n);.  
6a60: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 6f 66 66  if( z ){.    off
6a70: 73 65 74 20 3d 20 28 28 69 6e 74 29 7a 29 20 2d  set = ((int)z) -
6a80: 20 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b   (int)pBegin->z;
6a90: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63  .    sqliteSelec
6aa0: 74 4d 6f 76 65 53 74 72 69 6e 67 73 28 70 2d 3e  tMoveStrings(p->
6ab0: 70 53 65 6c 65 63 74 2c 20 6f 66 66 73 65 74 29  pSelect, offset)
6ac0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 54  ;.    sqliteEndT
6ad0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45  able(pParse, &sE
6ae0: 6e 64 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  nd, 0);.  }.  re
6af0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
6b00: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
6b10: 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61  re pTable is rea
6b20: 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c  lly a VIEW.  Fil
6b30: 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  l in the names o
6b40: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73  f.** the columns
6b50: 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20   of the view in 
6b60: 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63  the pTable struc
6b70: 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68  ture.  Return th
6b80: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
6b90: 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
6ba0: 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76  ror is seen leav
6bb0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
6bc0: 67 65 20 69 6e 20 70 50 61 72 65 2d 3e 7a 45 72  ge in pPare->zEr
6bd0: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
6be0: 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  iteViewGetColumn
6bf0: 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
6c00: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
6c10: 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  le){.  ExprList 
6c20: 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63  *pEList;.  Selec
6c30: 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65  t *pSel;.  Table
6c40: 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74   *pSelTab;.  int
6c50: 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73   nErr = 0;..  as
6c60: 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a  sert( pTable );.
6c70: 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
6c80: 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
6c90: 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
6ca0: 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
6cb0: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
6cc0: 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
6cd0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
6ce0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
6cf0: 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
6d00: 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
6d10: 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
6d20: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
6d30: 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
6d40: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
6d50: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
6d60: 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
6d70: 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
6d80: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
6d90: 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
6da0: 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
6db0: 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
6dc0: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
6dd0: 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
6de0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
6df0: 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
6e00: 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
6e10: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
6e20: 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
6e30: 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65  Actually, this e
6e40: 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70  rror is caught p
6e50: 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f  reviously and so
6e60: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
6e70: 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  est.  ** should 
6e80: 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75  always fail.  Bu
6e90: 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20  t we will leave 
6ea0: 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74  it in place just
6eb0: 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a   to be safe..  *
6ec0: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
6ed0: 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
6ee0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
6ef0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
6f00: 22 76 69 65 77 20 22 2c 20 70 54 61 62 6c 65 2d  "view ", pTable-
6f10: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
6f20: 20 22 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79   " is circularly
6f30: 20 64 65 66 69 6e 65 64 22 2c 20 30 29 3b 0a 20   defined", 0);. 
6f40: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
6f50: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  +;.    return 1;
6f60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
6f70: 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
6f80: 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
6f90: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
6fa0: 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f  able names..  */
6fb0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
6fc0: 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a  e->pSelect ); /*
6fd0: 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65   If nCol==0, the
6fe0: 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20 62 65  n pTable must be
6ff0: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70 53 65   a VIEW */.  pSe
7000: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  l = pTable->pSel
7010: 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20  ect;..  /* Note 
7020: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
7030: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
7040: 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20  OfSelect() will 
7050: 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20  expand any.  ** 
7060: 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  "*" elements in 
7070: 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20  this list.  But 
7080: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  we will need to 
7090: 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74  restore the list
70a0: 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74  .  ** back to it
70b0: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
70c0: 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61  guration afterwa
70d0: 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20  rds, so we save 
70e0: 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74  a copy of.  ** t
70f0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70  he original in p
7100: 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45  EList..  */.  pE
7110: 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c  List = pSel->pEL
7120: 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c  ist;.  pSel->pEL
7130: 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ist = sqliteExpr
7140: 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74 29 3b  ListDup(pEList);
7150: 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c  .  if( pSel->pEL
7160: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53  ist==0 ){.    pS
7170: 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  el->pEList = pEL
7180: 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ist;.    return 
7190: 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61  1;  /* Malloc fa
71a0: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  iled */.  }.  pT
71b0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
71c0: 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c  .  pSelTab = sql
71d0: 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65  iteResultSetOfSe
71e0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
71f0: 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53 65  pSel);.  if( pSe
7200: 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  lTab ){.    asse
7210: 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
7220: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c  ==0 );.    pTabl
7230: 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
7240: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61  b->nCol;.    pTa
7250: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
7260: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70  Tab->aCol;.    p
7270: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
7280: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61  ;.    pSelTab->a
7290: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Col = 0;.    sql
72a0: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30  iteDeleteTable(0
72b0: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
72c0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
72d0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 55 6e 72 65  s |= SQLITE_Unre
72e0: 73 65 74 56 69 65 77 73 3b 0a 20 20 7d 65 6c 73  setViews;.  }els
72f0: 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  e{.    pTable->n
7300: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72  Col = 0;.    nEr
7310: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  r++;.  }.  sqlit
7320: 65 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53  eSelectUnbind(pS
7330: 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  el);.  sqliteExp
7340: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c  rListDelete(pSel
7350: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 65  ->pEList);.  pSe
7360: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  l->pEList = pELi
7370: 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72  st;.  return nEr
7380: 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  r;  .}../*.** Cl
7390: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
73a0: 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 56 49  ames from the VI
73b0: 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  EW pTable..**.**
73c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
73d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
73e0: 20 61 6e 79 20 6f 74 68 65 72 20 74 61 62 6c 65   any other table
73f0: 20 6f 72 20 76 69 65 77 20 69 73 20 6d 6f 64 69   or view is modi
7400: 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76 69 65  fied..** The vie
7410: 77 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  w passed into th
7420: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
7430: 20 64 65 70 65 6e 64 20 64 69 72 65 63 74 6c 79   depend directly
7440: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 0a 2a   or indirectly.*
7450: 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66 69 65  * on the modifie
7460: 64 20 6f 72 20 64 65 6c 65 74 65 64 20 74 61 62  d or deleted tab
7470: 6c 65 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f  le so we need to
7480: 20 63 6c 65 61 72 20 74 68 65 20 6f 6c 64 20 63   clear the old c
7490: 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73  olumn.** names s
74a0: 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c  o that they will
74b0: 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64 2e 0a   be recomputed..
74c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
74d0: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 43 6f  qliteViewResetCo
74e0: 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20  lumnNames(Table 
74f0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
7500: 69 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  i;.  if( pTable=
7510: 3d 30 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 70 53  =0 || pTable->pS
7520: 65 6c 65 63 74 3d 3d 30 20 29 20 72 65 74 75 72  elect==0 ) retur
7530: 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  n;.  if( pTable-
7540: 3e 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  >nCol==0 ) retur
7550: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
7560: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
7570: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
7580: 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  ee(pTable->aCol[
7590: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  i].zName);.    s
75a0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
75b0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29  ->aCol[i].zDflt)
75c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
75d0: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d  (pTable->aCol[i]
75e0: 2e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73  .zType);.  }.  s
75f0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
7600: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c  ->aCol);.  pTabl
7610: 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->aCol = 0;.  p
7620: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
7630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
7640: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
7650: 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
7660: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7670: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
7680: 69 74 65 20 2a 64 62 29 7b 0a 20 20 48 61 73 68  ite *db){.  Hash
7690: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 28  Elem *i;.  if( (
76a0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
76b0: 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  TE_UnresetViews)
76c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
76d0: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
76e0: 46 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 48 61  First(&db->tblHa
76f0: 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  sh); i; i=sqlite
7700: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
7710: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
7720: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
7730: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
7740: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
7750: 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
7760: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61  tColumnNames(pTa
7770: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
7780: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
7790: 4c 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77  LITE_UnresetView
77a0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  s;.}../*.** Give
77b0: 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20  n a token, look 
77c0: 75 70 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  up a table with 
77d0: 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e  that name.  If n
77e0: 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a  ot found, leave.
77f0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20  ** an error for 
7800: 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 66 69  the parser to fi
7810: 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  nd and return NU
7820: 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  LL..*/.Table *sq
7830: 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b  liteTableFromTok
7840: 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  en(Parse *pParse
7850: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a  , Token *pTok){.
7860: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
7870: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
7880: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61  zName = sqliteTa
7890: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
78a0: 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e  (pTok);.  if( zN
78b0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
78c0: 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  0;.  pTab = sqli
78d0: 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  teFindTable(pPar
78e0: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  se->db, zName);.
78f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
7900: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  me);.  if( pTab=
7910: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
7920: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
7930: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
7940: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20   such table: ", 
7950: 30 2c 20 0a 20 20 20 20 20 20 20 20 70 54 6f 6b  0, .        pTok
7960: 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29  ->z, pTok->n, 0)
7970: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
7980: 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rr++;.  }.  retu
7990: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
79a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
79b0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
79c0: 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
79d0: 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
79e0: 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
79f0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
7a00: 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
7a10: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
7a20: 74 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  teDropTable(Pars
7a30: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
7a40: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
7a50: 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  iew){.  Table *p
7a60: 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76  Table;.  Vdbe *v
7a70: 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20  ;.  int base;.  
7a80: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
7a90: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
7aa0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
7ab0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
7ac0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
7ad0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
7ae0: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  TableFromToken(p
7af0: 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20  Parse, pName);. 
7b00: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
7b10: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
7b20: 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79 20  Table->readOnly 
7b30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
7b40: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
7b50: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
7b60: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
7b70: 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61 79 20  , .       " may 
7b80: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
7b90: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
7ba0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
7bb0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  urn;.  }.  if( i
7bc0: 73 56 69 65 77 20 26 26 20 70 54 61 62 6c 65 2d  sView && pTable-
7bd0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
7be0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
7bf0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
7c00: 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50 20 54  Msg, "use DROP T
7c10: 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
7c20: 61 62 6c 65 20 22 2c 0a 20 20 20 20 20 20 70 54  able ",.      pT
7c30: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  able->zName, 0);
7c40: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7c50: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r++;.    return;
7c60: 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
7c70: 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53  ew && pTable->pS
7c80: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
7c90: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
7ca0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
7cb0: 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f  use DROP VIEW to
7cc0: 20 64 65 6c 65 74 65 20 76 69 65 77 20 22 2c 0a   delete view ",.
7cd0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e        pTable->zN
7ce0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ame, 0);.    pPa
7cf0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
7d00: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
7d10: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
7d20: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
7d30: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
7d40: 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
7d50: 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
7d60: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
7d70: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
7d80: 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63   v ){.    static
7d90: 20 56 64 62 65 4f 70 20 64 72 6f 70 54 61 62 6c   VdbeOp dropTabl
7da0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  e[] = {.      { 
7db0: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
7dc0: 2c 20 41 44 44 52 28 38 29 2c 20 20 30 7d 2c 0a  , ADDR(8),  0},.
7dd0: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
7de0: 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  g,     0, 0,    
7df0: 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a      0}, /* 1 */.
7e00: 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74        { OP_MemSt
7e10: 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20  ore,   1, 1,    
7e20: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
7e30: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31  OP_MemLoad,    1
7e40: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
7e50: 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
7e60: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
7e70: 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
7e80: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20        { OP_Ne,  
7e90: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 37         0, ADDR(7
7ea0: 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ),  0},.      { 
7eb0: 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30  OP_Delete,     0
7ec0: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
7ed0: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c        { OP_Next,
7ee0: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33         0, ADDR(3
7ef0: 29 2c 20 20 30 7d 2c 20 2f 2a 20 37 20 2a 2f 0a  ),  0}, /* 7 */.
7f00: 20 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78      };.    Index
7f10: 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 72 69 67   *pIdx;.    Trig
7f20: 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20  ger *pTrigger;. 
7f30: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
7f40: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
7f50: 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  rse, 0);.    sql
7f60: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
7f70: 6c 65 28 76 2c 20 70 54 61 62 6c 65 2d 3e 69 73  le(v, pTable->is
7f80: 54 65 6d 70 29 3b 0a 20 20 20 20 2f 2a 20 44 72  Temp);.    /* Dr
7f90: 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  op all triggers 
7fa0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7fb0: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
7fc0: 64 72 6f 70 70 65 64 20 2a 2f 0a 20 20 20 20 70  dropped */.    p
7fd0: 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c 65  Trigger = pTable
7fe0: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
7ff0: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
8000: 29 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 74  ){.      Token t
8010: 74 3b 0a 20 20 20 20 20 20 74 74 2e 7a 20 3d 20  t;.      tt.z = 
8020: 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72  pTable->pTrigger
8030: 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20 74 74  ->name;.      tt
8040: 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62  .n = strlen(pTab
8050: 6c 65 2d 3e 70 54 72 69 67 67 65 72 2d 3e 6e 61  le->pTrigger->na
8060: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
8070: 65 44 72 6f 70 54 72 69 67 67 65 72 28 70 50 61  eDropTrigger(pPa
8080: 72 73 65 2c 20 26 74 74 2c 20 31 29 3b 0a 20 20  rse, &tt, 1);.  
8090: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
80a0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  explain ){.     
80b0: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
80c0: 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
80d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
80e0: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
80f0: 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b  Table->pTrigger;
8100: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8110: 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
8120: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
8130: 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54   ArraySize(dropT
8140: 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65  able), dropTable
8150: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
8160: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
8170: 65 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  e+1, pTable->zNa
8180: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  me, 0);.    if( 
8190: 21 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20  !pTable->isTemp 
81a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43  ){.      sqliteC
81b0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
81c0: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
81d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
81e0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
81f0: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ;.    if( !isVie
8200: 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  w ){.      sqlit
8210: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8220: 5f 44 65 73 74 72 6f 79 2c 20 70 54 61 62 6c 65  _Destroy, pTable
8230: 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e  ->tnum, pTable->
8240: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66  isTemp);.      f
8250: 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e  or(pIdx=pTable->
8260: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
8270: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
8280: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
8290: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
82a0: 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e  estroy, pIdx->tn
82b0: 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65  um, pTable->isTe
82c0: 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mp);.      }.   
82d0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64   }.    sqliteEnd
82e0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
82f0: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
8300: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d  * Delete the in-
8310: 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69  memory descripti
8320: 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  on of the table.
8330: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
8340: 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51 4c  tion: if the SQL
8350: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61 6e   statement began
8360: 20 77 69 74 68 20 74 68 65 20 45 58 50 4c 41 49   with the EXPLAI
8370: 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20  N keyword,.  ** 
8380: 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  then no changes 
8390: 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e 0a  should be made..
83a0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
83b0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
83c0: 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41     sqliteUnlinkA
83d0: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  ndDeleteTable(db
83e0: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 64  , pTable);.    d
83f0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
8400: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
8410: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69  ;.  }.  sqliteVi
8420: 65 77 52 65 73 65 74 41 6c 6c 28 64 62 29 3b 0a  ewResetAll(db);.
8430: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8440: 75 74 69 6e 65 20 63 6f 6e 73 74 72 75 63 74 73  utine constructs
8450: 20 61 20 50 33 20 73 74 72 69 6e 67 20 73 75 69   a P3 string sui
8460: 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 4f 50 5f  table for an OP_
8470: 4d 61 6b 65 49 64 78 4b 65 79 0a 2a 2a 20 6f 70  MakeIdxKey.** op
8480: 63 6f 64 65 20 61 6e 64 20 61 64 64 73 20 74 68  code and adds th
8490: 61 74 20 50 33 20 73 74 72 69 6e 67 20 74 6f 20  at P3 string to 
84a0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
84b0: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
84c0: 75 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  uction.** in the
84d0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
84e0: 2e 20 20 54 68 65 20 50 33 20 73 74 72 69 6e 67  .  The P3 string
84f0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
8500: 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 0a  ingle character.
8510: 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ** for each colu
8520: 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  mn in the index 
8530: 70 49 64 78 20 6f 66 20 74 61 62 6c 65 20 70 54  pIdx of table pT
8540: 61 62 2e 20 20 49 66 20 74 68 65 20 63 6f 6c 75  ab.  If the colu
8550: 6d 6e 20 75 73 65 73 0a 2a 2a 20 61 20 6e 75 6d  mn uses.** a num
8560: 65 72 69 63 20 73 6f 72 74 20 6f 72 64 65 72 2c  eric sort order,
8570: 20 74 68 65 6e 20 74 68 65 20 50 33 20 73 74 72   then the P3 str
8580: 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 63 6f  ing character co
8590: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0a 2a  rresponding to.*
85a0: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73  * that column is
85b0: 20 27 6e 27 2e 20 20 49 66 20 74 68 65 20 63 6f   'n'.  If the co
85c0: 6c 75 6d 6e 20 75 73 65 73 20 61 20 74 65 78 74  lumn uses a text
85d0: 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74 68 65   sort order, the
85e0: 6e 20 74 68 65 0a 2a 2a 20 50 33 20 73 74 72 69  n the.** P3 stri
85f0: 6e 67 20 69 73 20 27 74 27 2e 20 20 53 65 65 20  ng is 't'.  See 
8600: 74 68 65 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65  the OP_MakeIdxKe
8610: 79 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e  y opcode documen
8620: 74 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 64  tation for.** ad
8630: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
8640: 74 69 6f 6e 2e 20 20 53 65 65 20 61 6c 73 6f 20  tion.  See also 
8650: 74 68 65 20 73 71 6c 69 74 65 41 64 64 4b 65 79  the sqliteAddKey
8660: 54 79 70 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a  Type() routine..
8670: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
8680: 64 49 64 78 4b 65 79 54 79 70 65 28 56 64 62 65  dIdxKeyType(Vdbe
8690: 20 2a 76 2c 20 49 6e 64 65 78 20 2a 70 49 64 78   *v, Index *pIdx
86a0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  ){.  char *zType
86b0: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
86c0: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61  .  int i, n;.  a
86d0: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 26  ssert( pIdx!=0 &
86e0: 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 21 3d  & pIdx->pTable!=
86f0: 30 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  0 );.  pTab = pI
8700: 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 6e 20  dx->pTable;.  n 
8710: 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
8720: 0a 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  .  zType = sqlit
8730: 65 4d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a  eMalloc( n+1 );.
8740: 20 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29    if( zType==0 )
8750: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
8760: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
8770: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49     int iCol = pI
8780: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
8790: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f  .    assert( iCo
87a0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
87b0: 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 69  b->nCol );.    i
87c0: 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  f( (pTab->aCol[i
87d0: 43 6f 6c 5d 2e 73 6f 72 74 4f 72 64 65 72 20 26  Col].sortOrder &
87e0: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d   SQLITE_SO_TYPEM
87f0: 41 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  ASK)==SQLITE_SO_
8800: 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 54  TEXT ){.      zT
8810: 79 70 65 5b 69 5d 20 3d 20 27 74 27 3b 0a 20 20  ype[i] = 't';.  
8820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
8830: 54 79 70 65 5b 69 5d 20 3d 20 27 6e 27 3b 0a 20  Type[i] = 'n';. 
8840: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 54 79 70 65     }.  }.  zType
8850: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [n] = 0;.  sqlit
8860: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
8870: 20 2d 31 2c 20 7a 54 79 70 65 2c 20 6e 29 3b 0a   -1, zType, n);.
8880: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 79    sqliteFree(zTy
8890: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  pe);.}../*.** Cr
88a0: 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
88b0: 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
88c0: 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74 68  e.  pIndex is th
88d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
88e0: 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62  dex .** and pTab
88f0: 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  le is the name o
8900: 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
8910: 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
8920: 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
8930: 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
8940: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
8950: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
8960: 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
8970: 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
8980: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
8990: 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
89a0: 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
89b0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
89c0: 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
89d0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
89e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
89f0: 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
8a00: 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
8a10: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
8a20: 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
8a30: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
8a40: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
8a50: 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
8a60: 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
8a70: 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
8a80: 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
8a90: 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
8aa0: 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
8ab0: 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
8ac0: 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
8ad0: 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
8ae0: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
8af0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8b00: 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ion.  .*/.void s
8b10: 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78  qliteCreateIndex
8b20: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8b30: 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f  e,   /* All info
8b40: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
8b50: 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
8b60: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f  ken *pName,    /
8b70: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
8b80: 64 65 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  dex.  May be NUL
8b90: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  L */.  Token *pT
8ba0: 61 62 6c 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  able,   /* Name 
8bb0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
8bc0: 69 6e 64 65 78 2e 20 20 55 73 65 20 70 50 61 72  index.  Use pPar
8bd0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
8be0: 20 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a   0 */.  IdList *
8bf0: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
8c00: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
8c10: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
8c20: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
8c30: 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
8c40: 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
8c50: 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
8c60: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
8c70: 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52  art,   /* The CR
8c80: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
8c90: 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20  begins a CREATE 
8ca0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
8cb0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
8cc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22        /* The ")"
8cd0: 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65   that closes the
8ce0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
8cf0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
8d00: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
8d10: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
8d20: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
8d30: 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a  ex *pIndex;   /*
8d40: 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
8d50: 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
8d60: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
8d70: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b   int i, j;.  Tok
8d80: 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20  en nullId;      
8d90: 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74         /* Fake t
8da0: 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74  oken for an empt
8db0: 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 73  y ID list */.  s
8dc0: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
8dd0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 68 69  se->db;.  int hi
8de0: 64 65 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  deName = 0;     
8df0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 70 75      /* Do not pu
8e00: 74 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20  t table name in 
8e10: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a  the hash table *
8e20: 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  /..  if( pParse-
8e30: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
8e40: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
8e50: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
8e60: 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20  _index;..  /*.  
8e70: 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
8e80: 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
8e90: 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
8ea0: 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
8eb0: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
8ec0: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
8ed0: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21 3d   assert( pName!=
8ee0: 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
8ef0: 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d   sqliteTableFrom
8f00: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 54  Token(pParse, pT
8f10: 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  able);.  }else{.
8f20: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
8f30: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  e==0 );.    pTab
8f40: 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   =  pParse->pNew
8f50: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  Table;.  }.  if(
8f60: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72   pTab==0 || pPar
8f70: 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
8f80: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
8f90: 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  x;.  if( pTab->r
8fa0: 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
8fb0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
8fc0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
8fd0: 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d   "table ", pTab-
8fe0: 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 22  >zName, .      "
8ff0: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 6e 65   may not have ne
9000: 77 20 69 6e 64 69 63 65 73 20 61 64 64 65 64 22  w indices added"
9010: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
9020: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
9030: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
9040: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
9050: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
9060: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
9070: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
9080: 72 72 4d 73 67 2c 20 22 76 69 65 77 73 20 6d 61  rrMsg, "views ma
9090: 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
90a0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
90b0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
90c0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
90d0: 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
90e0: 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 69   If this index i
90f0: 73 20 63 72 65 61 74 65 64 20 77 68 69 6c 65 20  s created while 
9100: 72 65 2d 72 65 61 64 69 6e 67 20 74 68 65 20 73  re-reading the s
9110: 63 68 65 6d 61 20 66 72 6f 6d 20 73 71 6c 69 74  chema from sqlit
9120: 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 62 75  e_master.  ** bu
9130: 74 20 74 68 65 20 74 61 62 6c 65 20 61 73 73 6f  t the table asso
9140: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
9150: 20 69 6e 64 65 78 20 69 73 20 61 20 74 65 6d 70   index is a temp
9160: 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 69 74 20  orary table, it 
9170: 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 6d 65  can.  ** only me
9180: 61 6e 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  an that the tabl
9190: 65 20 74 68 61 74 20 74 68 69 73 20 69 6e 64 65  e that this inde
91a0: 78 20 69 73 20 72 65 61 6c 6c 79 20 61 73 73 6f  x is really asso
91b0: 63 69 61 74 65 64 20 77 69 74 68 20 69 73 0a 20  ciated with is. 
91c0: 20 2a 2a 20 6f 6e 65 20 77 68 6f 73 65 20 6e 61   ** one whose na
91d0: 6d 65 20 69 73 20 68 69 64 64 65 6e 20 62 65 68  me is hidden beh
91e0: 69 6e 64 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ind a temporary 
91f0: 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
9200: 61 6d 65 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 53  ame name..  ** S
9210: 69 6e 63 65 20 69 74 73 20 74 61 62 6c 65 20 68  ince its table h
9220: 61 73 20 62 65 65 6e 20 73 75 70 70 72 65 73 73  as been suppress
9230: 65 64 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 61  ed, we need to a
9240: 6c 73 6f 20 73 75 70 70 72 65 73 73 20 74 68 65  lso suppress the
9250: 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20 2a  .  ** index..  *
9260: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
9270: 69 6e 69 74 46 6c 61 67 20 26 26 20 21 70 50 61  initFlag && !pPa
9280: 72 73 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70  rse->isTemp && p
9290: 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20  Tab->isTemp ){. 
92a0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
92b0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
92c0: 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
92d0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
92e0: 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
92f0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
9300: 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
9310: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
9320: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
9330: 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
9340: 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
9350: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
9360: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
9370: 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
9380: 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
9390: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
93a0: 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
93b0: 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
93c0: 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
93d0: 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
93e0: 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
93f0: 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
9400: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
9410: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
9420: 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
9430: 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
9440: 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
9450: 73 20 69 6e 64 65 78 2c 20 62 75 74 20 77 65 20  s index, but we 
9460: 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 73 74  will not.  ** st
9470: 6f 72 65 20 69 74 73 20 6e 61 6d 65 20 69 6e 20  ore its name in 
9480: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
9490: 20 53 65 74 20 74 68 65 20 68 69 64 65 4e 61 6d   Set the hideNam
94a0: 65 20 66 6c 61 67 20 74 6f 20 61 63 63 6f 6d 70  e flag to accomp
94b0: 6c 69 73 68 0a 20 20 2a 2a 20 74 68 69 73 2e 0a  lish.  ** this..
94c0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
94d0: 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
94e0: 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
94f0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
9500: 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
9510: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
9520: 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
9530: 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
9540: 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
9550: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 49  ( pName ){.    I
9560: 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65  ndex *pISameName
9570: 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20  ;    /* Another 
9580: 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73  index with the s
9590: 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ame name */.    
95a0: 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d  Table *pTSameNam
95b0: 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65  e;    /* A table
95c0: 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20   with same name 
95d0: 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  as the index */.
95e0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
95f0: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
9600: 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20  oken(pName);.   
9610: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
9620: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
9630: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
9640: 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71  (pISameName = sq
9650: 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62  liteFindIndex(db
9660: 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a  , zName))!=0 ){.
9670: 20 20 20 20 20 20 69 66 28 20 70 49 53 61 6d 65        if( pISame
9680: 4e 61 6d 65 2d 3e 70 54 61 62 6c 65 2d 3e 69 73  Name->pTable->is
9690: 54 65 6d 70 20 26 26 20 70 50 61 72 73 65 2d 3e  Temp && pParse->
96a0: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
96b0: 20 20 20 20 68 69 64 65 4e 61 6d 65 20 3d 20 31      hideName = 1
96c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
96d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
96e0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
96f0: 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20  zErrMsg, "index 
9700: 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  ", zName, .     
9710: 20 20 20 20 20 20 22 20 61 6c 72 65 61 64 79 20        " already 
9720: 65 78 69 73 74 73 22 2c 20 30 29 3b 0a 20 20 20  exists", 0);.   
9730: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
9740: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  r++;.        got
9750: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
9760: 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
9770: 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54 53 61   }.    if( (pTSa
9780: 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46  meName = sqliteF
9790: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
97a0: 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  me))!=0 ){.     
97b0: 20 69 66 28 20 70 54 53 61 6d 65 4e 61 6d 65 2d   if( pTSameName-
97c0: 3e 69 73 54 65 6d 70 20 26 26 20 70 50 61 72 73  >isTemp && pPars
97d0: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
97e0: 20 20 20 20 20 20 20 68 69 64 65 4e 61 6d 65 20         hideName 
97f0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
9800: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9810: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
9820: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68 65  e->zErrMsg, "the
9830: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
9840: 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 2c 0a 20  table named ",. 
9850: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c            zName,
9860: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
9870: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
9880: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
9890: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
98a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
98b0: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  se{.    char zBu
98c0: 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  f[30];.    int n
98d0: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
98e0: 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
98f0: 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
9900: 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
9910: 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
9920: 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e  n++){}.    sprin
9930: 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c 6e 29  tf(zBuf,"%d)",n)
9940: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  ;.    zName = 0;
9950: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
9960: 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 28 22  ring(&zName, "("
9970: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  , pTab->zName, "
9980: 20 61 75 74 6f 69 6e 64 65 78 20 22 2c 20 7a 42   autoindex ", zB
9990: 75 66 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  uf, 0);.    if( 
99a0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
99b0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
99c0: 78 3b 0a 20 20 20 20 68 69 64 65 4e 61 6d 65 20  x;.    hideName 
99d0: 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
99e0: 78 28 64 62 2c 20 7a 4e 61 6d 65 29 21 3d 30 3b  x(db, zName)!=0;
99f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  .  }..  /* If pL
9a00: 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
9a10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
9a20: 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
9a30: 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
9a40: 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
9a50: 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
9a60: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
9a70: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
9a80: 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
9a90: 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
9aa0: 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
9ab0: 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
9ac0: 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64  =0 ){.    nullId
9ad0: 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .z = pTab->aCol[
9ae0: 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
9af0: 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  ame;.    nullId.
9b00: 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49  n = strlen(nullI
9b10: 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
9b20: 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70  = sqliteIdListAp
9b30: 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49 64 29  pend(0, &nullId)
9b40: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
9b50: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
9b60: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
9b70: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
9b80: 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
9b90: 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
9ba0: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
9bb0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
9bc0: 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e  (Index) + strlen
9bd0: 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20  (zName) + 1 +.  
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bf0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74        sizeof(int
9c00: 29 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29 3b 0a  )*pList->nId );.
9c10: 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
9c20: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
9c30: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49 6e 64  te_index;.  pInd
9c40: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  ex->aiColumn = (
9c50: 69 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d 3b  int*)&pIndex[1];
9c60: 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
9c70: 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65   = (char*)&pInde
9c80: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73  x->aiColumn[pLis
9c90: 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70  t->nId];.  strcp
9ca0: 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
9cb0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65   zName);.  pInde
9cc0: 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
9cd0: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
9ce0: 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64  umn = pList->nId
9cf0: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
9d00: 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 69 73  ror = pIndex->is
9d10: 55 6e 69 71 75 65 20 3d 20 6f 6e 45 72 72 6f 72  Unique = onError
9d20: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
9d30: 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30  Index = pName==0
9d40: 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  ;..  /* Scan the
9d50: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
9d60: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
9d70: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
9d80: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
9d90: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
9da0: 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
9db0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
9dc0: 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
9dd0: 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
9de0: 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
9df0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
9e00: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
9e10: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
9e20: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
9e30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9e40: 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74  iteStrICmp(pList
9e50: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
9e60: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
9e70: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
9e80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
9e90: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
9ea0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
9eb0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
9ec0: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20  rMsg, "table ", 
9ed0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  pTab->zName, .  
9ee0: 20 20 20 20 20 20 22 20 68 61 73 20 6e 6f 20 63        " has no c
9ef0: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20 70  olumn named ", p
9f00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
9f10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
9f20: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
9f30: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e    sqliteFree(pIn
9f40: 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  dex);.      goto
9f50: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
9f60: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
9f70: 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
9f80: 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ] = j;.  }..  /*
9f90: 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e   Link the new In
9fa0: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f  dex structure to
9fb0: 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74   its table and t
9fc0: 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a  o the other.  **
9fd0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
9fe0: 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20  ase structures. 
9ff0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
a000: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20  rse->explain && 
a010: 21 68 69 64 65 4e 61 6d 65 20 29 7b 0a 20 20 20  !hideName ){.   
a020: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70   Index *p;.    p
a030: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73   = sqliteHashIns
a040: 65 72 74 28 26 64 62 2d 3e 69 64 78 48 61 73 68  ert(&db->idxHash
a050: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
a060: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
a070: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  , pIndex);.    i
a080: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73  f( p ){.      as
a090: 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
a0a0: 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
a0b0: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
a0c0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  /.      sqliteFr
a0d0: 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ee(pIndex);.    
a0e0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
a0f0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
a100: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
a110: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
a120: 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  anges;.  }..  /*
a130: 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
a140: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
a150: 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
a160: 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
a170: 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
a180: 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
a190: 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
a1a0: 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
a1b0: 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
a1c0: 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
a1d0: 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
a1e0: 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
a1f0: 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a  n of UPDATE.  **
a200: 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a   and INSERT..  *
a210: 2f 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21  /.  if( onError!
a220: 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
a230: 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
a240: 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
a250: 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
a260: 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
a270: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
a280: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
a290: 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
a2a0: 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  = pIndex;.  }els
a2b0: 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  e{.    Index *pO
a2c0: 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
a2d0: 64 65 78 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  dex;.    while( 
a2e0: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
a2f0: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
a300: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
a310: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 70 4f 74  ace ){.      pOt
a320: 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
a330: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
a340: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
a350: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
a360: 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
a370: 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  = pIndex;.  }.. 
a380: 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46   /* If the initF
a390: 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65 61 6e  lag is 1 it mean
a3a0: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
a3b0: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
a3c0: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
a3d0: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
a3e0: 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20  he disk.  So do 
a3f0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
a400: 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e   disk.  ** again
a410: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 74  .  Extract the t
a420: 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d  able number from
a430: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 65 77   the pParse->new
a440: 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20 2a 2f  Tnum field..  */
a450: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69  .  if( pParse->i
a460: 6e 69 74 46 6c 61 67 20 26 26 20 70 54 61 62 6c  nitFlag && pTabl
a470: 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64  e!=0 ){.    pInd
a480: 65 78 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73  ex->tnum = pPars
a490: 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  e->newTnum;.  }.
a4a0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69  .  /* If the ini
a4b0: 74 46 6c 61 67 20 69 73 20 30 20 74 68 65 6e 20  tFlag is 0 then 
a4c0: 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
a4d0: 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
a4e0: 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
a4f0: 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
a500: 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
a510: 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
a520: 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
a530: 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
a540: 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
a550: 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
a560: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30  he initFlag is 0
a570: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66   when the user f
a580: 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52  irst enters a CR
a590: 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a  EATE INDEX .  **
a5a0: 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20 69   command.  The i
a5b0: 6e 69 74 46 6c 61 67 20 69 73 20 31 20 77 68 65  nitFlag is 1 whe
a5c0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
a5d0: 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
a5e0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
a5f0: 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
a600: 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
a610: 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
a620: 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
a630: 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
a640: 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
a650: 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
a660: 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
a670: 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
a680: 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e it..  **.  ** 
a690: 49 66 20 70 54 61 62 6c 65 3d 3d 30 20 69 74 20  If pTable==0 it 
a6a0: 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
a6b0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
a6c0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
a6d0: 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
a6e0: 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
a6f0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
a700: 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
a710: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
a720: 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
a730: 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
a740: 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
a750: 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
a760: 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
a770: 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
a780: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50  */.  else if( pP
a790: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d  arse->initFlag==
a7a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  0 ){.    int n;.
a7b0: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
a7c0: 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b   int lbl1, lbl2;
a7d0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
a7e0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e  int addr;.    in
a7f0: 74 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62 2d  t isTemp = pTab-
a800: 3e 69 73 54 65 6d 70 3b 0a 0a 20 20 20 20 76 20  >isTemp;..    v 
a810: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
a820: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
a830: 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
a840: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
a850: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d      if( pTable!=
a860: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
a870: 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
a880: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 29 3b  tion(pParse, 0);
a890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 70 65  .      sqliteOpe
a8a0: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
a8b0: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  isTemp);.    }. 
a8c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a8d0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
a8e0: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  o, 0, 0);.    sq
a8f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
a900: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
a910: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
a920: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
a930: 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41   "index", P3_STA
a940: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
a950: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a960: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
a970: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
a980: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 6e  ngeP3(v, -1, pIn
a990: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  dex->zName, P3_S
a9a0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
a9b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
a9c0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
a9d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
a9e0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
a9f0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Tab->zName, P3_S
aa00: 54 41 54 49 43 29 3b 0a 20 20 20 20 61 64 64 72  TATIC);.    addr
aa10: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
aa20: 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  Op(v, OP_CreateI
aa30: 6e 64 65 78 2c 20 30 2c 20 69 73 54 65 6d 70 29  ndex, 0, isTemp)
aa40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
aa50: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
aa60: 2c 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  , (char*)&pIndex
aa70: 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54  ->tnum, P3_POINT
aa80: 45 52 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ER);.    pIndex-
aa90: 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69  >tnum = 0;.    i
aaa0: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
aab0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
aac0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
aad0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69   0);.      if( i
aae0: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
aaf0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
ab00: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78  (v, OP_OpenWrAux
ab10: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
ab20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
ab30: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
ab40: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
ab50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
ab60: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
ab70: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ab80: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
ab90: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  0);.    if( pSta
aba0: 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20  rt && pEnd ){.  
abb0: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
abc0: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 53 74  d->z) - Addr(pSt
abd0: 61 72 74 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20  art->z) + 1;.   
abe0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
abf0: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
ac00: 53 74 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20  Start->z, n);.  
ac10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
ac20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
ac30: 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b  keRecord, 5, 0);
ac40: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
ac50: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
ac60: 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tKey, 0, 0);.   
ac70: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
ac80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ac90: 64 64 4f 70 28 76 2c 20 69 73 54 65 6d 70 20 3f  ddOp(v, isTemp ?
aca0: 20 4f 50 5f 4f 70 65 6e 41 75 78 20 3a 20 4f 50   OP_OpenAux : OP
acb0: 5f 4f 70 65 6e 2c 20 32 2c 20 70 54 61 62 2d 3e  _Open, 2, pTab->
acc0: 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  tnum);.      sql
acd0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
ace0: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
acf0: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
ad00: 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c        lbl2 = sql
ad10: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
ad20: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
ad30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
ad40: 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c 32  _Rewind, 2, lbl2
ad50: 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20  );.      lbl1 = 
ad60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
ad70: 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 32 2c 20  v, OP_Recno, 2, 
ad80: 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
ad90: 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
ada0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
adb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
adc0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
add0: 2c 20 32 2c 20 70 49 6e 64 65 78 2d 3e 61 69 43  , 2, pIndex->aiC
ade0: 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20 20  olumn[i]);.     
adf0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
ae00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
ae10: 61 6b 65 49 64 78 4b 65 79 2c 20 70 49 6e 64 65  akeIdxKey, pInde
ae20: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  x->nColumn, 0);.
ae30: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 66 69        if( db->fi
ae40: 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20 73  le_format>=4 ) s
ae50: 71 6c 69 74 65 41 64 64 49 64 78 4b 65 79 54 79  qliteAddIdxKeyTy
ae60: 70 65 28 76 2c 20 70 49 6e 64 65 78 29 3b 0a 20  pe(v, pIndex);. 
ae70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
ae80: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 50 75  ddOp(v, OP_IdxPu
ae90: 74 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e  t, 1, pIndex->on
aea0: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 3b  Error!=OE_None);
aeb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
aec0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
aed0: 74 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  t, 2, lbl1);.   
aee0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
aef0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
af00: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
af10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
af20: 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20  Close, 2, 0);.  
af30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
af40: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
af50: 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
af60: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
af70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  ){.      if( !is
af80: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
af90: 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b  sqliteChangeCook
afa0: 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 20  ie(db, v);.     
afb0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
afc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
afd0: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
afe0: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
aff0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
b000: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
b010: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
b020: 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
b030: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
b040: 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74  :.  sqliteIdList
b050: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
b060: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
b070: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
b080: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
b090: 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
b0a0: 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
b0b0: 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
b0c0: 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
b0d0: 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
b0e0: 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
b0f0: 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 49  void sqliteDropI
b100: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
b110: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
b120: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
b130: 65 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ex;.  char *zNam
b140: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
b150: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
b160: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
b170: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
b180: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
b190: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
b1a0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54   zName = sqliteT
b1b0: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
b1c0: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
b1d0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
b1e0: 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  n;.  pIndex = sq
b1f0: 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62  liteFindIndex(db
b200: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
b210: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
b220: 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
b230: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
b240: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
b250: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
b260: 68 20 69 6e 64 65 78 3a 20 22 2c 20 30 2c 20 0a  h index: ", 0, .
b270: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a          pName->z
b280: 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a  , pName->n, 0);.
b290: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
b2a0: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
b2b0: 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
b2c0: 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20  ->autoIndex ){. 
b2d0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
b2e0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
b2f0: 4d 73 67 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  Msg, "index asso
b300: 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
b310: 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
b320: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
b330: 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
b340: 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
b350: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
b360: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b370: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
b380: 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
b390: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
b3a0: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
b3b0: 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
b3c0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
b3d0: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
b3e0: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
b3f0: 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b   dropIndex[] = {
b400: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
b410: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
b420: 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20 7b  9), 0}, .      {
b430: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
b440: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
b450: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
b460: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31  OP_MemStore,   1
b470: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
b480: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
b490: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
b4a0: 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
b4b0: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
b4c0: 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20       0, 1,      
b4d0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
b4e0: 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
b4f0: 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(8), 0},.    
b500: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
b510: 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 30     0, ADDR(3), 0
b520: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  },.      { OP_Go
b530: 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  to,       0, ADD
b540: 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(9), 0},.      
b550: 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
b560: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
b570: 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a   /* 8 */.    };.
b580: 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20      int base;.  
b590: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b5a0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
b5b0: 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e  .    sqliteBegin
b5c0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
b5d0: 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 73  Parse, 0);.    s
b5e0: 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54  qliteOpenMasterT
b5f0: 61 62 6c 65 28 76 2c 20 70 54 61 62 2d 3e 69 73  able(v, pTab->is
b600: 54 65 6d 70 29 3b 0a 20 20 20 20 62 61 73 65 20  Temp);.    base 
b610: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
b620: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
b630: 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c 20 64  ze(dropIndex), d
b640: 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  ropIndex);.    s
b650: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
b660: 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e  3(v, base+1, pIn
b670: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
b680: 20 20 20 20 69 66 28 20 21 70 54 61 62 2d 3e 69      if( !pTab->i
b690: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73  sTemp ){.      s
b6a0: 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69  qliteChangeCooki
b6b0: 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a  e(db, v);.    }.
b6c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
b6d0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
b6e0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
b6f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
b700: 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e 64 65  P_Destroy, pInde
b710: 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69  x->tnum, pTab->i
b720: 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  sTemp);.    sqli
b730: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
b740: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
b750: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
b760: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63  e in-memory desc
b770: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ription of this 
b780: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66  index..  */.  if
b790: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
b7a0: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
b7b0: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49  UnlinkAndDeleteI
b7c0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
b7d0: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
b7e0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
b7f0: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a  Changes;.  }.}..
b800: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
b810: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
b820: 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
b830: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
b840: 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
b850: 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
b860: 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
b870: 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
b880: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
b890: 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
b8a0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c  IdListAppend(IdL
b8b0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
b8c0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
b8d0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
b8e0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
b8f0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
b900: 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
b910: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
b920: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
b930: 20 28 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37   (pList->nId & 7
b940: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
b950: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
b960: 61 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  a;.    a = sqlit
b970: 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
b980: 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 49 64 2b 38  a, (pList->nId+8
b990: 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
b9a0: 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
b9b0: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   a==0 ){.      s
b9c0: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
b9d0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
b9e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
b9f0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
ba00: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
ba10: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
ba20: 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  nId], 0, sizeof(
ba30: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
ba40: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
ba50: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
ba60: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
ba70: 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  nId].zName;.    
ba80: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
ba90: 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  (pz, pToken->z, 
baa0: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
bab0: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
bac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c  .      sqliteIdL
bad0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
bae0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
baf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bb00: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
bb10: 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
bb20: 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
bb30: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
bb40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
bb50: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
bb60: 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
bb70: 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
bb80: 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
bb90: 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
bba0: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
bbb0: 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
bbc0: 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b  ist even if pTok
bbd0: 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  en is NULL..**.*
bbe0: 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20  * A new SrcList 
bbf0: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
bc00: 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
bc10: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 53 72 63 4c 69   fails..*/.SrcLi
bc20: 73 74 20 2a 73 71 6c 69 74 65 53 72 63 4c 69 73  st *sqliteSrcLis
bc30: 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20  tAppend(SrcList 
bc40: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
bc50: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
bc60: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
bc70: 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
bc80: 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  oc( sizeof(IdLis
bc90: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
bca0: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
bcb0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4c  0;.  }.  if( (pL
bcc0: 69 73 74 2d 3e 6e 53 72 63 20 26 20 37 29 3d 3d  ist->nSrc & 7)==
bcd0: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
bce0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  SrcList_item *a;
bcf0: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52  .    a = sqliteR
bd00: 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
bd10: 20 28 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 38 29   (pList->nSrc+8)
bd20: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
bd30: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
bd40: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  a==0 ){.      sq
bd50: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
bd60: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
bd70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
bd80: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
bd90: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
bda0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
bdb0: 6e 53 72 63 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nSrc], 0, sizeof
bdc0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
bdd0: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
bde0: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
bdf0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
be00: 3e 6e 53 72 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  >nSrc].zName;.  
be10: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
be20: 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  ng(pz, pToken->z
be30: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
be40: 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20  .    if( *pz==0 
be50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
be60: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  rcListDelete(pLi
be70: 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
be80: 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
be90: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 71 75        sqliteDequ
bea0: 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a  ote(*pz);.    }.
beb0: 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72    }.  pList->nSr
bec0: 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  c++;.  return pL
bed0: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ist;.}../*.** Ad
bee0: 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
bef0: 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
bf00: 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
bf10: 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
bf20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 72  */.void sqliteSr
bf30: 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53 72  cListAddAlias(Sr
bf40: 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  cList *pList, To
bf50: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
bf60: 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
bf70: 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20  st->nSrc>0 ){.  
bf80: 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
bf90: 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 73  >nSrc - 1;.    s
bfa0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
bfb0: 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  &pList->a[i].zAl
bfc0: 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ias, pToken->z, 
bfd0: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
bfe0: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
bff0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
c000: 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ias);.  }.}../*.
c010: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
c020: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
c030: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
c040: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
c050: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
c060: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
c070: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
c080: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
c090: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
c0a0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
c0b0: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
c0c0: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
c0d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
c0e0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
c0f0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
c100: 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
c110: 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
c120: 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
c130: 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
c140: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49 64  .*/.int sqliteId
c150: 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
c160: 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
c170: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
c180: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
c190: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
c1a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
c1b0: 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
c1c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53  .    if( sqliteS
c1d0: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
c1e0: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
c1f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
c200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
c210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
c220: 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
c230: 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
c240: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
c250: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
c260: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53  eSrcListDelete(S
c270: 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
c280: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
c290: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
c2a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
c2b0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
c2c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
c2d0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
c2e0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
c2f0: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
c300: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28  zAlias);.    if(
c310: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61   pList->a[i].pTa
c320: 62 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  b && pList->a[i]
c330: 2e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65  .pTab->isTransie
c340: 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
c350: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  teDeleteTable(0,
c360: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61   pList->a[i].pTa
c370: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
c380: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
c390: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  (pList->a[i].pSe
c3a0: 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
c3b0: 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69 73  eExprDelete(pLis
c3c0: 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20  t->a[i].pOn);.  
c3d0: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
c3e0: 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  lete(pList->a[i]
c3f0: 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  .pUsing);.  }.  
c400: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
c410: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ->a);.  sqliteFr
c420: 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  ee(pList);.}../*
c430: 0a 2a 2a 20 54 68 65 20 43 4f 50 59 20 63 6f 6d  .** The COPY com
c440: 6d 61 6e 64 20 69 73 20 66 6f 72 20 63 6f 6d 70  mand is for comp
c450: 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 50  atibility with P
c460: 6f 73 74 67 72 65 53 51 4c 20 61 6e 64 20 73 70  ostgreSQL and sp
c470: 65 63 69 66 69 63 69 61 6c 6c 79 0a 2a 2a 20 66  ecificially.** f
c480: 6f 72 20 74 68 65 20 61 62 69 6c 69 74 79 20 74  or the ability t
c490: 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74 70 75  o read the outpu
c4a0: 74 20 6f 66 20 70 67 5f 64 75 6d 70 2e 20 20 54  t of pg_dump.  T
c4b0: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 0a  he format is as.
c4c0: 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  ** follows:.**.*
c4d0: 2a 20 20 20 20 43 4f 50 59 20 74 61 62 6c 65 20  *    COPY table 
c4e0: 46 52 4f 4d 20 66 69 6c 65 20 5b 55 53 49 4e 47  FROM file [USING
c4f0: 20 44 45 4c 49 4d 49 54 45 52 53 20 73 74 72 69   DELIMITERS stri
c500: 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74 61 62 6c 65  ng].**.** "table
c510: 22 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67  " is an existing
c520: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 57 65   table name.  We
c530: 20 77 69 6c 6c 20 72 65 61 64 20 6c 69 6e 65 73   will read lines
c540: 20 6f 66 20 63 6f 64 65 20 66 72 6f 6d 0a 2a 2a   of code from.**
c550: 20 66 69 6c 65 20 74 6f 20 66 69 6c 6c 20 74 68   file to fill th
c560: 69 73 20 74 61 62 6c 65 20 77 69 74 68 20 64 61  is table with da
c570: 74 61 2e 20 20 46 69 6c 65 20 6d 69 67 68 74 20  ta.  File might 
c580: 62 65 20 22 73 74 64 69 6e 22 2e 20 20 54 68 65  be "stdin".  The
c590: 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 65 6c   optional.** del
c5a0: 69 6d 69 74 65 72 20 73 74 72 69 6e 67 20 69 64  imiter string id
c5b0: 65 6e 74 69 66 69 65 73 20 74 68 65 20 66 69 65  entifies the fie
c5c0: 6c 64 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20  ld separators.  
c5d0: 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 61  The default is a
c5e0: 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   tab..*/.void sq
c5f0: 6c 69 74 65 43 6f 70 79 28 0a 20 20 50 61 72 73  liteCopy(.  Pars
c600: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c610: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
c620: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
c630: 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20  n *pTableName,  
c640: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   /* The name of 
c650: 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  the table into w
c660: 68 69 63 68 20 77 65 20 77 69 6c 6c 20 69 6e 73  hich we will ins
c670: 65 72 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ert */.  Token *
c680: 70 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a  pFilename,    /*
c690: 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77   The file from w
c6a0: 68 69 63 68 20 74 6f 20 6f 62 74 61 69 6e 20 69  hich to obtain i
c6b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
c6c0: 54 6f 6b 65 6e 20 2a 70 44 65 6c 69 6d 69 74 65  Token *pDelimite
c6d0: 72 2c 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73  r,   /* Use this
c6e0: 20 61 73 20 74 68 65 20 66 69 65 6c 64 20 64 65   as the field de
c6f0: 6c 69 6d 69 74 65 72 20 2a 2f 0a 20 20 69 6e 74  limiter */.  int
c700: 20 6f 6e 45 72 72 6f 72 20 20 20 20 20 20 20 20   onError        
c710: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
c720: 69 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  if a constraint 
c730: 66 61 69 6c 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  fails */.){.  Ta
c740: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 63 68 61  ble *pTab;.  cha
c750: 72 20 2a 7a 54 61 62 3b 0a 20 20 69 6e 74 20 69  r *zTab;.  int i
c760: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
c770: 6e 74 20 61 64 64 72 2c 20 65 6e 64 3b 0a 20 20  nt addr, end;.  
c780: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 73  Index *pIdx;.  s
c790: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
c7a0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a 54 61 62 20  se->db;..  zTab 
c7b0: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d  = sqliteTableNam
c7c0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c  eFromToken(pTabl
c7d0: 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71  eName);.  if( sq
c7e0: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
c7f0: 65 64 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20  ed || zTab==0 ) 
c800: 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75  goto copy_cleanu
c810: 70 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  p;.  pTab = sqli
c820: 74 65 54 61 62 6c 65 4e 61 6d 65 54 6f 54 61 62  teTableNameToTab
c830: 6c 65 28 70 50 61 72 73 65 2c 20 7a 54 61 62 29  le(pParse, zTab)
c840: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
c850: 54 61 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  Tab);.  if( pTab
c860: 3d 3d 30 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f  ==0 ) goto copy_
c870: 63 6c 65 61 6e 75 70 3b 0a 20 20 76 20 3d 20 73  cleanup;.  v = s
c880: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
c890: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
c8a0: 0a 20 20 20 20 69 6e 74 20 6f 70 65 6e 4f 70 3b  .    int openOp;
c8b0: 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e  .    sqliteBegin
c8c0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
c8d0: 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 61  Parse, 1);.    a
c8e0: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
c8f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65  AddOp(v, OP_File
c900: 4f 70 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Open, 0, 0);.   
c910: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
c920: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 46 69  eP3(v, addr, pFi
c930: 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c 65  lename->z, pFile
c940: 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  name->n);.    sq
c950: 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74 65 50  liteVdbeDequoteP
c960: 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  3(v, addr);.    
c970: 6f 70 65 6e 4f 70 20 3d 20 70 54 61 62 2d 3e 69  openOp = pTab->i
c980: 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 57  sTemp ? OP_OpenW
c990: 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 57 72  rAux : OP_OpenWr
c9a0: 69 74 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  ite;.    sqliteV
c9b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e  dbeAddOp(v, open
c9c0: 4f 70 2c 20 30 2c 20 70 54 61 62 2d 3e 74 6e 75  Op, 0, pTab->tnu
c9d0: 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  m);.    sqliteVd
c9e0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
c9f0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50  , pTab->zName, P
ca00: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 66  3_STATIC);.    f
ca10: 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61  or(i=1, pIdx=pTa
ca20: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
ca30: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
ca40: 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  t, i++){.      s
ca50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ca60: 2c 20 6f 70 65 6e 4f 70 2c 20 69 2c 20 70 49 64  , openOp, i, pId
ca70: 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  x->tnum);.      
ca80: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
ca90: 50 33 28 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e  P3(v, -1, pIdx->
caa0: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
cab0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
cac0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
cad0: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b  ITE_CountRows ){
cae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
caf0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
cb00: 65 67 65 72 2c 20 30 2c 20 30 29 3b 20 20 2f 2a  eger, 0, 0);  /*
cb10: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
cb20: 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  row count */.   
cb30: 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20 73 71 6c   }.    end = sql
cb40: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
cb50: 28 76 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  (v);.    addr = 
cb60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
cb70: 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61 64 2c 20  v, OP_FileRead, 
cb80: 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65 6e 64 29  pTab->nCol, end)
cb90: 3b 0a 20 20 20 20 69 66 28 20 70 44 65 6c 69 6d  ;.    if( pDelim
cba0: 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  iter ){.      sq
cbb0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
cbc0: 28 76 2c 20 61 64 64 72 2c 20 70 44 65 6c 69 6d  (v, addr, pDelim
cbd0: 69 74 65 72 2d 3e 7a 2c 20 70 44 65 6c 69 6d 69  iter->z, pDelimi
cbe0: 74 65 72 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 73  ter->n);.      s
cbf0: 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74 65  qliteVdbeDequote
cc00: 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  P3(v, addr);.   
cc10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
cc20: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
cc30: 28 76 2c 20 61 64 64 72 2c 20 22 5c 74 22 2c 20  (v, addr, "\t", 
cc40: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
cc50: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
cc60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
cc70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cc80: 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 70 54 61 62  FileColumn, pTab
cc90: 2d 3e 69 50 4b 65 79 2c 20 30 29 3b 0a 20 20 20  ->iPKey, 0);.   
cca0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
ccb0: 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  Op(v, OP_MustBeI
ccc0: 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  nt, 0, 0);.    }
ccd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
cce0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ccf0: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30  P_NewRecno, 0, 0
cd00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
cd10: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
cd20: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
cd30: 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( i==pTab->iPK
cd40: 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ey ){.        /*
cd50: 20 54 68 65 20 69 6e 74 65 67 65 72 20 70 72 69   The integer pri
cd60: 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  mary key column 
cd70: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 4e  is filled with N
cd80: 55 4c 4c 20 73 69 6e 63 65 20 69 74 73 0a 20 20  ULL since its.  
cd90: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69        ** value i
cda0: 73 20 61 6c 77 61 79 73 20 70 75 6c 6c 65 64 20  s always pulled 
cdb0: 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 20  from the record 
cdc0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20  number */.      
cdd0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cde0: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
cdf0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  0, 0);.      }el
ce00: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
ce10: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
ce20: 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e 2c 20 69 2c  P_FileColumn, i,
ce30: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ce40: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 47 65 6e   }.    sqliteGen
ce50: 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  erateConstraintC
ce60: 68 65 63 6b 73 28 70 50 61 72 73 65 2c 20 70 54  hecks(pParse, pT
ce70: 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ab, 0, 0, 0, 0, 
ce80: 6f 6e 45 72 72 6f 72 2c 20 61 64 64 72 29 3b 0a  onError, addr);.
ce90: 20 20 20 20 73 71 6c 69 74 65 43 6f 6d 70 6c 65      sqliteComple
cea0: 74 65 49 6e 73 65 72 74 69 6f 6e 28 70 50 61 72  teInsertion(pPar
ceb0: 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c 20  se, pTab, 0, 0, 
cec0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28  0, 0);.    if( (
ced0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
cee0: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d 30  TE_CountRows)!=0
cef0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
cf00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cf10: 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 20 20  AddImm, 1, 0);  
cf20: 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 72 6f 77  /* Increment row
cf30: 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a   count */.    }.
cf40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
cf50: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
cf60: 30 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71  0, addr);.    sq
cf70: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
cf80: 61 62 65 6c 28 76 2c 20 65 6e 64 29 3b 0a 20 20  abel(v, end);.  
cf90: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cfa0: 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c  p(v, OP_Noop, 0,
cfb0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45   0);.    sqliteE
cfc0: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
cfd0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
cfe0: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
cff0: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29  LITE_CountRows )
d000: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
d010: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
d020: 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 29  lumnCount, 1, 0)
d030: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d040: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
d050: 6c 75 6d 6e 4e 61 6d 65 2c 20 30 2c 20 30 29 3b  lumnName, 0, 0);
d060: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
d070: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
d080: 20 22 72 6f 77 73 20 69 6e 73 65 72 74 65 64 22   "rows inserted"
d090: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
d0a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d0b0: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
d0c0: 63 6b 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  ck, 1, 0);.    }
d0d0: 0a 20 20 7d 0a 20 20 0a 63 6f 70 79 5f 63 6c 65  .  }.  .copy_cle
d0e0: 61 6e 75 70 3a 0a 20 20 72 65 74 75 72 6e 3b 0a  anup:.  return;.
d0f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6e  }../*.** The non
d100: 2d 73 74 61 6e 64 61 72 64 20 56 41 43 55 55 4d  -standard VACUUM
d110: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
d120: 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65   to clean up the
d130: 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 63 6f   database,.** co
d140: 6c 6c 61 70 73 65 20 66 72 65 65 20 73 70 61 63  llapse free spac
d150: 65 2c 20 65 74 63 2e 20 20 49 74 20 69 73 20 6d  e, etc.  It is m
d160: 6f 64 65 6c 6c 65 64 20 61 66 74 65 72 20 74 68  odelled after th
d170: 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64  e VACUUM command
d180: 0a 2a 2a 20 69 6e 20 50 6f 73 74 67 72 65 53 51  .** in PostgreSQ
d190: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 76 65 72 73  L..**.** In vers
d1a0: 69 6f 6e 20 31 2e 30 2e 78 20 6f 66 20 53 51 4c  ion 1.0.x of SQL
d1b0: 69 74 65 2c 20 74 68 65 20 56 41 43 55 55 4d 20  ite, the VACUUM 
d1c0: 63 6f 6d 6d 61 6e 64 20 77 6f 75 6c 64 20 63 61  command would ca
d1d0: 6c 6c 0a 2a 2a 20 67 64 62 6d 5f 72 65 6f 72 67  ll.** gdbm_reorg
d1e0: 61 6e 69 7a 65 28 29 20 6f 6e 20 61 6c 6c 20 74  anize() on all t
d1f0: 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
d200: 65 73 2e 20 20 42 75 74 20 62 65 67 69 6e 6e 69  es.  But beginni
d210: 6e 67 0a 2a 2a 20 77 69 74 68 20 32 2e 30 2e 30  ng.** with 2.0.0
d220: 2c 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67  , SQLite no long
d230: 65 72 20 75 73 65 73 20 47 44 42 4d 20 73 6f 20  er uses GDBM so 
d240: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 68 61 73  this command has
d250: 0a 2a 2a 20 62 65 63 6f 6d 65 20 61 20 6e 6f 2d  .** become a no-
d260: 6f 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  op..*/.void sqli
d270: 74 65 56 61 63 75 75 6d 28 50 61 72 73 65 20 2a  teVacuum(Parse *
d280: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
d290: 54 61 62 6c 65 4e 61 6d 65 29 7b 0a 20 20 2f 2a  TableName){.  /*
d2a0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d   Do nothing */.}
d2b0: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
d2c0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
d2d0: 6f 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e 54  oid sqliteBeginT
d2e0: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
d2f0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
d300: 45 72 72 6f 72 29 7b 0a 20 20 73 71 6c 69 74 65  Error){.  sqlite
d310: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   *db;..  if( pPa
d320: 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
d330: 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
d340: 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74  db->pBe==0 ) ret
d350: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
d360: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
d370: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
d380: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
d390: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
d3a0: 54 45 5f 49 6e 54 72 61 6e 73 20 29 20 72 65 74  TE_InTrans ) ret
d3b0: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 42 65 67  urn;.  sqliteBeg
d3c0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
d3d0: 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 64  (pParse, 0);.  d
d3e0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
d3f0: 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62  TE_InTrans;.  db
d400: 2d 3e 70 69 64 20 3d 20 73 71 6c 69 74 65 4f 73  ->pid = sqliteOs
d410: 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 64  ProcessId();.  d
d420: 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45  b->onError = onE
d430: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rror;.}../*.** C
d440: 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
d450: 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
d460: 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  teCommitTransact
d470: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
d480: 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
d490: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
d4a0: 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
d4b0: 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
d4c0: 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBe==0 ) return;
d4d0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
d4e0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
d4f0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
d500: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d  turn;.  if( (db-
d510: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
d520: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 20 72 65  InTrans)==0 ) re
d530: 74 75 72 6e 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  turn;.  db->flag
d540: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54  s &= ~SQLITE_InT
d550: 72 61 6e 73 3b 0a 20 20 73 71 6c 69 74 65 45 6e  rans;.  sqliteEn
d560: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
d570: 70 50 61 72 73 65 29 3b 0a 20 20 64 62 2d 3e 6f  pParse);.  db->o
d580: 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61  nError = OE_Defa
d590: 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ult;.}../*.** Ro
d5a0: 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
d5b0: 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
d5c0: 69 74 65 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  iteRollbackTrans
d5d0: 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
d5e0: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20  arse){.  sqlite 
d5f0: 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
d600: 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
d610: 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
d620: 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42  db)==0 || db->pB
d630: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
d640: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
d650: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
d660: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
d670: 72 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66  rn;.  if( (db->f
d680: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
d690: 54 72 61 6e 73 29 3d 3d 30 20 29 20 72 65 74 75  Trans)==0 ) retu
d6a0: 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  rn;.  v = sqlite
d6b0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d6c0: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
d6d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d6e0: 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b 2c 20  v, OP_Rollback, 
d6f0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  0, 0);.  }.  db-
d700: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
d710: 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d  E_InTrans;.  db-
d720: 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65  >onError = OE_De
d730: 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fault;.}../*.** 
d740: 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
d750: 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73  de that prepares
d760: 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70   for doing an op
d770: 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  eration that.** 
d780: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
d790: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
d7a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   This routine st
d7b0: 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73  arts a new trans
d7c0: 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65  action if we are
d7d0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74   not already wit
d7e0: 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63  hin.** a transac
d7f0: 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65  tion.  If we are
d800: 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20   already within 
d810: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  a transaction, t
d820: 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  hen a checkpoint
d830: 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68  .** is set if th
d840: 65 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20  e setCheckpoint 
d850: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
d860: 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
d870: 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
d880: 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
d890: 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
d8a0: 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
d8b0: 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
d8c0: 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
d8d0: 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
d8e0: 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
d8f0: 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
d900: 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
d910: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
d920: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
d930: 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
d940: 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
d950: 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
d960: 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
d970: 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
d980: 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
d990: 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
d9a0: 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
d9b0: 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
d9c0: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
d9d0: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
d9e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d9f0: 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
da00: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
da10: 73 65 2c 20 69 6e 74 20 73 65 74 43 68 65 63 6b  se, int setCheck
da20: 70 6f 69 6e 74 29 7b 0a 20 20 56 64 62 65 20 2a  point){.  Vdbe *
da30: 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  v;.  v = sqliteG
da40: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
da50: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
da60: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
da70: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 20 72  e->trigStack ) r
da80: 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69  eturn; /* if thi
da90: 73 20 69 73 20 69 6e 20 61 20 74 72 69 67 67 65  s is in a trigge
daa0: 72 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 72  r */.  if( (pPar
dab0: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
dac0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
dad0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
dae0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
daf0: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20  Transaction, 0, 
db00: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
db10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65  beAddOp(v, OP_Ve
db20: 72 69 66 79 43 6f 6f 6b 69 65 2c 20 70 50 61 72  rifyCookie, pPar
db30: 73 65 2d 3e 64 62 2d 3e 73 63 68 65 6d 61 5f 63  se->db->schema_c
db40: 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20 70  ookie, 0);.    p
db50: 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56 65 72  Parse->schemaVer
db60: 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  ified = 1;.  }el
db70: 73 65 20 69 66 28 20 73 65 74 43 68 65 63 6b 70  se if( setCheckp
db80: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  oint ){.    sqli
db90: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
dba0: 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 30 2c  P_Checkpoint, 0,
dbb0: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
dbc0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
dbd0: 74 68 61 74 20 63 6f 6e 63 6c 75 64 65 73 20 61  that concludes a
dbe0: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
dbf0: 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
dc00: 64 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  d.** the databas
dc10: 65 2e 20 20 54 68 69 73 20 69 73 20 61 20 63 6f  e.  This is a co
dc20: 6d 70 61 6e 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  mpanion function
dc30: 20 74 6f 20 42 65 67 69 6e 57 72 69 74 65 4f 70   to BeginWriteOp
dc40: 65 72 61 74 69 6f 6e 28 29 2e 0a 2a 2a 20 49 66  eration()..** If
dc50: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
dc60: 61 73 20 73 74 61 72 74 65 64 2c 20 74 68 65 6e  as started, then
dc70: 20 63 6f 6d 6d 69 74 20 69 74 2e 20 20 49 66 20   commit it.  If 
dc80: 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 77 61 73  a checkpoint was
dc90: 0a 2a 2a 20 73 74 61 72 74 65 64 20 74 68 65 6e  .** started then
dca0: 20 63 6f 6d 6d 69 74 20 74 68 61 74 2e 0a 2a 2f   commit that..*/
dcb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 57  .void sqliteEndW
dcc0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
dcd0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
dce0: 56 64 62 65 20 2a 76 3b 0a 20 20 69 66 28 20 70  Vdbe *v;.  if( p
dcf0: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
dd00: 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66   ) return; /* if
dd10: 20 74 68 69 73 20 69 73 20 69 6e 20 61 20 74 72   this is in a tr
dd20: 69 67 67 65 72 20 2a 2f 0a 20 20 76 20 3d 20 73  igger */.  v = s
dd30: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
dd40: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
dd50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
dd60: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
dd70: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
dd80: 61 6e 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ans ){.    /* Do
dd90: 20 4e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65   Nothing */.  }e
dda0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  lse{.    sqliteV
ddb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
ddc0: 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 20 20  ommit, 0, 0);.  
ddd0: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  }.}.../*.** Inte
dde0: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
ddf0: 73 74 72 69 6e 67 20 61 73 20 61 20 62 6f 6f 6c  string as a bool
de00: 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  ean value..*/.st
de10: 61 74 69 63 20 69 6e 74 20 67 65 74 42 6f 6f 6c  atic int getBool
de20: 65 61 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ean(char *z){.  
de30: 73 74 61 74 69 63 20 63 68 61 72 20 2a 61 7a 54  static char *azT
de40: 72 75 65 5b 5d 20 3d 20 7b 20 22 79 65 73 22 2c  rue[] = { "yes",
de50: 20 22 6f 6e 22 2c 20 22 74 72 75 65 22 20 7d 3b   "on", "true" };
de60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
de70: 7a 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  z[0]==0 ) return
de80: 20 30 3b 0a 20 20 69 66 28 20 69 73 64 69 67 69   0;.  if( isdigi
de90: 74 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b 30 5d  t(z[0]) || (z[0]
dea0: 3d 3d 27 2d 27 20 26 26 20 69 73 64 69 67 69 74  =='-' && isdigit
deb0: 28 7a 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 72  (z[1])) ){.    r
dec0: 65 74 75 72 6e 20 61 74 6f 69 28 7a 29 3b 0a 20  eturn atoi(z);. 
ded0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
dee0: 73 69 7a 65 6f 66 28 61 7a 54 72 75 65 29 2f 73  sizeof(azTrue)/s
def0: 69 7a 65 6f 66 28 61 7a 54 72 75 65 5b 30 5d 29  izeof(azTrue[0])
df00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
df10: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c  sqliteStrICmp(z,
df20: 61 7a 54 72 75 65 5b 69 5d 29 3d 3d 30 20 29 20  azTrue[i])==0 ) 
df30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
df40: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
df50: 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70 72 61  ** Process a pra
df60: 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  gma statement.  
df70: 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73 20 61  .**.** Pragmas a
df80: 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72 6d 3a  re of this form:
df90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52 41 47  .**.**      PRAG
dfa0: 4d 41 20 69 64 20 3d 20 76 61 6c 75 65 0a 2a 2a  MA id = value.**
dfb0: 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69  .** The identifi
dfc0: 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  er might also be
dfd0: 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20   a string.  The 
dfe0: 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
dff0: 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69  g, and.** identi
e000: 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65  fier, or a numbe
e010: 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67  r.  If minusFlag
e020: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
e030: 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  he value is.** a
e040: 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61 73   number that was
e050: 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
e060: 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2f 0a 76 6f  inus sign..*/.vo
e070: 69 64 20 73 71 6c 69 74 65 50 72 61 67 6d 61 28  id sqlitePragma(
e080: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
e090: 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b  oken *pLeft, Tok
e0a0: 65 6e 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20  en *pRight, int 
e0b0: 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 63 68  minusFlag){.  ch
e0c0: 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b 0a 20  ar *zLeft = 0;. 
e0d0: 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20   char *zRight = 
e0e0: 30 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  0;.  sqlite *db 
e0f0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
e100: 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 53   zLeft = sqliteS
e110: 74 72 4e 44 75 70 28 70 4c 65 66 74 2d 3e 7a 2c  trNDup(pLeft->z,
e120: 20 70 4c 65 66 74 2d 3e 6e 29 3b 0a 20 20 73 71   pLeft->n);.  sq
e130: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4c 65 66  liteDequote(zLef
e140: 74 29 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73 46  t);.  if( minusF
e150: 6c 61 67 20 29 7b 0a 20 20 20 20 7a 52 69 67 68  lag ){.    zRigh
e160: 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t = 0;.    sqlit
e170: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 7a 52 69  eSetNString(&zRi
e180: 67 68 74 2c 20 22 2d 22 2c 20 31 2c 20 70 52 69  ght, "-", 1, pRi
e190: 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74 2d 3e  ght->z, pRight->
e1a0: 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n, 0);.  }else{.
e1b0: 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71 6c      zRight = sql
e1c0: 69 74 65 53 74 72 4e 44 75 70 28 70 52 69 67 68  iteStrNDup(pRigh
e1d0: 74 2d 3e 7a 2c 20 70 52 69 67 68 74 2d 3e 6e 29  t->z, pRight->n)
e1e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75  ;.    sqliteDequ
e1f0: 6f 74 65 28 7a 52 69 67 68 74 29 3b 0a 20 20 7d  ote(zRight);.  }
e200: 0a 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  . .  /*.  **  PR
e210: 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 63 61 63  AGMA default_cac
e220: 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  he_size.  **  PR
e230: 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 63 61 63  AGMA default_cac
e240: 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20  he_size=N.  **. 
e250: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
e260: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
e270: 75 72 72 65 6e 74 20 70 65 72 73 69 73 74 65 6e  urrent persisten
e280: 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68  t setting for th
e290: 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68  e.  ** page cach
e2a0: 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76 61 6c  e size.  The val
e2b0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
e2c0: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
e2d0: 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20  r of.  ** pages 
e2e0: 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
e2f0: 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66  e.  The second f
e300: 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20 74 68  orm sets both th
e310: 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70  e current.  ** p
e320: 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76  age cache size v
e330: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 65 72  alue and the per
e340: 73 69 73 74 65 6e 74 20 70 61 67 65 20 63 61 63  sistent page cac
e350: 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a 20 20  he size value.  
e360: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
e370: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
e380: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65    **.  ** The de
e390: 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65  fault cache size
e3a0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
e3b0: 74 61 2d 76 61 6c 75 65 20 32 20 6f 66 20 70 61  ta-value 2 of pa
e3c0: 67 65 20 31 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ge 1 of the.  **
e3d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
e3e0: 20 54 68 65 20 63 61 63 68 65 20 73 69 7a 65 20   The cache size 
e3f0: 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68 65 20  is actually the 
e400: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
e410: 66 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 6d 6f  f.  ** this memo
e420: 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68  ry location.  Th
e430: 65 20 73 69 67 6e 20 6f 66 20 6d 65 74 61 2d 76  e sign of meta-v
e440: 61 6c 75 65 20 32 20 64 65 74 65 72 6d 69 6e 65  alue 2 determine
e450: 73 20 74 68 65 0a 20 20 2a 2a 20 73 79 6e 63 68  s the.  ** synch
e460: 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67 2e 20  ronous setting. 
e470: 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   A negative valu
e480: 65 20 6d 65 61 6e 73 20 73 79 6e 63 68 72 6f 6e  e means synchron
e490: 6f 75 73 20 69 73 20 6f 66 66 0a 20 20 2a 2a 20  ous is off.  ** 
e4a0: 61 6e 64 20 61 20 70 6f 73 69 74 69 76 65 20 76  and a positive v
e4b0: 61 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e 63 68  alue means synch
e4c0: 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 2e 0a 20 20  ronous is on..  
e4d0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  */.  if( sqliteS
e4e0: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 64 65  trICmp(zLeft,"de
e4f0: 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65  fault_cache_size
e500: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  ")==0 ){.    sta
e510: 74 69 63 20 56 64 62 65 4f 70 20 67 65 74 43 61  tic VdbeOp getCa
e520: 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20  cheSize[] = {.  
e530: 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f      { OP_ReadCoo
e540: 6b 69 65 2c 20 20 30 2c 20 32 2c 20 20 20 20 20  kie,  0, 2,     
e550: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
e560: 50 5f 41 62 73 56 61 6c 75 65 2c 20 20 20 20 30  P_AbsValue,    0
e570: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
e580: 20 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20        { OP_Dup, 
e590: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20          0, 0,   
e5a0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
e5b0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20   OP_Integer,    
e5c0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
e5d0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c  ,.      { OP_Ne,
e5e0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 36 2c 20            0, 6, 
e5f0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
e600: 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
e610: 20 20 20 4d 41 58 5f 50 41 47 45 53 2c 30 2c 20     MAX_PAGES,0, 
e620: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
e630: 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30  olumnCount, 1, 0
e640: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
e650: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
e660: 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  me,  0, 0,      
e670: 20 20 22 63 61 63 68 65 5f 73 69 7a 65 22 7d 2c    "cache_size"},
e680: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c  .      { OP_Call
e690: 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20  back,    1, 0,  
e6a0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
e6b0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
e6c0: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
e6d0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
e6e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
e6f0: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d   if( pRight->z==
e700: 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20  pLeft->z ){.    
e710: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
e720: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
e730: 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29  ze(getCacheSize)
e740: 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 29 3b  , getCacheSize);
e750: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e760: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
e770: 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f    int size = ato
e780: 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
e790: 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69   if( size<0 ) si
e7a0: 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20  ze = -size;.    
e7b0: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
e7c0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
e7d0: 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  se, 0);.      sq
e7e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
e7f0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 69 7a   OP_Integer, siz
e800: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  e, 0);.      sql
e810: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e820: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 30  OP_ReadCookie, 0
e830: 2c 20 32 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 2);.      addr
e840: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
e850: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
e860: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
e870: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
e880: 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 61 64 64 72  , OP_Ge, 0, addr
e890: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
e8a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
e8b0: 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29  _Negative, 0, 0)
e8c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
e8d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
e8e0: 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a  tCookie, 0, 2);.
e8f0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57        sqliteEndW
e900: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
e910: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 64 62 2d  arse);.      db-
e920: 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 64 62  >cache_size = db
e930: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3c 30 20 3f  ->cache_size<0 ?
e940: 20 2d 73 69 7a 65 20 3a 20 73 69 7a 65 3b 0a 20   -size : size;. 
e950: 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65       sqliteBtree
e960: 53 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d  SetCacheSize(db-
e970: 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f  >pBe, db->cache_
e980: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  size);.    }.  }
e990: 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  else..  /*.  ** 
e9a0: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
e9b0: 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  ze.  **  PRAGMA 
e9c0: 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a  cache_size=N.  *
e9d0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
e9e0: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
e9f0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20  e current local 
ea00: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
ea10: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
ea20: 73 69 7a 65 2e 20 20 54 68 65 20 6c 6f 63 61 6c  size.  The local
ea30: 20 73 65 74 74 69 6e 67 20 63 61 6e 20 62 65 20   setting can be 
ea40: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 0a 20  different from. 
ea50: 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65   ** the persiste
ea60: 6e 74 20 63 61 63 68 65 20 73 69 7a 65 20 76 61  nt cache size va
ea70: 6c 75 65 20 74 68 61 74 20 69 73 20 73 74 6f 72  lue that is stor
ea80: 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
ea90: 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 73  se.  ** file its
eaa0: 65 6c 66 2e 20 20 54 68 65 20 76 61 6c 75 65 20  elf.  The value 
eab0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
eac0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
ead0: 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e 20  f.  ** pages in 
eae0: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
eaf0: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
eb00: 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a   sets the local.
eb10: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
eb20: 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 74 20  size value.  It 
eb30: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
eb40: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a 20  the persistent. 
eb50: 20 2a 2a 20 63 61 63 68 65 20 73 69 7a 65 20 73   ** cache size s
eb60: 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 64 69 73  tored on the dis
eb70: 6b 20 73 6f 20 74 68 65 20 63 61 63 68 65 20 73  k so the cache s
eb80: 69 7a 65 20 77 69 6c 6c 20 72 65 76 65 72 74 0a  ize will revert.
eb90: 20 20 2a 2a 20 74 6f 20 69 74 73 20 64 65 66 61    ** to its defa
eba0: 75 6c 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74  ult value when t
ebb0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
ebc0: 6c 6f 73 65 64 20 61 6e 64 20 72 65 6f 70 65 6e  losed and reopen
ebd0: 65 64 2e 0a 20 20 2a 2a 20 4e 20 73 68 6f 75 6c  ed..  ** N shoul
ebe0: 64 20 62 65 20 61 20 70 6f 73 69 74 69 76 65 20  d be a positive 
ebf0: 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  integer..  */.  
ec00: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
ec10: 70 28 7a 4c 65 66 74 2c 22 63 61 63 68 65 5f 73  p(zLeft,"cache_s
ec20: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
ec30: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 67 65  static VdbeOp ge
ec40: 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b  tCacheSize[] = {
ec50: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
ec60: 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20  mnCount, 1, 0,  
ec70: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
ec80: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  { OP_ColumnName,
ec90: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22    0, 0,        "
eca0: 63 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20  cache_size"},.  
ecb0: 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63      { OP_Callbac
ecc0: 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  k,    1, 0,     
ecd0: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
ece0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
ecf0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
ed00: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
ed10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
ed20: 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65  ( pRight->z==pLe
ed30: 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 69  ft->z ){.      i
ed40: 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61  nt size = db->ca
ed50: 63 68 65 5f 73 69 7a 65 3b 3b 0a 20 20 20 20 20  che_size;;.     
ed60: 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69   if( size<0 ) si
ed70: 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20  ze = -size;.    
ed80: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
ed90: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
eda0: 20 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20   size, 0);.     
edb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
edc0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
edd0: 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c  e(getCacheSize),
ede0: 20 67 65 74 43 61 63 68 65 53 69 7a 65 29 3b 0a   getCacheSize);.
edf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ee00: 20 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69   int size = atoi
ee10: 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  (zRight);.      
ee20: 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a  if( size<0 ) siz
ee30: 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
ee40: 20 69 66 28 20 64 62 2d 3e 63 61 63 68 65 5f 73   if( db->cache_s
ee50: 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d  ize<0 ) size = -
ee60: 73 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e  size;.      db->
ee70: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a  cache_size = siz
ee80: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  e;.      sqliteB
ee90: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
eea0: 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61  (db->pBe, db->ca
eeb0: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
eec0: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20  .  }else..  /*. 
eed0: 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61   **  PRAGMA defa
eee0: 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 0a  ult_synchronous.
eef0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66    **  PRAGMA def
ef00: 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73  ault_synchronous
ef10: 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20  =BOOLEAN.  **.  
ef20: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
ef30: 6d 20 72 65 74 75 72 6e 73 20 74 68 65 20 70 65  m returns the pe
ef40: 72 73 69 73 74 65 6e 74 20 76 61 6c 75 65 20 6f  rsistent value o
ef50: 66 20 74 68 65 20 22 73 79 6e 63 68 72 6f 6e 6f  f the "synchrono
ef60: 75 73 22 20 73 65 74 74 69 6e 67 0a 20 20 2a 2a  us" setting.  **
ef70: 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20   that is stored 
ef80: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
ef90: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 73 79    This is the sy
efa0: 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e  nchronous settin
efb0: 67 20 74 68 61 74 0a 20 20 2a 2a 20 69 73 20 75  g that.  ** is u
efc0: 73 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  sed whenever the
efd0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
efe0: 6e 65 64 20 75 6e 6c 65 73 73 20 6f 76 65 72 72  ned unless overr
eff0: 69 64 64 65 6e 20 62 79 20 61 20 73 65 70 61 72  idden by a separ
f000: 61 74 65 0a 20 20 2a 2a 20 22 73 79 6e 63 68 72  ate.  ** "synchr
f010: 6f 6e 6f 75 73 22 20 70 72 61 67 6d 61 2e 20 20  onous" pragma.  
f020: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
f030: 63 68 61 6e 67 65 73 20 74 68 65 20 70 65 72 73  changes the pers
f040: 69 73 74 65 6e 74 20 61 6e 64 20 74 68 65 0a 20  istent and the. 
f050: 20 2a 2a 20 6c 6f 63 61 6c 20 73 79 6e 63 68 72   ** local synchr
f060: 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67 20 74 6f  onous setting to
f070: 20 74 68 65 20 76 61 6c 75 65 20 67 69 76 65 6e   the value given
f080: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 73  ..  **.  ** If s
f090: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
f0a0: 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 64 6f  , SQLite will do
f0b0: 20 61 6e 20 66 73 79 6e 63 28 29 20 73 79 73 74   an fsync() syst
f0c0: 65 6d 20 63 61 6c 6c 20 61 74 20 73 74 72 61 74  em call at strat
f0d0: 65 67 69 63 0a 20 20 2a 2a 20 70 6f 69 6e 74 73  egic.  ** points
f0e0: 20 74 6f 20 69 6e 73 75 72 65 20 74 68 61 74 20   to insure that 
f0f0: 61 6c 6c 20 70 72 65 76 69 6f 75 73 6c 79 20 77  all previously w
f100: 72 69 74 74 65 6e 20 64 61 74 61 20 68 61 73 20  ritten data has 
f110: 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 0a 20 20  actually been.  
f120: 2a 2a 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  ** written onto 
f130: 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
f140: 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69   before continui
f150: 6e 67 2e 20 20 54 68 69 73 20 6d 6f 64 65 20 69  ng.  This mode i
f160: 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 2a 2a  nsures that.  **
f170: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69   the database wi
f180: 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e 20  ll always be in 
f190: 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  a consistent sta
f1a0: 74 65 20 65 76 65 6e 74 20 69 66 20 74 68 65 20  te event if the 
f1b0: 6f 70 65 72 61 74 69 6e 67 0a 20 20 2a 2a 20 73  operating.  ** s
f1c0: 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
f1d0: 20 70 6f 77 65 72 20 74 6f 20 74 68 65 20 63 6f   power to the co
f1e0: 6d 70 75 74 65 72 20 69 73 20 69 6e 74 65 72 72  mputer is interr
f1f0: 75 70 74 65 64 20 75 6e 65 78 70 65 63 74 65 64  upted unexpected
f200: 6c 79 2e 0a 20 20 2a 2a 20 57 68 65 6e 20 73 79  ly..  ** When sy
f210: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
f220: 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  , SQLite will no
f230: 74 20 77 61 69 74 20 66 6f 72 20 63 68 61 6e 67  t wait for chang
f240: 65 73 20 74 6f 20 61 63 74 75 61 6c 6c 79 0a 20  es to actually. 
f250: 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74   ** be written t
f260: 6f 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  o the disk befor
f270: 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 41  e continuing.  A
f280: 73 20 73 6f 6f 6e 20 61 73 20 69 74 20 68 61 6e  s soon as it han
f290: 64 73 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  ds changes.  ** 
f2a0: 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  to the operating
f2b0: 20 73 79 73 74 65 6d 2c 20 69 74 20 61 73 73 75   system, it assu
f2c0: 6d 65 73 20 74 68 61 74 20 74 68 65 20 63 68 61  mes that the cha
f2d0: 6e 67 65 73 20 61 72 65 20 70 65 72 6d 61 6e 65  nges are permane
f2e0: 6e 74 20 61 6e 64 0a 20 20 2a 2a 20 69 74 20 63  nt and.  ** it c
f2f0: 6f 6e 74 69 6e 75 65 73 20 67 6f 69 6e 67 2e 20  ontinues going. 
f300: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 61   The database ca
f310: 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
f320: 64 20 62 79 20 61 20 70 72 6f 67 72 61 6d 20 63  d by a program c
f330: 72 61 73 68 0a 20 20 2a 2a 20 65 76 65 6e 20 77  rash.  ** even w
f340: 69 74 68 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ith synchronous 
f350: 6f 66 66 2c 20 62 75 74 20 61 6e 20 6f 70 65 72  off, but an oper
f360: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61  ating system cra
f370: 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73  sh or power loss
f380: 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 70 6f 74 65  .  ** could pote
f390: 6e 74 69 61 6c 6c 79 20 63 6f 72 72 75 70 74 20  ntially corrupt 
f3a0: 64 61 74 61 2e 20 20 4f 6e 20 74 68 65 20 6f 74  data.  On the ot
f3b0: 68 65 72 20 68 61 6e 64 2c 20 73 79 6e 63 68 72  her hand, synchr
f3c0: 6f 6e 6f 75 73 20 6f 66 66 20 69 73 0a 20 20 2a  onous off is.  *
f3d0: 2a 20 66 61 73 74 65 72 20 74 68 61 6e 20 73 79  * faster than sy
f3e0: 6e 63 68 72 6f 6e 6f 75 73 20 6f 6e 2e 0a 20 20  nchronous on..  
f3f0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  */.  if( sqliteS
f400: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 64 65  trICmp(zLeft,"de
f410: 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75  fault_synchronou
f420: 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  s")==0 ){.    st
f430: 61 74 69 63 20 56 64 62 65 4f 70 20 67 65 74 53  atic VdbeOp getS
f440: 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ync[] = {.      
f450: 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20  { OP_Integer,   
f460: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
f470: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  },.      { OP_Re
f480: 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c  adCookie,  0, 2,
f490: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
f4a0: 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
f4b0: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
f4c0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
f4d0: 4c 74 2c 20 20 20 20 20 20 20 20 20 20 30 2c 20  Lt,          0, 
f4e0: 35 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  5,        0},.  
f4f0: 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c      { OP_AddImm,
f500: 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20        1, 0,     
f510: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
f520: 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31  P_ColumnCount, 1
f530: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
f540: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
f550: 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20  nName,  0, 0,   
f560: 20 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75       "synchronou
f570: 73 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  s"},.      { OP_
f580: 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20  Callback,    1, 
f590: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
f5a0: 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76    };.    Vdbe *v
f5b0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
f5c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
f5d0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
f5e0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
f5f0: 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a  >z==pLeft->z ){.
f600: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
f610: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
f620: 61 79 53 69 7a 65 28 67 65 74 53 79 6e 63 29 2c  aySize(getSync),
f630: 20 67 65 74 53 79 6e 63 29 3b 0a 20 20 20 20 7d   getSync);.    }
f640: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
f650: 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  addr;.      int 
f660: 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68 65  size = db->cache
f670: 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  _size;.      if(
f680: 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d   size<0 ) size =
f690: 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71   -size;.      sq
f6a0: 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
f6b0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
f6c0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f6d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f6e0: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 30 2c 20 32  ReadCookie, 0, 2
f6f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
f700: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
f710: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
f720: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
f730: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
f740: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
f750: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
f760: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 30 2c  dOp(v, OP_Ne, 0,
f770: 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20   addr+3);.      
f780: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
f790: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 4d 41  v, OP_AddImm, MA
f7a0: 58 5f 50 41 47 45 53 2c 20 30 29 3b 0a 20 20 20  X_PAGES, 0);.   
f7b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
f7c0: 4f 70 28 76 2c 20 4f 50 5f 41 62 73 56 61 6c 75  Op(v, OP_AbsValu
f7d0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
f7e0: 69 66 28 20 21 67 65 74 42 6f 6f 6c 65 61 6e 28  if( !getBoolean(
f7f0: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
f800: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
f810: 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76  Op(v, OP_Negativ
f820: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
f830: 20 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a    size = -size;.
f840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
f850: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
f860: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30   OP_SetCookie, 0
f870: 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
f880: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
f890: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
f8a0: 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a     db->cache_siz
f8b0: 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e = size;.      
f8c0: 73 71 6c 69 74 65 42 74 72 65 65 53 65 74 43 61  sqliteBtreeSetCa
f8d0: 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c  cheSize(db->pBe,
f8e0: 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29   db->cache_size)
f8f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
f900: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
f910: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a  GMA synchronous.
f920: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 79    **   PRAGMA sy
f930: 6e 63 68 72 6f 6e 6f 75 73 3d 42 4f 4f 4c 45 41  nchronous=BOOLEA
f940: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  N.  **.  ** Retu
f950: 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
f960: 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
f970: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 66 6c 61   synchronous fla
f980: 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a  g.  Changing.  *
f990: 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  * the local valu
f9a0: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20  e does not make 
f9b0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
f9c0: 69 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65  isk file and the
f9d0: 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61  .  ** default va
f9e0: 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74  lue will be rest
f9f0: 6f 72 65 64 20 74 68 65 20 6e 65 78 74 20 74 69  ored the next ti
fa00: 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  me the database 
fa10: 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a  is.  ** opened..
fa20: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
fa30: 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22  eStrICmp(zLeft,"
fa40: 73 79 6e 63 68 72 6f 6e 6f 75 73 22 29 3d 3d 30  synchronous")==0
fa50: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
fa60: 64 62 65 4f 70 20 67 65 74 53 79 6e 63 5b 5d 20  dbeOp getSync[] 
fa70: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  = {.      { OP_C
fa80: 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30  olumnCount, 1, 0
fa90: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
faa0: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
fab0: 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  me,  0, 0,      
fac0: 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 7d    "synchronous"}
fad0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c  ,.      { OP_Cal
fae0: 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20  lback,    1, 0, 
faf0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
fb00: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
fb10: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
fb20: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
fb30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
fb40: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d    if( pRight->z=
fb50: 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20  =pLeft->z ){.   
fb60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
fb70: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
fb80: 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  , db->cache_size
fb90: 3e 3d 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  >=0, 0);.      s
fba0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
fbb0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
fbc0: 67 65 74 53 79 6e 63 29 2c 20 67 65 74 53 79 6e  getSync), getSyn
fbd0: 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  c);.    }else{. 
fbe0: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
fbf0: 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 0a  db->cache_size;.
fc00: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30        if( size<0
fc10: 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b   ) size = -size;
fc20: 0a 20 20 20 20 20 20 69 66 28 20 21 67 65 74 42  .      if( !getB
fc30: 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
fc40: 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20   size = -size;. 
fc50: 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73       db->cache_s
fc60: 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ize = size;.    
fc70: 20 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74    sqliteBtreeSet
fc80: 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42  CacheSize(db->pB
fc90: 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a  e, db->cache_siz
fca0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
fcb0: 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
fcc0: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 74  trICmp(zLeft, "t
fcd0: 72 69 67 67 65 72 5f 6f 76 65 72 68 65 61 64 5f  rigger_overhead_
fce0: 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  test")==0 ){.   
fcf0: 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
fd00: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
fd10: 20 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72 69   always_code_tri
fd20: 67 67 65 72 5f 73 65 74 75 70 20 3d 20 31 3b 0a  gger_setup = 1;.
fd30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fd40: 20 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72 69   always_code_tri
fd50: 67 67 65 72 5f 73 65 74 75 70 20 3d 20 30 3b 0a  gger_setup = 0;.
fd60: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
fd70: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
fd80: 6d 70 28 7a 4c 65 66 74 2c 20 22 76 64 62 65 5f  mp(zLeft, "vdbe_
fd90: 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  trace")==0 ){.  
fda0: 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
fdb0: 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
fdc0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
fdd0: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b  QLITE_VdbeTrace;
fde0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fdf0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
fe00: 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65  SQLITE_VdbeTrace
fe10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
fe20: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
fe30: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 66 75 6c  ICmp(zLeft, "ful
fe40: 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 22 29  l_column_names")
fe50: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67  ==0 ){.    if( g
fe60: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
fe70: 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  ) ){.      db->f
fe80: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46  lags |= SQLITE_F
fe90: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20  ullColNames;.   
fea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
feb0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
fec0: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b  TE_FullColNames;
fed0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
fee0: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
fef0: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 73 68 6f 77  Cmp(zLeft, "show
ff00: 5f 64 61 74 61 74 79 70 65 73 22 29 3d 3d 30 20  _datatypes")==0 
ff10: 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
ff20: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
ff30: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
ff40: 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65 70 6f 72   |= SQLITE_Repor
ff50: 74 54 79 70 65 73 3b 0a 20 20 20 20 7d 65 6c 73  tTypes;.    }els
ff60: 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  e{.      db->fla
ff70: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 52 65  gs &= ~SQLITE_Re
ff80: 70 6f 72 74 54 79 70 65 73 3b 0a 20 20 20 20 7d  portTypes;.    }
ff90: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
ffa0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
ffb0: 65 66 74 2c 20 22 72 65 73 75 6c 74 5f 73 65 74  eft, "result_set
ffc0: 5f 64 65 74 61 69 6c 73 22 29 3d 3d 30 20 29 7b  _details")==0 ){
ffd0: 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c  .    if( getBool
ffe0: 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
fff0: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
10000 3d 20 53 51 4c 49 54 45 5f 52 65 73 75 6c 74 44  = SQLITE_ResultD
10010 65 74 61 69 6c 73 3b 0a 20 20 20 20 7d 65 6c 73  etails;.    }els
10020 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  e{.      db->fla
10030 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 52 65  gs &= ~SQLITE_Re
10040 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20  sultDetails;.   
10050 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
10060 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
10070 7a 4c 65 66 74 2c 20 22 63 6f 75 6e 74 5f 63 68  zLeft, "count_ch
10080 61 6e 67 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  anges")==0 ){.  
10090 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
100a0 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
100b0 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
100c0 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b  QLITE_CountRows;
100d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
100e0 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
100f0 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
10100 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
10110 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
10120 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 65 6d 70  ICmp(zLeft, "emp
10130 74 79 5f 72 65 73 75 6c 74 5f 63 61 6c 6c 62 61  ty_result_callba
10140 63 6b 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  cks")==0 ){.    
10150 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a  if( getBoolean(z
10160 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
10170 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
10180 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b  ITE_NullCallback
10190 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
101a0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
101b0 7e 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c  ~SQLITE_NullCall
101c0 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  back;.    }.  }e
101d0 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
101e0 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
101f0 22 74 61 62 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30  "table_info")==0
10200 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
10210 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  Tab;.    Vdbe *v
10220 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
10230 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
10240 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66   zRight);.    if
10250 28 20 70 54 61 62 20 29 20 76 20 3d 20 73 71 6c  ( pTab ) v = sql
10260 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
10270 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  e);.    if( pTab
10280 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73   && v ){.      s
10290 74 61 74 69 63 20 56 64 62 65 4f 70 20 74 61 62  tatic VdbeOp tab
102a0 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20  leInfoPreface[] 
102b0 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
102c0 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 35 2c  _ColumnCount, 5,
102d0 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   0,       0},.  
102e0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
102f0 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20  nName,  0, 0,   
10300 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20      "cid"},.    
10310 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
10320 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20  ame,  1, 0,     
10330 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20    "name"},.     
10340 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
10350 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20  me,  2, 0,      
10360 20 22 74 79 70 65 22 7d 2c 0a 20 20 20 20 20 20   "type"},.      
10370 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
10380 65 2c 20 20 33 2c 20 30 2c 20 20 20 20 20 20 20  e,  3, 0,       
10390 22 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20  "notnull"},.    
103a0 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
103b0 61 6d 65 2c 20 20 34 2c 20 30 2c 20 20 20 20 20  ame,  4, 0,     
103c0 20 20 22 64 66 6c 74 5f 76 61 6c 75 65 22 7d 2c    "dflt_value"},
103d0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
103e0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c  int i;.      sql
103f0 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
10400 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61  (v, ArraySize(ta
10410 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c  bleInfoPreface),
10420 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63   tableInfoPrefac
10430 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
10440 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
10450 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
10460 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
10470 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
10480 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
10490 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
104a0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
104b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
104c0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
104d0 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
104e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
104f0 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
10500 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  , pTab->aCol[i].
10510 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
10520 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10530 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
10540 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
10550 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
10560 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
10570 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  , .           pT
10580 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  ab->aCol[i].zTyp
10590 65 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e ? pTab->aCol[i
105a0 5d 2e 7a 54 79 70 65 20 3a 20 22 74 65 78 74 22  ].zType : "text"
105b0 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
105c0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
105d0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
105e0 67 65 72 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ger, pTab->aCol[
105f0 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29 3b 0a  i].notNull, 0);.
10600 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
10610 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
10620 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
10630 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
10640 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
10650 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66  Tab->aCol[i].zDf
10660 6c 74 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  lt, P3_STATIC);.
10670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
10680 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61  beAddOp(v, OP_Ca
10690 6c 6c 62 61 63 6b 2c 20 35 2c 20 30 29 3b 0a 20  llback, 5, 0);. 
106a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
106b0 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
106c0 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
106d0 20 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29 3d 3d   "index_info")==
106e0 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
106f0 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20  pIdx;.    Table 
10700 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20  *pTab;.    Vdbe 
10710 2a 76 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73  *v;.    pIdx = s
10720 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64  qliteFindIndex(d
10730 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  b, zRight);.    
10740 69 66 28 20 70 49 64 78 20 29 20 76 20 3d 20 73  if( pIdx ) v = s
10750 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
10760 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49  rse);.    if( pI
10770 64 78 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20  dx && v ){.     
10780 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 74   static VdbeOp t
10790 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b  ableInfoPreface[
107a0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
107b0 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
107c0 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  3, 0,       0},.
107d0 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
107e0 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
107f0 20 20 20 20 20 20 22 73 65 71 6e 6f 22 7d 2c 0a        "seqno"},.
10800 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
10810 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20  umnName,  1, 0, 
10820 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20        "cid"},.  
10830 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
10840 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20  nName,  2, 0,   
10850 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20      "name"},.   
10860 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
10870 69 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  i;.      pTab = 
10880 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  pIdx->pTable;.  
10890 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
108a0 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
108b0 53 69 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72  Size(tableInfoPr
108c0 65 66 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66  eface), tableInf
108d0 6f 50 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20  oPreface);.     
108e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
108f0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
10900 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6e 75  .        int cnu
10910 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  m = pIdx->aiColu
10920 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73  mn[i];.        s
10930 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
10940 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
10950 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
10960 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10970 4f 50 5f 49 6e 74 65 67 65 72 2c 20 63 6e 75 6d  OP_Integer, cnum
10980 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
10990 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
109a0 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
109b0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
109c0 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 63 6e  t( pTab->nCol>cn
109d0 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  um );.        sq
109e0 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
109f0 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43  (v, -1, pTab->aC
10a00 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20  ol[cnum].zName, 
10a10 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
10a20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10a30 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
10a40 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20 20  ck, 3, 0);.     
10a50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
10a60 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ..  if( sqliteSt
10a70 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e  rICmp(zLeft, "in
10a80 64 65 78 5f 6c 69 73 74 22 29 3d 3d 30 20 29 7b  dex_list")==0 ){
10a90 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
10aa0 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
10ab0 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  b;.    Vdbe *v;.
10ac0 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
10ad0 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
10ae0 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20  Right);.    if( 
10af0 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 76 20  pTab ){.      v 
10b00 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
10b10 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70  pParse);.      p
10b20 49 64 78 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  Idx = pTab->pInd
10b30 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
10b40 28 20 70 54 61 62 20 26 26 20 70 49 64 78 20 26  ( pTab && pIdx &
10b50 26 20 76 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  & v ){.      int
10b60 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 73   i = 0; .      s
10b70 74 61 74 69 63 20 56 64 62 65 4f 70 20 69 6e 64  tatic VdbeOp ind
10b80 65 78 4c 69 73 74 50 72 65 66 61 63 65 5b 5d 20  exListPreface[] 
10b90 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
10ba0 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c  _ColumnCount, 3,
10bb0 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   0,       0},.  
10bc0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
10bd0 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20  nName,  0, 0,   
10be0 20 20 20 20 22 73 65 71 22 7d 2c 0a 20 20 20 20      "seq"},.    
10bf0 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
10c00 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20  ame,  1, 0,     
10c10 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20    "name"},.     
10c20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
10c30 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20  me,  2, 0,      
10c40 20 22 75 6e 69 71 75 65 22 7d 2c 0a 20 20 20 20   "unique"},.    
10c50 20 20 7d 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69    };..      sqli
10c60 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
10c70 76 2c 20 41 72 72 61 79 53 69 7a 65 28 69 6e 64  v, ArraySize(ind
10c80 65 78 4c 69 73 74 50 72 65 66 61 63 65 29 2c 20  exListPreface), 
10c90 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65  indexListPreface
10ca0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 70  );.      while(p
10cb0 49 64 78 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Idx){.        sq
10cc0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
10cd0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
10ce0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
10cf0 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
10d00 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
10d10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
10d20 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
10d30 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  1, pIdx->zName, 
10d40 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
10d50 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10d60 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
10d70 72 2c 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  r, pIdx->onError
10d80 21 3d 4f 45 5f 4e 6f 6e 65 2c 20 30 29 3b 0a 20  !=OE_None, 0);. 
10d90 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
10da0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
10db0 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20  lback, 3, 0);.  
10dc0 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20        ++i;.     
10dd0 20 20 20 70 49 64 78 20 3d 20 70 49 64 78 2d 3e     pIdx = pIdx->
10de0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
10df0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
10e00 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
10e10 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
10e20 28 7a 4c 65 66 74 2c 20 22 70 61 72 73 65 72 5f  (zLeft, "parser_
10e30 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  trace")==0 ){.  
10e40 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71    extern void sq
10e50 6c 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28  liteParserTrace(
10e60 46 49 4c 45 2a 2c 20 63 68 61 72 20 2a 29 3b 0a  FILE*, char *);.
10e70 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
10e80 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
10e90 20 20 20 20 73 71 6c 69 74 65 50 61 72 73 65 72      sqliteParser
10ea0 54 72 61 63 65 28 73 74 64 6f 75 74 2c 20 22 70  Trace(stdout, "p
10eb0 61 72 73 65 72 3a 20 22 29 3b 0a 20 20 20 20 7d  arser: ");.    }
10ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
10ed0 74 65 50 61 72 73 65 72 54 72 61 63 65 28 30 2c  teParserTrace(0,
10ee0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
10ef0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  se.#endif..  if(
10f00 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
10f10 4c 65 66 74 2c 20 22 69 6e 74 65 67 72 69 74 79  Left, "integrity
10f20 5f 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20  _check")==0 ){. 
10f30 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
10f40 20 63 68 65 63 6b 44 62 5b 5d 20 3d 20 7b 0a 20   checkDb[] = {. 
10f50 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73       { OP_SetIns
10f60 65 72 74 2c 20 20 20 30 2c 20 30 2c 20 20 20 20  ert,   0, 0,    
10f70 20 20 20 20 22 32 22 7d 2c 0a 20 20 20 20 20 20      "2"},.      
10f80 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20  { OP_Open,      
10f90 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30    0, 2,        0
10fa0 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65  },.      { OP_Re
10fb0 77 69 6e 64 2c 20 20 20 20 20 20 30 2c 20 36 2c  wind,      0, 6,
10fc0 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
10fd0 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
10fe0 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20      0, 3,       
10ff0 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a   0},    /* 3 */.
11000 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e        { OP_SetIn
11010 73 65 72 74 2c 20 20 20 30 2c 20 30 2c 20 20 20  sert,   0, 0,   
11020 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
11030 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
11040 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d   0, 3,        0}
11050 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74  ,.      { OP_Int
11060 65 67 72 69 74 79 43 6b 2c 20 30 2c 20 30 2c 20  egrityCk, 0, 0, 
11070 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a         0},    /*
11080 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   6 */.      { OP
11090 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c  _ColumnCount, 1,
110a0 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
110b0 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
110c0 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
110d0 20 20 20 20 22 69 6e 74 65 67 72 69 74 79 5f 63      "integrity_c
110e0 68 65 63 6b 22 7d 2c 0a 20 20 20 20 20 20 7b 20  heck"},.      { 
110f0 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20  OP_Callback,    
11100 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
11110 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49  .      { OP_SetI
11120 6e 73 65 72 74 2c 20 20 20 31 2c 20 30 2c 20 20  nsert,   1, 0,  
11130 20 20 20 20 20 20 22 32 22 7d 2c 0a 20 20 20 20        "2"},.    
11140 20 20 7b 20 4f 50 5f 4f 70 65 6e 41 75 78 2c 20    { OP_OpenAux, 
11150 20 20 20 20 31 2c 20 32 2c 20 20 20 20 20 20 20      1, 2,       
11160 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
11170 52 65 77 69 6e 64 2c 20 20 20 20 20 20 31 2c 20  Rewind,      1, 
11180 31 36 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  16,       0},.  
11190 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
111a0 20 20 20 20 20 20 31 2c 20 33 2c 20 20 20 20 20        1, 3,     
111b0 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 33 20     0},    /* 13 
111c0 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65  */.      { OP_Se
111d0 74 49 6e 73 65 72 74 2c 20 20 20 31 2c 20 30 2c  tInsert,   1, 0,
111e0 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
111f0 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
11200 20 20 20 20 31 2c 20 31 33 2c 20 20 20 20 20 20      1, 13,      
11210 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
11220 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 31 2c 20  IntegrityCk, 1, 
11230 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  1,        0},   
11240 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20   /* 16 */.      
11250 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20  { OP_Callback,  
11260 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30    1, 0,        0
11270 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64  },.    };.    Vd
11280 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65  be *v = sqliteGe
11290 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
112a0 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
112b0 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
112c0 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
112d0 20 41 72 72 61 79 53 69 7a 65 28 63 68 65 63 6b   ArraySize(check
112e0 44 62 29 2c 20 63 68 65 63 6b 44 62 29 3b 0a 20  Db), checkDb);. 
112f0 20 7d 65 6c 73 65 0a 0a 20 20 7b 7d 0a 20 20 73   }else..  {}.  s
11300 71 6c 69 74 65 46 72 65 65 28 7a 4c 65 66 74 29  qliteFree(zLeft)
11310 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
11320 52 69 67 68 74 29 3b 0a 7d 0a                    Right);.}.