/ Hex Artifact Content
Login

Artifact 0116afe4f67687206364c4d1e88dc07aefc661de:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
02a0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
02b0: 20 20 20 20 20 42 45 47 49 4e 20 54 52 41 4e 53       BEGIN TRANS
02c0: 41 43 54 49 4f 4e 0a 2a 2a 20 20 20 20 20 43 4f  ACTION.**     CO
02d0: 4d 4d 49 54 0a 2a 2a 20 20 20 20 20 52 4f 4c 4c  MMIT.**     ROLL
02e0: 42 41 43 4b 0a 2a 2a 20 20 20 20 20 50 52 41 47  BACK.**     PRAG
02f0: 4d 41 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 62 75  MA.**.** $Id: bu
0300: 69 6c 64 2e 63 2c 76 20 31 2e 31 31 31 20 32 30  ild.c,v 1.111 20
0310: 30 32 2f 30 38 2f 33 31 20 31 38 3a 35 33 3a 30  02/08/31 18:53:0
0320: 36 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  6 drh Exp $.*/.#
0330: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0340: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h".#include <
0350: 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ctype.h>../*.** 
0360: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  called when a ne
0380: 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  w SQL statement 
0390: 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a  is beginning to.
03a0: 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 43  ** be parsed.  C
03b0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
03c0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
03d0: 65 20 64 61 74 61 62 61 73 65 20 6e 65 65 64 73  e database needs
03e0: 0a 2a 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66  .** to be read f
03f0: 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  rom the SQLITE_M
0400: 41 53 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45  ASTER and SQLITE
0410: 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62  _TEMP_MASTER tab
0420: 6c 65 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  les..** If it do
0430: 65 73 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74  es, then read it
0440: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0450: 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65  BeginParse(Parse
0460: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78   *pParse, int ex
0470: 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71  plainFlag){.  sq
0480: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
0490: 65 2d 3e 64 62 3b 0a 20 20 70 50 61 72 73 65 2d  e->db;.  pParse-
04a0: 3e 65 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61  >explain = expla
04b0: 69 6e 46 6c 61 67 3b 0a 20 20 69 66 28 28 64 62  inFlag;.  if((db
04c0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
04d0: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30  _Initialized)==0
04e0: 20 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74   && pParse->init
04f0: 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Flag==0 ){.    i
0500: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e  nt rc = sqliteIn
0510: 69 74 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e  it(db, &pParse->
0520: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
0530: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
0540: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
0550: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
0560: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
0570: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0580: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0590: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
05a0: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
05b0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
05c0: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 77 65  ** parsed and we
05d0: 20 77 61 6e 74 20 74 6f 20 65 78 65 63 75 74 65   want to execute
05e0: 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 74   the VDBE code t
05f0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20  o implement .** 
0600: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2e 20  that statement. 
0610: 20 50 72 69 6f 72 20 61 63 74 69 6f 6e 20 72 6f   Prior action ro
0620: 75 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61  utines should ha
0630: 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 63 6f  ve already.** co
0640: 6e 73 74 72 75 63 74 65 64 20 56 44 42 45 20 63  nstructed VDBE c
0650: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  ode to do the wo
0660: 72 6b 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  rk of the SQL st
0670: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73  atement..** This
0680: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61   routine just ha
0690: 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
06a0: 20 56 44 42 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a   VDBE code..**.*
06b0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61  * Note that if a
06c0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
06d0: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68  , it might be th
06e0: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e  e case that.** n
06f0: 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20  o VDBE code was 
0700: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f  generated..*/.vo
0710: 69 64 20 73 71 6c 69 74 65 45 78 65 63 28 50 61  id sqliteExec(Pa
0720: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
0730: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
0740: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  OK;.  sqlite *db
0750: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0760: 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   if( sqlite_mall
0770: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
0780: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
0790: 2d 3e 70 56 64 62 65 20 26 26 20 70 50 61 72 73  ->pVdbe && pPars
07a0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
07b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
07c0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 72  plain ){.      r
07d0: 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4c 69  c = sqliteVdbeLi
07e0: 73 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  st(pParse->pVdbe
07f0: 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62  , pParse->xCallb
0800: 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72  ack, pParse->pAr
0810: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
0830: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b  Parse->zErrMsg);
0840: 0a 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f  .      db->next_
0850: 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68  cookie = db->sch
0860: 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20  ema_cookie;.    
0870: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49 4c  }else{.      FIL
0880: 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e  E *trace = (db->
0890: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
08a0: 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73  dbeTrace)!=0 ? s
08b0: 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 20  tdout : 0;.     
08c0: 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63 65   sqliteVdbeTrace
08d0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
08e0: 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72 63  trace);.      rc
08f0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78 65   = sqliteVdbeExe
0900: 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  c(pParse->pVdbe,
0910: 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61   pParse->xCallba
0920: 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72 67  ck, pParse->pArg
0930: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 50               &pP
0950: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  arse->zErrMsg, d
0960: 62 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20 20  b->pBusyArg,.   
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 20 20 20 20 20 64 62 2d 3e 78 42 75 73 79         db->xBusy
0990: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  Callback);.     
09a0: 20 69 66 28 20 72 63 20 29 20 70 50 61 72 73 65   if( rc ) pParse
09b0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nErr++;.    }.
09c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
09d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56 64  lete(pParse->pVd
09e0: 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  be);.    pParse-
09f0: 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20 20  >pVdbe = 0;.    
0a00: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
0a10: 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Set = 0;.    pPa
0a20: 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
0a30: 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61    pParse->schema
0a40: 56 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20 20  Verified = 0;.  
0a50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  }.}../*.** Locat
0a60: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0a70: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0a80: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0a90: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0aa0: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0ab0: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0ac0: 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  at table.  Retur
0ad0: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
0ae0: 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  und..*/.Table *s
0af0: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73  qliteFindTable(s
0b00: 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74  qlite *db, const
0b10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
0b20: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d   Table *p;.  p =
0b30: 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28   sqliteHashFind(
0b40: 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  &db->tblHash, zN
0b50: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
0b60: 65 29 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  e)+1);.  return 
0b70: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
0b80: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0b90: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0ba0: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0bb0: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
0bc0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
0bd0: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a  of that index..*
0be0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
0bf0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49   not found..*/.I
0c00: 6e 64 65 78 20 2a 73 71 6c 69 74 65 46 69 6e 64  ndex *sqliteFind
0c10: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
0c20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
0c30: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
0c40: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61  ;.  p = sqliteHa
0c50: 73 68 46 69 6e 64 28 26 64 62 2d 3e 69 64 78 48  shFind(&db->idxH
0c60: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
0c70: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
0c80: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0c90: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
0ca0: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
0cb0: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
0cc0: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
0cd0: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
0ce0: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
0cf0: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
0d00: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
0d10: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
0d20: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
0d30: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
0d40: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
0d50: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
0d60: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
0d70: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
0d80: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
0d90: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
0da0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
0db0: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
0dc0: 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20  lite *db, Index 
0dd0: 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f  *p){.  Index *pO
0de0: 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  ld;.  assert( db
0df0: 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21  !=0 && p->zName!
0e00: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
0e10: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
0e20: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 2d  &db->idxHash, p-
0e30: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
0e40: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
0e50: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26    if( pOld!=0 &&
0e60: 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20   pOld!=p ){.    
0e70: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
0e80: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70  (&db->idxHash, p
0e90: 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  Old->zName, strl
0ea0: 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b  en(pOld->zName)+
0eb0: 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20  1, pOld);.  }.  
0ec0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
0ed0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
0ee0: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
0ef0: 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74  rom its table, t
0f00: 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68  hen remove.** th
0f10: 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  e index from the
0f20: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
0f30: 65 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d  e and free its m
0f40: 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75  emory.** structu
0f50: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
0f60: 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  iteUnlinkAndDele
0f70: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  teIndex(sqlite *
0f80: 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  db, Index *pInde
0f90: 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  x){.  if( pIndex
0fa0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
0fb0: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
0fc0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
0fd0: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
0fe0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
0ff0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
1000: 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d     for(p=pIndex-
1010: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
1020: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d   p && p->pNext!=
1030: 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65  pIndex; p=p->pNe
1040: 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 20  xt){}.    if( p 
1050: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
1060: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  dex ){.      p->
1070: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
1080: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
1090: 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  .  sqliteDeleteI
10a0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
10b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
10c0: 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f   all schema info
10d0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
10e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
10f0: 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 64 61 74  tables of.** dat
1100: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1110: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1120: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63  is called to rec
1130: 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62  laim memory.** b
1140: 65 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65 63  efore the connec
1150: 74 69 6f 6e 20 63 6c 6f 73 65 73 2e 20 20 49 74  tion closes.  It
1160: 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20   is also called 
1170: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
1180: 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65  k.** if there we
1190: 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  re schema change
11a0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  s during the tra
11b0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nsaction..*/.voi
11c0: 64 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74  d sqliteResetInt
11d0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69  ernalSchema(sqli
11e0: 74 65 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  te *db){.  HashE
11f0: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
1200: 73 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68  sh temp1;.  Hash
1210: 20 74 65 6d 70 32 3b 0a 0a 20 20 73 71 6c 69 74   temp2;..  sqlit
1220: 65 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  eHashClear(&db->
1230: 61 46 4b 65 79 29 3b 0a 20 20 74 65 6d 70 31 20  aFKey);.  temp1 
1240: 3d 20 64 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  = db->tblHash;. 
1250: 20 74 65 6d 70 32 20 3d 20 64 62 2d 3e 74 72 69   temp2 = db->tri
1260: 67 48 61 73 68 3b 0a 20 20 73 71 6c 69 74 65 48  gHash;.  sqliteH
1270: 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 74 72 69  ashInit(&db->tri
1280: 67 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41  gHash, SQLITE_HA
1290: 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20  SH_STRING, 0);. 
12a0: 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72   sqliteHashClear
12b0: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a  (&db->idxHash);.
12c0: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
12d0: 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d  teHashFirst(&tem
12e0: 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  p2); pElem; pEle
12f0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
1300: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 72  (pElem)){.    Tr
1310: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 20  igger *pTrigger 
1320: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
1330: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71 6c  (pElem);.    sql
1340: 69 74 65 44 65 6c 65 74 65 54 72 69 67 67 65 72  iteDeleteTrigger
1350: 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 7d 0a  (pTrigger);.  }.
1360: 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61    sqliteHashClea
1370: 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 73 71 6c  r(&temp2);.  sql
1380: 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62 2d  iteHashInit(&db-
1390: 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45  >tblHash, SQLITE
13a0: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29  _HASH_STRING, 0)
13b0: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
13c0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
13d0: 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45  emp1); pElem; pE
13e0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
13f0: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
1400: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
1410: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
1420: 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  em);.    sqliteD
1430: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1440: 54 61 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Tab);.  }.  sqli
1450: 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d  teHashClear(&tem
1460: 70 31 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  p1);.  db->flags
1470: 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 49 6e 69   &= ~(SQLITE_Ini
1480: 74 69 61 6c 69 7a 65 64 7c 53 51 4c 49 54 45 5f  tialized|SQLITE_
1490: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a  InternChanges);.
14a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
14b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
14c0: 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
14d0: 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20  ack occurs.  If 
14e0: 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63  there were.** sc
14f0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
1500: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
1510: 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76  ion, then we hav
1520: 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  e to reset the.*
1530: 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  * internal hash 
1540: 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61  tables and reloa
1550: 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b  d them from disk
1560: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1570: 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c  RollbackInternal
1580: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a  Changes(sqlite *
1590: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66  db){.  if( db->f
15a0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
15b0: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
15c0: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e     sqliteResetIn
15d0: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 29  ternalSchema(db)
15e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
15f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1600: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
1610: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
1620: 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  oid sqliteCommit
1630: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
1640: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 64  sqlite *db){.  d
1650: 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b->schema_cookie
1660: 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b   = db->next_cook
1670: 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  ie;.  db->flags 
1680: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
1690: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
16a0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
16b0: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
16c0: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
16d0: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
16e0: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
16f0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
1700: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
1710: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
1720: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
1730: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
1740: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
1750: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
1760: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
1770: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
1780: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
1790: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
17a0: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
17b0: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
17c0: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
17d0: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
17e0: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
17f0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
1800: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
1810: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
1820: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1830: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
1840: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
1850: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1860: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
1870: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
1880: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
1890: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
18a0: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
18b0: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
18c0: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
18d0: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
18e0: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
18f0: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
1900: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
1910: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1920: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  eDeleteTable(sql
1930: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
1940: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
1950: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ;.  Index *pInde
1960: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65  x, *pNext;.  FKe
1970: 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74  y *pFKey, *pNext
1980: 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61  FKey;..  if( pTa
1990: 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ble==0 ) return;
19a0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
19b0: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
19c0: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
19d0: 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  able.  */.  for(
19e0: 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d  pIndex = pTable-
19f0: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
1a00: 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a   pIndex=pNext){.
1a10: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64      pNext = pInd
1a20: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  ex->pNext;.    s
1a30: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
1a40: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
1a50: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
1a60: 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ll foreign keys 
1a70: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1a80: 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65  this table.  The
1a90: 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c   keys.  ** shoul
1aa0: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
1ab0: 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  een unlinked fro
1ac0: 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20  m the db->aFKey 
1ad0: 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f  hash table .  */
1ae0: 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61  .  for(pFKey=pTa
1af0: 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  ble->pFKey; pFKe
1b00: 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b  y; pFKey=pNextFK
1b10: 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b  ey){.    pNextFK
1b20: 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78  ey = pFKey->pNex
1b30: 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72  tFrom;.    asser
1b40: 74 28 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e  t( sqliteHashFin
1b50: 64 28 26 64 62 2d 3e 61 46 4b 65 79 2c 70 46 4b  d(&db->aFKey,pFK
1b60: 65 79 2d 3e 7a 54 6f 2c 73 74 72 6c 65 6e 28 70  ey->zTo,strlen(p
1b70: 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70  FKey->zTo)+1)!=p
1b80: 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69  FKey );.    sqli
1b90: 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20  teFree(pFKey);. 
1ba0: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
1bb0: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
1bc0: 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ure itself..  */
1bd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1be0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
1bf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1c00: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d  (pTable->aCol[i]
1c10: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  .zName);.    sql
1c20: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
1c30: 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a  aCol[i].zDflt);.
1c40: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1c50: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  Table->aCol[i].z
1c60: 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Type);.  }.  sql
1c70: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
1c80: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
1c90: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
1ca0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65  l);.  sqliteSele
1cb0: 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d  ctDelete(pTable-
1cc0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >pSelect);.  sql
1cd0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b  iteFree(pTable);
1ce0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
1cf0: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
1d00: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
1d10: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
1d20: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
1d30: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
1d40: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
1d50: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
1d60: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1d70: 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e  d sqliteUnlinkAn
1d80: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
1d90: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
1da0: 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c  p){.  Table *pOl
1db0: 64 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20  d;.  FKey *pF1, 
1dc0: 2a 70 46 32 3b 0a 20 20 61 73 73 65 72 74 28 20  *pF2;.  assert( 
1dd0: 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  db!=0 );.  pOld 
1de0: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1df0: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1e00: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
1e10: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
1e20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c  );.  assert( pOl
1e30: 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20  d==0 || pOld==p 
1e40: 29 3b 0a 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e  );.  for(pF1=p->
1e50: 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d  pFKey; pF1; pF1=
1e60: 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  pF1->pNextFrom){
1e70: 0a 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73  .    int nTo = s
1e80: 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20  trlen(pF1->zTo) 
1e90: 2b 20 31 3b 0a 20 20 20 20 70 46 32 20 3d 20 73  + 1;.    pF2 = s
1ea0: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
1eb0: 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a  b->aFKey, pF1->z
1ec0: 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66  To, nTo);.    if
1ed0: 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20  ( pF2==pF1 ){.  
1ee0: 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e      sqliteHashIn
1ef0: 73 65 72 74 28 26 64 62 2d 3e 61 46 4b 65 79 2c  sert(&db->aFKey,
1f00: 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20   pF1->zTo, nTo, 
1f10: 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20  pF1->pNextTo);. 
1f20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f30: 77 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46  while( pF2 && pF
1f40: 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20  2->pNextTo!=pF1 
1f50: 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78  ){ pF2=pF2->pNex
1f60: 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  tTo; }.      if(
1f70: 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20   pF2 ){.        
1f80: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  pF2->pNextTo = p
1f90: 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20  F1->pNextTo;.   
1fa0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1fb0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
1fc0: 6c 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  le(db, p);.}../*
1fd0: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68  .** Construct th
1fe0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 75 73 65 72  e name of a user
1ff0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
2000: 66 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a  from a token..**
2010: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
2020: 64 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6f 62  d the name is ob
2030: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
2040: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
2050: 75 73 74 0a 2a 2a 20 62 65 20 66 72 65 65 64 20  ust.** be freed 
2060: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
2070: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72  unction..*/.char
2080: 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d   *sqliteTableNam
2090: 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e  eFromToken(Token
20a0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
20b0: 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   *zName = sqlite
20c0: 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a  StrNDup(pName->z
20d0: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73  , pName->n);.  s
20e0: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4e 61  qliteDequote(zNa
20f0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e  me);.  return zN
2100: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ame;.}../*.** Ge
2110: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6f  nerate code to o
2120: 70 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  pen the appropri
2130: 61 74 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  ate master table
2140: 2e 20 20 54 68 65 20 74 61 62 6c 65 0a 2a 2a 20  .  The table.** 
2150: 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 53  opened will be S
2160: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 66 6f 72  QLITE_MASTER for
2170: 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c   persistent tabl
2180: 65 73 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54  es and .** SQLIT
2190: 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 66 6f  E_TEMP_MASTER fo
21a0: 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  r temporary tabl
21b0: 65 73 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69  es.  The table i
21c0: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 63  s opened.** on c
21d0: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
21e0: 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65   sqliteOpenMaste
21f0: 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20  rTable(Vdbe *v, 
2200: 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 69  int isTemp){.  i
2210: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
2220: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2230: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78  (v, OP_OpenWrAux
2240: 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 73 71 6c  , 0, 2);.    sql
2250: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
2260: 76 2c 20 2d 31 2c 20 54 45 4d 50 5f 4d 41 53 54  v, -1, TEMP_MAST
2270: 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54 41 54  ER_NAME, P3_STAT
2280: 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IC);.  }else{.  
2290: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
22a0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
22b0: 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 73 71  e, 0, 2);.    sq
22c0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
22d0: 28 76 2c 20 2d 31 2c 20 4d 41 53 54 45 52 5f 4e  (v, -1, MASTER_N
22e0: 41 4d 45 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  AME, P3_STATIC);
22f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  .  }.}../*.** Be
2300: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
2310: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
2320: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
2330: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
2340: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
2350: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
2360: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
2370: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
2380: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
2390: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
23a0: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
23b0: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
23c0: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
23d0: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
23e0: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
23f0: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
2400: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a  able name.  The.
2410: 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20  ** pStart token 
2420: 69 73 20 74 68 65 20 43 52 45 41 54 45 20 61 6e  is the CREATE an
2430: 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74  d pName is the t
2440: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
2450: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
2460: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
2470: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
2480: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
2490: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
24a0: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
24b0: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
24c0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
24d0: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
24e0: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
24f0: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
2500: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
2510: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
2520: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
2530: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
2540: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
2550: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
2560: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
2570: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
2580: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
2590: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
25a0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
25b0: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
25c0: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
25d0: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
25e0: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
25f0: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
2600: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
2610: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
2620: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
2630: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
2640: 65 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  eEndTable() rout
2650: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
2660: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
2670: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
2680: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
2690: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
26a0: 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28  qliteStartTable(
26b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
26c0: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 54 6f  oken *pStart, To
26d0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ken *pName, int 
26e0: 69 73 54 65 6d 70 29 7b 0a 20 20 54 61 62 6c 65  isTemp){.  Table
26f0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65   *pTable;.  Inde
2700: 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20  x *pIdx;.  char 
2710: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  *zName;.  sqlite
2720: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2730: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
2740: 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54   pParse->sFirstT
2750: 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a  oken = *pStart;.
2760: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
2770: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
2780: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
2790: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
27a0: 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  rn;..  /* Before
27b0: 20 74 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74   trying to creat
27c0: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
27d0: 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ble, make sure t
27e0: 68 65 20 42 74 72 65 65 20 66 6f 72 0a 20 20 2a  he Btree for.  *
27f0: 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72  * holding tempor
2800: 61 72 79 20 74 61 62 6c 65 73 20 69 73 20 6f 70  ary tables is op
2810: 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  en..  */.  if( i
2820: 73 54 65 6d 70 20 26 26 20 64 62 2d 3e 70 42 65  sTemp && db->pBe
2830: 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Temp==0 ){.    i
2840: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74  nt rc = sqliteBt
2850: 72 65 65 4f 70 65 6e 28 30 2c 20 30 2c 20 4d 41  reeOpen(0, 0, MA
2860: 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 70 42  X_PAGES, &db->pB
2870: 65 54 65 6d 70 29 3b 0a 20 20 20 20 69 66 28 20  eTemp);.    if( 
2880: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
28a0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
28b0: 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65  zErrMsg, "unable
28c0: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
28d0: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
28e0: 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
28f0: 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
2900: 61 72 79 20 74 61 62 6c 65 73 22 2c 20 30 29 3b  ary tables", 0);
2910: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
2920: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
2930: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
2940: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
2950: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b  QLITE_InTrans ){
2960: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2970: 74 65 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  teBtreeBeginTran
2980: 73 28 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b 0a  s(db->pBeTemp);.
2990: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29b0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
29c0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
29d0: 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20 74 6f  rMsg, "unable to
29e0: 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63   get a write loc
29f0: 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20  k on ".         
2a00: 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20   "the temporary 
2a10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 20  database file", 
2a20: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  0);.        pPar
2a30: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
2a40: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2a50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2a60: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
2a70: 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  e new table name
2a80: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64   does not collid
2a90: 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69  e with an existi
2aa0: 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  ng.  ** index or
2ab0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 49 73   table name.  Is
2ac0: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
2ad0: 73 61 67 65 20 69 66 20 69 74 20 64 6f 65 73 2e  sage if it does.
2ae0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
2af0: 20 61 72 65 20 72 65 2d 72 65 61 64 69 6e 67 20   are re-reading 
2b00: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
2b10: 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20  r table because 
2b20: 6f 66 20 61 20 73 63 68 65 6d 61 0a 20 20 2a 2a  of a schema.  **
2b30: 20 63 68 61 6e 67 65 20 61 6e 64 20 61 20 6e 65   change and a ne
2b40: 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c  w permanent tabl
2b50: 65 20 69 73 20 66 6f 75 6e 64 20 77 68 6f 73 65  e is found whose
2b60: 20 6e 61 6d 65 20 63 6f 6c 6c 69 64 65 73 20 77   name collides w
2b70: 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 78 69 73  ith.  ** an exis
2b80: 74 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ting temporary t
2b90: 61 62 6c 65 2c 20 74 68 65 6e 20 69 67 6e 6f 72  able, then ignor
2ba0: 65 20 74 68 65 20 6e 65 77 20 70 65 72 6d 61 6e  e the new perman
2bb0: 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 20  ent table..  ** 
2bc0: 57 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  We will continue
2bd0: 20 70 61 72 73 69 6e 67 2c 20 62 75 74 20 74 68   parsing, but th
2be0: 65 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43 6c  e pParse->nameCl
2bf0: 61 73 68 20 66 6c 61 67 20 77 69 6c 6c 20 62 65  ash flag will be
2c00: 20 73 65 74 0a 20 20 2a 2a 20 73 6f 20 77 65 20   set.  ** so we 
2c10: 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f 20 64 69 73  will know to dis
2c20: 63 61 72 64 20 74 68 65 20 74 61 62 6c 65 20 72  card the table r
2c30: 65 63 6f 72 64 20 6f 6e 63 65 20 70 61 72 73 69  ecord once parsi
2c40: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e  ng has finished.
2c50: 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65 20 3d  .  */.  pTable =
2c60: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
2c70: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  (db, zName);.  i
2c80: 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  f( pTable!=0 ){.
2c90: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e      if( pTable->
2ca0: 69 73 54 65 6d 70 20 26 26 20 70 50 61 72 73 65  isTemp && pParse
2cb0: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
2cc0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65      pParse->name
2cd0: 43 6c 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Clash = 1;.    }
2ce0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2cf0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
2d00: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
2d10: 74 61 62 6c 65 20 22 2c 20 30 2c 20 70 4e 61 6d  table ", 0, pNam
2d20: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 0a  e->z, pName->n,.
2d30: 20 20 20 20 20 20 20 20 20 20 22 20 61 6c 72 65            " alre
2d40: 61 64 79 20 65 78 69 73 74 73 22 2c 20 30 2c 20  ady exists", 0, 
2d50: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2d60: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
2d70: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
2d80: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  +;.      return;
2d90: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2da0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65      pParse->name
2db0: 43 6c 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 20  Clash = 0;.  }. 
2dc0: 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c   if( (pIdx = sql
2dd0: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
2de0: 20 7a 4e 61 6d 65 29 29 21 3d 30 20 26 26 0a 20   zName))!=0 &&. 
2df0: 20 20 20 20 20 20 20 20 20 28 21 70 49 64 78 2d           (!pIdx-
2e00: 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20  >pTable->isTemp 
2e10: 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  || !pParse->init
2e20: 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 73 71 6c  Flag) ){.    sql
2e30: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
2e40: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
2e50: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
2e60: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
2e70: 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ", .       zName
2e80: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2e90: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
2ea0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
2eb0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2ec0: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
2ed0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
2ee0: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
2ef0: 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20   pTable==0 ){.  
2f00: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
2f10: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
2f20: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
2f30: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
2f40: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
2f50: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ;.  pTable->aCol
2f60: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
2f70: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
2f80: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30  able->pIndex = 0
2f90: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 73 54 65  ;.  pTable->isTe
2fa0: 6d 70 20 3d 20 69 73 54 65 6d 70 3b 0a 20 20 69  mp = isTemp;.  i
2fb0: 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
2fc0: 61 62 6c 65 20 29 20 73 71 6c 69 74 65 44 65 6c  able ) sqliteDel
2fd0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61  eteTable(db, pPa
2fe0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b  rse->pNewTable);
2ff0: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
3000: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
3010: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
3020: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74  ating the code t
3030: 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20  hat will insert 
3040: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
3050: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53   into.  ** the S
3060: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
3070: 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72  le.  Note in par
3080: 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20  ticular that we 
3090: 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20  must go ahead.  
30a0: 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ** and allocate 
30b0: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
30c0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
30d0: 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f  entry now.  Befo
30e0: 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d  re any.  ** PRIM
30f0: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
3100: 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70  E keywords are p
3110: 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65  arsed.  Those ke
3120: 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73  ywords will caus
3130: 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74  e.  ** indices t
3140: 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64  o be created and
3150: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
3160: 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f  d must come befo
3170: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64  re the .  ** ind
3180: 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ices.  Hence, th
3190: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
31a0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
31b0: 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
31c0: 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20    ** now..  */. 
31d0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e   if( !pParse->in
31e0: 69 74 46 6c 61 67 20 26 26 20 28 76 20 3d 20 73  itFlag && (v = s
31f0: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
3200: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
3210: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
3220: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
3230: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69  , 0);.    if( !i
3240: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73  sTemp ){.      s
3250: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3260: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
3270: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30  ->file_format, 0
3280: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
3290: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
32a0: 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 31 29 3b  etCookie, 0, 1);
32b0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
32c0: 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  eOpenMasterTable
32d0: 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20  (v, isTemp);.   
32e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
32f0: 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c  (v, OP_NewRecno,
3300: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
3310: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3320: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
3330: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3340: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
3350: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
3360: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3370: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
3380: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3390: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
33a0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
33b0: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
33c0: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
33d0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
33e0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
33f0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
3400: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
3410: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
3420: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
3430: 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c   sqliteStartTabl
3440: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
3450: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
3460: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
3470: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
3480: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
3490: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
34a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64  /.void sqliteAdd
34b0: 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50  Column(Parse *pP
34c0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
34d0: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
34e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
34f0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d   *z = 0;.  Colum
3500: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28  n *pCol;.  if( (
3510: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
3520: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
3530: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e  rn;.  sqliteSetN
3540: 53 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d 65  String(&z, pName
3550: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30  ->z, pName->n, 0
3560: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
3570: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
3580: 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f  Dequote(z);.  fo
3590: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
35a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
35b0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c  sqliteStrICmp(z,
35c0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
35d0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
35e0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
35f0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
3600: 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75   "duplicate colu
3610: 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c 20 30  mn name: ", z, 0
3620: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
3630: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73  >nErr++;.      s
3640: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
3650: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
3660: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  }.  }.  if( (p->
3670: 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29  nCol & 0x7)==0 )
3680: 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e  {.    Column *aN
3690: 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73  ew;.    aNew = s
36a0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d  qliteRealloc( p-
36b0: 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b  >aCol, (p->nCol+
36c0: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
36d0: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
36e0: 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
36f0: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  ;.    p->aCol = 
3700: 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  aNew;.  }.  pCol
3710: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
3720: 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Col];.  memset(p
3730: 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Col, 0, sizeof(p
3740: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70  ->aCol[0]));.  p
3750: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a  Col->zName = z;.
3760: 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65    pCol->sortOrde
3770: 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  r = SQLITE_SO_NU
3780: 4d 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  M;.  p->nCol++;.
3790: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
37a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
37b0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
37c0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
37d0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
37e0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
37f0: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
3800: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
3810: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
3820: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
3830: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
3840: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
3850: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
3860: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
3870: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
3880: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
3890: 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  teAddNotNull(Par
38a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
38b0: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
38c0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
38d0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
38e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
38f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
3900: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
3910: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
3920: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  i].notNull = onE
3930: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rror;.}../*.** T
3940: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3950: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
3960: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
3970: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
3980: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
3990: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
39a0: 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65   The pFirst toke
39b0: 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n is the first.*
39c0: 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73  * token in the s
39d0: 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e  equence of token
39e0: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
39f0: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a  the type of the.
3a00: 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  ** column curren
3a10: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
3a20: 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20  uction.   pLast 
3a30: 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65  is the last toke
3a40: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75  n.** in the sequ
3a50: 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20  ence.  Use this 
3a60: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63  information to c
3a70: 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e  onstruct a strin
3a80: 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69  g.** that contai
3a90: 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20  ns the typename 
3aa0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e  of the column an
3ab0: 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72  d store that str
3ac0: 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e  ing.** in zType.
3ad0: 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
3ae0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
3af0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
3b00: 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65  en *pFirst, Toke
3b10: 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61 62  n *pLast){.  Tab
3b20: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20  le *p;.  int i, 
3b30: 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68  j;.  int n;.  ch
3b40: 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43  ar *z, **pz;.  C
3b50: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
3b60: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
3b70: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
3b80: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
3b90: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
3ba0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <0 ) return;.  p
3bb0: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69  Col = &p->aCol[i
3bc0: 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d  ];.  pz = &pCol-
3bd0: 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c  >zType;.  n = pL
3be0: 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 4c  ast->n + Addr(pL
3bf0: 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70  ast->z) - Addr(p
3c00: 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71 6c  First->z);.  sql
3c10: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  iteSetNString(pz
3c20: 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c 20  , pFirst->z, n, 
3c30: 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a 20  0);.  z = *pz;. 
3c40: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
3c50: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  rn;.  for(i=j=0;
3c60: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
3c70: 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20   int c = z[i];. 
3c80: 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28 63     if( isspace(c
3c90: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
3ca0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20    z[j++] = c;.  
3cb0: 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20  }.  z[j] = 0;.  
3cc0: 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20  pCol->sortOrder 
3cd0: 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b  = SQLITE_SO_NUM;
3ce0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
3cf0: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  b->file_format>=
3d00: 34 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  4 ){.    for(i=0
3d10: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
3d20: 20 20 20 20 73 77 69 74 63 68 28 20 7a 5b 69 5d      switch( z[i]
3d30: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
3d40: 20 27 62 27 3a 0a 20 20 20 20 20 20 20 20 63 61   'b':.        ca
3d50: 73 65 20 27 42 27 3a 20 7b 0a 20 20 20 20 20 20  se 'B': {.      
3d60: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
3d70: 72 4e 49 43 6d 70 28 26 7a 5b 69 5d 2c 22 62 6c  rNICmp(&z[i],"bl
3d80: 6f 62 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20  ob",4)==0 ){.   
3d90: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 73           pCol->s
3da0: 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54  ortOrder = SQLIT
3db0: 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20  E_SO_TEXT;.     
3dc0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
3dd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3de0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3df0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
3e00: 73 65 20 27 63 27 3a 0a 20 20 20 20 20 20 20 20  se 'c':.        
3e10: 63 61 73 65 20 27 43 27 3a 20 7b 0a 20 20 20 20  case 'C': {.    
3e20: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
3e30: 53 74 72 4e 49 43 6d 70 28 26 7a 5b 69 5d 2c 22  StrNICmp(&z[i],"
3e40: 63 68 61 72 22 2c 34 29 3d 3d 30 20 7c 7c 0a 20  char",4)==0 ||. 
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28   sqliteStrNICmp(
3e70: 26 7a 5b 69 5d 2c 22 63 6c 6f 62 22 2c 34 29 3d  &z[i],"clob",4)=
3e80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3e90: 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65    pCol->sortOrde
3ea0: 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45  r = SQLITE_SO_TE
3eb0: 58 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  XT;.            
3ec0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
3ed0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
3ee0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
3ef0: 20 20 20 20 20 20 20 63 61 73 65 20 27 78 27 3a         case 'x':
3f00: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 58  .        case 'X
3f10: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ': {.          i
3f20: 66 28 20 69 3e 3d 32 20 26 26 20 73 71 6c 69 74  f( i>=2 && sqlit
3f30: 65 53 74 72 4e 49 43 6d 70 28 26 7a 5b 69 2d 32  eStrNICmp(&z[i-2
3f40: 5d 2c 22 74 65 78 74 22 2c 34 29 3d 3d 30 20 29  ],"text",4)==0 )
3f50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
3f60: 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  ol->sortOrder = 
3f70: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
3f90: 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rn;.          }.
3fa0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
3fb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3fc0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
3fd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3fe0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3ff0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4000: 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f  .** The given to
4010: 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ken is the defau
4020: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
4030: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
4040: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62  ed to.** the tab
4050: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
4060: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
4070: 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22    If "minusFlag"
4080: 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20   is true, it.** 
4090: 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20  means the value 
40a0: 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64  token was preced
40b0: 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69  ed by a minus si
40c0: 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gn..**.** This r
40d0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
40e0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
40f0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
4100: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
4110: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
4120: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
4130: 69 64 20 73 71 6c 69 74 65 41 64 64 44 65 66 61  id sqliteAddDefa
4140: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
4150: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
4160: 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c  Val, int minusFl
4170: 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  ag){.  Table *p;
4180: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
4190: 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20   **pz;.  if( (p 
41a0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
41b0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
41c0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
41d0: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
41e0: 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70  eturn;.  pz = &p
41f0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b  ->aCol[i].zDflt;
4200: 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67  .  if( minusFlag
4210: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
4220: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22  tNString(pz, "-"
4230: 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56  , 1, pVal->z, pV
4240: 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c  al->n, 0);.  }el
4250: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  se{.    sqliteSe
4260: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 56 61  tNString(pz, pVa
4270: 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30  l->z, pVal->n, 0
4280: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44  );.  }.  sqliteD
4290: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a  equote(*pz);.}..
42a0: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
42b0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
42c0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
42d0: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
42e0: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
42f0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
4300: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
4310: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
4320: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
4330: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
4340: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
4350: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
4360: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
4370: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
4380: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
4390: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
43a0: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
43b0: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
43c0: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
43d0: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
43e0: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
43f0: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
4400: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
4410: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
4420: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
4430: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
4440: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
4450: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
4460: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
4470: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
4480: 6f 77 20 69 64 2e 20 20 28 45 78 63 65 70 74 69  ow id.  (Excepti
4490: 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77  on:.** For backw
44a0: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
44b0: 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61  ty with older da
44c0: 74 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20  tabases, do not 
44d0: 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68  do this.** if th
44e0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65  e file format ve
44f0: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20  rsion number is 
4500: 6c 65 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53  less than 1.)  S
4510: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
4520: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
4530: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
4540: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
4550: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
4560: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
4570: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
4580: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
4590: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
45a0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
45b0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
45c0: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
45d0: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
45e0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
45f0: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
4600: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
4610: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
4620: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
4630: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
4640: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
4650: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 50 72  void sqliteAddPr
4660: 69 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a  imaryKey(Parse *
4670: 70 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a  pParse, IdList *
4680: 70 4c 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72  pList, int onErr
4690: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  or){.  Table *pT
46a0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
46b0: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
46c0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
46d0: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 69 66   iCol = -1;.  if
46e0: 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
46f0: 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  rn;.  if( pTab->
4700: 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20  hasPrimKey ){.  
4710: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
4720: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
4730: 73 67 2c 20 22 74 61 62 6c 65 20 5c 22 22 2c 20  sg, "table \"", 
4740: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  pTab->zName, .  
4750: 20 20 20 20 20 20 22 5c 22 20 68 61 73 20 6d 6f        "\" has mo
4760: 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d  re than one prim
4770: 61 72 79 20 6b 65 79 22 2c 20 30 29 3b 0a 20 20  ary key", 0);.  
4780: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
4790: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
47a0: 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69  }.  pTab->hasPri
47b0: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20  mKey = 1;.  if( 
47c0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
47d0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
47e0: 6c 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l - 1;.  }else i
47f0: 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3d 3d 31  f( pList->nId==1
4800: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c   ){.    for(iCol
4810: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
4820: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
4830: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
4840: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 30  rICmp(pList->a[0
4850: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
4860: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
4870: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
4880: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f   }.  }.  if( iCo
4890: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
48a0: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  b->nCol ){.    z
48b0: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
48c0: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
48d0: 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
48e0: 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  >db->file_format
48f0: 3e 3d 31 20 26 26 20 0a 20 20 20 20 20 20 20 20  >=1 && .        
4900: 20 20 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69     zType && sqli
4910: 74 65 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c  teStrICmp(zType,
4920: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 20 29   "INTEGER")==0 )
4930: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
4940: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
4950: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e  ab->keyConf = on
4960: 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Error;.  }else{.
4970: 20 20 20 20 73 71 6c 69 74 65 43 72 65 61 74 65      sqliteCreate
4980: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
4990: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
49a0: 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d  or, 0, 0);.  }.}
49b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
49c0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
49d0: 6f 6c 6c 61 74 69 6e 67 20 74 79 70 65 20 67 69  ollating type gi
49e0: 76 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ven the collatio
49f0: 6e 20 74 79 70 65 20 74 6f 6b 65 6e 2e 0a 2a 2a  n type token..**
4a00: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
4a10: 20 69 66 20 74 68 65 20 74 79 70 65 20 69 73 20   if the type is 
4a20: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e  undefined..*/.in
4a30: 74 20 73 71 6c 69 74 65 43 6f 6c 6c 61 74 65 54  t sqliteCollateT
4a40: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
4a50: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29  e, Token *pType)
4a60: 7b 0a 20 20 69 66 28 20 70 54 79 70 65 3d 3d 30  {.  if( pType==0
4a70: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
4a80: 5f 53 4f 5f 55 4e 4b 3b 0a 20 20 69 66 28 20 70  _SO_UNK;.  if( p
4a90: 54 79 70 65 2d 3e 6e 3d 3d 34 20 26 26 20 73 71  Type->n==4 && sq
4aa0: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70 54 79  liteStrNICmp(pTy
4ab0: 70 65 2d 3e 7a 2c 20 22 74 65 78 74 22 2c 20 34  pe->z, "text", 4
4ac0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
4ad0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  rn SQLITE_SO_TEX
4ae0: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 79  T;.  }.  if( pTy
4af0: 70 65 2d 3e 6e 3d 3d 37 20 26 26 20 73 71 6c 69  pe->n==7 && sqli
4b00: 74 65 53 74 72 4e 49 43 6d 70 28 70 54 79 70 65  teStrNICmp(pType
4b10: 2d 3e 7a 2c 20 22 6e 75 6d 65 72 69 63 22 2c 20  ->z, "numeric", 
4b20: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  7)==0 ){.    ret
4b30: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  urn SQLITE_SO_NU
4b40: 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 53  M;.  }.  sqliteS
4b50: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
4b60: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 6b  e->zErrMsg, "unk
4b70: 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 74  nown collating t
4b80: 79 70 65 3a 20 22 2c 20 2d 31 2c 0a 20 20 20 20  ype: ", -1,.    
4b90: 70 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d  pType->z, pType-
4ba0: 3e 6e 2c 20 30 29 3b 0a 20 20 70 50 61 72 73 65  >n, 0);.  pParse
4bb0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 72 65 74 75  ->nErr++;.  retu
4bc0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 4b  rn SQLITE_SO_UNK
4bd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4be0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4bf0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
4c00: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
4c10: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
4c20: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
4c30: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
4c40: 43 4f 4c 4c 41 54 45 22 20 63 6c 61 75 73 65 20  COLLATE" clause 
4c50: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e  has.** been seen
4c60: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54   on a column.  T
4c70: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
4c80: 20 74 68 65 20 43 6f 6c 75 6d 6e 2e 73 6f 72 74   the Column.sort
4c90: 4f 72 64 65 72 20 6f 6e 0a 2a 2a 20 74 68 65 20  Order on.** the 
4ca0: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
4cb0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
4cc0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4cd0: 69 74 65 41 64 64 43 6f 6c 6c 61 74 65 54 79 70  iteAddCollateTyp
4ce0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
4cf0: 20 69 6e 74 20 63 6f 6c 6c 54 79 70 65 29 7b 0a   int collType){.
4d00: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
4d10: 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  t i;.  if( (p = 
4d20: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4d30: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
4d40: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
4d50: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d  .  if( i>=0 ) p-
4d60: 3e 61 43 6f 6c 5b 69 5d 2e 73 6f 72 74 4f 72 64  >aCol[i].sortOrd
4d70: 65 72 20 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a 7d  er = collType;.}
4d80: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20  ../*.** Come up 
4d90: 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f  with a new rando
4da0: 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  m value for the 
4db0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20  schema cookie.  
4dc0: 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65  Make sure.** the
4dd0: 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 64 69   new value is di
4de0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
4df0: 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   old..**.** The 
4e00: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
4e10: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
4e20: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
4e30: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
4e40: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
4e50: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
4e60: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
4e70: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
4e80: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
4e90: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
4ea0: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
4eb0: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
4ec0: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
4ed0: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
4ee0: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
4ef0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
4f00: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
4f10: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
4f20: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
4f30: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
4f40: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
4f50: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
4f60: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
4f70: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
4f80: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
4f90: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
4fa0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
4fb0: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
4fc0: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
4fd0: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
4fe0: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
4ff0: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
5000: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
5010: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
5020: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
5030: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
5040: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
5050: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
5060: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
5070: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
5080: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
5090: 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f   sqliteChangeCoo
50a0: 6b 69 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  kie(sqlite *db, 
50b0: 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20  Vdbe *v){.  if( 
50c0: 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 3d  db->next_cookie=
50d0: 3d 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  =db->schema_cook
50e0: 69 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 65  ie ){.    db->ne
50f0: 78 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e  xt_cookie = db->
5100: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 2b 20  schema_cookie + 
5110: 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42 79 74 65  sqliteRandomByte
5120: 28 29 20 2b 20 31 3b 0a 20 20 20 20 64 62 2d 3e  () + 1;.    db->
5130: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
5140: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
5150: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5160: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
5170: 2c 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69  , db->next_cooki
5180: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
5190: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
51a0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 30  _SetCookie, 0, 0
51b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
51c0: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
51d0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
51e0: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
51f0: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
5200: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
5210: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
5220: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
5230: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
5240: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
5250: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
5260: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
5270: 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28  int identLength(
5280: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
5290: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
52a0: 65 65 64 51 75 6f 74 65 20 3d 20 30 3b 0a 20 20  eedQuote = 0;.  
52b0: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
52c0: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
52d0: 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e 2b 2b 3b  *z=='\'' ){ n++;
52e0: 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b 20 7d 0a   needQuote=1; }.
52f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
5300: 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b 0a 7d 0a   needQuote*2;.}.
5310: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
5320: 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20  identifier onto 
5330: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67  the end of the g
5340: 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64  iven string.  Ad
5350: 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61  d.** quote chara
5360: 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e  cters as needed.
5370: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5380: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
5390: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
53a0: 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20 69 6e  r *zIdent){.  in
53b0: 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74  t i, j, needQuot
53c0: 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a  e;.  i = *pIdx;.
53d0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
53e0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
53f0: 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64  if( !isalnum(zId
5400: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
5410: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
5420: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
5430: 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21  te =  zIdent[j]!
5440: 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49  =0 || isdigit(zI
5450: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
5460: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
5470: 6c 69 74 65 4b 65 79 77 6f 72 64 43 6f 64 65 28  liteKeywordCode(
5480: 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49  zIdent, j)!=TK_I
5490: 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  D;.  if( needQuo
54a0: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c  te ) z[i++] = '\
54b0: 27 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  '';.  for(j=0; z
54c0: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
54d0: 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64      z[i++] = zId
54e0: 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ent[j];.    if( 
54f0: 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 5c 27 27 20  zIdent[j]=='\'' 
5500: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b  ) z[i++] = '\'';
5510: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
5520: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
5530: 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30  '\'';.  z[i] = 0
5540: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
5550: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
5560: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5570: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
5580: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
5590: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
55a0: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
55b0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
55c0: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
55d0: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
55e0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
55f0: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
5600: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
5610: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5620: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
5630: 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b  eStmt(Table *p){
5640: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
5650: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
5660: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
5670: 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 6e 20  ep2, *zEnd;.  n 
5680: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
5690: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
56a0: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
56b0: 65 6e 67 74 68 28 70 2d 3e 61 43 6f 6c 5b 69 5d  ength(p->aCol[i]
56c0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e  .zName);.  }.  n
56d0: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
56e0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
56f0: 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a 53 65   n<40 ){.    zSe
5700: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
5710: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
5720: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
5730: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
5740: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
5750: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
5760: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
5770: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
5780: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
5790: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
57a0: 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d   );.  if( zStmt=
57b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
57c0: 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c 20 70   strcpy(zStmt, p
57d0: 2d 3e 69 73 54 65 6d 70 20 3f 20 22 43 52 45 41  ->isTemp ? "CREA
57e0: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22 20  TE TEMP TABLE " 
57f0: 3a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  : "CREATE TABLE 
5800: 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e  ");.  k = strlen
5810: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
5820: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
5830: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d  ->zName);.  zStm
5840: 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20  t[k++] = '(';.  
5850: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
5860: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  ol; i++){.    st
5870: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
5880: 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  zSep);.    k += 
5890: 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d  strlen(&zStmt[k]
58a0: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53  );.    zSep = zS
58b0: 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75  ep2;.    identPu
58c0: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
58d0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[i].zName);.
58e0: 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53    }.  strcpy(&zS
58f0: 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20  tmt[k], zEnd);. 
5900: 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d   return zStmt;.}
5910: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5920: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
5930: 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e  o report the fin
5940: 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d  al ")" that term
5950: 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41  inates.** a CREA
5960: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
5970: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  nt..**.** The ta
5980: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
5990: 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20  at other action 
59a0: 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65  routines have be
59b0: 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69  en building.** i
59c0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
59d0: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
59e0: 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f  les, assuming no
59f0: 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20   errors have.** 
5a00: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  occurred..**.** 
5a10: 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  An entry for the
5a20: 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69   table is made i
5a30: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  n the master tab
5a40: 6c 65 20 6f 6e 20 64 69 73 6b 2c 0a 2a 2a 20 75  le on disk,.** u
5a50: 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 20  nless this is a 
5a60: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
5a70: 6f 72 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2e 20  or initFlag==1. 
5a80: 20 57 68 65 6e 20 69 6e 69 74 46 6c 61 67 3d 3d   When initFlag==
5a90: 31 2c 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  1,.** it means w
5aa0: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
5ab0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
5ac0: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
5ad0: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
5ae0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
5af0: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
5b00: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
5b10: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
5b20: 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73  ently changes, s
5b30: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
5b40: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
5b50: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
5b60: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
5b70: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
5b80: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
5b90: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
5ba0: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
5bb0: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
5bc0: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
5bd0: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
5be0: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
5bf0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
5c00: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
5c10: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
5c20: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
5c30: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
5c40: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
5c50: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
5c60: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
5c70: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
5c80: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
5c90: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
5ca0: 65 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20  eEndTable(Parse 
5cb0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
5cc0: 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70 53  pEnd, Select *pS
5cd0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
5ce0: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  *p;.  sqlite *db
5cf0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
5d00: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
5d10: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
5d20: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
5d30: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
5d40: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
5d50: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
5d60: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
5d70: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
5d80: 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
5d90: 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
5da0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
5db0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
5dc0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
5dd0: 28 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43 6c  ( pParse->nameCl
5de0: 61 73 68 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ash==0 || pParse
5df0: 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 31 20 29 3b  ->initFlag==1 );
5e00: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
5e10: 78 70 6c 61 69 6e 3d 3d 30 20 26 26 20 70 50 61  xplain==0 && pPa
5e20: 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d  rse->nameClash==
5e30: 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  0 ){.    Table *
5e40: 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a  pOld;.    FKey *
5e50: 70 46 4b 65 79 3b 0a 20 20 20 20 70 4f 6c 64 20  pFKey;.    pOld 
5e60: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
5e70: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
5e80: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
5e90: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  n(p->zName)+1, p
5ea0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
5eb0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
5ec0: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
5ed0: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
5ee0: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
5ef0: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
5f00: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
5f10: 20 7d 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79   }.    for(pFKey
5f20: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  =p->pFKey; pFKey
5f30: 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70  ; pFKey=pFKey->p
5f40: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
5f50: 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65   int nTo = strle
5f60: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20  n(pFKey->zTo) + 
5f70: 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  1;.      pFKey->
5f80: 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65  pNextTo = sqlite
5f90: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 46  HashFind(&db->aF
5fa0: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
5fb0: 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c   nTo);.      sql
5fc0: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
5fd0: 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d  b->aFKey, pFKey-
5fe0: 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79  >zTo, nTo, pFKey
5ff0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
6000: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
6010: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62   0;.    db->nTab
6020: 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  le++;.    db->fl
6030: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
6040: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
6050: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61  ..  /* If the ta
6060: 62 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ble is generated
6070: 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20   from a SELECT, 
6080: 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 20 74  then construct t
6090: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20  he.  ** list of 
60a0: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20  columns and the 
60b0: 74 65 78 74 20 6f 66 20 74 68 65 20 74 61 62 6c  text of the tabl
60c0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  e..  */.  if( pS
60d0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 54 61 62  elect ){.    Tab
60e0: 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d 20 73 71  le *pSelTab = sq
60f0: 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53  liteResultSetOfS
6100: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c  elect(pParse, 0,
6110: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69   pSelect);.    i
6120: 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
6130: 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65  return;.    asse
6140: 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29  rt( p->aCol==0 )
6150: 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20  ;.    p->nCol = 
6160: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
6170: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
6180: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
6190: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
61a0: 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  0;.    pSelTab->
61b0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  aCol = 0;.    sq
61c0: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
61d0: 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 7d  0, pSelTab);.  }
61e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e  ..  /* If the in
61f0: 69 74 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d  itFlag is 1 it m
6200: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
6210: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
6220: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
6230: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
6240: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
6250: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
6260: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
6270: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
6280: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
6290: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
62a0: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
62b0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
62c0: 6d 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 65  m the pParse->ne
62d0: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54  wTnum field.  (T
62e0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  he page number. 
62f0: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
6300: 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62  been put there b
6310: 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e  y the sqliteOpen
6320: 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a  Cb routine.).  *
6330: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
6340: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
6350: 70 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73 65  p->tnum = pParse
6360: 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a  ->newTnum;.  }..
6370: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
6380: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
6390: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
63a0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
63b0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
63c0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
63d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
63e0: 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75  .  The record nu
63f0: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
6400: 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72  e new table entr
6410: 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  y should already
6420: 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b   be on the stack
6430: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
6440: 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
6450: 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
6460: 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
6470: 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
6480: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
6490: 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
64a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
64b0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
64c0: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
64d0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
64e0: 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20  be *v;..    v = 
64f0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
6500: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
6510: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6520: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
6530: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
6540: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
6550: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  */.      sqliteV
6560: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
6570: 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c 20 70  reateTable, 0, p
6580: 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 20  ->isTemp);.     
6590: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
65a0: 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
65b0: 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f   *)&p->tnum, P3_
65c0: 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65  POINTER);.    }e
65d0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
65e0: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71  view */.      sq
65f0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6600: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
6610: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  0);.    }.    p-
6620: 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 73  >tnum = 0;.    s
6630: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6640: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
6650: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
6660: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
6670: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ng, 0, 0);.    i
6680: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
6690: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
66a0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
66b0: 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20 50 33 5f  -1, "table", P3_
66c0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 65 6c  STATIC);.    }el
66d0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
66e0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
66f0: 2d 31 2c 20 22 76 69 65 77 22 2c 20 50 33 5f 53  -1, "view", P3_S
6700: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  TATIC);.    }.  
6710: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6720: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
6730: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
6740: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
6750: 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50   -1, p->zName, P
6760: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
6770: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6780: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
6790: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
67a0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
67b0: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  , p->zName, P3_S
67c0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
67d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
67e0: 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20 20  P_Dup, 4, 0);.  
67f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6800: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
6810: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
6820: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
6830: 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65  char *z = create
6840: 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20  TableStmt(p);.  
6850: 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c      n = z ? strl
6860: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20  en(z) : 0;.     
6870: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
6880: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29  eP3(v, -1, z, n)
6890: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
68a0: 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ee(z);.    }else
68b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
68c0: 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20  pEnd!=0 );.     
68d0: 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e   n = Addr(pEnd->
68e0: 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73 65  z) - Addr(pParse
68f0: 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29  ->sFirstToken.z)
6900: 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 1;.      sqli
6910: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
6920: 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46  , -1, pParse->sF
6930: 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b  irstToken.z, n);
6940: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6950: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6960: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20  _MakeRecord, 5, 
6970: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
6980: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
6990: 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a  tIntKey, 0, 0);.
69a0: 20 20 20 20 69 66 28 20 21 70 2d 3e 69 73 54 65      if( !p->isTe
69b0: 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  mp ){.      sqli
69c0: 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  teChangeCookie(d
69d0: 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, v);.    }.   
69e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
69f0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
6a00: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65   0);.    if( pSe
6a10: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  lect ){.      in
6a20: 74 20 6f 70 20 3d 20 70 2d 3e 69 73 54 65 6d 70  t op = p->isTemp
6a30: 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78 20   ? OP_OpenWrAux 
6a40: 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  : OP_OpenWrite;.
6a50: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6a60: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20  AddOp(v, op, 1, 
6a70: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
6a80: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
6a90: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70    sqliteSelect(p
6aa0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
6ab0: 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c  SRT_Table, 1, 0,
6ac0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
6ad0: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
6ae0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
6af0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6b00: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
6b10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
6b20: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
6b30: 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76   a new VIEW.*/.v
6b40: 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65  oid sqliteCreate
6b50: 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
6b60: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
6b70: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
6b80: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
6b90: 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
6ba0: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
6bb0: 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
6bc0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
6bd0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
6be0: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
6bf0: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
6c00: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
6c10: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
6c20: 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54  t,   /* A SELECT
6c30: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
6c40: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
6c50: 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  new view */.  in
6c60: 74 20 69 73 54 65 6d 70 20 20 20 20 20 20 20 20  t isTemp        
6c70: 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54   /* TRUE for a T
6c80: 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f  EMPORARY view */
6c90: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
6ca0: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
6cb0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
6cc0: 6e 20 73 45 6e 64 3b 0a 0a 20 20 73 71 6c 69 74  n sEnd;..  sqlit
6cd0: 65 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  eStartTable(pPar
6ce0: 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d  se, pBegin, pNam
6cf0: 65 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 70 20  e, isTemp);.  p 
6d00: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
6d10: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
6d20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c  ){.    sqliteSel
6d30: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
6d40: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
6d50: 20 20 7d 0a 20 20 2f 2a 20 49 67 6e 6f 72 65 20    }.  /* Ignore 
6d60: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
6d70: 20 6f 6e 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   on a SELECT */.
6d80: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70    if( pSelect->p
6d90: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
6da0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
6db0: 65 74 65 28 70 53 65 6c 65 63 74 2d 3e 70 4f 72  ete(pSelect->pOr
6dc0: 64 65 72 42 79 29 3b 0a 20 20 20 20 70 53 65 6c  derBy);.    pSel
6dd0: 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ect->pOrderBy = 
6de0: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4d 61 6b 65  0;.  }.  /* Make
6df0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
6e00: 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
6e10: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
6e20: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
6e30: 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
6e40: 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
6e50: 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
6e60: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
6e70: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
6e80: 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
6e90: 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
6ea0: 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
6eb0: 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
6ec0: 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
6ed0: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
6ee0: 74 20 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20  t sqlite_exec() 
6ef0: 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20  call returns..  
6f00: 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20  */.  p->pSelect 
6f10: 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 75  = sqliteSelectDu
6f20: 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  p(pSelect);.  sq
6f30: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
6f40: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
6f50: 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c   !pParse->initFl
6f60: 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ag ){.    sqlite
6f70: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
6f80: 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
6f90: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
6fa0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
6fb0: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
6fc0: 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
6fd0: 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
6fe0: 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
6ff0: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
7000: 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  astToken;.  if( 
7010: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20  sEnd.z[0]!=0 && 
7020: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
7030: 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
7040: 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
7050: 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
7060: 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d 20  ((int)sEnd.z) - 
7070: 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a  (int)pBegin->z;.
7080: 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b    z = pBegin->z;
7090: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
70a0: 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c   (z[n-1]==';' ||
70b0: 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29   isspace(z[n-1])
70c0: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
70d0: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
70e0: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
70f0: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 45 6e   /* Use sqliteEn
7100: 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
7110: 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
7120: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
7130: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 45  ble */.  sqliteE
7140: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ndTable(pParse, 
7150: 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74  &sEnd, 0);.  ret
7160: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
7170: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
7180: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
7190: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
71a0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
71b0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
71c0: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
71d0: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
71e0: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
71f0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
7200: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
7210: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
7220: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
7230: 65 20 69 6e 20 70 50 61 72 65 2d 3e 7a 45 72 72  e in pPare->zErr
7240: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
7250: 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  teViewGetColumnN
7260: 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
7270: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
7280: 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  e){.  ExprList *
7290: 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63 74  pEList;.  Select
72a0: 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20   *pSel;.  Table 
72b0: 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20  *pSelTab;.  int 
72c0: 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  nErr = 0;..  ass
72d0: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
72e0: 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
72f0: 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
7300: 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
7310: 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
7320: 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
7330: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
7340: 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
7350: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
7360: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
7370: 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
7380: 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
7390: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
73a0: 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
73b0: 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
73c0: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
73d0: 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
73e0: 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
73f0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
7400: 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
7410: 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
7420: 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
7430: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
7440: 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
7450: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
7460: 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
7470: 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
7480: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
7490: 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
74a0: 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72  ctually, this er
74b0: 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70 72  ror is caught pr
74c0: 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20  eviously and so 
74d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
74e0: 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61  st.  ** should a
74f0: 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74  lways fail.  But
7500: 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69   we will leave i
7510: 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20  t in place just 
7520: 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f  to be safe..  */
7530: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
7540: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
7550: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
7560: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
7570: 76 69 65 77 20 22 2c 20 70 54 61 62 6c 65 2d 3e  view ", pTable->
7580: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
7590: 22 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  " is circularly 
75a0: 64 65 66 69 6e 65 64 22 2c 20 30 29 3b 0a 20 20  defined", 0);.  
75b0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
75c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
75d0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
75e0: 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
75f0: 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
7600: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61  o compute the ta
7610: 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a  ble names..  */.
7620: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
7630: 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a 20  ->pSelect ); /* 
7640: 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e  If nCol==0, then
7650: 20 70 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20   pTable must be 
7660: 61 20 56 49 45 57 20 2a 2f 0a 20 20 70 53 65 6c  a VIEW */.  pSel
7670: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65   = pTable->pSele
7680: 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74  ct;..  /* Note t
7690: 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hat the call to 
76a0: 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f  sqliteResultSetO
76b0: 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
76c0: 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
76d0: 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
76e0: 68 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20 77  his list.  But w
76f0: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72  e will need to r
7700: 65 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74 0a  estore the list.
7710: 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73    ** back to its
7720: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67   original config
7730: 75 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61 72  uration afterwar
7740: 64 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20 61  ds, so we save a
7750: 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68   copy of.  ** th
7760: 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70 45  e original in pE
7770: 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c  List..  */.  pEL
7780: 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69  ist = pSel->pELi
7790: 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69  st;.  pSel->pELi
77a0: 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  st = sqliteExprL
77b0: 69 73 74 44 75 70 28 70 45 4c 69 73 74 29 3b 0a  istDup(pEList);.
77c0: 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c 69    if( pSel->pELi
77d0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53 65  st==0 ){.    pSe
77e0: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  l->pEList = pELi
77f0: 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  st;.    return 1
7800: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69  ;  /* Malloc fai
7810: 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 61  led */.  }.  pTa
7820: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
7830: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
7840: 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  teResultSetOfSel
7850: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
7860: 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  Sel);.  if( pSel
7870: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
7880: 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d  t( pTable->aCol=
7890: 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  =0 );.    pTable
78a0: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
78b0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  ->nCol;.    pTab
78c0: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54  le->aCol = pSelT
78d0: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53  ab->aCol;.    pS
78e0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
78f0: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43  .    pSelTab->aC
7900: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ol = 0;.    sqli
7910: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  teDeleteTable(0,
7920: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 70   pSelTab);.    p
7930: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
7940: 20 7c 3d 20 53 51 4c 49 54 45 5f 55 6e 72 65 73   |= SQLITE_Unres
7950: 65 74 56 69 65 77 73 3b 0a 20 20 7d 65 6c 73 65  etViews;.  }else
7960: 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  {.    pTable->nC
7970: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72  ol = 0;.    nErr
7980: 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ++;.  }.  sqlite
7990: 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70 53 65  SelectUnbind(pSe
79a0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  l);.  sqliteExpr
79b0: 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c 2d  ListDelete(pSel-
79c0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 65 6c  >pEList);.  pSel
79d0: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
79e0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  t;.  return nErr
79f0: 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  ;  .}../*.** Cle
7a00: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
7a10: 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 56 49 45  mes from the VIE
7a20: 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  W pTable..**.** 
7a30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
7a40: 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
7a50: 61 6e 79 20 6f 74 68 65 72 20 74 61 62 6c 65 20  any other table 
7a60: 6f 72 20 76 69 65 77 20 69 73 20 6d 6f 64 69 66  or view is modif
7a70: 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76 69 65 77  ied..** The view
7a80: 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69   passed into thi
7a90: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
7aa0: 64 65 70 65 6e 64 20 64 69 72 65 63 74 6c 79 20  depend directly 
7ab0: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 0a 2a 2a  or indirectly.**
7ac0: 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66 69 65 64   on the modified
7ad0: 20 6f 72 20 64 65 6c 65 74 65 64 20 74 61 62 6c   or deleted tabl
7ae0: 65 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20  e so we need to 
7af0: 63 6c 65 61 72 20 74 68 65 20 6f 6c 64 20 63 6f  clear the old co
7b00: 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73 6f  lumn.** names so
7b10: 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20   that they will 
7b20: 62 65 20 72 65 63 6f 6d 70 75 74 65 64 2e 0a 2a  be recomputed..*
7b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
7b40: 6c 69 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c  liteViewResetCol
7b50: 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a  umnNames(Table *
7b60: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
7b70: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
7b80: 30 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 70 53 65  0 || pTable->pSe
7b90: 6c 65 63 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  lect==0 ) return
7ba0: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  ;.  if( pTable->
7bb0: 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  nCol==0 ) return
7bc0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7bd0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
7be0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
7bf0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
7c00: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
7c10: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
7c20: 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b  >aCol[i].zDflt);
7c30: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
7c40: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
7c50: 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zType);.  }.  sq
7c60: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
7c70: 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65  >aCol);.  pTable
7c80: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
7c90: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
7ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
7cb0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
7cc0: 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 2e  from every VIEW.
7cd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 56  .*/.void sqliteV
7ce0: 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69  iewResetAll(sqli
7cf0: 74 65 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  te *db){.  HashE
7d00: 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 28 64  lem *i;.  if( (d
7d10: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
7d20: 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3d  E_UnresetViews)=
7d30: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
7d40: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
7d50: 69 72 73 74 28 26 64 62 2d 3e 74 62 6c 48 61 73  irst(&db->tblHas
7d60: 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  h); i; i=sqliteH
7d70: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
7d80: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
7d90: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
7da0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
7db0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
7dc0: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
7dd0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62  ColumnNames(pTab
7de0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64  );.    }.  }.  d
7df0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
7e00: 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73  ITE_UnresetViews
7e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
7e20: 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75   a token, look u
7e30: 70 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  p a table with t
7e40: 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f  hat name.  If no
7e50: 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a  t found, leave.*
7e60: 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74  * an error for t
7e70: 68 65 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e  he parser to fin
7e80: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  d and return NUL
7e90: 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  L..*/.Table *sql
7ea0: 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65  iteTableFromToke
7eb0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
7ec0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20   Token *pTok){. 
7ed0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
7ee0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a  Table *pTab;.  z
7ef0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
7f00: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
7f10: 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61  pTok);.  if( zNa
7f20: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
7f30: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
7f40: 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  eFindTable(pPars
7f50: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e->db, zName);. 
7f60: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
7f70: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  e);.  if( pTab==
7f80: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
7f90: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
7fa0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
7fb0: 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30  such table: ", 0
7fc0: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 2d  , .        pTok-
7fd0: 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b  >z, pTok->n, 0);
7fe0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7ff0: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
8000: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
8010: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8020: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
8030: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
8040: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
8050: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
8060: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
8070: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
8080: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
8090: 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  eDropTable(Parse
80a0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
80b0: 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69  *pName, int isVi
80c0: 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ew){.  Table *pT
80d0: 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b  able;.  Vdbe *v;
80e0: 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 73  .  int base;.  s
80f0: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
8100: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
8110: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
8120: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
8130: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
8140: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 54  pTable = sqliteT
8150: 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  ableFromToken(pP
8160: 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  arse, pName);.  
8170: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
8180: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54  return;.  if( pT
8190: 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  able->readOnly )
81a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
81b0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
81c0: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
81d0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
81e0: 20 0a 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e   .       " may n
81f0: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
8200: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
8210: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
8220: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  rn;.  }.  if( is
8230: 56 69 65 77 20 26 26 20 70 54 61 62 6c 65 2d 3e  View && pTable->
8240: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
8250: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
8260: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
8270: 73 67 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  sg, "use DROP TA
8280: 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
8290: 62 6c 65 20 22 2c 0a 20 20 20 20 20 20 70 54 61  ble ",.      pTa
82a0: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  ble->zName, 0);.
82b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
82c0: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
82d0: 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65    }.  if( !isVie
82e0: 77 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65  w && pTable->pSe
82f0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
8300: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
8310: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
8320: 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
8330: 64 65 6c 65 74 65 20 76 69 65 77 20 22 2c 0a 20  delete view ",. 
8340: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61       pTable->zNa
8350: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  me, 0);.    pPar
8360: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
8370: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
8380: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8390: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
83a0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
83b0: 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
83c0: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
83d0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
83e0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
83f0: 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  v ){.    static 
8400: 56 64 62 65 4f 70 20 64 72 6f 70 54 61 62 6c 65  VdbeOp dropTable
8410: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
8420: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
8430: 20 41 44 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20   ADDR(8),  0},. 
8440: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
8450: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
8460: 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20     0}, /* 1 */. 
8470: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
8480: 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
8490: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
84a0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c  P_MemLoad,    1,
84b0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
84c0: 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 3 */.      { O
84d0: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
84e0: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   2,        0},. 
84f0: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20       { OP_Ne,   
8500: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 37 29        0, ADDR(7)
8510: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
8520: 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c  P_Delete,     0,
8530: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
8540: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
8550: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29        0, ADDR(3)
8560: 2c 20 20 30 7d 2c 20 2f 2a 20 37 20 2a 2f 0a 20  ,  0}, /* 7 */. 
8570: 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20     };.    Index 
8580: 2a 70 49 64 78 3b 0a 20 20 20 20 54 72 69 67 67  *pIdx;.    Trigg
8590: 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
85a0: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
85b0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
85c0: 73 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  se, 0);.    sqli
85d0: 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  teOpenMasterTabl
85e0: 65 28 76 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54  e(v, pTable->isT
85f0: 65 6d 70 29 3b 0a 20 20 20 20 2f 2a 20 44 72 6f  emp);.    /* Dro
8600: 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
8610: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
8620: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
8630: 72 6f 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 54  ropped */.    pT
8640: 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c 65 2d  rigger = pTable-
8650: 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77  >pTrigger;.    w
8660: 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
8670: 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 74 74  {.      Token tt
8680: 3b 0a 20 20 20 20 20 20 74 74 2e 7a 20 3d 20 70  ;.      tt.z = p
8690: 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 2d  Table->pTrigger-
86a0: 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20 74 74 2e  >name;.      tt.
86b0: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62 6c  n = strlen(pTabl
86c0: 65 2d 3e 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  e->pTrigger->nam
86d0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
86e0: 44 72 6f 70 54 72 69 67 67 65 72 28 70 50 61 72  DropTrigger(pPar
86f0: 73 65 2c 20 26 74 74 2c 20 31 29 3b 0a 20 20 20  se, &tt, 1);.   
8700: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65     if( pParse->e
8710: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
8720: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
8730: 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
8740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8750: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
8760: 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a  able->pTrigger;.
8770: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8780: 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56    base = sqliteV
8790: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
87a0: 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61  ArraySize(dropTa
87b0: 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29  ble), dropTable)
87c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
87d0: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
87e0: 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  +1, pTable->zNam
87f0: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  e, 0);.    if( !
8800: 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 29  pTable->isTemp )
8810: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68  {.      sqliteCh
8820: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
8830: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
8840: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8850: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
8860: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
8870: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8880: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8890: 44 65 73 74 72 6f 79 2c 20 70 54 61 62 6c 65 2d  Destroy, pTable-
88a0: 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69  >tnum, pTable->i
88b0: 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  sTemp);.      fo
88c0: 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e 70  r(pIdx=pTable->p
88d0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
88e0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
88f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
8900: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
8910: 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75  stroy, pIdx->tnu
8920: 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d  m, pTable->isTem
8930: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
8940: 7d 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  }.    sqliteEndW
8950: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
8960: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
8970: 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d   Delete the in-m
8980: 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f  emory descriptio
8990: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  n of the table..
89a0: 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
89b0: 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51 4c 20  ion: if the SQL 
89c0: 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61 6e 20  statement began 
89d0: 77 69 74 68 20 74 68 65 20 45 58 50 4c 41 49 4e  with the EXPLAIN
89e0: 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74   keyword,.  ** t
89f0: 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 73  hen no changes s
8a00: 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e 0a 20  hould be made.. 
8a10: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
8a20: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
8a30: 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e    sqliteUnlinkAn
8a40: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  dDeleteTable(db,
8a50: 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 64 62   pTable);.    db
8a60: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
8a70: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
8a80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65  .  }.  sqliteVie
8a90: 77 52 65 73 65 74 41 6c 6c 28 64 62 29 3b 0a 7d  wResetAll(db);.}
8aa0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8ab0: 74 69 6e 65 20 63 6f 6e 73 74 72 75 63 74 73 20  tine constructs 
8ac0: 61 20 50 33 20 73 74 72 69 6e 67 20 73 75 69 74  a P3 string suit
8ad0: 61 62 6c 65 20 66 6f 72 20 61 6e 20 4f 50 5f 4d  able for an OP_M
8ae0: 61 6b 65 49 64 78 4b 65 79 0a 2a 2a 20 6f 70 63  akeIdxKey.** opc
8af0: 6f 64 65 20 61 6e 64 20 61 64 64 73 20 74 68 61  ode and adds tha
8b00: 74 20 50 33 20 73 74 72 69 6e 67 20 74 6f 20 74  t P3 string to t
8b10: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
8b20: 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75   inserted instru
8b30: 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
8b40: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
8b50: 20 20 54 68 65 20 50 33 20 73 74 72 69 6e 67 20    The P3 string 
8b60: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69  consists of a si
8b70: 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 0a 2a  ngle character.*
8b80: 2a 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  * for each colum
8b90: 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 70  n in the index p
8ba0: 49 64 78 20 6f 66 20 74 61 62 6c 65 20 70 54 61  Idx of table pTa
8bb0: 62 2e 20 20 49 66 20 74 68 65 20 63 6f 6c 75 6d  b.  If the colum
8bc0: 6e 20 75 73 65 73 0a 2a 2a 20 61 20 6e 75 6d 65  n uses.** a nume
8bd0: 72 69 63 20 73 6f 72 74 20 6f 72 64 65 72 2c 20  ric sort order, 
8be0: 74 68 65 6e 20 74 68 65 20 50 33 20 73 74 72 69  then the P3 stri
8bf0: 6e 67 20 63 68 61 72 61 63 74 65 72 20 63 6f 72  ng character cor
8c00: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0a 2a 2a  responding to.**
8c10: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73 20   that column is 
8c20: 27 6e 27 2e 20 20 49 66 20 74 68 65 20 63 6f 6c  'n'.  If the col
8c30: 75 6d 6e 20 75 73 65 73 20 61 20 74 65 78 74 20  umn uses a text 
8c40: 73 6f 72 74 20 6f 72 64 65 72 2c 20 74 68 65 6e  sort order, then
8c50: 20 74 68 65 0a 2a 2a 20 50 33 20 73 74 72 69 6e   the.** P3 strin
8c60: 67 20 69 73 20 27 74 27 2e 20 20 53 65 65 20 74  g is 't'.  See t
8c70: 68 65 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79  he OP_MakeIdxKey
8c80: 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e 74   opcode document
8c90: 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 64 64  ation for.** add
8ca0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
8cb0: 69 6f 6e 2e 20 20 53 65 65 20 61 6c 73 6f 20 74  ion.  See also t
8cc0: 68 65 20 73 71 6c 69 74 65 41 64 64 4b 65 79 54  he sqliteAddKeyT
8cd0: 79 70 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  ype() routine..*
8ce0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64  /.void sqliteAdd
8cf0: 49 64 78 4b 65 79 54 79 70 65 28 56 64 62 65 20  IdxKeyType(Vdbe 
8d00: 2a 76 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  *v, Index *pIdx)
8d10: 7b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  {.  char *zType;
8d20: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
8d30: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73    int i, n;.  as
8d40: 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 26 26  sert( pIdx!=0 &&
8d50: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 21 3d 30   pIdx->pTable!=0
8d60: 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 64   );.  pTab = pId
8d70: 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d  x->pTable;.  n =
8d80: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
8d90: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
8da0: 4d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20  Malloc( n+1 );. 
8db0: 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20   if( zType==0 ) 
8dc0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
8dd0: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
8de0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49 64    int iCol = pId
8df0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
8e00: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
8e10: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
8e20: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 69 66  ->nCol );.    if
8e30: 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  ( (pTab->aCol[iC
8e40: 6f 6c 5d 2e 73 6f 72 74 4f 72 64 65 72 20 26 20  ol].sortOrder & 
8e50: 53 51 4c 49 54 45 5f 53 4f 5f 54 59 50 45 4d 41  SQLITE_SO_TYPEMA
8e60: 53 4b 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 54  SK)==SQLITE_SO_T
8e70: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  EXT ){.      zTy
8e80: 70 65 5b 69 5d 20 3d 20 27 74 27 3b 0a 20 20 20  pe[i] = 't';.   
8e90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54   }else{.      zT
8ea0: 79 70 65 5b 69 5d 20 3d 20 27 6e 27 3b 0a 20 20  ype[i] = 'n';.  
8eb0: 20 20 7d 0a 20 20 7d 0a 20 20 7a 54 79 70 65 5b    }.  }.  zType[
8ec0: 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  n] = 0;.  sqlite
8ed0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
8ee0: 2d 31 2c 20 7a 54 79 70 65 2c 20 6e 29 3b 0a 20  -1, zType, n);. 
8ef0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 79 70   sqliteFree(zTyp
8f00: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
8f10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8f20: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
8f30: 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  new foreign key 
8f40: 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  on the table.** 
8f50: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8f60: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70  construction.  p
8f70: 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e  FromCol determin
8f80: 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
8f90: 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
8fa0: 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74  nt table point t
8fb0: 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  o the foreign ke
8fc0: 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d  y.  If pFromCol=
8fd0: 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65  =0 then.** conne
8fe0: 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68  ct the key to th
8ff0: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e  e last column in
9000: 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20  serted.  pTo is 
9010: 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74  the name of.** t
9020: 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65  he table referre
9030: 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73  d to.  pToCol is
9040: 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65   a list of table
9050: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a  s in the other.*
9060: 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74  * pTo table that
9070: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
9080: 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61   points to.  fla
9090: 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
90a0: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
90b0: 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
90c0: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
90d0: 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
90e0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
90f0: 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
9100: 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
9110: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
9120: 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
9130: 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
9140: 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
9150: 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
9160: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9170: 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
9180: 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
9190: 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a  .  The new FKey.
91a0: 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64  ** is not linked
91b0: 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20   into db->aFKey 
91c0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20  at this point - 
91d0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61  that does not ha
91e0: 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71  ppen.** until sq
91f0: 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29 2e 0a  liteEndTable()..
9200: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67  **.** The foreig
9210: 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72  n key is set for
9220: 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65   IMMEDIATE proce
9230: 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71  ssing.  A subseq
9240: 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  uent call.** to 
9250: 73 71 6c 69 74 65 44 65 66 65 72 46 6f 72 65 69  sqliteDeferForei
9260: 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68  gnKey() might ch
9270: 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46  ange this to DEF
9280: 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ERRED..*/.void s
9290: 71 6c 69 74 65 43 72 65 61 74 65 46 6f 72 65 69  qliteCreateForei
92a0: 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
92b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
92c0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
92d0: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 46   */.  IdList *pF
92e0: 72 6f 6d 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f  romCol,    /* Co
92f0: 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
9300: 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
9310: 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
9320: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
9330: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
9340: 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
9350: 6c 65 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  le */.  IdList *
9360: 70 54 6f 43 6f 6c 2c 20 20 20 20 20 20 2f 2a 20  pToCol,      /* 
9370: 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
9380: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
9390: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
93a0: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
93b0: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
93c0: 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20  rithms. */.){.  
93d0: 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
93e0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
93f0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
9400: 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
9410: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 46 4b 65    char *z;.  FKe
9420: 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 20  y *pFKey = 0;.. 
9430: 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20   assert( pTo!=0 
9440: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
9450: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
9460: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
9470: 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
9480: 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
9490: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
94a0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74  if( iCol<0 ) got
94b0: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
94c0: 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
94d0: 6f 6c 2d 3e 6e 49 64 21 3d 31 20 29 7b 0a 20 20  ol->nId!=1 ){.  
94e0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
94f0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
9500: 72 72 4d 73 67 2c 20 22 66 6f 72 65 69 67 6e 20  rrMsg, "foreign 
9510: 6b 65 79 20 6f 6e 20 22 2c 20 2d 31 2c 0a 20 20  key on ", -1,.  
9520: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
9530: 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 2d 31 2c 20  Col].zName, -1, 
9540: 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
9550: 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
9560: 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
9570: 74 61 62 6c 65 20 22 2c 20 2d 31 2c 0a 20 20 20  table ", -1,.   
9580: 20 20 20 20 20 20 70 54 6f 2d 3e 7a 2c 20 70 54        pTo->z, pT
9590: 6f 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  o->n, 0);.      
95a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
95b0: 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
95c0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
95d0: 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
95e0: 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
95f0: 43 6f 6c 2d 3e 6e 49 64 21 3d 70 46 72 6f 6d 43  Col->nId!=pFromC
9600: 6f 6c 2d 3e 6e 49 64 20 29 7b 0a 20 20 20 20 73  ol->nId ){.    s
9610: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
9620: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
9630: 20 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65   .        "numbe
9640: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
9650: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
9660: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
9670: 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
9680: 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
9690: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
96a0: 62 6c 65 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ble", 0);.    pP
96b0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
96c0: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
96d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
96e0: 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64   = pFromCol->nId
96f0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
9700: 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
9710: 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b   nCol*sizeof(pFK
9720: 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
9730: 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
9740: 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
9750: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
9760: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
9770: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c     nByte += strl
9780: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
9790: 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
97a0: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
97b0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42  sqliteMalloc( nB
97c0: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
97d0: 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f  ey==0 ) goto fk_
97e0: 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46  end;.  pFKey->pF
97f0: 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
9800: 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
9810: 3e 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 2d  >pFKey;.  pFKey-
9820: 3e 7a 54 6f 20 3d 20 7a 20 3d 20 28 63 68 61 72  >zTo = z = (char
9830: 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 6d  *)&pFKey[1];.  m
9840: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
9850: 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
9860: 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b  o->n] = 0;.  z +
9870: 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
9880: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30  Key->pNextTo = 0
9890: 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
98a0: 3d 20 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d  = nCol;.  pFKey-
98b0: 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20  >aCol = (struct 
98c0: 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20  sColMap*)z;.  z 
98d0: 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  += sizeof(struct
98e0: 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a   sColMap)*nCol;.
98f0: 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
9900: 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 ){.    pFKey->
9910: 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[0].iFrom = 
9920: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c  p->nCol-1;.  }el
9930: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
9940: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
9950: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
9960: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
9970: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
9980: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
9990: 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
99a0: 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
99b0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
99c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
99d0: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
99e0: 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
99f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
9a00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
9a10: 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
9a20: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9a30: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
9a40: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e  se->zErrMsg, "un
9a50: 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 22  known column \""
9a60: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
9a70: 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
9a80: 65 2c 20 22 5c 22 20 69 6e 20 66 6f 72 65 69 67  e, "\" in foreig
9a90: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
9aa0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ", 0);.        p
9ab0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
9ac0: 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
9ad0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
9ae0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
9af0: 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
9b00: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
9b10: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
9b20: 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
9b30: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
9b40: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
9b50: 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
9b60: 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
9b70: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
9b80: 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
9b90: 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
9ba0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
9bb0: 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
9bc0: 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65  = 0;.  pFKey->de
9bd0: 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73  leteConf = flags
9be0: 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79   & 0xff;.  pFKey
9bf0: 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28  ->updateConf = (
9c00: 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30  flags >> 8 ) & 0
9c10: 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e  xff;.  pFKey->in
9c20: 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67  sertConf = (flag
9c30: 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66  s >> 16 ) & 0xff
9c40: 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  ;..  /* Link the
9c50: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
9c60: 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
9c70: 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
9c80: 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
9c90: 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
9ca0: 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
9cb0: 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
9cc0: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
9cd0: 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a  lete(pFromCol);.
9ce0: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65    sqliteIdListDe
9cf0: 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  lete(pToCol);.}.
9d00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9d10: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
9d20: 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
9d30: 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
9d40: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
9d50: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
9d60: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
9d70: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
9d80: 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
9d90: 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
9da0: 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
9db0: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
9dc0: 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
9dd0: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
9de0: 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
9df0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
9e00: 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
9e10: 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
9e20: 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
9e30: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
9e40: 74 65 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  teDeferForeignKe
9e50: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
9e60: 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
9e70: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
9e80: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
9e90: 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
9ea0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
9eb0: 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
9ec0: 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
9ed0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65  ) return;.  pFKe
9ee0: 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
9ef0: 69 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f  isDeferred;.}../
9f00: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
9f10: 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
9f20: 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65  QL table.  pInde
9f30: 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  x is the name of
9f40: 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
9f50: 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74 68 65  nd pTable is the
9f60: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
9f70: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
9f80: 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
9f90: 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
9fa0: 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
9fb0: 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
9fc0: 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
9fd0: 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
9fe0: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
9ff0: 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
a000: 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
a010: 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
a020: 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
a030: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
a040: 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
a050: 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
a060: 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
a070: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
a080: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
a090: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
a0a0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
a0b0: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
a0c0: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
a0d0: 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
a0e0: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
a0f0: 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
a100: 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
a110: 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
a120: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
a130: 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
a140: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
a150: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
a160: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
a170: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61  .void sqliteCrea
a180: 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
a190: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41   *pParse,   /* A
a1a0: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
a1b0: 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
a1c0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
a1d0: 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e,    /* Name of
a1e0: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 79   the index.  May
a1f0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
a200: 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 2f  ken *pTable,   /
a210: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
a220: 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 20 55  ble to index.  U
a230: 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
a240: 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 49  able if 0 */.  I
a250: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  dList *pList,   
a260: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
a270: 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
a280: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
a290: 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41  ror,     /* OE_A
a2a0: 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
a2b0: 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
a2c0: 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
a2d0: 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a  en *pStart,   /*
a2e0: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
a2f0: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20  n that begins a 
a300: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
a310: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
a320: 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20  n *pEnd      /* 
a330: 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
a340: 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
a350: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
a360: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
a370: 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
a380: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
a390: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
a3a0: 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  x;   /* The inde
a3b0: 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
a3c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
a3d0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
a3e0: 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
a3f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a400: 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20   Fake token for 
a410: 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74  an empty ID list
a420: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62   */.  sqlite *db
a430: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
a440: 20 69 6e 74 20 68 69 64 65 4e 61 6d 65 20 3d 20   int hideName = 
a450: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  0;         /* Do
a460: 20 6e 6f 74 20 70 75 74 20 74 61 62 6c 65 20 6e   not put table n
a470: 61 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  ame in the hash 
a480: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20  table */..  if( 
a490: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
a4a0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
a4b0: 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
a4c0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
a4d0: 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
a4e0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
a4f0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
a500: 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
a510: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
a520: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30  .  if( pTable!=0
a530: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a540: 70 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20  pName!=0 );.    
a550: 70 54 61 62 20 3d 20 20 73 71 6c 69 74 65 54 61  pTab =  sqliteTa
a560: 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  bleFromToken(pPa
a570: 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  rse, pTable);.  
a580: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
a590: 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  t( pName==0 );. 
a5a0: 20 20 20 70 54 61 62 20 3d 20 20 70 50 61 72 73     pTab =  pPars
a5b0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
a5c0: 7d 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  }.  if( pTab==0 
a5d0: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
a5e0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
a5f0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  te_index;.  if( 
a600: 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  pTab->readOnly )
a610: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
a620: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
a630: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
a640: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a  , pTab->zName, .
a650: 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20        " may not 
a660: 68 61 76 65 20 6e 65 77 20 69 6e 64 69 63 65 73  have new indices
a670: 20 61 64 64 65 64 22 2c 20 30 29 3b 0a 20 20 20   added", 0);.   
a680: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
a690: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
a6a0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
a6b0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
a6c0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
a6d0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
a6e0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 76  rse->zErrMsg, "v
a6f0: 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
a700: 69 6e 64 65 78 65 64 22 2c 20 30 29 3b 0a 20 20  indexed", 0);.  
a710: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
a720: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
a730: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
a740: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
a750: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
a760: 20 77 68 69 6c 65 20 72 65 2d 72 65 61 64 69 6e   while re-readin
a770: 67 20 74 68 65 20 73 63 68 65 6d 61 20 66 72 6f  g the schema fro
a780: 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  m sqlite_master.
a790: 20 20 2a 2a 20 62 75 74 20 74 68 65 20 74 61 62    ** but the tab
a7a0: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
a7b0: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  th this index is
a7c0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
a7d0: 6c 65 2c 20 69 74 20 63 61 6e 0a 20 20 2a 2a 20  le, it can.  ** 
a7e0: 6f 6e 6c 79 20 6d 65 61 6e 20 74 68 61 74 20 74  only mean that t
a7f0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 74 68  he table that th
a800: 69 73 20 69 6e 64 65 78 20 69 73 20 72 65 61 6c  is index is real
a810: 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ly associated wi
a820: 74 68 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 20 77  th is.  ** one w
a830: 68 6f 73 65 20 6e 61 6d 65 20 69 73 20 68 69 64  hose name is hid
a840: 64 65 6e 20 62 65 68 69 6e 64 20 61 20 74 65 6d  den behind a tem
a850: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 77 69 74  porary table wit
a860: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
a870: 0a 20 20 2a 2a 20 53 69 6e 63 65 20 69 74 73 20  .  ** Since its 
a880: 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 73  table has been s
a890: 75 70 70 72 65 73 73 65 64 2c 20 77 65 20 6e 65  uppressed, we ne
a8a0: 65 64 20 74 6f 20 61 6c 73 6f 20 73 75 70 70 72  ed to also suppr
a8b0: 65 73 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64  ess the.  ** ind
a8c0: 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ex..  */.  if( p
a8d0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
a8e0: 26 26 20 21 70 50 61 72 73 65 2d 3e 69 73 54 65  && !pParse->isTe
a8f0: 6d 70 20 26 26 20 70 54 61 62 2d 3e 69 73 54 65  mp && pTab->isTe
a900: 6d 70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  mp ){.    goto e
a910: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
a920: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
a930: 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
a940: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
a950: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
a960: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
a970: 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
a980: 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
a990: 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
a9a0: 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
a9b0: 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
a9c0: 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
a9d0: 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
a9e0: 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
a9f0: 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
aa00: 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
aa10: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
aa20: 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
aa30: 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
aa40: 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
aa50: 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
aa60: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
aa70: 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
aa80: 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
aa90: 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
aaa0: 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
aab0: 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2c 20  ess this index, 
aac0: 62 75 74 20 77 65 20 77 69 6c 6c 20 6e 6f 74 0a  but we will not.
aad0: 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 73 20 6e    ** store its n
aae0: 61 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  ame in the hash 
aaf0: 74 61 62 6c 65 2e 20 20 53 65 74 20 74 68 65 20  table.  Set the 
ab00: 68 69 64 65 4e 61 6d 65 20 66 6c 61 67 20 74 6f  hideName flag to
ab10: 20 61 63 63 6f 6d 70 6c 69 73 68 0a 20 20 2a 2a   accomplish.  **
ab20: 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
ab30: 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
ab40: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
ab50: 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
ab60: 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
ab70: 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
ab80: 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
ab90: 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
aba0: 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
abb0: 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
abc0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53  {.    Index *pIS
abd0: 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41  ameName;    /* A
abe0: 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74  nother index wit
abf0: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
ac00: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
ac10: 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
ac20: 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d  A table with sam
ac30: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e  e name as the in
ac40: 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65  dex */.    zName
ac50: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
ac60: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
ac70: 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  e);.    if( zNam
ac80: 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
ac90: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
aca0: 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61     if( (pISameNa
acb0: 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49  me = sqliteFindI
acc0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29  ndex(db, zName))
acd0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
ace0: 20 70 49 53 61 6d 65 4e 61 6d 65 2d 3e 70 54 61   pISameName->pTa
acf0: 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70  ble->isTemp && p
ad00: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
ad10: 29 7b 0a 20 20 20 20 20 20 20 20 68 69 64 65 4e  ){.        hideN
ad20: 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ame = 1;.      }
ad30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
ad40: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
ad50: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
ad60: 22 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65 2c  "index ", zName,
ad70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 61   .           " a
ad80: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
ad90: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  0);.        pPar
ada0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
adb0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
adc0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
add0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
ade0: 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20  ( (pTSameName = 
adf0: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
ae00: 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29  db, zName))!=0 )
ae10: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 53 61  {.      if( pTSa
ae20: 6d 65 4e 61 6d 65 2d 3e 69 73 54 65 6d 70 20 26  meName->isTemp &
ae30: 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  & pParse->initFl
ae40: 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68 69  ag ){.        hi
ae50: 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20  deName = 1;.    
ae60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ae70: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
ae80: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
ae90: 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  g, "there is alr
aea0: 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
aeb0: 65 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ed ",.          
aec0: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
aed0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
aee0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ++;.        goto
aef0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
af00: 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
af10: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
af20: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
af30: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64    int n;.    Ind
af40: 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66  ex *pLoop;.    f
af50: 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70  or(pLoop=pTab->p
af60: 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f  Index, n=1; pLoo
af70: 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
af80: 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  pNext, n++){}.  
af90: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22    sprintf(zBuf,"
afa0: 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61  %d)",n);.    zNa
afb0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  me = 0;.    sqli
afc0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  teSetString(&zNa
afd0: 6d 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e 7a  me, "(", pTab->z
afe0: 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64 65  Name, " autoinde
aff0: 78 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  x ", zBuf, 0);. 
b000: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
b010: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
b020: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 68 69  te_index;.    hi
b030: 64 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46  deName = sqliteF
b040: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
b050: 6d 65 29 21 3d 30 3b 0a 20 20 7d 0a 0a 20 20 2f  me)!=0;.  }..  /
b060: 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
b070: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
b080: 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
b090: 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
b0a0: 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
b0b0: 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
b0c0: 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
b0d0: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
b0e0: 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
b0f0: 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
b100: 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
b110: 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
b120: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
b130: 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62   nullId.z = pTab
b140: 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
b150: 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l-1].zName;.    
b160: 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65  nullId.n = strle
b170: 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20  n(nullId.z);.   
b180: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49   pList = sqliteI
b190: 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26  dListAppend(0, &
b1a0: 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28  nullId);.    if(
b1b0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
b1c0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
b1d0: 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20  ex;.  }..  /* . 
b1e0: 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
b1f0: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
b200: 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78  . .  */.  pIndex
b210: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
b220: 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b   sizeof(Index) +
b230: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b   strlen(zName) +
b240: 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20   1 +.           
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
b260: 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e  eof(int)*pList->
b270: 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  nId );.  if( pIn
b280: 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  dex==0 ) goto ex
b290: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
b2a0: 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  .  pIndex->aiCol
b2b0: 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e  umn = (int*)&pIn
b2c0: 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78  dex[1];.  pIndex
b2d0: 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ->zName = (char*
b2e0: 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  )&pIndex->aiColu
b2f0: 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a  mn[pList->nId];.
b300: 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d    strcpy(pIndex-
b310: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  >zName, zName);.
b320: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
b330: 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
b340: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69  x->nColumn = pLi
b350: 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65  st->nId;.  pInde
b360: 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e  x->onError = pIn
b370: 64 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d 20  dex->isUnique = 
b380: 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
b390: 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70  x->autoIndex = p
b3a0: 4e 61 6d 65 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53  Name==0;..  /* S
b3b0: 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
b3c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
b3d0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
b3e0: 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
b3f0: 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
b400: 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
b410: 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
b420: 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
b430: 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
b440: 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
b450: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
b460: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
b470: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  d; i++){.    for
b480: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
b490: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
b4a0: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
b4b0: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
b4c0: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
b4d0: 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  j].zName)==0 ) b
b4e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b4f0: 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
b500: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
b510: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
b520: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
b530: 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  ble ", pTab->zNa
b540: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20 68  me, .        " h
b550: 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
b560: 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  ed ", pList->a[i
b570: 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ].zName, 0);.   
b580: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
b590: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  +;.      sqliteF
b5a0: 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree(pIndex);.   
b5b0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
b5c0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
b5d0: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
b5e0: 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
b5f0: 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
b600: 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
b610: 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
b620: 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
b630: 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
b640: 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
b650: 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69  tures. .  */.  i
b660: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
b670: 61 69 6e 20 26 26 20 21 68 69 64 65 4e 61 6d 65  ain && !hideName
b680: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
b690: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
b6a0: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
b6b0: 69 64 78 48 61 73 68 2c 20 70 49 6e 64 65 78 2d  idxHash, pIndex-
b6c0: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a  >zName, strlen(z
b6d0: 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29  Name)+1, pIndex)
b6e0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
b6f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
b700: 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
b710: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
b720: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  ailed */.      s
b730: 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78  qliteFree(pIndex
b740: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
b750: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
b760: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66  .    }.    db->f
b770: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
b780: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
b790: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
b7a0: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
b7b0: 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
b7c0: 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
b7d0: 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
b7e0: 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
b7f0: 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
b800: 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
b810: 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
b820: 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
b830: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
b840: 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  or the correct o
b850: 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41  peration of UPDA
b860: 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45  TE.  ** and INSE
b870: 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  RT..  */.  if( o
b880: 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
b890: 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64  ce || pTab->pInd
b8a0: 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ex==0.       || 
b8b0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
b8c0: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
b8d0: 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  e){.    pIndex->
b8e0: 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
b8f0: 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e  ndex;.    pTab->
b900: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
b910: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
b920: 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
b930: 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
b940: 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
b950: 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
b960: 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
b970: 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
b980: 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
b990: 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
b9a0: 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e  }.    pIndex->pN
b9b0: 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
b9c0: 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d  ext;.    pOther-
b9d0: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
b9e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
b9f0: 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20  e initFlag is 1 
ba00: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
ba10: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
ba20: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
ba30: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62  lite_master" tab
ba40: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20  le on the disk. 
ba50: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
ba60: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a   to the disk.  *
ba70: 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  * again.  Extrac
ba80: 74 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62  t the table numb
ba90: 65 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61 72  er from the pPar
baa0: 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  se->newTnum fiel
bab0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
bac0: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26  arse->initFlag &
bad0: 26 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  & pTable!=0 ){. 
bae0: 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
baf0: 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  = pParse->newTnu
bb00: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
bb10: 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20  the initFlag is 
bb20: 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  0 then create th
bb30: 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e  e index on disk.
bb40: 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f    This.  ** invo
bb50: 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65  lves writing the
bb60: 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
bb70: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
bb80: 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a   filling in the.
bb90: 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
bba0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
bbb0: 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a  e contents..  **
bbc0: 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c  .  ** The initFl
bbd0: 61 67 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  ag is 0 when the
bbe0: 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
bbf0: 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
bc00: 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
bc10: 20 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69    The initFlag i
bc20: 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
bc30: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
bc40: 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
bc50: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
bc60: 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
bc70: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
bc80: 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
bc90: 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
bca0: 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
bcb0: 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
bcc0: 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
bcd0: 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
bce0: 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
bcf0: 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c 65  *.  ** If pTable
bd00: 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
bd10: 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
bd20: 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72  ated as a primar
bd30: 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e  y key.  ** or UN
bd40: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
bd50: 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  of a CREATE TABL
bd60: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
bd70: 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
bd80: 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
bd90: 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
bda0: 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
bdb0: 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
bdc0: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
bdd0: 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
bde0: 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
bdf0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69   if( pParse->ini
be00: 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20  tFlag==0 ){.    
be10: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
be20: 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31  *v;.    int lbl1
be30: 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20  , lbl2;.    int 
be40: 69 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  i;.    int addr;
be50: 0a 20 20 20 20 69 6e 74 20 69 73 54 65 6d 70 20  .    int isTemp 
be60: 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 3b 0a  = pTab->isTemp;.
be70: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47  .    v = sqliteG
be80: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
be90: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
bea0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
beb0: 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  index;.    if( p
bec0: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
bed0: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
bee0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
bef0: 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  se, 0);.      sq
bf00: 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61  liteOpenMasterTa
bf10: 62 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a  ble(v, isTemp);.
bf20: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
bf30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bf40: 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b  NewRecno, 0, 0);
bf50: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
bf60: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
bf70: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
bf80: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
bf90: 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78 22 2c  (v, -1, "index",
bfa0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
bfb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
bfc0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
bfd0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
bfe0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
bff0: 2d 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  -1, pIndex->zNam
c000: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
c010: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
c020: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
c030: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
c040: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
c050: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  , -1, pTab->zNam
c060: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
c070: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c080: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c090: 43 72 65 61 74 65 49 6e 64 65 78 2c 20 30 2c 20  CreateIndex, 0, 
c0a0: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  isTemp);.    sql
c0b0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
c0c0: 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
c0d0: 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 50  &pIndex->tnum, P
c0e0: 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
c0f0: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30  pIndex->tnum = 0
c100: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
c110: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c120: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c130: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
c140: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
c150: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
c160: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
c170: 65 6e 57 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a  enWrAux, 1, 0);.
c180: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c190: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
c1a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
c1b0: 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  rite, 1, 0);.   
c1c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
c1d0: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
c1e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
c1f0: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ng, 0, 0);.    i
c200: 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
c210: 64 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41  d ){.      n = A
c220: 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41  ddr(pEnd->z) - A
c230: 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b  ddr(pStart->z) +
c240: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
c250: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
c260: 61 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c  addr, pStart->z,
c270: 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   n);.    }.    s
c280: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c290: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
c2a0: 20 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   5, 0);.    sqli
c2b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
c2c0: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
c2d0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  0);.    if( pTab
c2e0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  le ){.      sqli
c2f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 69  teVdbeAddOp(v, i
c300: 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41  sTemp ? OP_OpenA
c310: 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 2c 20 32 2c  ux : OP_Open, 2,
c320: 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pTab->tnum);.  
c330: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
c340: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
c350: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ab->zName, P3_ST
c360: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 6c 62 6c  ATIC);.      lbl
c370: 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  2 = sqliteVdbeMa
c380: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
c390: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
c3a0: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
c3b0: 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20  2, lbl2);.      
c3c0: 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62  lbl1 = sqliteVdb
c3d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63  eAddOp(v, OP_Rec
c3e0: 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  no, 2, 0);.     
c3f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
c400: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
c410: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c420: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c430: 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e 64  _Column, 2, pInd
c440: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  ex->aiColumn[i])
c450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c460: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
c470: 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79  v, OP_MakeIdxKey
c480: 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  , pIndex->nColum
c490: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
c4a0: 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74   db->file_format
c4b0: 3e 3d 34 20 29 20 73 71 6c 69 74 65 41 64 64 49  >=4 ) sqliteAddI
c4c0: 64 78 4b 65 79 54 79 70 65 28 76 2c 20 70 49 6e  dxKeyType(v, pIn
c4d0: 64 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dex);.      sqli
c4e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
c4f0: 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e  P_IdxPut, 1, pIn
c500: 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
c510: 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71  _None);.      sq
c520: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c530: 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c   OP_Next, 2, lbl
c540: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
c550: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
c560: 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20  (v, lbl2);.     
c570: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c580: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c  (v, OP_Close, 2,
c590: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
c5a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c5b0: 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20  _Close, 1, 0);. 
c5c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61     }.    if( pTa
c5d0: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble!=0 ){.      
c5e0: 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20  if( !isTemp ){. 
c5f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61         sqliteCha
c600: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29  ngeCookie(db, v)
c610: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c620: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
c630: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
c640: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
c650: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
c660: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  n(pParse);.    }
c670: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
c680: 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
c690: 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
c6a0: 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  e_index:.  sqlit
c6b0: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  eIdListDelete(pL
c6c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ist);.  sqliteFr
c6d0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  ee(zName);.  ret
c6e0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
c6f0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
c700: 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
c710: 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
c720: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
c730: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
c740: 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
c750: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
c760: 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  teDropIndex(Pars
c770: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
c780: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65   *pName){.  Inde
c790: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 63 68 61  x *pIndex;.  cha
c7a0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65  r *zName;.  Vdbe
c7b0: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *v;.  sqlite *d
c7c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c7d0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
c7e0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
c7f0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
c800: 74 75 72 6e 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  turn;.  zName = 
c810: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
c820: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
c830: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
c840: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e 64  ) return;.  pInd
c850: 65 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49  ex = sqliteFindI
c860: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  ndex(db, zName);
c870: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
c880: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ame);.  if( pInd
c890: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex==0 ){.    sql
c8a0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
c8b0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
c8c0: 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
c8d0: 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70  ", 0, .        p
c8e0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
c8f0: 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  n, 0);.    pPars
c900: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
c910: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
c920: 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
c930: 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
c940: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
c950: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64  e->zErrMsg, "ind
c960: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
c970: 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
c980: 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
c990: 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
c9a0: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
c9b0: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
c9c0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
c9d0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  urn;.  }..  /* G
c9e0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
c9f0: 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
ca00: 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
ca10: 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
ca20: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
ca30: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
ca40: 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63   v ){.    static
ca50: 20 56 64 62 65 4f 70 20 64 72 6f 70 49 6e 64 65   VdbeOp dropInde
ca60: 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  x[] = {.      { 
ca70: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
ca80: 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 20 0a  , ADDR(9), 0}, .
ca90: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
caa0: 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  g,     0, 0,    
cab0: 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20     0}, /* 1 */. 
cac0: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
cad0: 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
cae0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
caf0: 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20  _MemLoad,    1, 
cb00: 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
cb10: 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  3 */.      { OP_
cb20: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31  Column,     0, 1
cb30: 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
cb40: 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20    { OP_Eq,      
cb50: 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30     0, ADDR(8), 0
cb60: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
cb70: 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  xt,       0, ADD
cb80: 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(3), 0},.      
cb90: 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20  { OP_Goto,      
cba0: 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c   0, ADDR(9), 0},
cbb0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
cbc0: 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
cbd0: 20 20 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a      0}, /* 8 */.
cbe0: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62      };.    int b
cbf0: 61 73 65 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ase;.    Table *
cc00: 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
cc10: 54 61 62 6c 65 3b 0a 0a 20 20 20 20 73 71 6c 69  Table;..    sqli
cc20: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
cc30: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 29  ation(pParse, 0)
cc40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e  ;.    sqliteOpen
cc50: 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70  MasterTable(v, p
cc60: 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20  Tab->isTemp);.  
cc70: 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56    base = sqliteV
cc80: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
cc90: 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e  ArraySize(dropIn
cca0: 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29  dex), dropIndex)
ccb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
ccc0: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
ccd0: 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  +1, pIndex->zNam
cce0: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  e, 0);.    if( !
ccf0: 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b 0a  pTab->isTemp ){.
cd00: 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e        sqliteChan
cd10: 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b  geCookie(db, v);
cd20: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
cd30: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
cd40: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
cd50: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
cd60: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
cd70: 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20  , pIndex->tnum, 
cd80: 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b 0a 20  pTab->isTemp);. 
cd90: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
cda0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
cdb0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  e);.  }..  /* De
cdc0: 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lete the in-memo
cdd0: 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  ry description o
cde0: 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  f this index..  
cdf0: 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  */.  if( !pParse
ce00: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
ce10: 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64   sqliteUnlinkAnd
ce20: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
ce30: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64 62 2d  pIndex);.    db-
ce40: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
ce50: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
ce60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70    }.}../*.** App
ce70: 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
ce80: 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
ce90: 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
cea0: 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
ceb0: 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
cec0: 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
ced0: 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
cee0: 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
cef0: 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  ails..*/.IdList 
cf00: 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70  *sqliteIdListApp
cf10: 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  end(IdList *pLis
cf20: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
cf30: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
cf40: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
cf50: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
cf60: 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
cf70: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
cf80: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
cf90: 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e  }.  if( (pList->
cfa0: 6e 49 64 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20  nId & 7)==0 ){. 
cfb0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
cfc0: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20  _item *a;.    a 
cfd0: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
cfe0: 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74  pList->a, (pList
cff0: 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66 28  ->nId+8)*sizeof(
d000: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a  pList->a[0]) );.
d010: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
d020: 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69        sqliteIdLi
d030: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
d040: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
d050: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
d060: 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d  ->a = a;.  }.  m
d070: 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b  emset(&pList->a[
d080: 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20  pList->nId], 0, 
d090: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
d0a0: 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  0]));.  if( pTok
d0b0: 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  en ){.    char *
d0c0: 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  *pz = &pList->a[
d0d0: 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d  pList->nId].zNam
d0e0: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  e;.    sqliteSet
d0f0: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b  NString(pz, pTok
d100: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
d110: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  , 0);.    if( *p
d120: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
d130: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
d140: 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
d150: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
d160: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
d170: 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20  Dequote(*pz);.  
d180: 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d    }.  }.  pList-
d190: 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  >nId++;.  return
d1a0: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
d1b0: 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
d1c0: 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
d1d0: 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
d1e0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
d1f0: 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
d200: 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
d210: 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
d220: 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
d230: 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
d240: 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53  L..**.** A new S
d250: 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  rcList is return
d260: 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
d270: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
d280: 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
d290: 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53  eSrcListAppend(S
d2a0: 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
d2b0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
d2c0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
d2d0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
d2e0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
d2f0: 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20  f(IdList) );.   
d300: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
d310: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d320: 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 53 72 63  if( (pList->nSrc
d330: 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   & 7)==0 ){.    
d340: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
d350: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d 20  tem *a;.    a = 
d360: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
d370: 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d 3e  ist->a, (pList->
d380: 6e 53 72 63 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nSrc+8)*sizeof(p
d390: 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  List->a[0]) );. 
d3a0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
d3b0: 20 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69       sqliteSrcLi
d3c0: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
d3d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
d3e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
d3f0: 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d  ->a = a;.  }.  m
d400: 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b  emset(&pList->a[
d410: 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c  pList->nSrc], 0,
d420: 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
d430: 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f  [0]));.  if( pTo
d440: 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ken ){.    char 
d450: 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61  **pz = &pList->a
d460: 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e  [pList->nSrc].zN
d470: 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  ame;.    sqliteS
d480: 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54  etNString(pz, pT
d490: 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d  oken->z, pToken-
d4a0: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  >n, 0);.    if( 
d4b0: 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  *pz==0 ){.      
d4c0: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c  sqliteSrcListDel
d4d0: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
d4e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
d4f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
d500: 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  iteDequote(*pz);
d510: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69  .    }.  }.  pLi
d520: 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65  st->nSrc++;.  re
d530: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
d540: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61  *.** Add an alia
d550: 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64  s to the last id
d560: 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20  entifier on the 
d570: 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72  given identifier
d580: 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
d590: 71 6c 69 74 65 53 72 63 4c 69 73 74 41 64 64 41  qliteSrcListAddA
d5a0: 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c  lias(SrcList *pL
d5b0: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
d5c0: 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  en){.  if( pList
d5d0: 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e   && pList->nSrc>
d5e0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  0 ){.    int i =
d5f0: 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 2d 20 31   pList->nSrc - 1
d600: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  ;.    sqliteSetN
d610: 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61  String(&pList->a
d620: 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f 6b  [i].zAlias, pTok
d630: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
d640: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
d650: 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61  Dequote(pList->a
d660: 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d  [i].zAlias);.  }
d670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
d680: 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
d690: 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74  oid sqliteIdList
d6a0: 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70  Delete(IdList *p
d6b0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
d6c0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
d6d0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
d6e0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
d6f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
d700: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
d710: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
d720: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
d730: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  t->a);.  sqliteF
d740: 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
d750: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
d760: 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
d770: 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
d780: 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
d790: 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
d7a0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
d7b0: 71 6c 69 74 65 49 64 4c 69 73 74 49 6e 64 65 78  qliteIdListIndex
d7c0: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
d7d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
d7e0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
d7f0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
d800: 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69  turn -1;.  for(i
d810: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
d820: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
d830: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c  sqliteStrICmp(pL
d840: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
d850: 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74   zName)==0 ) ret
d860: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
d870: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
d880: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
d890: 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64  e SrcList includ
d8a0: 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73  ing all its subs
d8b0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
d8c0: 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44  d sqliteSrcListD
d8d0: 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70  elete(SrcList *p
d8e0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
d8f0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
d900: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
d910: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
d920: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  c; i++){.    sql
d930: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
d940: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
d950: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
d960: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a  ->a[i].zAlias);.
d970: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
d980: 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69 73  [i].pTab && pLis
d990: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69 73  t->a[i].pTab->is
d9a0: 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20  Transient ){.   
d9b0: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54     sqliteDeleteT
d9c0: 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e 61  able(0, pList->a
d9d0: 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20 7d  [i].pTab);.    }
d9e0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63  .    sqliteSelec
d9f0: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61  tDelete(pList->a
da00: 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  [i].pSelect);.  
da10: 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65    sqliteExprDele
da20: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
da30: 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 49  On);.    sqliteI
da40: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
da50: 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29 3b  t->a[i].pUsing);
da60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
da70: 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  e(pList->a);.  s
da80: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29  qliteFree(pList)
da90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
daa0: 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 69 73 20 66  OPY command is f
dab0: 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  or compatibility
dac0: 20 77 69 74 68 20 50 6f 73 74 67 72 65 53 51 4c   with PostgreSQL
dad0: 20 61 6e 64 20 73 70 65 63 69 66 69 63 69 61 6c   and specificial
dae0: 6c 79 0a 2a 2a 20 66 6f 72 20 74 68 65 20 61 62  ly.** for the ab
daf0: 69 6c 69 74 79 20 74 6f 20 72 65 61 64 20 74 68  ility to read th
db00: 65 20 6f 75 74 70 75 74 20 6f 66 20 70 67 5f 64  e output of pg_d
db10: 75 6d 70 2e 20 20 54 68 65 20 66 6f 72 6d 61 74  ump.  The format
db20: 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77   is as.** follow
db30: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50 59  s:.**.**    COPY
db40: 20 74 61 62 6c 65 20 46 52 4f 4d 20 66 69 6c 65   table FROM file
db50: 20 5b 55 53 49 4e 47 20 44 45 4c 49 4d 49 54 45   [USING DELIMITE
db60: 52 53 20 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a  RS string].**.**
db70: 20 22 74 61 62 6c 65 22 20 69 73 20 61 6e 20 65   "table" is an e
db80: 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6e 61  xisting table na
db90: 6d 65 2e 20 20 57 65 20 77 69 6c 6c 20 72 65 61  me.  We will rea
dba0: 64 20 6c 69 6e 65 73 20 6f 66 20 63 6f 64 65 20  d lines of code 
dbb0: 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f 20  from.** file to 
dbc0: 66 69 6c 6c 20 74 68 69 73 20 74 61 62 6c 65 20  fill this table 
dbd0: 77 69 74 68 20 64 61 74 61 2e 20 20 46 69 6c 65  with data.  File
dbe0: 20 6d 69 67 68 74 20 62 65 20 22 73 74 64 69 6e   might be "stdin
dbf0: 22 2e 20 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c  ".  The optional
dc00: 0a 2a 2a 20 64 65 6c 69 6d 69 74 65 72 20 73 74  .** delimiter st
dc10: 72 69 6e 67 20 69 64 65 6e 74 69 66 69 65 73 20  ring identifies 
dc20: 74 68 65 20 66 69 65 6c 64 20 73 65 70 61 72 61  the field separa
dc30: 74 6f 72 73 2e 20 20 54 68 65 20 64 65 66 61 75  tors.  The defau
dc40: 6c 74 20 69 73 20 61 20 74 61 62 2e 0a 2a 2f 0a  lt is a tab..*/.
dc50: 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 70 79 28  void sqliteCopy(
dc60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
dc70: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
dc80: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
dc90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
dca0: 4e 61 6d 65 2c 20 20 20 2f 2a 20 54 68 65 20 6e  Name,   /* The n
dcb0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
dcc0: 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 77   into which we w
dcd0: 69 6c 6c 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20  ill insert */.  
dce0: 54 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e 61 6d 65  Token *pFilename
dcf0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65  ,    /* The file
dd00: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 6f   from which to o
dd10: 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  btain informatio
dd20: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  n */.  Token *pD
dd30: 65 6c 69 6d 69 74 65 72 2c 20 20 20 2f 2a 20 55  elimiter,   /* U
dd40: 73 65 20 74 68 69 73 20 61 73 20 74 68 65 20 66  se this as the f
dd50: 69 65 6c 64 20 64 65 6c 69 6d 69 74 65 72 20 2a  ield delimiter *
dd60: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20  /.  int onError 
dd70: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
dd80: 20 74 6f 20 64 6f 20 69 66 20 61 20 63 6f 6e 73   to do if a cons
dd90: 74 72 61 69 6e 74 20 66 61 69 6c 73 20 2a 2f 0a  traint fails */.
dda0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
ddb0: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a  ;.  char *zTab;.
ddc0: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 20    int i;.  Vdbe 
ddd0: 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  *v;.  int addr, 
dde0: 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  end;.  Index *pI
ddf0: 64 78 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  dx;.  sqlite *db
de00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
de10: 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 54    zTab = sqliteT
de20: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
de30: 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  n(pTableName);. 
de40: 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   if( sqlite_mall
de50: 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 7a 54 61  oc_failed || zTa
de60: 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63 6f 70 79  b==0 ) goto copy
de70: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 61 62  _cleanup;.  pTab
de80: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
de90: 6d 65 54 6f 54 61 62 6c 65 28 70 50 61 72 73 65  meToTable(pParse
dea0: 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  , zTab);.  sqlit
deb0: 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 69  eFree(zTab);.  i
dec0: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
ded0: 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a  o copy_cleanup;.
dee0: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
def0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
df00: 66 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( v ){.    int 
df10: 6f 70 65 6e 4f 70 3b 0a 20 20 20 20 73 71 6c 69  openOp;.    sqli
df20: 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
df30: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 29  ation(pParse, 1)
df40: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
df50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
df60: 4f 50 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c 20  OP_FileOpen, 0, 
df70: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
df80: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
df90: 64 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a  dr, pFilename->z
dfa0: 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b  , pFilename->n);
dfb0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44  .    sqliteVdbeD
dfc0: 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72  equoteP3(v, addr
dfd0: 29 3b 0a 20 20 20 20 6f 70 65 6e 4f 70 20 3d 20  );.    openOp = 
dfe0: 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 3f 20 4f  pTab->isTemp ? O
dff0: 50 5f 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f 50  P_OpenWrAux : OP
e000: 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20  _OpenWrite;.    
e010: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e020: 76 2c 20 6f 70 65 6e 4f 70 2c 20 30 2c 20 70 54  v, openOp, 0, pT
e030: 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73  ab->tnum);.    s
e040: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
e050: 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a  3(v, -1, pTab->z
e060: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
e070: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70  ;.    for(i=1, p
e080: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
e090: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
e0a0: 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a  x->pNext, i++){.
e0b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
e0c0: 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c  AddOp(v, openOp,
e0d0: 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b   i, pIdx->tnum);
e0e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
e0f0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
e100: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pIdx->zName, P3
e110: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a  _STATIC);.    }.
e120: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
e130: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
e140: 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71  Rows ){.      sq
e150: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
e160: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
e170: 30 29 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  0);  /* Initiali
e180: 7a 65 20 74 68 65 20 72 6f 77 20 63 6f 75 6e 74  ze the row count
e190: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e   */.    }.    en
e1a0: 64 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  d = sqliteVdbeMa
e1b0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
e1c0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
e1d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c  eAddOp(v, OP_Fil
e1e0: 65 52 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43 6f  eRead, pTab->nCo
e1f0: 6c 2c 20 65 6e 64 29 3b 0a 20 20 20 20 69 66 28  l, end);.    if(
e200: 20 70 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a 20   pDelimiter ){. 
e210: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
e220: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
e230: 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20   pDelimiter->z, 
e240: 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a  pDelimiter->n);.
e250: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
e260: 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64  DequoteP3(v, add
e270: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
e280: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
e290: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
e2a0: 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20 7d   "\t", 1);.    }
e2b0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69  .    if( pTab->i
e2c0: 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20  PKey>=0 ){.     
e2d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
e2e0: 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d  (v, OP_FileColum
e2f0: 6e 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 2c 20  n, pTab->iPKey, 
e300: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
e310: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e320: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
e330: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e340: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
e350: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
e360: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  o, 0, 0);.    }.
e370: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
e380: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
e390: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 54  .      if( i==pT
e3a0: 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
e3b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65       /* The inte
e3c0: 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ger primary key 
e3d0: 63 6f 6c 75 6d 6e 20 69 73 20 66 69 6c 6c 65 64  column is filled
e3e0: 20 77 69 74 68 20 4e 55 4c 4c 20 73 69 6e 63 65   with NULL since
e3f0: 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   its.        ** 
e400: 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73 20  value is always 
e410: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20  pulled from the 
e420: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a 2f  record number */
e430: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
e440: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
e450: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
e460: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e470: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
e480: 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c  Op(v, OP_FileCol
e490: 75 6d 6e 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  umn, i, 0);.    
e4a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
e4b0: 6c 69 74 65 47 65 6e 65 72 61 74 65 43 6f 6e 73  liteGenerateCons
e4c0: 74 72 61 69 6e 74 43 68 65 63 6b 73 28 70 50 61  traintChecks(pPa
e4d0: 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c  rse, pTab, 0, 0,
e4e0: 20 30 2c 20 30 2c 20 6f 6e 45 72 72 6f 72 2c 20   0, 0, onError, 
e4f0: 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  addr);.    sqlit
e500: 65 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69  eCompleteInserti
e510: 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  on(pParse, pTab,
e520: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
e530: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
e540: 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52   & SQLITE_CountR
e550: 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ows)!=0 ){.     
e560: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
e570: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31  (v, OP_AddImm, 1
e580: 2c 20 30 29 3b 20 20 2f 2a 20 49 6e 63 72 65 6d  , 0);  /* Increm
e590: 65 6e 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f  ent row count */
e5a0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e5b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
e5c0: 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b  _Goto, 0, addr);
e5d0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52  .    sqliteVdbeR
e5e0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
e5f0: 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  nd);.    sqliteV
e600: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
e610: 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  oop, 0, 0);.    
e620: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
e630: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
e640: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
e650: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e  gs & SQLITE_Coun
e660: 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73  tRows ){.      s
e670: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
e680: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74  , OP_ColumnCount
e690: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
e6a0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
e6b0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
e6c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
e6d0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
e6e0: 28 76 2c 20 2d 31 2c 20 22 72 6f 77 73 20 69 6e  (v, -1, "rows in
e6f0: 73 65 72 74 65 64 22 2c 20 50 33 5f 53 54 41 54  serted", P3_STAT
e700: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
e710: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
e720: 5f 43 61 6c 6c 62 61 63 6b 2c 20 31 2c 20 30 29  _Callback, 1, 0)
e730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 63  ;.    }.  }.  .c
e740: 6f 70 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 72  opy_cleanup:.  r
e750: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
e760: 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64  The non-standard
e770: 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20   VACUUM command 
e780: 69 73 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  is used to clean
e790: 20 75 70 20 74 68 65 20 64 61 74 61 62 61 73 65   up the database
e7a0: 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66 72  ,.** collapse fr
e7b0: 65 65 20 73 70 61 63 65 2c 20 65 74 63 2e 20 20  ee space, etc.  
e7c0: 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20 61  It is modelled a
e7d0: 66 74 65 72 20 74 68 65 20 56 41 43 55 55 4d 20  fter the VACUUM 
e7e0: 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50 6f  command.** in Po
e7f0: 73 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a 2a 20  stgreSQL..**.** 
e800: 49 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30 2e 78  In version 1.0.x
e810: 20 6f 66 20 53 51 4c 69 74 65 2c 20 74 68 65 20   of SQLite, the 
e820: 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 77  VACUUM command w
e830: 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67 64 62  ould call.** gdb
e840: 6d 5f 72 65 6f 72 67 61 6e 69 7a 65 28 29 20 6f  m_reorganize() o
e850: 6e 20 61 6c 6c 20 74 68 65 20 64 61 74 61 62 61  n all the databa
e860: 73 65 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20  se tables.  But 
e870: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74  beginning.** wit
e880: 68 20 32 2e 30 2e 30 2c 20 53 51 4c 69 74 65 20  h 2.0.0, SQLite 
e890: 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 47  no longer uses G
e8a0: 44 42 4d 20 73 6f 20 74 68 69 73 20 63 6f 6d 6d  DBM so this comm
e8b0: 61 6e 64 20 68 61 73 0a 2a 2a 20 62 65 63 6f 6d  and has.** becom
e8c0: 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f  e a no-op..*/.vo
e8d0: 69 64 20 73 71 6c 69 74 65 56 61 63 75 75 6d 28  id sqliteVacuum(
e8e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
e8f0: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65  oken *pTableName
e900: 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69  ){.  /* Do nothi
e910: 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ng */.}../*.** B
e920: 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
e930: 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
e940: 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  eBeginTransactio
e950: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
e960: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
e970: 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20   sqlite *db;..  
e980: 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
e990: 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
e9a0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d  ==0 || db->pBe==
e9b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
e9c0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
e9d0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
e9e0: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
e9f0: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
ea00: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
ea10: 73 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  s ){.    pParse-
ea20: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nErr++;.    sql
ea30: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
ea40: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
ea50: 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74  cannot start a t
ea60: 72 61 6e 73 61 63 74 69 6f 6e 20 22 0a 20 20 20  ransaction ".   
ea70: 20 20 20 20 22 77 69 74 68 69 6e 20 61 20 74 72      "within a tr
ea80: 61 6e 73 61 63 74 69 6f 6e 22 2c 20 30 29 3b 0a  ansaction", 0);.
ea90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
eaa0: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
eab0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
eac0: 73 65 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c  se, 0);.  db->fl
ead0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
eae0: 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45  Trans;.  db->onE
eaf0: 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  rror = onError;.
eb00: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
eb10: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
eb20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d  .void sqliteComm
eb30: 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
eb40: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
eb50: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69  sqlite *db;..  i
eb60: 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
eb70: 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
eb80: 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30  =0 || db->pBe==0
eb90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
eba0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
ebb0: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
ebc0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
ebd0: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
ebe0: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
ebf0: 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  s)==0 ){.    pPa
ec00: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
ec10: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
ec20: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
ec30: 67 2c 20 0a 20 20 20 20 20 20 20 22 63 61 6e 6e  g, .       "cann
ec40: 6f 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74  ot commit - no t
ec50: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
ec60: 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  tive", 0);.    r
ec70: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62 2d  eturn;.  }.  db-
ec80: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
ec90: 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 73 71 6c  E_InTrans;.  sql
eca0: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
ecb0: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
ecc0: 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45  db->onError = OE
ecd0: 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  _Default;.}../*.
ece0: 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72  ** Rollback a tr
ecf0: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
ed00: 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b  d sqliteRollback
ed10: 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
ed20: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
ed30: 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65  lite *db;.  Vdbe
ed40: 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
ed50: 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
ed60: 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
ed70: 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75  b->pBe==0 ) retu
ed80: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
ed90: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
eda0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
edb0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
edc0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
edd0: 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29  TE_InTrans)==0 )
ede0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  {.    pParse->nE
edf0: 72 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  rr++;.    sqlite
ee00: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
ee10: 65 2d 3e 7a 45 72 72 4d 73 67 2c 0a 20 20 20 20  e->zErrMsg,.    
ee20: 20 20 20 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62     "cannot rollb
ee30: 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63  ack - no transac
ee40: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 2c  tion is active",
ee50: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
ee60: 20 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69   .  }.  v = sqli
ee70: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
ee80: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
ee90: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
eea0: 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61 63 6b  p(v, OP_Rollback
eeb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64  , 0, 0);.  }.  d
eec0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
eed0: 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 64  ITE_InTrans;.  d
eee0: 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f  b->onError = OE_
eef0: 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  Default;.}../*.*
ef00: 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
ef10: 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
ef20: 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
ef30: 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
ef40: 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
ef50: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
ef60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ef70: 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
ef80: 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
ef90: 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
efa0: 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
efb0: 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
efc0: 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
efd0: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
efe0: 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
eff0: 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
f000: 74 68 65 20 73 65 74 43 68 65 63 6b 70 6f 69 6e  the setCheckpoin
f010: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
f020: 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
f030: 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
f040: 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
f050: 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
f060: 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
f070: 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
f080: 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
f090: 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
f0a0: 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
f0b0: 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
f0c0: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
f0d0: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
f0e0: 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
f0f0: 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
f100: 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
f110: 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
f120: 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
f130: 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
f140: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
f150: 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
f160: 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
f170: 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
f180: 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
f190: 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
f1a0: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
f1b0: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
f1c0: 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
f1d0: 61 72 73 65 2c 20 69 6e 74 20 73 65 74 43 68 65  arse, int setChe
f1e0: 63 6b 70 6f 69 6e 74 29 7b 0a 20 20 56 64 62 65  ckpoint){.  Vdbe
f1f0: 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74   *v;.  v = sqlit
f200: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
f210: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
f220: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
f230: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
f240: 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66 20 74   return; /* if t
f250: 68 69 73 20 69 73 20 69 6e 20 61 20 74 72 69 67  his is in a trig
f260: 67 65 72 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  ger */.  if( (pP
f270: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
f280: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
f290: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
f2a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f2b0: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 30  P_Transaction, 0
f2c0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
f2d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f2e0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 70 50  VerifyCookie, pP
f2f0: 61 72 73 65 2d 3e 64 62 2d 3e 73 63 68 65 6d 61  arse->db->schema
f300: 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  _cookie, 0);.   
f310: 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56   pParse->schemaV
f320: 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d  erified = 1;.  }
f330: 65 6c 73 65 20 69 66 28 20 73 65 74 43 68 65 63  else if( setChec
f340: 6b 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 73 71  kpoint ){.    sq
f350: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
f360: 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20   OP_Checkpoint, 
f370: 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, 0);.  }.}../*
f380: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
f390: 65 20 74 68 61 74 20 63 6f 6e 63 6c 75 64 65 73  e that concludes
f3a0: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
f3b0: 61 74 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e  at may have chan
f3c0: 67 65 64 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ged.** the datab
f3d0: 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 61 20  ase.  This is a 
f3e0: 63 6f 6d 70 61 6e 69 6f 6e 20 66 75 6e 63 74 69  companion functi
f3f0: 6f 6e 20 74 6f 20 42 65 67 69 6e 57 72 69 74 65  on to BeginWrite
f400: 4f 70 65 72 61 74 69 6f 6e 28 29 2e 0a 2a 2a 20  Operation()..** 
f410: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
f420: 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 74 68   was started, th
f430: 65 6e 20 63 6f 6d 6d 69 74 20 69 74 2e 20 20 49  en commit it.  I
f440: 66 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 77  f a checkpoint w
f450: 61 73 0a 2a 2a 20 73 74 61 72 74 65 64 20 74 68  as.** started th
f460: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 61 74 2e 0a  en commit that..
f470: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 6e  */.void sqliteEn
f480: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
f490: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
f4a0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 66 28    Vdbe *v;.  if(
f4b0: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
f4c0: 63 6b 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  ck ) return; /* 
f4d0: 69 66 20 74 68 69 73 20 69 73 20 69 6e 20 61 20  if this is in a 
f4e0: 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 76 20 3d  trigger */.  v =
f4f0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
f500: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
f510: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
f520: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
f530: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
f540: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 2f 2a 20  Trans ){.    /* 
f550: 44 6f 20 4e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do Nothing */.  
f560: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
f570: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
f580: 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  _Commit, 0, 0);.
f590: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e    }.}.../*.** In
f5a0: 74 65 72 70 72 65 74 20 74 68 65 20 67 69 76 65  terpret the give
f5b0: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 62 6f  n string as a bo
f5c0: 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a  olean value..*/.
f5d0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 42 6f  static int getBo
f5e0: 6f 6c 65 61 6e 28 63 68 61 72 20 2a 7a 29 7b 0a  olean(char *z){.
f5f0: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 61    static char *a
f600: 7a 54 72 75 65 5b 5d 20 3d 20 7b 20 22 79 65 73  zTrue[] = { "yes
f610: 22 2c 20 22 6f 6e 22 2c 20 22 74 72 75 65 22 20  ", "on", "true" 
f620: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  };.  int i;.  if
f630: 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75  ( z[0]==0 ) retu
f640: 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 73 64 69  rn 0;.  if( isdi
f650: 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b  git(z[0]) || (z[
f660: 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73 64 69 67  0]=='-' && isdig
f670: 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20 20 20  it(z[1])) ){.   
f680: 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a 29 3b   return atoi(z);
f690: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
f6a0: 69 3c 73 69 7a 65 6f 66 28 61 7a 54 72 75 65 29  i<sizeof(azTrue)
f6b0: 2f 73 69 7a 65 6f 66 28 61 7a 54 72 75 65 5b 30  /sizeof(azTrue[0
f6c0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
f6d0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
f6e0: 7a 2c 61 7a 54 72 75 65 5b 69 5d 29 3d 3d 30 20  z,azTrue[i])==0 
f6f0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
f700: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
f710: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70  *.** Process a p
f720: 72 61 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  ragma statement.
f730: 20 20 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73    .**.** Pragmas
f740: 20 61 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72   are of this for
f750: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52  m:.**.**      PR
f760: 41 47 4d 41 20 69 64 20 3d 20 76 61 6c 75 65 0a  AGMA id = value.
f770: 2a 2a 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69  **.** The identi
f780: 66 69 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20  fier might also 
f790: 62 65 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68  be a string.  Th
f7a0: 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72  e value is a str
f7b0: 69 6e 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e  ing, and.** iden
f7c0: 74 69 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d  tifier, or a num
f7d0: 62 65 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c  ber.  If minusFl
f7e0: 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
f7f0: 20 74 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a   the value is.**
f800: 20 61 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77   a number that w
f810: 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61  as preceded by a
f820: 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2f 0a   minus sign..*/.
f830: 76 6f 69 64 20 73 71 6c 69 74 65 50 72 61 67 6d  void sqlitePragm
f840: 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
f850: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
f860: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 2c 20 69 6e  oken *pRight, in
f870: 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20  t minusFlag){.  
f880: 63 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b  char *zLeft = 0;
f890: 0a 20 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20  .  char *zRight 
f8a0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  = 0;.  sqlite *d
f8b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
f8c0: 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74  .  zLeft = sqlit
f8d0: 65 53 74 72 4e 44 75 70 28 70 4c 65 66 74 2d 3e  eStrNDup(pLeft->
f8e0: 7a 2c 20 70 4c 65 66 74 2d 3e 6e 29 3b 0a 20 20  z, pLeft->n);.  
f8f0: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4c  sqliteDequote(zL
f900: 65 66 74 29 3b 0a 20 20 69 66 28 20 6d 69 6e 75  eft);.  if( minu
f910: 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a 52 69  sFlag ){.    zRi
f920: 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ght = 0;.    sql
f930: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 7a  iteSetNString(&z
f940: 52 69 67 68 74 2c 20 22 2d 22 2c 20 31 2c 20 70  Right, "-", 1, p
f950: 52 69 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74  Right->z, pRight
f960: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ->n, 0);.  }else
f970: 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73  {.    zRight = s
f980: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 52 69  qliteStrNDup(pRi
f990: 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74 2d 3e  ght->z, pRight->
f9a0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65  n);.    sqliteDe
f9b0: 71 75 6f 74 65 28 7a 52 69 67 68 74 29 3b 0a 20  quote(zRight);. 
f9c0: 20 7d 0a 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20   }. .  /*.  **  
f9d0: 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 63  PRAGMA default_c
f9e0: 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20  ache_size.  **  
f9f0: 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 63  PRAGMA default_c
fa00: 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a  ache_size=N.  **
fa10: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
fa20: 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65  form reports the
fa30: 20 63 75 72 72 65 6e 74 20 70 65 72 73 69 73 74   current persist
fa40: 65 6e 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ent setting for 
fa50: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  the.  ** page ca
fa60: 63 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76  che size.  The v
fa70: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
fa80: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
fa90: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65  ber of.  ** page
faa0: 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
fab0: 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  che.  The second
fac0: 20 66 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20   form sets both 
fad0: 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
fae0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
faf0: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
fb00: 65 72 73 69 73 74 65 6e 74 20 70 61 67 65 20 63  ersistent page c
fb10: 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a  ache size value.
fb20: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74    ** stored in t
fb30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
fb40: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
fb50: 64 65 66 61 75 6c 74 20 63 61 63 68 65 20 73 69  default cache si
fb60: 7a 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ze is stored in 
fb70: 6d 65 74 61 2d 76 61 6c 75 65 20 32 20 6f 66 20  meta-value 2 of 
fb80: 70 61 67 65 20 31 20 6f 66 20 74 68 65 0a 20 20  page 1 of the.  
fb90: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
fba0: 2e 20 20 54 68 65 20 63 61 63 68 65 20 73 69 7a  .  The cache siz
fbb0: 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68  e is actually th
fbc0: 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65  e absolute value
fbd0: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65   of.  ** this me
fbe0: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 20 20  mory location.  
fbf0: 54 68 65 20 73 69 67 6e 20 6f 66 20 6d 65 74 61  The sign of meta
fc00: 2d 76 61 6c 75 65 20 32 20 64 65 74 65 72 6d 69  -value 2 determi
fc10: 6e 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 79 6e  nes the.  ** syn
fc20: 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67  chronous setting
fc30: 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 76 61  .  A negative va
fc40: 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e 63 68 72  lue means synchr
fc50: 6f 6e 6f 75 73 20 69 73 20 6f 66 66 0a 20 20 2a  onous is off.  *
fc60: 2a 20 61 6e 64 20 61 20 70 6f 73 69 74 69 76 65  * and a positive
fc70: 20 76 61 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e   value means syn
fc80: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 2e 0a  chronous is on..
fc90: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
fca0: 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22  eStrICmp(zLeft,"
fcb0: 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69  default_cache_si
fcc0: 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ze")==0 ){.    s
fcd0: 74 61 74 69 63 20 56 64 62 65 4f 70 20 67 65 74  tatic VdbeOp get
fce0: 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a  CacheSize[] = {.
fcf0: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43        { OP_ReadC
fd00: 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c 20 20 20  ookie,  0, 2,   
fd10: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
fd20: 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c 20 20 20   OP_AbsValue,   
fd30: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
fd40: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 75 70  ,.      { OP_Dup
fd50: 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20  ,         0, 0, 
fd60: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
fd70: 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
fd80: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
fd90: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
fda0: 65 2c 20 20 20 20 20 20 20 20 20 20 30 2c 20 36  e,          0, 6
fdb0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
fdc0: 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
fdd0: 20 20 20 20 20 4d 41 58 5f 50 41 47 45 53 2c 30       MAX_PAGES,0
fde0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
fdf0: 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c  _ColumnCount, 1,
fe00: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
fe10: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
fe20: 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
fe30: 20 20 20 20 22 63 61 63 68 65 5f 73 69 7a 65 22      "cache_size"
fe40: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61  },.      { OP_Ca
fe50: 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c  llback,    1, 0,
fe60: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
fe70: 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  };.    Vdbe *v =
fe80: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
fe90: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
fea0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
feb0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a     if( pRight->z
fec0: 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20  ==pLeft->z ){.  
fed0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
fee0: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
fef0: 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a  Size(getCacheSiz
ff00: 65 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65  e), getCacheSize
ff10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ff20: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
ff30: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 61      int size = a
ff40: 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  toi(zRight);.   
ff50: 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20     if( size<0 ) 
ff60: 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20  size = -size;.  
ff70: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
ff80: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
ff90: 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  arse, 0);.      
ffa0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
ffb0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73  v, OP_Integer, s
ffc0: 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ize, 0);.      s
ffd0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
ffe0: 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  , OP_ReadCookie,
fff0: 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 61 64   0, 2);.      ad
10000 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
10010 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
10020 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  er, 0, 0);.     
10030 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
10040 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 61 64  (v, OP_Ge, 0, ad
10050 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+3);.      sql
10060 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
10070 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c 20  OP_Negative, 0, 
10080 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
10090 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
100a0 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29  SetCookie, 0, 2)
100b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 6e  ;.      sqliteEn
100c0 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
100d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 64  pParse);.      d
100e0 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  b->cache_size = 
100f0 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3c 30  db->cache_size<0
10100 20 3f 20 2d 73 69 7a 65 20 3a 20 73 69 7a 65 3b   ? -size : size;
10110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72  .      sqliteBtr
10120 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 64  eeSetCacheSize(d
10130 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63 68  b->pBe, db->cach
10140 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  e_size);.    }. 
10150 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a   }else..  /*.  *
10160 2a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f  *  PRAGMA cache_
10170 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d  size.  **  PRAGM
10180 41 20 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20  A cache_size=N. 
10190 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
101a0 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20  st form reports 
101b0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
101c0 6c 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68  l setting for th
101d0 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68  e.  ** page cach
101e0 65 20 73 69 7a 65 2e 20 20 54 68 65 20 6c 6f 63  e size.  The loc
101f0 61 6c 20 73 65 74 74 69 6e 67 20 63 61 6e 20 62  al setting can b
10200 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
10210 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73  .  ** the persis
10220 74 65 6e 74 20 63 61 63 68 65 20 73 69 7a 65 20  tent cache size 
10230 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 73 74  value that is st
10240 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
10250 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69  base.  ** file i
10260 74 73 65 6c 66 2e 20 20 54 68 65 20 76 61 6c 75  tself.  The valu
10270 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
10280 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
10290 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69   of.  ** pages i
102a0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
102b0 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  .  The second fo
102c0 72 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61  rm sets the loca
102d0 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68  l.  ** page cach
102e0 65 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49  e size value.  I
102f0 74 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67  t does not chang
10300 65 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  e the persistent
10310 0a 20 20 2a 2a 20 63 61 63 68 65 20 73 69 7a 65  .  ** cache size
10320 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 64   stored on the d
10330 69 73 6b 20 73 6f 20 74 68 65 20 63 61 63 68 65  isk so the cache
10340 20 73 69 7a 65 20 77 69 6c 6c 20 72 65 76 65 72   size will rever
10350 74 0a 20 20 2a 2a 20 74 6f 20 69 74 73 20 64 65  t.  ** to its de
10360 66 61 75 6c 74 20 76 61 6c 75 65 20 77 68 65 6e  fault value when
10370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
10380 20 63 6c 6f 73 65 64 20 61 6e 64 20 72 65 6f 70   closed and reop
10390 65 6e 65 64 2e 0a 20 20 2a 2a 20 4e 20 73 68 6f  ened..  ** N sho
103a0 75 6c 64 20 62 65 20 61 20 70 6f 73 69 74 69 76  uld be a positiv
103b0 65 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2f 0a  e integer..  */.
103c0 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
103d0 43 6d 70 28 7a 4c 65 66 74 2c 22 63 61 63 68 65  Cmp(zLeft,"cache
103e0 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20  _size")==0 ){.  
103f0 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
10400 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d  getCacheSize[] =
10410 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f   {.      { OP_Co
10420 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c  lumnCount, 1, 0,
10430 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
10440 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
10450 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20  e,  0, 0,       
10460 20 22 63 61 63 68 65 5f 73 69 7a 65 22 7d 2c 0a   "cache_size"},.
10470 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62        { OP_Callb
10480 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  ack,    1, 0,   
10490 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a       0},.    };.
104a0 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
104b0 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
104c0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
104d0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
104e0 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70  if( pRight->z==p
104f0 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  Left->z ){.     
10500 20 69 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e   int size = db->
10510 63 61 63 68 65 5f 73 69 7a 65 3b 3b 0a 20 20 20  cache_size;;.   
10520 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20     if( size<0 ) 
10530 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20  size = -size;.  
10540 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
10550 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
10560 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20  r, size, 0);.   
10570 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10580 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
10590 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65  ize(getCacheSize
105a0 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 29  ), getCacheSize)
105b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
105c0 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 61 74     int size = at
105d0 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  oi(zRight);.    
105e0 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73    if( size<0 ) s
105f0 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20  ize = -size;.   
10600 20 20 20 69 66 28 20 64 62 2d 3e 63 61 63 68 65     if( db->cache
10610 5f 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d  _size<0 ) size =
10620 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 64 62   -size;.      db
10630 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73  ->cache_size = s
10640 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ize;.      sqlit
10650 65 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  eBtreeSetCacheSi
10660 7a 65 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e  ze(db->pBe, db->
10670 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20  cache_size);.   
10680 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a   }.  }else..  /*
10690 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65  .  **  PRAGMA de
106a0 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75  fault_synchronou
106b0 73 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64  s.  **  PRAGMA d
106c0 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f  efault_synchrono
106d0 75 73 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a  us=BOOLEAN.  **.
106e0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
106f0 6f 72 6d 20 72 65 74 75 72 6e 73 20 74 68 65 20  orm returns the 
10700 70 65 72 73 69 73 74 65 6e 74 20 76 61 6c 75 65  persistent value
10710 20 6f 66 20 74 68 65 20 22 73 79 6e 63 68 72 6f   of the "synchro
10720 6e 6f 75 73 22 20 73 65 74 74 69 6e 67 0a 20 20  nous" setting.  
10730 2a 2a 20 74 68 61 74 20 69 73 20 73 74 6f 72 65  ** that is store
10740 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
10750 65 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  e.  This is the 
10760 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74  synchronous sett
10770 69 6e 67 20 74 68 61 74 0a 20 20 2a 2a 20 69 73  ing that.  ** is
10780 20 75 73 65 64 20 77 68 65 6e 65 76 65 72 20 74   used whenever t
10790 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  he database is o
107a0 70 65 6e 65 64 20 75 6e 6c 65 73 73 20 6f 76 65  pened unless ove
107b0 72 72 69 64 64 65 6e 20 62 79 20 61 20 73 65 70  rridden by a sep
107c0 61 72 61 74 65 0a 20 20 2a 2a 20 22 73 79 6e 63  arate.  ** "sync
107d0 68 72 6f 6e 6f 75 73 22 20 70 72 61 67 6d 61 2e  hronous" pragma.
107e0 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
107f0 6d 20 63 68 61 6e 67 65 73 20 74 68 65 20 70 65  m changes the pe
10800 72 73 69 73 74 65 6e 74 20 61 6e 64 20 74 68 65  rsistent and the
10810 0a 20 20 2a 2a 20 6c 6f 63 61 6c 20 73 79 6e 63  .  ** local sync
10820 68 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67 20  hronous setting 
10830 74 6f 20 74 68 65 20 76 61 6c 75 65 20 67 69 76  to the value giv
10840 65 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  en..  **.  ** If
10850 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
10860 6f 6e 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  on, SQLite will 
10870 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 73 79  do an fsync() sy
10880 73 74 65 6d 20 63 61 6c 6c 20 61 74 20 73 74 72  stem call at str
10890 61 74 65 67 69 63 0a 20 20 2a 2a 20 70 6f 69 6e  ategic.  ** poin
108a0 74 73 20 74 6f 20 69 6e 73 75 72 65 20 74 68 61  ts to insure tha
108b0 74 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 6c 79  t all previously
108c0 20 77 72 69 74 74 65 6e 20 64 61 74 61 20 68 61   written data ha
108d0 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 0a  s actually been.
108e0 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 6f 6e 74    ** written ont
108f0 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
10900 63 65 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e  ce before contin
10910 75 69 6e 67 2e 20 20 54 68 69 73 20 6d 6f 64 65  uing.  This mode
10920 20 69 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   insures that.  
10930 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
10940 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69  will always be i
10950 6e 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73  n a consistent s
10960 74 61 74 65 20 65 76 65 6e 74 20 69 66 20 74 68  tate event if th
10970 65 20 6f 70 65 72 61 74 69 6e 67 0a 20 20 2a 2a  e operating.  **
10980 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
10990 6f 72 20 70 6f 77 65 72 20 74 6f 20 74 68 65 20  or power to the 
109a0 63 6f 6d 70 75 74 65 72 20 69 73 20 69 6e 74 65  computer is inte
109b0 72 72 75 70 74 65 64 20 75 6e 65 78 70 65 63 74  rrupted unexpect
109c0 65 64 6c 79 2e 0a 20 20 2a 2a 20 57 68 65 6e 20  edly..  ** When 
109d0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
109e0 66 66 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  ff, SQLite will 
109f0 6e 6f 74 20 77 61 69 74 20 66 6f 72 20 63 68 61  not wait for cha
10a00 6e 67 65 73 20 74 6f 20 61 63 74 75 61 6c 6c 79  nges to actually
10a10 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
10a20 20 74 6f 20 74 68 65 20 64 69 73 6b 20 62 65 66   to the disk bef
10a30 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  ore continuing. 
10a40 20 41 73 20 73 6f 6f 6e 20 61 73 20 69 74 20 68   As soon as it h
10a50 61 6e 64 73 20 63 68 61 6e 67 65 73 0a 20 20 2a  ands changes.  *
10a60 2a 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  * to the operati
10a70 6e 67 20 73 79 73 74 65 6d 2c 20 69 74 20 61 73  ng system, it as
10a80 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 63  sumes that the c
10a90 68 61 6e 67 65 73 20 61 72 65 20 70 65 72 6d 61  hanges are perma
10aa0 6e 65 6e 74 20 61 6e 64 0a 20 20 2a 2a 20 69 74  nent and.  ** it
10ab0 20 63 6f 6e 74 69 6e 75 65 73 20 67 6f 69 6e 67   continues going
10ac0 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
10ad0 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  cannot be corrup
10ae0 74 65 64 20 62 79 20 61 20 70 72 6f 67 72 61 6d  ted by a program
10af0 20 63 72 61 73 68 0a 20 20 2a 2a 20 65 76 65 6e   crash.  ** even
10b00 20 77 69 74 68 20 73 79 6e 63 68 72 6f 6e 6f 75   with synchronou
10b10 73 20 6f 66 66 2c 20 62 75 74 20 61 6e 20 6f 70  s off, but an op
10b20 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
10b30 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f  rash or power lo
10b40 73 73 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 70 6f  ss.  ** could po
10b50 74 65 6e 74 69 61 6c 6c 79 20 63 6f 72 72 75 70  tentially corrup
10b60 74 20 64 61 74 61 2e 20 20 4f 6e 20 74 68 65 20  t data.  On the 
10b70 6f 74 68 65 72 20 68 61 6e 64 2c 20 73 79 6e 63  other hand, sync
10b80 68 72 6f 6e 6f 75 73 20 6f 66 66 20 69 73 0a 20  hronous off is. 
10b90 20 2a 2a 20 66 61 73 74 65 72 20 74 68 61 6e 20   ** faster than 
10ba0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6f 6e 2e 0a  synchronous on..
10bb0 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
10bc0 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22  eStrICmp(zLeft,"
10bd0 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e  default_synchron
10be0 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ous")==0 ){.    
10bf0 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 67 65  static VdbeOp ge
10c00 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20  tSync[] = {.    
10c10 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
10c20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
10c30 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
10c40 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20  ReadCookie,  0, 
10c50 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  2,        0},.  
10c60 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
10c70 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
10c80 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
10c90 50 5f 4c 74 2c 20 20 20 20 20 20 20 20 20 20 30  P_Lt,          0
10ca0 2c 20 35 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 5,        0},.
10cb0 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d        { OP_AddIm
10cc0 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20  m,      1, 0,   
10cd0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
10ce0 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c   OP_ColumnCount,
10cf0 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
10d00 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  ,.      { OP_Col
10d10 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
10d20 20 20 20 20 20 20 20 22 73 79 6e 63 68 72 6f 6e         "synchron
10d30 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ous"},.      { O
10d40 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31  P_Callback,    1
10d50 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
10d60 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20      };.    Vdbe 
10d70 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64  *v = sqliteGetVd
10d80 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
10d90 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
10da0 6e 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  n;.    if( pRigh
10db0 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29  t->z==pLeft->z )
10dc0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
10dd0 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
10de0 72 72 61 79 53 69 7a 65 28 67 65 74 53 79 6e 63  rraySize(getSync
10df0 29 2c 20 67 65 74 53 79 6e 63 29 3b 0a 20 20 20  ), getSync);.   
10e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
10e10 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  t addr;.      in
10e20 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63  t size = db->cac
10e30 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69  he_size;.      i
10e40 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65  f( size<0 ) size
10e50 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
10e60 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
10e70 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
10e80 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10e90 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
10ea0 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 30 2c  P_ReadCookie, 0,
10eb0 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
10ec0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
10ed0 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
10ee0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
10ef0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10f00 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
10f10 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
10f20 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20  AddOp(v, OP_Ne, 
10f30 30 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20  0, addr+3);.    
10f40 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10f50 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
10f60 4d 41 58 5f 50 41 47 45 53 2c 20 30 29 3b 0a 20  MAX_PAGES, 0);. 
10f70 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
10f80 64 64 4f 70 28 76 2c 20 4f 50 5f 41 62 73 56 61  ddOp(v, OP_AbsVa
10f90 6c 75 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  lue, 0, 0);.    
10fa0 20 20 69 66 28 20 21 67 65 74 42 6f 6f 6c 65 61    if( !getBoolea
10fb0 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
10fc0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
10fd0 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74  ddOp(v, OP_Negat
10fe0 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ive, 0, 0);.    
10ff0 20 20 20 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65      size = -size
11000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11010 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11020 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
11030 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71   0, 2);.      sq
11040 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72  liteEndWriteOper
11050 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20  ation(pParse);. 
11060 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73       db->cache_s
11070 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ize = size;.    
11080 20 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74    sqliteBtreeSet
11090 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42  CacheSize(db->pB
110a0 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a  e, db->cache_siz
110b0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
110c0 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50  e..  /*.  **   P
110d0 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
110e0 73 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20  s.  **   PRAGMA 
110f0 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 42 4f 4f 4c  synchronous=BOOL
11100 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65  EAN.  **.  ** Re
11110 74 75 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20  turn or set the 
11120 6c 6f 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74  local value of t
11130 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 66  he synchronous f
11140 6c 61 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20  lag.  Changing. 
11150 20 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76 61   ** the local va
11160 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b  lue does not mak
11170 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
11180 20 64 69 73 6b 20 66 69 6c 65 20 61 6e 64 20 74   disk file and t
11190 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
111a0 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65  value will be re
111b0 73 74 6f 72 65 64 20 74 68 65 20 6e 65 78 74 20  stored the next 
111c0 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73  time the databas
111d0 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65 64  e is.  ** opened
111e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
111f0 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
11200 2c 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 29 3d  ,"synchronous")=
11210 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
11220 20 56 64 62 65 4f 70 20 67 65 74 53 79 6e 63 5b   VdbeOp getSync[
11230 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
11240 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c  _ColumnCount, 1,
11250 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
11260 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
11270 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
11280 20 20 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73      "synchronous
11290 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  "},.      { OP_C
112a0 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30  allback,    1, 0
112b0 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
112c0 20 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   };.    Vdbe *v 
112d0 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
112e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
112f0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
11300 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
11310 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20  z==pLeft->z ){. 
11320 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
11330 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
11340 65 72 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  er, db->cache_si
11350 7a 65 3e 3d 30 2c 20 30 29 3b 0a 20 20 20 20 20  ze>=0, 0);.     
11360 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11370 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
11380 65 28 67 65 74 53 79 6e 63 29 2c 20 67 65 74 53  e(getSync), getS
11390 79 6e 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ync);.    }else{
113a0 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
113b0 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  = db->cache_size
113c0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
113d0 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a  <0 ) size = -siz
113e0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 67 65  e;.      if( !ge
113f0 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
11400 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b   ) size = -size;
11410 0a 20 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65  .      db->cache
11420 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
11430 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 53      sqliteBtreeS
11440 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e  etCacheSize(db->
11450 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73  pBe, db->cache_s
11460 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ize);.    }.  }e
11470 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
11480 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
11490 22 74 72 69 67 67 65 72 5f 6f 76 65 72 68 65 61  "trigger_overhea
114a0 64 5f 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20  d_test")==0 ){. 
114b0 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61     if( getBoolea
114c0 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
114d0 20 20 20 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74     always_code_t
114e0 72 69 67 67 65 72 5f 73 65 74 75 70 20 3d 20 31  rigger_setup = 1
114f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11500 20 20 20 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74     always_code_t
11510 72 69 67 67 65 72 5f 73 65 74 75 70 20 3d 20 30  rigger_setup = 0
11520 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
11530 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
11540 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 76 64 62  ICmp(zLeft, "vdb
11550 65 5f 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a  e_trace")==0 ){.
11560 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
11570 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
11580 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
11590 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63   SQLITE_VdbeTrac
115a0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
115b0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
115c0 20 7e 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61   ~SQLITE_VdbeTra
115d0 63 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ce;.    }.  }els
115e0 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
115f0 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 66  trICmp(zLeft, "f
11600 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73  ull_column_names
11610 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
11620 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67   getBoolean(zRig
11630 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ht) ){.      db-
11640 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
11650 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20  _FullColNames;. 
11660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11670 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
11680 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
11690 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  s;.    }.  }else
116a0 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ..  if( sqliteSt
116b0 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 73 68  rICmp(zLeft, "sh
116c0 6f 77 5f 64 61 74 61 74 79 70 65 73 22 29 3d 3d  ow_datatypes")==
116d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  0 ){.    if( get
116e0 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20  Boolean(zRight) 
116f0 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  ){.      db->fla
11700 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65 70  gs |= SQLITE_Rep
11710 6f 72 74 54 79 70 65 73 3b 0a 20 20 20 20 7d 65  ortTypes;.    }e
11720 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  lse{.      db->f
11730 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
11740 52 65 70 6f 72 74 54 79 70 65 73 3b 0a 20 20 20  ReportTypes;.   
11750 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
11760 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
11770 7a 4c 65 66 74 2c 20 22 72 65 73 75 6c 74 5f 73  zLeft, "result_s
11780 65 74 5f 64 65 74 61 69 6c 73 22 29 3d 3d 30 20  et_details")==0 
11790 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
117a0 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
117b0 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
117c0 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65 73 75 6c   |= SQLITE_Resul
117d0 74 44 65 74 61 69 6c 73 3b 0a 20 20 20 20 7d 65  tDetails;.    }e
117e0 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  lse{.      db->f
117f0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
11800 52 65 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20  ResultDetails;. 
11810 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
11820 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
11830 70 28 7a 4c 65 66 74 2c 20 22 63 6f 75 6e 74 5f  p(zLeft, "count_
11840 63 68 61 6e 67 65 73 22 29 3d 3d 30 20 29 7b 0a  changes")==0 ){.
11850 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
11860 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
11870 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
11880 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
11890 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
118a0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
118b0 20 7e 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f   ~SQLITE_CountRo
118c0 77 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ws;.    }.  }els
118d0 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
118e0 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 65  trICmp(zLeft, "e
118f0 6d 70 74 79 5f 72 65 73 75 6c 74 5f 63 61 6c 6c  mpty_result_call
11900 62 61 63 6b 73 22 29 3d 3d 30 20 29 7b 0a 20 20  backs")==0 ){.  
11910 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
11920 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
11930 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
11940 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61  QLITE_NullCallba
11950 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ck;.    }else{. 
11960 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
11970 3d 20 7e 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61  = ~SQLITE_NullCa
11980 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  llback;.    }.  
11990 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
119a0 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
119b0 2c 20 22 74 61 62 6c 65 5f 69 6e 66 6f 22 29 3d  , "table_info")=
119c0 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
119d0 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20  *pTab;.    Vdbe 
119e0 2a 76 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73  *v;.    pTab = s
119f0 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64  qliteFindTable(d
11a00 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20  b, zRight);.    
11a10 69 66 28 20 70 54 61 62 20 29 20 76 20 3d 20 73  if( pTab ) v = s
11a20 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
11a30 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54  rse);.    if( pT
11a40 61 62 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20  ab && v ){.     
11a50 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 74   static VdbeOp t
11a60 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b  ableInfoPreface[
11a70 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
11a80 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
11a90 35 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  5, 0,       0},.
11aa0 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
11ab0 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
11ac0 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20        "cid"},.  
11ad0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
11ae0 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20  nName,  1, 0,   
11af0 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20      "name"},.   
11b00 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
11b10 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20  Name,  2, 0,    
11b20 20 20 20 22 74 79 70 65 22 7d 2c 0a 20 20 20 20     "type"},.    
11b30 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
11b40 61 6d 65 2c 20 20 33 2c 20 30 2c 20 20 20 20 20  ame,  3, 0,     
11b50 20 20 22 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20    "notnull"},.  
11b60 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
11b70 6e 4e 61 6d 65 2c 20 20 34 2c 20 30 2c 20 20 20  nName,  4, 0,   
11b80 20 20 20 20 22 64 66 6c 74 5f 76 61 6c 75 65 22      "dflt_value"
11b90 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  },.      };.    
11ba0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
11bb0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
11bc0 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
11bd0 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65  tableInfoPreface
11be0 29 2c 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66  ), tableInfoPref
11bf0 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ace);.      sqli
11c00 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  teViewGetColumnN
11c10 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
11c20 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  b);.      for(i=
11c30 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
11c40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
11c50 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11c60 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
11c70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
11c80 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11c90 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
11ca0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11cb0 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
11cc0 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  -1, pTab->aCol[i
11cd0 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ].zName, P3_STAT
11ce0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
11cf0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11d00 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
11d10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11d20 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
11d30 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
11d40 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  pTab->aCol[i].zT
11d50 79 70 65 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c  ype ? pTab->aCol
11d60 5b 69 5d 2e 7a 54 79 70 65 20 3a 20 22 74 65 78  [i].zType : "tex
11d70 74 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  t", P3_STATIC);.
11d80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
11d90 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
11da0 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 61 43 6f  teger, pTab->aCo
11db0 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29  l[i].notNull, 0)
11dc0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11dd0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11de0 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
11df0 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
11e00 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
11e10 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
11e20 44 66 6c 74 2c 20 50 33 5f 53 54 41 54 49 43 29  Dflt, P3_STATIC)
11e30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11e40 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11e50 43 61 6c 6c 62 61 63 6b 2c 20 35 2c 20 30 29 3b  Callback, 5, 0);
11e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11e70 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
11e80 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
11e90 74 2c 20 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29  t, "index_info")
11ea0 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
11eb0 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c   *pIdx;.    Tabl
11ec0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64 62  e *pTab;.    Vdb
11ed0 65 20 2a 76 3b 0a 20 20 20 20 70 49 64 78 20 3d  e *v;.    pIdx =
11ee0 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78   sqliteFindIndex
11ef0 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20  (db, zRight);.  
11f00 20 20 69 66 28 20 70 49 64 78 20 29 20 76 20 3d    if( pIdx ) v =
11f10 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
11f20 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
11f30 70 49 64 78 20 26 26 20 76 20 29 7b 0a 20 20 20  pIdx && v ){.   
11f40 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
11f50 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63   tableInfoPrefac
11f60 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
11f70 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74  { OP_ColumnCount
11f80 2c 20 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d  , 3, 0,       0}
11f90 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
11fa0 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30  olumnName,  0, 0
11fb0 2c 20 20 20 20 20 20 20 22 73 65 71 6e 6f 22 7d  ,       "seqno"}
11fc0 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
11fd0 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30  olumnName,  1, 0
11fe0 2c 20 20 20 20 20 20 20 22 63 69 64 22 7d 2c 0a  ,       "cid"},.
11ff0 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
12000 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20  umnName,  2, 0, 
12010 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20        "name"},. 
12020 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
12030 74 20 69 3b 0a 20 20 20 20 20 20 70 54 61 62 20  t i;.      pTab 
12040 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a  = pIdx->pTable;.
12050 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12060 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
12070 61 79 53 69 7a 65 28 74 61 62 6c 65 49 6e 66 6f  aySize(tableInfo
12080 50 72 65 66 61 63 65 29 2c 20 74 61 62 6c 65 49  Preface), tableI
12090 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a 20 20 20  nfoPreface);.   
120a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
120b0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
120c0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  ){.        int c
120d0 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  num = pIdx->aiCo
120e0 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lumn[i];.       
120f0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
12100 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12110 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  i, 0);.        s
12120 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12130 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 63 6e  , OP_Integer, cn
12140 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  um, 0);.        
12150 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
12160 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
12170 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
12180 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
12190 63 6e 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  cnum );.        
121a0 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
121b0 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P3(v, -1, pTab->
121c0 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65  aCol[cnum].zName
121d0 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
121e0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
121f0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
12200 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20  back, 3, 0);.   
12210 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
12220 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
12230 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
12240 69 6e 64 65 78 5f 6c 69 73 74 22 29 3d 3d 30 20  index_list")==0 
12250 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
12260 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  dx;.    Table *p
12270 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  Tab;.    Vdbe *v
12280 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
12290 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
122a0 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66   zRight);.    if
122b0 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
122c0 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
122d0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
122e0 20 70 49 64 78 20 3d 20 70 54 61 62 2d 3e 70 49   pIdx = pTab->pI
122f0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
12300 69 66 28 20 70 54 61 62 20 26 26 20 70 49 64 78  if( pTab && pIdx
12310 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 69   && v ){.      i
12320 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20  nt i = 0; .     
12330 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 69   static VdbeOp i
12340 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 5b  ndexListPreface[
12350 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
12360 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
12370 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  3, 0,       0},.
12380 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
12390 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
123a0 20 20 20 20 20 20 22 73 65 71 22 7d 2c 0a 20 20        "seq"},.  
123b0 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
123c0 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20  nName,  1, 0,   
123d0 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20      "name"},.   
123e0 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
123f0 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20  Name,  2, 0,    
12400 20 20 20 22 75 6e 69 71 75 65 22 7d 2c 0a 20 20     "unique"},.  
12410 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 73 71      };..      sq
12420 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
12430 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 69  t(v, ArraySize(i
12440 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 29  ndexListPreface)
12450 2c 20 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61  , indexListPrefa
12460 63 65 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ce);.      while
12470 28 70 49 64 78 29 7b 0a 20 20 20 20 20 20 20 20  (pIdx){.        
12480 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
12490 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
124a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
124b0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
124c0 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
124d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
124e0 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
124f0 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65   -1, pIdx->zName
12500 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
12510 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12520 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
12530 67 65 72 2c 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ger, pIdx->onErr
12540 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 20 30 29 3b  or!=OE_None, 0);
12550 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
12560 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
12570 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a  allback, 3, 0);.
12580 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20          ++i;.   
12590 20 20 20 20 20 70 49 64 78 20 3d 20 70 49 64 78       pIdx = pIdx
125a0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
125b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
125c0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
125d0 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
125e0 6d 70 28 7a 4c 65 66 74 2c 20 22 70 61 72 73 65  mp(zLeft, "parse
125f0 72 5f 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a  r_trace")==0 ){.
12600 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
12610 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61 63  sqliteParserTrac
12620 65 28 46 49 4c 45 2a 2c 20 63 68 61 72 20 2a 29  e(FILE*, char *)
12630 3b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f  ;.    if( getBoo
12640 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
12650 20 20 20 20 20 20 73 71 6c 69 74 65 50 61 72 73        sqlitePars
12660 65 72 54 72 61 63 65 28 73 74 64 6f 75 74 2c 20  erTrace(stdout, 
12670 22 70 61 72 73 65 72 3a 20 22 29 3b 0a 20 20 20  "parser: ");.   
12680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
12690 6c 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28  liteParserTrace(
126a0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
126b0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
126c0 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
126d0 28 7a 4c 65 66 74 2c 20 22 69 6e 74 65 67 72 69  (zLeft, "integri
126e0 74 79 5f 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b  ty_check")==0 ){
126f0 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
12700 4f 70 20 63 68 65 63 6b 44 62 5b 5d 20 3d 20 7b  Op checkDb[] = {
12710 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49  .      { OP_SetI
12720 6e 73 65 72 74 2c 20 20 20 30 2c 20 30 2c 20 20  nsert,   0, 0,  
12730 20 20 20 20 20 20 22 32 22 7d 2c 0a 20 20 20 20        "2"},.    
12740 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20 20 20    { OP_Open,    
12750 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20      0, 2,       
12760 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
12770 52 65 77 69 6e 64 2c 20 20 20 20 20 20 30 2c 20  Rewind,      0, 
12780 36 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  6,        0},.  
12790 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
127a0 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20        0, 3,     
127b0 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a     0},    /* 3 *
127c0 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74  /.      { OP_Set
127d0 49 6e 73 65 72 74 2c 20 20 20 30 2c 20 30 2c 20  Insert,   0, 0, 
127e0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
127f0 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20   { OP_Next,     
12800 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20     0, 3,        
12810 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  0},.      { OP_I
12820 6e 74 65 67 72 69 74 79 43 6b 2c 20 30 2c 20 30  ntegrityCk, 0, 0
12830 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
12840 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 6 */.      { 
12850 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
12860 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
12870 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
12880 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
12890 20 20 20 20 20 20 22 69 6e 74 65 67 72 69 74 79        "integrity
128a0 5f 63 68 65 63 6b 22 7d 2c 0a 20 20 20 20 20 20  _check"},.      
128b0 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20  { OP_Callback,  
128c0 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30    1, 0,        0
128d0 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65  },.      { OP_Se
128e0 74 49 6e 73 65 72 74 2c 20 20 20 31 2c 20 30 2c  tInsert,   1, 0,
128f0 20 20 20 20 20 20 20 20 22 32 22 7d 2c 0a 20 20          "2"},.  
12900 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 41 75 78      { OP_OpenAux
12910 2c 20 20 20 20 20 31 2c 20 32 2c 20 20 20 20 20  ,     1, 2,     
12920 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
12930 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 31  P_Rewind,      1
12940 2c 20 31 36 2c 20 20 20 20 20 20 20 30 7d 2c 0a  , 16,       0},.
12950 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
12960 6e 2c 20 20 20 20 20 20 31 2c 20 33 2c 20 20 20  n,      1, 3,   
12970 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31       0},    /* 1
12980 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  3 */.      { OP_
12990 53 65 74 49 6e 73 65 72 74 2c 20 20 20 31 2c 20  SetInsert,   1, 
129a0 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
129b0 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20      { OP_Next,  
129c0 20 20 20 20 20 20 31 2c 20 31 33 2c 20 20 20 20        1, 13,    
129d0 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
129e0 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 31  P_IntegrityCk, 1
129f0 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 1,        0}, 
12a00 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20     /* 16 */.    
12a10 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c    { OP_Callback,
12a20 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
12a30 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
12a40 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
12a50 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
12a60 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
12a70 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
12a80 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
12a90 76 2c 20 41 72 72 61 79 53 69 7a 65 28 63 68 65  v, ArraySize(che
12aa0 63 6b 44 62 29 2c 20 63 68 65 63 6b 44 62 29 3b  ckDb), checkDb);
12ab0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b 7d 0a 20  .  }else..  {}. 
12ac0 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 65 66   sqliteFree(zLef
12ad0 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
12ae0 28 7a 52 69 67 68 74 29 3b 0a 7d 0a              (zRight);.}.