/ Hex Artifact Content
Login

Artifact 8569ac014609add4b796260d3567a5090b90056d:


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 38 20 32 30  ild.c,v 1.118 20
0310: 30 33 2f 30 31 2f 30 32 20 31 34 3a 34 33 3a 35  03/01/02 14:43:5
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 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  }.  pParse->nTab
0a60: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0a70: 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72  nMem = 0;.  pPar
0a80: 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20  se->nSet = 0;.  
0a90: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20 30  pParse->nAgg = 0
0aa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0ab0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0ac0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0ad0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0ae0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0af0: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0b00: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0b10: 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  at table.  Retur
0b20: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
0b30: 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  und..*/.Table *s
0b40: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73  qliteFindTable(s
0b50: 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74  qlite *db, const
0b60: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
0b70: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d   Table *p;.  p =
0b80: 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28   sqliteHashFind(
0b90: 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  &db->tblHash, zN
0ba0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
0bb0: 65 29 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  e)+1);.  return 
0bc0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
0bd0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0be0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0bf0: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0c00: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
0c10: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
0c20: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a  of that index..*
0c30: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
0c40: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49   not found..*/.I
0c50: 6e 64 65 78 20 2a 73 71 6c 69 74 65 46 69 6e 64  ndex *sqliteFind
0c60: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
0c70: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
0c80: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
0c90: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61  ;.  p = sqliteHa
0ca0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 69 64 78 48  shFind(&db->idxH
0cb0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
0cc0: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
0cd0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0ce0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
0cf0: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
0d00: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
0d10: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
0d20: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
0d30: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
0d40: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
0d50: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
0d60: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
0d70: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
0d80: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
0d90: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
0da0: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
0db0: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
0dc0: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
0dd0: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
0de0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
0df0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
0e00: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  teDeleteIndex(sq
0e10: 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20  lite *db, Index 
0e20: 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f  *p){.  Index *pO
0e30: 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  ld;.  assert( db
0e40: 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21  !=0 && p->zName!
0e50: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
0e60: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
0e70: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 2d  &db->idxHash, p-
0e80: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
0e90: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
0ea0: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26    if( pOld!=0 &&
0eb0: 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20   pOld!=p ){.    
0ec0: 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74  sqliteHashInsert
0ed0: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70  (&db->idxHash, p
0ee0: 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  Old->zName, strl
0ef0: 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b  en(pOld->zName)+
0f00: 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20  1, pOld);.  }.  
0f10: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
0f20: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
0f30: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
0f40: 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74  rom its table, t
0f50: 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68  hen remove.** th
0f60: 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  e index from the
0f70: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
0f80: 65 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d  e and free its m
0f90: 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75  emory.** structu
0fa0: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
0fb0: 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  iteUnlinkAndDele
0fc0: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  teIndex(sqlite *
0fd0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  db, Index *pInde
0fe0: 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  x){.  if( pIndex
0ff0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
1000: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
1010: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
1020: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
1030: 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
1040: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
1050: 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d     for(p=pIndex-
1060: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
1070: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d   p && p->pNext!=
1080: 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65  pIndex; p=p->pNe
1090: 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 20  xt){}.    if( p 
10a0: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
10b0: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  dex ){.      p->
10c0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
10d0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
10e0: 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  .  sqliteDeleteI
10f0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1100: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
1110: 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f   all schema info
1120: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
1130: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
1140: 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 64 61 74  tables of.** dat
1150: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1160: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1170: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63  is called to rec
1180: 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62  laim memory.** b
1190: 65 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65 63  efore the connec
11a0: 74 69 6f 6e 20 63 6c 6f 73 65 73 2e 20 20 49 74  tion closes.  It
11b0: 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20   is also called 
11c0: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
11d0: 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65  k.** if there we
11e0: 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  re schema change
11f0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  s during the tra
1200: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nsaction..*/.voi
1210: 64 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74  d sqliteResetInt
1220: 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69  ernalSchema(sqli
1230: 74 65 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  te *db){.  HashE
1240: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
1250: 73 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68  sh temp1;.  Hash
1260: 20 74 65 6d 70 32 3b 0a 0a 20 20 73 71 6c 69 74   temp2;..  sqlit
1270: 65 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  eHashClear(&db->
1280: 61 46 4b 65 79 29 3b 0a 20 20 74 65 6d 70 31 20  aFKey);.  temp1 
1290: 3d 20 64 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  = db->tblHash;. 
12a0: 20 74 65 6d 70 32 20 3d 20 64 62 2d 3e 74 72 69   temp2 = db->tri
12b0: 67 48 61 73 68 3b 0a 20 20 73 71 6c 69 74 65 48  gHash;.  sqliteH
12c0: 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 74 72 69  ashInit(&db->tri
12d0: 67 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41  gHash, SQLITE_HA
12e0: 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20  SH_STRING, 0);. 
12f0: 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72   sqliteHashClear
1300: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a  (&db->idxHash);.
1310: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
1320: 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d  teHashFirst(&tem
1330: 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  p2); pElem; pEle
1340: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
1350: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 72  (pElem)){.    Tr
1360: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 20  igger *pTrigger 
1370: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
1380: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71 6c  (pElem);.    sql
1390: 69 74 65 44 65 6c 65 74 65 54 72 69 67 67 65 72  iteDeleteTrigger
13a0: 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 7d 0a  (pTrigger);.  }.
13b0: 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61    sqliteHashClea
13c0: 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 73 71 6c  r(&temp2);.  sql
13d0: 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62 2d  iteHashInit(&db-
13e0: 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45  >tblHash, SQLITE
13f0: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29  _HASH_STRING, 0)
1400: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
1410: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
1420: 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45  emp1); pElem; pE
1430: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
1440: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
1450: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
1460: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
1470: 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  em);.    sqliteD
1480: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1490: 54 61 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Tab);.  }.  sqli
14a0: 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d  teHashClear(&tem
14b0: 70 31 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  p1);.  db->flags
14c0: 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 49 6e 69   &= ~(SQLITE_Ini
14d0: 74 69 61 6c 69 7a 65 64 7c 53 51 4c 49 54 45 5f  tialized|SQLITE_
14e0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a  InternChanges);.
14f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1500: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1510: 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
1520: 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20  ack occurs.  If 
1530: 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63  there were.** sc
1540: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
1550: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
1560: 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76  ion, then we hav
1570: 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  e to reset the.*
1580: 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  * internal hash 
1590: 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61  tables and reloa
15a0: 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b  d them from disk
15b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15c0: 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c  RollbackInternal
15d0: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a  Changes(sqlite *
15e0: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66  db){.  if( db->f
15f0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
1600: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
1610: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e     sqliteResetIn
1620: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 29  ternalSchema(db)
1630: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1640: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1650: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
1660: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
1670: 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  oid sqliteCommit
1680: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
1690: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 64  sqlite *db){.  d
16a0: 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b->schema_cookie
16b0: 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b   = db->next_cook
16c0: 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  ie;.  db->flags 
16d0: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
16e0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
16f0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
1700: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
1710: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
1720: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
1730: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
1740: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
1750: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
1760: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
1770: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
1780: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
1790: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
17a0: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
17b0: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
17c0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
17d0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
17e0: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
17f0: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
1800: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
1810: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
1820: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
1830: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
1840: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
1850: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
1860: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
1870: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1880: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
1890: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
18a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
18b0: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
18c0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
18d0: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
18e0: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
18f0: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
1900: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
1910: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
1920: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
1930: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1940: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
1950: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
1960: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1970: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  eDeleteTable(sql
1980: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
1990: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
19a0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ;.  Index *pInde
19b0: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65  x, *pNext;.  FKe
19c0: 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74  y *pFKey, *pNext
19d0: 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61  FKey;..  if( pTa
19e0: 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ble==0 ) return;
19f0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
1a00: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
1a10: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
1a20: 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  able.  */.  for(
1a30: 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d  pIndex = pTable-
1a40: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
1a50: 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a   pIndex=pNext){.
1a60: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64      pNext = pInd
1a70: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  ex->pNext;.    s
1a80: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
1a90: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
1aa0: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
1ab0: 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ll foreign keys 
1ac0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ad0: 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65  this table.  The
1ae0: 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c   keys.  ** shoul
1af0: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
1b00: 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  een unlinked fro
1b10: 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20  m the db->aFKey 
1b20: 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f  hash table .  */
1b30: 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61  .  for(pFKey=pTa
1b40: 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  ble->pFKey; pFKe
1b50: 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b  y; pFKey=pNextFK
1b60: 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b  ey){.    pNextFK
1b70: 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78  ey = pFKey->pNex
1b80: 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72  tFrom;.    asser
1b90: 74 28 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e  t( sqliteHashFin
1ba0: 64 28 26 64 62 2d 3e 61 46 4b 65 79 2c 70 46 4b  d(&db->aFKey,pFK
1bb0: 65 79 2d 3e 7a 54 6f 2c 73 74 72 6c 65 6e 28 70  ey->zTo,strlen(p
1bc0: 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70  FKey->zTo)+1)!=p
1bd0: 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69  FKey );.    sqli
1be0: 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20  teFree(pFKey);. 
1bf0: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
1c00: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
1c10: 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ure itself..  */
1c20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1c30: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
1c40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1c50: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d  (pTable->aCol[i]
1c60: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  .zName);.    sql
1c70: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
1c80: 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a  aCol[i].zDflt);.
1c90: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1ca0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  Table->aCol[i].z
1cb0: 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Type);.  }.  sql
1cc0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
1cd0: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
1ce0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
1cf0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65  l);.  sqliteSele
1d00: 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d  ctDelete(pTable-
1d10: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >pSelect);.  sql
1d20: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b  iteFree(pTable);
1d30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
1d40: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
1d50: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
1d60: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
1d70: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
1d80: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
1d90: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
1da0: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
1db0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1dc0: 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e  d sqliteUnlinkAn
1dd0: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
1de0: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
1df0: 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c  p){.  Table *pOl
1e00: 64 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20  d;.  FKey *pF1, 
1e10: 2a 70 46 32 3b 0a 20 20 61 73 73 65 72 74 28 20  *pF2;.  assert( 
1e20: 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  db!=0 );.  pOld 
1e30: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1e40: 72 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c  rt(&db->tblHash,
1e50: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
1e60: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
1e70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c  );.  assert( pOl
1e80: 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20  d==0 || pOld==p 
1e90: 29 3b 0a 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e  );.  for(pF1=p->
1ea0: 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d  pFKey; pF1; pF1=
1eb0: 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b  pF1->pNextFrom){
1ec0: 0a 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73  .    int nTo = s
1ed0: 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20  trlen(pF1->zTo) 
1ee0: 2b 20 31 3b 0a 20 20 20 20 70 46 32 20 3d 20 73  + 1;.    pF2 = s
1ef0: 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26 64  qliteHashFind(&d
1f00: 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a  b->aFKey, pF1->z
1f10: 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66  To, nTo);.    if
1f20: 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20  ( pF2==pF1 ){.  
1f30: 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e      sqliteHashIn
1f40: 73 65 72 74 28 26 64 62 2d 3e 61 46 4b 65 79 2c  sert(&db->aFKey,
1f50: 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20   pF1->zTo, nTo, 
1f60: 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20  pF1->pNextTo);. 
1f70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f80: 77 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46  while( pF2 && pF
1f90: 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20  2->pNextTo!=pF1 
1fa0: 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78  ){ pF2=pF2->pNex
1fb0: 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  tTo; }.      if(
1fc0: 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20   pF2 ){.        
1fd0: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  pF2->pNextTo = p
1fe0: 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20  F1->pNextTo;.   
1ff0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2000: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
2010: 6c 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  le(db, p);.}../*
2020: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68  .** Construct th
2030: 65 20 6e 61 6d 65 20 6f 66 20 61 20 75 73 65 72  e name of a user
2040: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
2050: 66 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a 2a  from a token..**
2060: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
2070: 64 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6f 62  d the name is ob
2080: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
2090: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
20a0: 75 73 74 0a 2a 2a 20 62 65 20 66 72 65 65 64 20  ust.** be freed 
20b0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
20c0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72  unction..*/.char
20d0: 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d   *sqliteTableNam
20e0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e  eFromToken(Token
20f0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
2100: 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   *zName = sqlite
2110: 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a  StrNDup(pName->z
2120: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73  , pName->n);.  s
2130: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4e 61  qliteDequote(zNa
2140: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e  me);.  return zN
2150: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ame;.}../*.** Ge
2160: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6f  nerate code to o
2170: 70 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  pen the appropri
2180: 61 74 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  ate master table
2190: 2e 20 20 54 68 65 20 74 61 62 6c 65 0a 2a 2a 20  .  The table.** 
21a0: 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 53  opened will be S
21b0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 66 6f 72  QLITE_MASTER for
21c0: 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c   persistent tabl
21d0: 65 73 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54  es and .** SQLIT
21e0: 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 66 6f  E_TEMP_MASTER fo
21f0: 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  r temporary tabl
2200: 65 73 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69  es.  The table i
2210: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 63  s opened.** on c
2220: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
2230: 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65   sqliteOpenMaste
2240: 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20  rTable(Vdbe *v, 
2250: 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 69  int isTemp){.  i
2260: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
2270: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2280: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78  (v, OP_OpenWrAux
2290: 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 73 71 6c  , 0, 2);.    sql
22a0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
22b0: 76 2c 20 2d 31 2c 20 54 45 4d 50 5f 4d 41 53 54  v, -1, TEMP_MAST
22c0: 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54 41 54  ER_NAME, P3_STAT
22d0: 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IC);.  }else{.  
22e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
22f0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
2300: 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 73 71  e, 0, 2);.    sq
2310: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
2320: 28 76 2c 20 2d 31 2c 20 4d 41 53 54 45 52 5f 4e  (v, -1, MASTER_N
2330: 41 4d 45 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  AME, P3_STATIC);
2340: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  .  }.}../*.** Be
2350: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
2360: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
2370: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
2380: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
2390: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
23a0: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
23b0: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
23c0: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
23d0: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
23e0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
23f0: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
2400: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
2410: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
2420: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
2430: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
2440: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
2450: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a  able name.  The.
2460: 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20  ** pStart token 
2470: 69 73 20 74 68 65 20 43 52 45 41 54 45 20 61 6e  is the CREATE an
2480: 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74  d pName is the t
2490: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
24a0: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
24b0: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
24c0: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
24d0: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
24e0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
24f0: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
2500: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
2510: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
2520: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
2530: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
2540: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
2550: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
2560: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
2570: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
2580: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
2590: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
25a0: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
25b0: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
25c0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
25d0: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
25e0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
25f0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
2600: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
2610: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
2620: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
2630: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
2640: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
2650: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
2660: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
2670: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
2680: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
2690: 65 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  eEndTable() rout
26a0: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
26b0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
26c0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
26d0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
26e0: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
26f0: 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28  qliteStartTable(
2700: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
2710: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 54 6f  oken *pStart, To
2720: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ken *pName, int 
2730: 69 73 54 65 6d 70 29 7b 0a 20 20 54 61 62 6c 65  isTemp){.  Table
2740: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65   *pTable;.  Inde
2750: 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20  x *pIdx;.  char 
2760: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  *zName;.  sqlite
2770: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2780: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
2790: 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54   pParse->sFirstT
27a0: 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a  oken = *pStart;.
27b0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
27c0: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
27d0: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
27e0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
27f0: 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  rn;..  /* Before
2800: 20 74 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74   trying to creat
2810: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
2820: 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ble, make sure t
2830: 68 65 20 42 74 72 65 65 20 66 6f 72 0a 20 20 2a  he Btree for.  *
2840: 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72  * holding tempor
2850: 61 72 79 20 74 61 62 6c 65 73 20 69 73 20 6f 70  ary tables is op
2860: 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  en..  */.  if( i
2870: 73 54 65 6d 70 20 26 26 20 64 62 2d 3e 70 42 65  sTemp && db->pBe
2880: 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Temp==0 ){.    i
2890: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74  nt rc = sqliteBt
28a0: 72 65 65 4f 70 65 6e 28 30 2c 20 30 2c 20 4d 41  reeOpen(0, 0, MA
28b0: 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 70 42  X_PAGES, &db->pB
28c0: 65 54 65 6d 70 29 3b 0a 20 20 20 20 69 66 28 20  eTemp);.    if( 
28d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
28f0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
2900: 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65  zErrMsg, "unable
2910: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
2920: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
2930: 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
2940: 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
2950: 61 72 79 20 74 61 62 6c 65 73 22 2c 20 30 29 3b  ary tables", 0);
2960: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
2970: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
2980: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
2990: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
29a0: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b  QLITE_InTrans ){
29b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
29c0: 74 65 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  teBtreeBeginTran
29d0: 73 28 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b 0a  s(db->pBeTemp);.
29e0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a00: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
2a10: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
2a20: 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20 74 6f  rMsg, "unable to
2a30: 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63   get a write loc
2a40: 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20  k on ".         
2a50: 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20   "the temporary 
2a60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 20  database file", 
2a70: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  0);.        pPar
2a80: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
2a90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2aa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2ab0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
2ac0: 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  e new table name
2ad0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64   does not collid
2ae0: 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69  e with an existi
2af0: 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  ng.  ** index or
2b00: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 49 73   table name.  Is
2b10: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
2b20: 73 61 67 65 20 69 66 20 69 74 20 64 6f 65 73 2e  sage if it does.
2b30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
2b40: 20 61 72 65 20 72 65 2d 72 65 61 64 69 6e 67 20   are re-reading 
2b50: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
2b60: 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20  r table because 
2b70: 6f 66 20 61 20 73 63 68 65 6d 61 0a 20 20 2a 2a  of a schema.  **
2b80: 20 63 68 61 6e 67 65 20 61 6e 64 20 61 20 6e 65   change and a ne
2b90: 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c  w permanent tabl
2ba0: 65 20 69 73 20 66 6f 75 6e 64 20 77 68 6f 73 65  e is found whose
2bb0: 20 6e 61 6d 65 20 63 6f 6c 6c 69 64 65 73 20 77   name collides w
2bc0: 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 78 69 73  ith.  ** an exis
2bd0: 74 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ting temporary t
2be0: 61 62 6c 65 2c 20 74 68 65 6e 20 69 67 6e 6f 72  able, then ignor
2bf0: 65 20 74 68 65 20 6e 65 77 20 70 65 72 6d 61 6e  e the new perman
2c00: 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 20  ent table..  ** 
2c10: 57 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  We will continue
2c20: 20 70 61 72 73 69 6e 67 2c 20 62 75 74 20 74 68   parsing, but th
2c30: 65 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43 6c  e pParse->nameCl
2c40: 61 73 68 20 66 6c 61 67 20 77 69 6c 6c 20 62 65  ash flag will be
2c50: 20 73 65 74 0a 20 20 2a 2a 20 73 6f 20 77 65 20   set.  ** so we 
2c60: 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f 20 64 69 73  will know to dis
2c70: 63 61 72 64 20 74 68 65 20 74 61 62 6c 65 20 72  card the table r
2c80: 65 63 6f 72 64 20 6f 6e 63 65 20 70 61 72 73 69  ecord once parsi
2c90: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e  ng has finished.
2ca0: 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65 20 3d  .  */.  pTable =
2cb0: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
2cc0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  (db, zName);.  i
2cd0: 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  f( pTable!=0 ){.
2ce0: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e      if( pTable->
2cf0: 69 73 54 65 6d 70 20 26 26 20 70 50 61 72 73 65  isTemp && pParse
2d00: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
2d10: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65      pParse->name
2d20: 43 6c 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Clash = 1;.    }
2d30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2d40: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
2d50: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
2d60: 74 61 62 6c 65 20 22 2c 20 30 2c 20 70 4e 61 6d  table ", 0, pNam
2d70: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 0a  e->z, pName->n,.
2d80: 20 20 20 20 20 20 20 20 20 20 22 20 61 6c 72 65            " alre
2d90: 61 64 79 20 65 78 69 73 74 73 22 2c 20 30 2c 20  ady exists", 0, 
2da0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2db0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
2dc0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
2dd0: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  +;.      return;
2de0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2df0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65      pParse->name
2e00: 43 6c 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 20  Clash = 0;.  }. 
2e10: 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71 6c   if( (pIdx = sql
2e20: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
2e30: 20 7a 4e 61 6d 65 29 29 21 3d 30 20 26 26 0a 20   zName))!=0 &&. 
2e40: 20 20 20 20 20 20 20 20 20 28 21 70 49 64 78 2d           (!pIdx-
2e50: 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20  >pTable->isTemp 
2e60: 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  || !pParse->init
2e70: 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 73 71 6c  Flag) ){.    sql
2e80: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
2e90: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
2ea0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
2eb0: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
2ec0: 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ", .       zName
2ed0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2ee0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
2ef0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
2f00: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2f10: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
2f20: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
2f30: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
2f40: 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20   pTable==0 ){.  
2f50: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
2f60: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
2f70: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
2f80: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
2f90: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
2fa0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ;.  pTable->aCol
2fb0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
2fc0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
2fd0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30  able->pIndex = 0
2fe0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 73 54 65  ;.  pTable->isTe
2ff0: 6d 70 20 3d 20 69 73 54 65 6d 70 3b 0a 20 20 69  mp = isTemp;.  i
3000: 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
3010: 61 62 6c 65 20 29 20 73 71 6c 69 74 65 44 65 6c  able ) sqliteDel
3020: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61  eteTable(db, pPa
3030: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b  rse->pNewTable);
3040: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
3050: 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a  able = pTable;..
3060: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
3070: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74  ating the code t
3080: 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20  hat will insert 
3090: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
30a0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53   into.  ** the S
30b0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
30c0: 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72  le.  Note in par
30d0: 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20  ticular that we 
30e0: 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20  must go ahead.  
30f0: 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ** and allocate 
3100: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
3110: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
3120: 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f  entry now.  Befo
3130: 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d  re any.  ** PRIM
3140: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
3150: 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70  E keywords are p
3160: 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65  arsed.  Those ke
3170: 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73  ywords will caus
3180: 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74  e.  ** indices t
3190: 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64  o be created and
31a0: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
31b0: 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f  d must come befo
31c0: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64  re the .  ** ind
31d0: 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ices.  Hence, th
31e0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
31f0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
3200: 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
3210: 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20    ** now..  */. 
3220: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e   if( !pParse->in
3230: 69 74 46 6c 61 67 20 26 26 20 28 76 20 3d 20 73  itFlag && (v = s
3240: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
3250: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
3260: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
3270: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
3280: 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20  , 0, isTemp);.  
3290: 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b    if( !isTemp ){
32a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
32b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
32c0: 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66  eger, db->file_f
32d0: 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 20  ormat, 0);.     
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 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
3300: 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 1);.    }. 
3310: 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73     sqliteOpenMas
3320: 74 65 72 54 61 62 6c 65 28 76 2c 20 69 73 54 65  terTable(v, isTe
3330: 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  mp);.    sqliteV
3340: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
3350: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
3360: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3370: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
3380: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3390: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
33a0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
33b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
33c0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
33d0: 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d  ey, 0, 0);.  }.}
33e0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
33f0: 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20  w column to the 
3400: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
3410: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
3420: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
3430: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
3440: 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20  outine once for 
3450: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  each column decl
3460: 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20  aration.** in a 
3470: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
3480: 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 53  tement.  sqliteS
3490: 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73  tartTable() gets
34a0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74   called.** first
34b0: 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67   to get things g
34c0: 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73  oing.  Then this
34d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
34e0: 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  ed for each.** c
34f0: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olumn..*/.void s
3500: 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e 28 50  qliteAddColumn(P
3510: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
3520: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54  ken *pName){.  T
3530: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
3540: 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  ;.  char *z = 0;
3550: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
3560: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
3570: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
3580: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
3590: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
35a0: 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  z, pName->z, pNa
35b0: 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 69 66 28  me->n, 0);.  if(
35c0: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
35d0: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
35e0: 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  z);.  for(i=0; i
35f0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  <p->nCol; i++){.
3600: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
3610: 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c  rICmp(z, p->aCol
3620: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
3630: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
3640: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
3650: 7a 45 72 72 4d 73 67 2c 20 22 64 75 70 6c 69 63  zErrMsg, "duplic
3660: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ate column name:
3670: 20 22 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 20   ", z, 0);.     
3680: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
3690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
36a0: 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(z);.      retu
36b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
36c0: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
36d0: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
36e0: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
36f0: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  aNew = sqliteRea
3700: 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28  lloc( p->aCol, (
3710: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
3720: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
3730: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
3740: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d  ) return;.    p-
3750: 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20  >aCol = aNew;.  
3760: 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  }.  pCol = &p->a
3770: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20  Col[p->nCol];.  
3780: 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20  memset(pCol, 0, 
3790: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
37a0: 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61  ]));.  pCol->zNa
37b0: 6d 65 20 3d 20 7a 3b 0a 20 20 70 43 6f 6c 2d 3e  me = z;.  pCol->
37c0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49  sortOrder = SQLI
37d0: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 70 2d 3e  TE_SO_NUM;.  p->
37e0: 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nCol++;.}../*.**
37f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3800: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
3810: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
3820: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
3830: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
3840: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
3850: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
3860: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
3870: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
3880: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
3890: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
38a0: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
38b0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
38c0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
38d0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
38e0: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 4e 6f 74  oid sqliteAddNot
38f0: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
3900: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
3910: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
3920: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
3930: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
3940: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
3950: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
3960: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
3970: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
3980: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
3990: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
39a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
39b0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
39c0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
39d0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
39e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
39f0: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
3a00: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
3a10: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
3a20: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
3a30: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
3a40: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
3a50: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
3a60: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
3a70: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
3a80: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
3a90: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
3aa0: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
3ab0: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
3ac0: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
3ad0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
3ae0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
3af0: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
3b00: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
3b10: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
3b20: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
3b30: 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d  d sqliteAddColum
3b40: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
3b50: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72  rse, Token *pFir
3b60: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74  st, Token *pLast
3b70: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
3b80: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
3b90: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a   n;.  char *z, *
3ba0: 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  *pz;.  Column *p
3bb0: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
3bc0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
3bd0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
3be0: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
3bf0: 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
3c00: 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70  urn;.  pCol = &p
3c10: 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20  ->aCol[i];.  pz 
3c20: 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a  = &pCol->zType;.
3c30: 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b    n = pLast->n +
3c40: 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20   Addr(pLast->z) 
3c50: 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e 7a  - Addr(pFirst->z
3c60: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53  );.  sqliteSetNS
3c70: 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73 74  tring(pz, pFirst
3c80: 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20  ->z, n, 0);.  z 
3c90: 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d  = *pz;.  if( z==
3ca0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
3cb0: 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  r(i=j=0; z[i]; i
3cc0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d  ++){.    int c =
3cd0: 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69   z[i];.    if( i
3ce0: 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74  sspace(c) ) cont
3cf0: 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d  inue;.    z[j++]
3d00: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d   = c;.  }.  z[j]
3d10: 20 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d 3e 73 6f   = 0;.  pCol->so
3d20: 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45  rtOrder = SQLITE
3d30: 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 69 66 28 20 70  _SO_NUM;.  if( p
3d40: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f  Parse->db->file_
3d50: 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
3d60: 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
3d70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 77 69 74  i++){.      swit
3d80: 63 68 28 20 7a 5b 69 5d 20 29 7b 0a 20 20 20 20  ch( z[i] ){.    
3d90: 20 20 20 20 63 61 73 65 20 27 62 27 3a 0a 20 20      case 'b':.  
3da0: 20 20 20 20 20 20 63 61 73 65 20 27 42 27 3a 20        case 'B': 
3db0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3dc0: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26  sqliteStrNICmp(&
3dd0: 7a 5b 69 5d 2c 22 62 6c 6f 62 22 2c 34 29 3d 3d  z[i],"blob",4)==
3de0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
3df0: 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72   pCol->sortOrder
3e00: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58   = SQLITE_SO_TEX
3e10: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  T;.            r
3e20: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20  eturn;.         
3e30: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
3e40: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
3e50: 20 20 20 20 20 20 63 61 73 65 20 27 63 27 3a 0a        case 'c':.
3e60: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 43 27          case 'C'
3e70: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  : {.          if
3e80: 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70  ( sqliteStrNICmp
3e90: 28 26 7a 5b 69 5d 2c 22 63 68 61 72 22 2c 34 29  (&z[i],"char",4)
3ea0: 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ==0 ||.         
3eb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53           sqliteS
3ec0: 74 72 4e 49 43 6d 70 28 26 7a 5b 69 5d 2c 22 63  trNICmp(&z[i],"c
3ed0: 6c 6f 62 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20  lob",4)==0 ){.  
3ee0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
3ef0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49  sortOrder = SQLI
3f00: 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20  TE_SO_TEXT;.    
3f10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
3f20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3f30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3f40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
3f50: 61 73 65 20 27 78 27 3a 0a 20 20 20 20 20 20 20  ase 'x':.       
3f60: 20 63 61 73 65 20 27 58 27 3a 20 7b 0a 20 20 20   case 'X': {.   
3f70: 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 32 20         if( i>=2 
3f80: 26 26 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d  && sqliteStrNICm
3f90: 70 28 26 7a 5b 69 2d 32 5d 2c 22 74 65 78 74 22  p(&z[i-2],"text"
3fa0: 2c 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,4)==0 ){.      
3fb0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72 74        pCol->sort
3fc0: 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53  Order = SQLITE_S
3fd0: 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 20 20  O_TEXT;.        
3fe0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
3ff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4000: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4010: 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75   }.        defau
4020: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lt: {.          
4030: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4050: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
4060: 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74  given token is t
4070: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
4080: 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f   for the last co
4090: 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a  lumn added to.**
40a0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
40b0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
40c0: 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69  ruction.  If "mi
40d0: 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72 75 65  nusFlag" is true
40e0: 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
40f0: 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61  e value token wa
4100: 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  s preceded by a 
4110: 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a  minus sign..**.*
4120: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4130: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
4140: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
4150: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
4160: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
4170: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
4180: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
4190: 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  eAddDefaultValue
41a0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
41b0: 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74  Token *pVal, int
41c0: 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54   minusFlag){.  T
41d0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
41e0: 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20  ;.  char **pz;. 
41f0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
4200: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
4210: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
4220: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
4230: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
4240: 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69   pz = &p->aCol[i
4250: 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d  ].zDflt;.  if( m
4260: 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20  inusFlag ){.    
4270: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
4280: 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61  (pz, "-", 1, pVa
4290: 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30  l->z, pVal->n, 0
42a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
42b0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
42c0: 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56  (pz, pVal->z, pV
42d0: 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20  al->n, 0);.  }. 
42e0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a   sqliteDequote(*
42f0: 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  pz);.}../*.** De
4300: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
4310: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
4320: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
4330: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
4340: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
4350: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
4360: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
4370: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
4380: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
4390: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
43a0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
43b0: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
43c0: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
43d0: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
43e0: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
43f0: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
4400: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
4410: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
4420: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
4430: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
4440: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
4450: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
4460: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
4470: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
4480: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
4490: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
44a0: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
44b0: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
44c0: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
44d0: 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20  as the row id.  
44e0: 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46  (Exception:.** F
44f0: 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
4500: 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
4510: 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c  older databases,
4520: 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   do not do this.
4530: 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66  ** if the file f
4540: 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75  ormat version nu
4550: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
4560: 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54  n 1.)  Set the T
4570: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
4580: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
4590: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
45a0: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
45b0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
45c0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
45d0: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
45e0: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
45f0: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
4600: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
4610: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
4620: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
4630: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
4640: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
4650: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
4660: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
4670: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
4680: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
4690: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
46a0: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
46b0: 69 74 65 41 64 64 50 72 69 6d 61 72 79 4b 65 79  iteAddPrimaryKey
46c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
46d0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  IdList *pList, i
46e0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
46f0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
4700: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
4710: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
4720: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
4730: 2d 31 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  -1;.  if( pTab==
4740: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
4750: 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b  ( pTab->hasPrimK
4760: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
4770: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
4780: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
4790: 6c 65 20 5c 22 22 2c 20 70 54 61 62 2d 3e 7a 4e  le \"", pTab->zN
47a0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 5c  ame, .        "\
47b0: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
47c0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
47d0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
47e0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
47f0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
4800: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31  ->hasPrimKey = 1
4810: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
4820: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
4830: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
4840: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74   }else if( pList
4850: 2d 3e 6e 49 64 3d 3d 31 20 29 7b 0a 20 20 20 20  ->nId==1 ){.    
4860: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
4870: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
4880: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
4890: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c  sqliteStrICmp(pL
48a0: 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ist->a[0].zName,
48b0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
48c0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
48d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
48e0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
48f0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
4900: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70  ){.    zType = p
4910: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
4920: 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zType;.  }.  if(
4930: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c   pParse->db->fil
4940: 65 5f 66 6f 72 6d 61 74 3e 3d 31 20 26 26 20 0a  e_format>=1 && .
4950: 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65             zType
4960: 20 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d   && sqliteStrICm
4970: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
4980: 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54  R")==0 ){.    pT
4990: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
49a0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
49b0: 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  onf = onError;. 
49c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
49d0: 74 65 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  teCreateIndex(pP
49e0: 61 72 73 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73  arse, 0, 0, pLis
49f0: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30  t, onError, 0, 0
4a00: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4a10: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
4a20: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
4a30: 20 74 79 70 65 20 67 69 76 65 6e 20 74 68 65 20   type given the 
4a40: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 74  collation type t
4a50: 6f 6b 65 6e 2e 0a 2a 2a 20 52 65 70 6f 72 74 20  oken..** Report 
4a60: 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
4a70: 74 79 70 65 20 69 73 20 75 6e 64 65 66 69 6e 65  type is undefine
4a80: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
4a90: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
4aa0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
4ab0: 20 2a 70 54 79 70 65 29 7b 0a 20 20 69 66 28 20   *pType){.  if( 
4ac0: 70 54 79 70 65 3d 3d 30 20 29 20 72 65 74 75 72  pType==0 ) retur
4ad0: 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 4b 3b  n SQLITE_SO_UNK;
4ae0: 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d  .  if( pType->n=
4af0: 3d 34 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e  =4 && sqliteStrN
4b00: 49 43 6d 70 28 70 54 79 70 65 2d 3e 7a 2c 20 22  ICmp(pType->z, "
4b10: 74 65 78 74 22 2c 20 34 29 3d 3d 30 20 29 7b 0a  text", 4)==0 ){.
4b20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4b30: 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 7d 0a 20  E_SO_TEXT;.  }. 
4b40: 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 37   if( pType->n==7
4b50: 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e 49 43   && sqliteStrNIC
4b60: 6d 70 28 70 54 79 70 65 2d 3e 7a 2c 20 22 6e 75  mp(pType->z, "nu
4b70: 6d 65 72 69 63 22 2c 20 37 29 3d 3d 30 20 29 7b  meric", 7)==0 ){
4b80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4b90: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 7d 0a 20  TE_SO_NUM;.  }. 
4ba0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
4bb0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
4bc0: 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c  sg, "unknown col
4bd0: 6c 61 74 69 6e 67 20 74 79 70 65 3a 20 22 2c 20  lating type: ", 
4be0: 2d 31 2c 0a 20 20 20 20 70 54 79 70 65 2d 3e 7a  -1,.    pType->z
4bf0: 2c 20 70 54 79 70 65 2d 3e 6e 2c 20 30 29 3b 0a  , pType->n, 0);.
4c00: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
4c10: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
4c20: 45 5f 53 4f 5f 55 4e 4b 3b 0a 7d 0a 0a 2f 2a 0a  E_SO_UNK;.}../*.
4c30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4c40: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
4c50: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
4c60: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
4c70: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
4c80: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
4c90: 6e 74 2e 20 20 41 20 22 43 4f 4c 4c 41 54 45 22  nt.  A "COLLATE"
4ca0: 20 63 6c 61 75 73 65 20 68 61 73 0a 2a 2a 20 62   clause has.** b
4cb0: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
4cc0: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
4cd0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 43 6f 6c  ine sets the Col
4ce0: 75 6d 6e 2e 73 6f 72 74 4f 72 64 65 72 20 6f 6e  umn.sortOrder on
4cf0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
4d00: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
4d10: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
4d20: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f  void sqliteAddCo
4d30: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
4d40: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 63 6f 6c  *pParse, int col
4d50: 6c 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20  lType){.  Table 
4d60: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  *p;.  int i;.  i
4d70: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
4d80: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
4d90: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
4da0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
4db0: 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d  >=0 ) p->aCol[i]
4dc0: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 63 6f 6c  .sortOrder = col
4dd0: 6c 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lType;.}../*.** 
4de0: 43 6f 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e  Come up with a n
4df0: 65 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  ew random value 
4e00: 66 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 63  for the schema c
4e10: 6f 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72  ookie.  Make sur
4e20: 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c  e.** the new val
4e30: 75 65 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ue is different 
4e40: 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a  from the old..**
4e50: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
4e60: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
4e70: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
4e80: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
4e90: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
4ea0: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
4eb0: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
4ec0: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
4ed0: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
4ee0: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
4ef0: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
4f00: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
4f10: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
4f20: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
4f30: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
4f40: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
4f50: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
4f60: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
4f70: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
4f80: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
4f90: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
4fa0: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
4fb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
4fc0: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
4fd0: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
4fe0: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
4ff0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
5000: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
5010: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
5020: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
5030: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
5040: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
5050: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
5060: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
5070: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
5080: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
5090: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
50a0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
50b0: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
50c0: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
50d0: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
50e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
50f0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69  hangeCookie(sqli
5100: 74 65 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 29  te *db, Vdbe *v)
5110: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65 78 74  {.  if( db->next
5120: 5f 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 73 63 68  _cookie==db->sch
5130: 65 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20  ema_cookie ){.  
5140: 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69    db->next_cooki
5150: 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63  e = db->schema_c
5160: 6f 6f 6b 69 65 20 2b 20 73 71 6c 69 74 65 52 61  ookie + sqliteRa
5170: 6e 64 6f 6d 42 79 74 65 28 29 20 2b 20 31 3b 0a  ndomByte() + 1;.
5180: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
5190: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
51a0: 61 6e 67 65 73 3b 0a 20 20 20 20 73 71 6c 69 74  anges;.    sqlit
51b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
51c0: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 6e 65  _Integer, db->ne
51d0: 78 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20  xt_cookie, 0);. 
51e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
51f0: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
5200: 69 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d  ie, 0, 0);.  }.}
5210: 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20  ../*.** Measure 
5220: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
5230: 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20  aracters needed 
5240: 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69  to output the gi
5250: 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  ven.** identifie
5260: 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72  r.  The number r
5270: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
5280: 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64   any quotes used
5290: 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  .** but does not
52a0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c   include the nul
52b0: 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f  l terminator..*/
52c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
52d0: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
52e0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
52f0: 0a 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74 65  .  int needQuote
5300: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b   = 0;.  for(n=0;
5310: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
5320: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27 27      if( *z=='\''
5330: 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f   ){ n++; needQuo
5340: 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65  te=1; }.  }.  re
5350: 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75 6f  turn n + needQuo
5360: 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  te*2;.}../*.** W
5370: 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69  rite an identifi
5380: 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  er onto the end 
5390: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  of the given str
53a0: 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f  ing.  Add.** quo
53b0: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73  te characters as
53c0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
53d0: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
53e0: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
53f0: 49 64 78 2c 20 63 68 61 72 20 2a 7a 49 64 65 6e  Idx, char *zIden
5400: 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  t){.  int i, j, 
5410: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
5420: 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d   *pIdx;.  for(j=
5430: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
5440: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61  +){.    if( !isa
5450: 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20  lnum(zIdent[j]) 
5460: 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f  && zIdent[j]!='_
5470: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ' ) break;.  }. 
5480: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49   needQuote =  zI
5490: 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73  dent[j]!=0 || is
54a0: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
54b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
54c0: 20 20 20 7c 7c 20 73 71 6c 69 74 65 4b 65 79 77     || sqliteKeyw
54d0: 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20  ordCode(zIdent, 
54e0: 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28  j)!=TK_ID;.  if(
54f0: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
5500: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f  ++] = '\'';.  fo
5510: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
5520: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
5530: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
5540: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
5550: 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d  ]=='\'' ) z[i++]
5560: 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69   = '\'';.  }.  i
5570: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
5580: 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [i++] = '\'';.  
5590: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
55a0: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
55b0: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
55c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
55d0: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
55e0: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
55f0: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
5600: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
5610: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
5620: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
5630: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
5640: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
5650: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
5660: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
5670: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
5680: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61  eateTableStmt(Ta
5690: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
56a0: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
56b0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
56c0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
56d0: 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  nd;.  n = 0;.  f
56e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
56f0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b  l; i++){.    n +
5700: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
5710: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
5720: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e  .  }.  n += iden
5730: 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65  tLength(p->zName
5740: 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20 29 7b  );.  if( n<40 ){
5750: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
5760: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
5770: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
5780: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
5790: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
57a0: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
57b0: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
57c0: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
57d0: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
57e0: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d   zStmt = sqliteM
57f0: 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20  allocRaw( n );. 
5800: 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20   if( zStmt==0 ) 
5810: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63  return 0;.  strc
5820: 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 73 54  py(zStmt, p->isT
5830: 65 6d 70 20 3f 20 22 43 52 45 41 54 45 20 54 45  emp ? "CREATE TE
5840: 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43 52  MP TABLE " : "CR
5850: 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20  EATE TABLE ");. 
5860: 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d   k = strlen(zStm
5870: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
5880: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
5890: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
58a0: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 69  ] = '(';.  for(i
58b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
58c0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  ++){.    strcpy(
58d0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
58e0: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65  ;.    k += strle
58f0: 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  n(&zStmt[k]);.  
5900: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
5910: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
5920: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b  mt, &k, p->aCol[
5930: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
5940: 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b   strcpy(&zStmt[k
5950: 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75  ], zEnd);.  retu
5960: 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zStmt;.}../*.
5970: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5980: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70  is called to rep
5990: 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29  ort the final ")
59a0: 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  " that terminate
59b0: 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41  s.** a CREATE TA
59c0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
59d0: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73  *.** The table s
59e0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74  tructure that ot
59f0: 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  her action routi
5a00: 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75  nes have been bu
5a10: 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64  ilding.** is add
5a20: 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
5a30: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20  al hash tables, 
5a40: 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  assuming no erro
5a50: 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72  rs have.** occur
5a60: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e  red..**.** An en
5a70: 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c  try for the tabl
5a80: 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65  e is made in the
5a90: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e   master table on
5aa0: 20 64 69 73 6b 2c 0a 2a 2a 20 75 6e 6c 65 73 73   disk,.** unless
5ab0: 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
5ac0: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 69 6e  rary table or in
5ad0: 69 74 46 6c 61 67 3d 3d 31 2e 20 20 57 68 65 6e  itFlag==1.  When
5ae0: 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2c 0a 2a 2a   initFlag==1,.**
5af0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
5b00: 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
5b10: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
5b20: 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
5b30: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f  .** connected to
5b40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
5b50: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c   because the sql
5b60: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
5b70: 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79   has.** recently
5b80: 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68 65   changes, so the
5b90: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20   entry for this 
5ba0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
5bb0: 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ists in.** the s
5bc0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
5bd0: 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77  le.  We do not w
5be0: 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74  ant to create it
5bf0: 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66   again..**.** If
5c00: 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67   the pSelect arg
5c10: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
5c20: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
5c30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
5c40: 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63   was called to c
5c50: 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65  reate a table ge
5c60: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a  nerated from a .
5c70: 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  ** "CREATE TABLE
5c80: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e   ... AS SELECT .
5c90: 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  .." statement.  
5ca0: 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  The column names
5cb0: 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74   of.** the new t
5cc0: 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20  able will match 
5cd0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
5ce0: 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  f the SELECT..*/
5cf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 54  .void sqliteEndT
5d00: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
5d10: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  se, Token *pEnd,
5d20: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
5d30: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
5d40: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
5d50: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
5d60: 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65   (pEnd==0 && pSe
5d70: 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72  lect==0) || pPar
5d80: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
5d90: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
5da0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d   ) return;.  p =
5db0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5dc0: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
5dd0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 41   return;..  /* A
5de0: 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
5df0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
5e00: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
5e10: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
5e20: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
5e30: 72 73 65 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d  rse->nameClash==
5e40: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 6e 69  0 || pParse->ini
5e50: 74 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66  tFlag==1 );.  if
5e60: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
5e70: 6e 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  n==0 && pParse->
5e80: 6e 61 6d 65 43 6c 61 73 68 3d 3d 30 20 29 7b 0a  nameClash==0 ){.
5e90: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
5ea0: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
5eb0: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
5ec0: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
5ed0: 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  b->tblHash, p->z
5ee0: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
5ef0: 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20  zName)+1, p);.  
5f00: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
5f10: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
5f20: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
5f30: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
5f40: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
5f50: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
5f60: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
5f70: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70    for(pFKey=p->p
5f80: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
5f90: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  ey=pFKey->pNextF
5fa0: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
5fb0: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b  nTo = strlen(pFK
5fc0: 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20  ey->zTo) + 1;.  
5fd0: 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74      pFKey->pNext
5fe0: 54 6f 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46  To = sqliteHashF
5ff0: 69 6e 64 28 26 64 62 2d 3e 61 46 4b 65 79 2c 20  ind(&db->aFKey, 
6000: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29  pFKey->zTo, nTo)
6010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61  ;.      sqliteHa
6020: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 46  shInsert(&db->aF
6030: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
6040: 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20   nTo, pFKey);.  
6050: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
6060: 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
6070: 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b     db->nTable++;
6080: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
6090: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
60a0: 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f  hanges;.  }..  /
60b0: 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  * If the table i
60c0: 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  s generated from
60d0: 20 61 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20   a SELECT, then 
60e0: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 0a 20 20  construct the.  
60f0: 2a 2a 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  ** list of colum
6100: 6e 73 20 61 6e 64 20 74 68 65 20 74 65 78 74 20  ns and the text 
6110: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
6120: 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  */.  if( pSelect
6130: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
6140: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 52  SelTab = sqliteR
6150: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
6160: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c  (pParse, 0, pSel
6170: 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 70 53  ect);.    if( pS
6180: 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  elTab==0 ) retur
6190: 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  n;.    assert( p
61a0: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
61b0: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
61c0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d  ab->nCol;.    p-
61d0: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
61e0: 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54  >aCol;.    pSelT
61f0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
6200: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
6210: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  = 0;.    sqliteD
6220: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
6230: 65 6c 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f  elTab);.  }..  /
6240: 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61  * If the initFla
6250: 67 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  g is 1 it means 
6260: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
6270: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
6280: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
6290: 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
62a0: 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
62b0: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
62c0: 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
62d0: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
62e0: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
62f0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
6300: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
6310: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
6320: 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d   pParse->newTnum
6330: 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61   field.  (The pa
6340: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73  ge number.  ** s
6350: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
6360: 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65  put there by the
6370: 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f   sqliteOpenCb ro
6380: 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69  utine.).  */.  i
6390: 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  f( pParse->initF
63a0: 6c 61 67 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  lag ){.    p->tn
63b0: 75 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77  um = pParse->new
63c0: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
63d0: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
63e0: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
63f0: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
6400: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
6410: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
6420: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
6430: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
6440: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a  e record number.
6450: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77    ** for the new
6460: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f   table entry sho
6470: 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f  uld already be o
6480: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  n the stack..  *
6490: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
64a0: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
64b0: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
64c0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
64d0: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
64e0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
64f0: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
6500: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
6510: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e   if( !pParse->in
6520: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 6e  itFlag ){.    in
6530: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
6540: 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  ;..    v = sqlit
6550: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
6560: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
6570: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
6580: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
6590: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
65a0: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
65b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
65c0: 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  dOp(v, OP_Create
65d0: 54 61 62 6c 65 2c 20 30 2c 20 70 2d 3e 69 73 54  Table, 0, p->isT
65e0: 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  emp);.      sqli
65f0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
6600: 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 26 70  , -1, (char *)&p
6610: 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54  ->tnum, P3_POINT
6620: 45 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ER);.    }else{.
6630: 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
6640: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  */.      sqliteV
6650: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6660: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
6670: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d     }.    p->tnum
6680: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
6690: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
66a0: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
66b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
66c0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
66d0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 0);.    if( p-
66e0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
66f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
6700: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
6710: 74 61 62 6c 65 22 2c 20 50 33 5f 53 54 41 54 49  table", P3_STATI
6720: 43 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  C);.    }else{. 
6730: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
6740: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
6750: 76 69 65 77 22 2c 20 50 33 5f 53 54 41 54 49 43  view", P3_STATIC
6760: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6770: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6780: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
6790: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
67a0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
67b0: 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41  p->zName, P3_STA
67c0: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
67d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
67e0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
67f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
6800: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e  ngeP3(v, -1, p->
6810: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
6820: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
6830: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
6840: 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 4, 0);.    sql
6850: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6860: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
6870: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
6880: 74 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  t ){.      char 
6890: 2a 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65  *z = createTable
68a0: 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 6e  Stmt(p);.      n
68b0: 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29   = z ? strlen(z)
68c0: 20 3a 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   : 0;.      sqli
68d0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
68e0: 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  , -1, z, n);.   
68f0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
6900: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6910: 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21     assert( pEnd!
6920: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  =0 );.      n = 
6930: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
6940: 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73 46 69  Addr(pParse->sFi
6950: 72 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b  rstToken.z) + 1;
6960: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6970: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
6980: 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54   pParse->sFirstT
6990: 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20  oken.z, n);.    
69a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
69b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
69c0: 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20  Record, 5, 0);. 
69d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
69e0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
69f0: 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ey, 0, 0);.    i
6a00: 66 28 20 21 70 2d 3e 69 73 54 65 6d 70 20 29 7b  f( !p->isTemp ){
6a10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61  .      sqliteCha
6a20: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29  ngeCookie(db, v)
6a30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6a40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6a50: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
6a60: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
6a70: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  ){.      int op 
6a80: 3d 20 70 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50  = p->isTemp ? OP
6a90: 5f 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f  _OpenWrAux : OP_
6aa0: 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  OpenWrite;.     
6ab0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6ac0: 28 76 2c 20 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  (v, op, 1, 0);. 
6ad0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
6ae0: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
6af0: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
6b00: 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54  , pSelect, SRT_T
6b10: 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30  able, 1, 0, 0, 0
6b20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
6b30: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
6b40: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
6b50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  }.}../*.** The p
6b60: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
6b70: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
6b80: 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
6b90: 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
6ba0: 71 6c 69 74 65 43 72 65 61 74 65 56 69 65 77 28  qliteCreateView(
6bb0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6bc0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  ,     /* The par
6bd0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6be0: 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c    Token *pBegin,
6bf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
6c00: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
6c10: 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  gins the stateme
6c20: 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
6c30: 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  Name,      /* Th
6c40: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
6c50: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
6c60: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c  he view */.  Sel
6c70: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
6c80: 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
6c90: 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
6ca0: 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
6cb0: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
6cc0: 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54  emp         /* T
6cd0: 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
6ce0: 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20  ARY view */.){. 
6cf0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
6d00: 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
6d10: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
6d20: 64 3b 0a 0a 20 20 73 71 6c 69 74 65 53 74 61 72  d;..  sqliteStar
6d30: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
6d40: 42 65 67 69 6e 2c 20 70 4e 61 6d 65 2c 20 69 73  Begin, pName, is
6d50: 54 65 6d 70 29 3b 0a 20 20 70 20 3d 20 70 50 61  Temp);.  p = pPa
6d60: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
6d70: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
6d80: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65    sqliteSelectDe
6d90: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
6da0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
6db0: 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
6dc0: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
6dd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
6de0: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
6df0: 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
6e00: 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
6e10: 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
6e20: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
6e30: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
6e40: 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
6e50: 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
6e60: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
6e70: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
6e80: 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
6e90: 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
6ea0: 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
6eb0: 65 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  e_exec() call re
6ec0: 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
6ed0: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
6ee0: 65 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65  eSelectDup(pSele
6ef0: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c  ct);.  sqliteSel
6f00: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
6f10: 74 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73  t);.  if( !pPars
6f20: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
6f30: 20 20 20 73 71 6c 69 74 65 56 69 65 77 47 65 74     sqliteViewGet
6f40: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
6f50: 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  se, p);.  }..  /
6f60: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
6f70: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
6f80: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
6f90: 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
6fa0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
6fb0: 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
6fc0: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
6fd0: 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b  n;.  if( sEnd.z[
6fe0: 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b  0]!=0 && sEnd.z[
6ff0: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
7000: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
7010: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
7020: 30 3b 0a 20 20 6e 20 3d 20 28 28 69 6e 74 29 73  0;.  n = ((int)s
7030: 45 6e 64 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42  End.z) - (int)pB
7040: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70  egin->z;.  z = p
7050: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c  Begin->z;.  whil
7060: 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31  e( n>0 && (z[n-1
7070: 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63  ]==';' || isspac
7080: 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d  e(z[n-1])) ){ n-
7090: 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20  -; }.  sEnd.z = 
70a0: 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e  &z[n-1];.  sEnd.
70b0: 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65  n = 1;..  /* Use
70c0: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
70d0: 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65  ) to add the vie
70e0: 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f  w to the SQLITE_
70f0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a  MASTER table */.
7100: 20 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65    sqliteEndTable
7110: 28 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20  (pParse, &sEnd, 
7120: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
7130: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
7140: 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
7150: 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
7160: 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
7170: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
7180: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
7190: 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
71a0: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
71b0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
71c0: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
71d0: 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
71e0: 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
71f0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
7200: 61 72 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  are->zErrMsg..*/
7210: 0a 69 6e 74 20 73 71 6c 69 74 65 56 69 65 77 47  .int sqliteViewG
7220: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61  etColumnNames(Pa
7230: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
7240: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45  le *pTable){.  E
7250: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
7260: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
7270: 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
7280: 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  b;.  int nErr = 
7290: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  0;..  assert( pT
72a0: 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  able );..  /* A 
72b0: 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65  positive nCol me
72c0: 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ans the columns 
72d0: 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76  names for this v
72e0: 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72  iew are.  ** alr
72f0: 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f  eady known..  */
7300: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
7310: 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30  Col>0 ) return 0
7320: 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69  ;..  /* A negati
7330: 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65  ve nCol is a spe
7340: 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e  cial marker mean
7350: 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20  ing that we are 
7360: 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74  currently.  ** t
7370: 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65  rying to compute
7380: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
7390: 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20  s.  If we enter 
73a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
73b0: 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76  h.  ** a negativ
73c0: 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73  e nCol, it means
73d0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65   two or more vie
73e0: 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20  ws form a loop, 
73f0: 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  like this:.  **.
7400: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
7410: 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45  VIEW one AS SELE
7420: 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20  CT * FROM two;. 
7430: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
7440: 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43  IEW two AS SELEC
7450: 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20  T * FROM one;.  
7460: 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
7470: 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20  , this error is 
7480: 63 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c  caught previousl
7490: 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c  y and so the fol
74a0: 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a  lowing test.  **
74b0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66   should always f
74c0: 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c  ail.  But we wil
74d0: 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c  l leave it in pl
74e0: 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73  ace just to be s
74f0: 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  afe..  */.  if( 
7500: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29  pTable->nCol<0 )
7510: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
7520: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
7530: 45 72 72 4d 73 67 2c 20 22 76 69 65 77 20 22 2c  ErrMsg, "view ",
7540: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a   pTable->zName,.
7550: 20 20 20 20 20 20 20 20 20 22 20 69 73 20 63 69           " is ci
7560: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
7570: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
7580: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
7590: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
75a0: 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
75b0: 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
75c0: 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
75d0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
75e0: 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  es..  */.  asser
75f0: 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  t( pTable->pSele
7600: 63 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c  ct ); /* If nCol
7610: 3d 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65  ==0, then pTable
7620: 20 6d 75 73 74 20 62 65 20 61 20 56 49 45 57 20   must be a VIEW 
7630: 2a 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62  */.  pSel = pTab
7640: 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  le->pSelect;..  
7650: 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  /* Note that the
7660: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 52   call to sqliteR
7670: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
7680: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
7690: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
76a0: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73  ents in this lis
76b0: 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  t.  But we will 
76c0: 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  need to restore 
76d0: 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61  the list.  ** ba
76e0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
76f0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
7700: 20 61 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20   afterwards, so 
7710: 77 65 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f  we save a copy o
7720: 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69  f.  ** the origi
7730: 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20  nal in pEList.. 
7740: 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
7750: 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  Sel->pEList;.  p
7760: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sel->pEList = sq
7770: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 75 70 28  liteExprListDup(
7780: 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70  pEList);.  if( p
7790: 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29  Sel->pEList==0 )
77a0: 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69  {.    pSel->pELi
77b0: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  st = pEList;.   
77c0: 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d   return 1;  /* M
77d0: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a  alloc failed */.
77e0: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43    }.  pTable->nC
77f0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54  ol = -1;.  pSelT
7800: 61 62 20 3d 20 73 71 6c 69 74 65 52 65 73 75 6c  ab = sqliteResul
7810: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
7820: 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20  rse, 0, pSel);. 
7830: 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
7840: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
7850: 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
7860: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
7870: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
7880: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  .    pTable->aCo
7890: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
78a0: 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  l;.    pSelTab->
78b0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53  nCol = 0;.    pS
78c0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
78d0: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74  .    sqliteDelet
78e0: 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61  eTable(0, pSelTa
78f0: 62 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  b);.    pParse->
7900: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
7910: 49 54 45 5f 55 6e 72 65 73 65 74 56 69 65 77 73  ITE_UnresetViews
7920: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
7930: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
7940: 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d  .    nErr++;.  }
7950: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 55  .  sqliteSelectU
7960: 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73  nbind(pSel);.  s
7970: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
7980: 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ete(pSel->pEList
7990: 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  );.  pSel->pELis
79a0: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65  t = pEList;.  re
79b0: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a  turn nErr;  .}..
79c0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
79d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
79e0: 6d 20 74 68 65 20 56 49 45 57 20 70 54 61 62 6c  m the VIEW pTabl
79f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
7a00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
7a10: 77 68 65 6e 65 76 65 72 20 61 6e 79 20 6f 74 68  whenever any oth
7a20: 65 72 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  er table or view
7a30: 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a   is modified..**
7a40: 20 54 68 65 20 76 69 65 77 20 70 61 73 73 65 64   The view passed
7a50: 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69   into this routi
7a60: 6e 65 20 6d 69 67 68 74 20 64 65 70 65 6e 64 20  ne might depend 
7a70: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69  directly or indi
7a80: 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65  rectly.** on the
7a90: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65 6c   modified or del
7aa0: 65 74 65 64 20 74 61 62 6c 65 20 73 6f 20 77 65  eted table so we
7ab0: 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74   need to clear t
7ac0: 68 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a  he old column.**
7ad0: 20 6e 61 6d 65 73 20 73 6f 20 74 68 61 74 20 74   names so that t
7ae0: 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63 6f  hey will be reco
7af0: 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mputed..*/.stati
7b00: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
7b10: 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  wResetColumnName
7b20: 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  s(Table *pTable)
7b30: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
7b40: 20 70 54 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 54   pTable==0 || pT
7b50: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  able->pSelect==0
7b60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
7b70: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30   pTable->nCol==0
7b80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
7b90: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
7ba0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7bb0: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
7bc0: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  e->aCol[i].zName
7bd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
7be0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
7bf0: 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71  ].zDflt);.    sq
7c00: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
7c10: 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b  >aCol[i].zType);
7c20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
7c30: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  e(pTable->aCol);
7c40: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
7c50: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
7c60: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
7c70: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
7c80: 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
7c90: 65 72 79 20 56 49 45 57 2e 0a 2a 2f 0a 76 6f 69  ery VIEW..*/.voi
7ca0: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
7cb0: 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 29  tAll(sqlite *db)
7cc0: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
7cd0: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
7ce0: 73 20 26 20 53 51 4c 49 54 45 5f 55 6e 72 65 73  s & SQLITE_Unres
7cf0: 65 74 56 69 65 77 73 29 3d 3d 30 20 29 20 72 65  etViews)==0 ) re
7d00: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
7d10: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
7d20: 62 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20  b->tblHash); i; 
7d30: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
7d40: 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
7d50: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
7d60: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
7d70: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
7d80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7d90: 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  ViewResetColumnN
7da0: 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20  ames(pTab);.    
7db0: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  }.  }.  db->flag
7dc0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 55 6e 72  s &= ~SQLITE_Unr
7dd0: 65 73 65 74 56 69 65 77 73 3b 0a 7d 0a 0a 2f 2a  esetViews;.}../*
7de0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
7df0: 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62  n, look up a tab
7e00: 6c 65 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d  le with that nam
7e10: 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  e.  If not found
7e20: 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72  , leave.** an er
7e30: 72 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72 73  ror for the pars
7e40: 65 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20 72  er to find and r
7e50: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54  eturn NULL..*/.T
7e60: 61 62 6c 65 20 2a 73 71 6c 69 74 65 54 61 62 6c  able *sqliteTabl
7e70: 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65  eFromToken(Parse
7e80: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
7e90: 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a  *pTok){.  char *
7ea0: 7a 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a  zName;.  Table *
7eb0: 70 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  pTab;.  zName = 
7ec0: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
7ed0: 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a  romToken(pTok);.
7ee0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
7ef0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61   return 0;.  pTa
7f00: 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
7f10: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
7f20: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
7f30: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  Free(zName);.  i
7f40: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
7f50: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
7f60: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
7f70: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  Msg, "no such ta
7f80: 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20  ble: ", 0, .    
7f90: 20 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f      pTok->z, pTo
7fa0: 6b 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50  k->n, 0);.    pP
7fb0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
7fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
7fd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7fe0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7ff0: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
8000: 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
8010: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
8020: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
8030: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
8040: 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
8050: 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 54 61  oid sqliteDropTa
8060: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
8070: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  e, Token *pName,
8080: 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
8090: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
80a0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
80b0: 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a  base;.  sqlite *
80c0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
80d0: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
80e0: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
80f0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
8100: 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20  eturn;.  pTable 
8110: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f  = sqliteTableFro
8120: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70  mToken(pParse, p
8130: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
8140: 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ble==0 ) return;
8150: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 72  .  if( pTable->r
8160: 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
8170: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
8180: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
8190: 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 6c   "table ", pTabl
81a0: 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  e->zName, .     
81b0: 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 64    " may not be d
81c0: 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
81d0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
81e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
81f0: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
8200: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
8210: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8220: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
8230: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73  se->zErrMsg, "us
8240: 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20  e DROP TABLE to 
8250: 64 65 6c 65 74 65 20 74 61 62 6c 65 20 22 2c 0a  delete table ",.
8260: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e        pTable->zN
8270: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ame, 0);.    pPa
8280: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
8290: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
82a0: 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
82b0: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b  able->pSelect ){
82c0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
82d0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
82e0: 72 72 4d 73 67 2c 20 22 75 73 65 20 44 52 4f 50  rrMsg, "use DROP
82f0: 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
8300: 76 69 65 77 20 22 2c 0a 20 20 20 20 20 20 70 54  view ",.      pT
8310: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  able->zName, 0);
8320: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
8330: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r++;.    return;
8340: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
8350: 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
8360: 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ve the table fro
8370: 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
8380: 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e  le.  ** on disk.
8390: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
83a0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
83b0: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
83c0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
83d0: 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a  dropTable[] = {.
83e0: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e        { OP_Rewin
83f0: 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 38  d,     0, ADDR(8
8400: 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ),  0},.      { 
8410: 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30  OP_String,     0
8420: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
8430: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
8440: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31  OP_MemStore,   1
8450: 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 1,        0},.
8460: 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f        { OP_MemLo
8470: 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ad,    1, 0,    
8480: 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a      0}, /* 3 */.
8490: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
84a0: 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20  n,     0, 2,    
84b0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
84c0: 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30  OP_Ne,         0
84d0: 2c 20 41 44 44 52 28 37 29 2c 20 20 30 7d 2c 0a  , ADDR(7),  0},.
84e0: 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74        { OP_Delet
84f0: 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  e,     0, 0,    
8500: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
8510: 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30  OP_Next,       0
8520: 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20  , ADDR(3),  0}, 
8530: 2f 2a 20 37 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  /* 7 */.    };. 
8540: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
8550: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
8560: 69 67 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  igger;.    sqlit
8570: 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
8580: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
8590: 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b  pTable->isTemp);
85a0: 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d  .    sqliteOpenM
85b0: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 54  asterTable(v, pT
85c0: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20  able->isTemp);. 
85d0: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74     /* Drop all t
85e0: 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
85f0: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
8600: 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20  e being dropped 
8610: 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  */.    pTrigger 
8620: 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67  = pTable->pTrigg
8630: 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  er;.    while( p
8640: 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20  Trigger ){.     
8650: 20 54 6f 6b 65 6e 20 74 74 3b 0a 20 20 20 20 20   Token tt;.     
8660: 20 74 74 2e 7a 20 3d 20 70 54 61 62 6c 65 2d 3e   tt.z = pTable->
8670: 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 3b 0a  pTrigger->name;.
8680: 20 20 20 20 20 20 74 74 2e 6e 20 3d 20 73 74 72        tt.n = str
8690: 6c 65 6e 28 70 54 61 62 6c 65 2d 3e 70 54 72 69  len(pTable->pTri
86a0: 67 67 65 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  gger->name);.   
86b0: 20 20 20 73 71 6c 69 74 65 44 72 6f 70 54 72 69     sqliteDropTri
86c0: 67 67 65 72 28 70 50 61 72 73 65 2c 20 26 74 74  gger(pParse, &tt
86d0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
86e0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
86f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69 67  ){.        pTrig
8700: 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
8710: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
8720: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69  se{.        pTri
8730: 67 67 65 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70  gger = pTable->p
8740: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d  Trigger;.      }
8750: 0a 20 20 20 20 7d 0a 20 20 20 20 62 61 73 65 20  .    }.    base 
8760: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
8770: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
8780: 7a 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64  ze(dropTable), d
8790: 72 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 73  ropTable);.    s
87a0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
87b0: 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 54 61  3(v, base+1, pTa
87c0: 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  ble->zName, 0);.
87d0: 20 20 20 20 69 66 28 20 21 70 54 61 62 6c 65 2d      if( !pTable-
87e0: 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  >isTemp ){.     
87f0: 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f   sqliteChangeCoo
8800: 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20  kie(db, v);.    
8810: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
8820: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
8830: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  e, 0, 0);.    if
8840: 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20  ( !isView ){.   
8850: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8860: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
8870: 2c 20 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 2c 20  , pTable->tnum, 
8880: 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b  pTable->isTemp);
8890: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
88a0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
88b0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
88c0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
88d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
88e0: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
88f0: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62  pIdx->tnum, pTab
8900: 6c 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20  le->isTemp);.   
8910: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
8920: 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
8930: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
8940: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
8950: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
8960: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
8970: 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  e table..  **.  
8980: 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66  ** Exception: if
8990: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
89a0: 6e 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68  nt began with th
89b0: 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72  e EXPLAIN keywor
89c0: 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20  d,.  ** then no 
89d0: 63 68 61 6e 67 65 73 20 73 68 6f 75 6c 64 20 62  changes should b
89e0: 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69  e made..  */.  i
89f0: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
8a00: 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ain ){.    sqlit
8a10: 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  eUnlinkAndDelete
8a20: 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 6c 65  Table(db, pTable
8a30: 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  );.    db->flags
8a40: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
8a50: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20  nChanges;.  }.  
8a60: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
8a70: 6c 6c 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ll(db);.}../*.**
8a80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   This routine co
8a90: 6e 73 74 72 75 63 74 73 20 61 20 50 33 20 73 74  nstructs a P3 st
8aa0: 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
8ab0: 72 20 61 6e 20 4f 50 5f 4d 61 6b 65 49 64 78 4b  r an OP_MakeIdxK
8ac0: 65 79 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64  ey.** opcode and
8ad0: 20 61 64 64 73 20 74 68 61 74 20 50 33 20 73 74   adds that P3 st
8ae0: 72 69 6e 67 20 74 6f 20 74 68 65 20 6d 6f 73 74  ring to the most
8af0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
8b00: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  ed instruction.*
8b10: 2a 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  * in the virtual
8b20: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 50   machine.  The P
8b30: 33 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74  3 string consist
8b40: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 68  s of a single ch
8b50: 61 72 61 63 74 65 72 0a 2a 2a 20 66 6f 72 20 65  aracter.** for e
8b60: 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ach column in th
8b70: 65 20 69 6e 64 65 78 20 70 49 64 78 20 6f 66 20  e index pIdx of 
8b80: 74 61 62 6c 65 20 70 54 61 62 2e 20 20 49 66 20  table pTab.  If 
8b90: 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 0a  the column uses.
8ba0: 2a 2a 20 61 20 6e 75 6d 65 72 69 63 20 73 6f 72  ** a numeric sor
8bb0: 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68  t order, then th
8bc0: 65 20 50 33 20 73 74 72 69 6e 67 20 63 68 61 72  e P3 string char
8bd0: 61 63 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64  acter correspond
8be0: 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 61 74 20 63  ing to.** that c
8bf0: 6f 6c 75 6d 6e 20 69 73 20 27 6e 27 2e 20 20 49  olumn is 'n'.  I
8c00: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65  f the column use
8c10: 73 20 61 20 74 65 78 74 20 73 6f 72 74 20 6f 72  s a text sort or
8c20: 64 65 72 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  der, then the.**
8c30: 20 50 33 20 73 74 72 69 6e 67 20 69 73 20 27 74   P3 string is 't
8c40: 27 2e 20 20 53 65 65 20 74 68 65 20 4f 50 5f 4d  '.  See the OP_M
8c50: 61 6b 65 49 64 78 4b 65 79 20 6f 70 63 6f 64 65  akeIdxKey opcode
8c60: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
8c70: 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  or.** additional
8c80: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53   information.  S
8c90: 65 65 20 61 6c 73 6f 20 74 68 65 20 73 71 6c 69  ee also the sqli
8ca0: 74 65 41 64 64 4b 65 79 54 79 70 65 28 29 20 72  teAddKeyType() r
8cb0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  outine..*/.void 
8cc0: 73 71 6c 69 74 65 41 64 64 49 64 78 4b 65 79 54  sqliteAddIdxKeyT
8cd0: 79 70 65 28 56 64 62 65 20 2a 76 2c 20 49 6e 64  ype(Vdbe *v, Ind
8ce0: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 63 68 61  ex *pIdx){.  cha
8cf0: 72 20 2a 7a 54 79 70 65 3b 0a 20 20 54 61 62 6c  r *zType;.  Tabl
8d00: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
8d10: 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
8d20: 49 64 78 21 3d 30 20 26 26 20 70 49 64 78 2d 3e  Idx!=0 && pIdx->
8d30: 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 70  pTable!=0 );.  p
8d40: 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
8d50: 6c 65 3b 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e  le;.  n = pIdx->
8d60: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7a 54 79 70 65  nColumn;.  zType
8d70: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
8d80: 61 77 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28  aw( n+1 );.  if(
8d90: 20 7a 54 79 70 65 3d 3d 30 20 29 20 72 65 74 75   zType==0 ) retu
8da0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
8db0: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
8dc0: 74 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61  t iCol = pIdx->a
8dd0: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
8de0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
8df0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
8e00: 6f 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ol );.    if( (p
8e10: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8e20: 73 6f 72 74 4f 72 64 65 72 20 26 20 53 51 4c 49  sortOrder & SQLI
8e30: 54 45 5f 53 4f 5f 54 59 50 45 4d 41 53 4b 29 3d  TE_SO_TYPEMASK)=
8e40: 3d 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 20  =SQLITE_SO_TEXT 
8e50: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 5b 69  ){.      zType[i
8e60: 5d 20 3d 20 27 74 27 3b 0a 20 20 20 20 7d 65 6c  ] = 't';.    }el
8e70: 73 65 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 5b  se{.      zType[
8e80: 69 5d 20 3d 20 27 6e 27 3b 0a 20 20 20 20 7d 0a  i] = 'n';.    }.
8e90: 20 20 7d 0a 20 20 7a 54 79 70 65 5b 6e 5d 20 3d    }.  zType[n] =
8ea0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65   0;.  sqliteVdbe
8eb0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
8ec0: 7a 54 79 70 65 2c 20 6e 29 3b 0a 20 20 73 71 6c  zType, n);.  sql
8ed0: 69 74 65 46 72 65 65 28 7a 54 79 70 65 29 3b 0a  iteFree(zType);.
8ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8ef0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8f00: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
8f10: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
8f20: 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
8f30: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
8f40: 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
8f50: 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
8f60: 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
8f70: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
8f80: 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
8f90: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
8fa0: 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
8fb0: 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
8fc0: 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
8fd0: 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
8fe0: 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
8ff0: 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
9000: 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
9010: 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c  .  pToCol is a l
9020: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
9030: 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54   the other.** pT
9040: 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  o table that the
9050: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69   foreign key poi
9060: 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63  nts to.  flags c
9070: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
9080: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
9090: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
90a0: 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
90b0: 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
90c0: 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
90d0: 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
90e0: 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
90f0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
9100: 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
9110: 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
9120: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
9130: 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
9140: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
9150: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
9160: 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54  wTable field.  T
9170: 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69  he new FKey.** i
9180: 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74  s not linked int
9190: 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74  o db->aFKey at t
91a0: 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74  his point - that
91b0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e   does not happen
91c0: 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65  .** until sqlite
91d0: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a  EndTable()..**.*
91e0: 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  * The foreign ke
91f0: 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d  y is set for IMM
9200: 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e  EDIATE processin
9210: 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74  g.  A subsequent
9220: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
9230: 74 65 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  teDeferForeignKe
9240: 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
9250: 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
9260: 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
9270: 65 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  eCreateForeignKe
9280: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
9290: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
92a0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
92b0: 20 20 49 64 4c 69 73 74 20 2a 70 46 72 6f 6d 43    IdList *pFromC
92c0: 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
92d0: 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
92e0: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
92f0: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
9300: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
9310: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
9320: 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
9330: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 6f 43  /.  IdList *pToC
9340: 6f 6c 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  ol,      /* Colu
9350: 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
9360: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
9370: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
9380: 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
9390: 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
93a0: 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ms. */.){.  Tabl
93b0: 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
93c0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
93d0: 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
93e0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
93f0: 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70  ar *z;.  FKey *p
9400: 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73  FKey = 0;..  ass
9410: 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
9420: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
9430: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
9440: 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
9450: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
9460: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
9470: 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
9480: 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b  iCol<0 ) goto fk
9490: 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
94a0: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
94b0: 6e 49 64 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  nId!=1 ){.      
94c0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
94d0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
94e0: 67 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  g, "foreign key 
94f0: 6f 6e 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20  on ", -1,.      
9500: 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d     p->aCol[iCol]
9510: 2e 7a 4e 61 6d 65 2c 20 2d 31 2c 20 0a 20 20 20  .zName, -1, .   
9520: 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
9530: 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
9540: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
9550: 65 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20  e ", -1,.       
9560: 20 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e    pTo->z, pTo->n
9570: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
9580: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
9590: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
95a0: 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
95b0: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
95c0: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
95d0: 3e 6e 49 64 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  >nId!=pFromCol->
95e0: 6e 49 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nId ){.    sqlit
95f0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
9600: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20  se->zErrMsg, .  
9610: 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
9620: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
9630: 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
9640: 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
9650: 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
9660: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
9670: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
9680: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
9690: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
96a0: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
96b0: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
96c0: 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 3b 0a 20 20  FromCol->nId;.  
96d0: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
96e0: 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f  of(*pFKey) + nCo
96f0: 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  l*sizeof(pFKey->
9700: 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
9710: 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
9720: 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
9730: 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 49  =0; i<pToCol->nI
9740: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  d; i++){.      n
9750: 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70  Byte += strlen(p
9760: 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
9770: 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  e) + 1;.    }.  
9780: 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69  }.  pFKey = sqli
9790: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  teMalloc( nByte 
97a0: 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
97b0: 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  0 ) goto fk_end;
97c0: 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
97d0: 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
97e0: 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
97f0: 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
9800: 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46  )&pFKey[1];.  pF
9810: 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72  Key->aCol = (str
9820: 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a  uct sColMap*)z;.
9830: 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74    z += sizeof(st
9840: 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43  ruct sColMap)*nC
9850: 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f  ol;.  pFKey->zTo
9860: 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a   = z;.  memcpy(z
9870: 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e  , pTo->z, pTo->n
9880: 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d  );.  z[pTo->n] =
9890: 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e   0;.  z += pTo->
98a0: 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  n+1;.  pFKey->pN
98b0: 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b  extTo = 0;.  pFK
98c0: 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
98d0: 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
98e0: 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
98f0: 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
9900: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
9910: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
9920: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
9930: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
9940: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
9950: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
9960: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
9970: 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a  trICmp(p->aCol[j
9980: 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f  ].zName, pFromCo
9990: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  l->a[i].zName)==
99a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
99b0: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  FKey->aCol[i].iF
99c0: 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  rom = j;.       
99d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
99e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
99f0: 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c    if( j>=p->nCol
9a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9a10: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
9a20: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75  rse->zErrMsg, "u
9a30: 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
9a40: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
9a50: 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
9a60: 6d 65 2c 20 22 5c 22 20 69 6e 20 66 6f 72 65 69  me, "\" in forei
9a70: 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
9a80: 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  n", 0);.        
9a90: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
9aa0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f          goto fk_
9ab0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
9ac0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f   }.  }.  if( pTo
9ad0: 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
9ae0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
9af0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
9b00: 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61  strlen(pToCol->a
9b10: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
9b20: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
9b30: 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20  .zCol = z;.     
9b40: 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
9b50: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
9b60: 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
9b70: 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
9b80: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
9b90: 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
9ba0: 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64   = 0;.  pFKey->d
9bb0: 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67  eleteConf = flag
9bc0: 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65  s & 0xff;.  pFKe
9bd0: 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20  y->updateConf = 
9be0: 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20  (flags >> 8 ) & 
9bf0: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  0xff;.  pFKey->i
9c00: 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61  nsertConf = (fla
9c10: 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66  gs >> 16 ) & 0xf
9c20: 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  f;..  /* Link th
9c30: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
9c40: 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
9c50: 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
9c60: 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
9c70: 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
9c80: 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
9c90: 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b  liteFree(pFKey);
9ca0: 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44  .  sqliteIdListD
9cb0: 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b  elete(pFromCol);
9cc0: 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44  .  sqliteIdListD
9cd0: 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d  elete(pToCol);.}
9ce0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
9cf0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
9d00: 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
9d10: 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
9d20: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
9d30: 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
9d40: 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
9d50: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
9d60: 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
9d70: 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
9d80: 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
9d90: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
9da0: 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
9db0: 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
9dc0: 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
9dd0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
9de0: 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
9df0: 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
9e00: 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
9e10: 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
9e20: 69 74 65 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  iteDeferForeignK
9e30: 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
9e40: 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
9e50: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
9e60: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
9e70: 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
9e80: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9e90: 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
9ea0: 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
9eb0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b   ) return;.  pFK
9ec0: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
9ed0: 20 69 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a   isDeferred;.}..
9ee0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
9ef0: 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
9f00: 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64  SQL table.  pInd
9f10: 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  ex is the name o
9f20: 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
9f30: 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74 68  and pTable is th
9f40: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
9f50: 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
9f60: 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
9f70: 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
9f80: 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
9f90: 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
9fa0: 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
9fb0: 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
9fc0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
9fd0: 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
9fe0: 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
9ff0: 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
a000: 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
a010: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
a020: 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
a030: 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
a040: 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
a050: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
a060: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
a070: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
a080: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
a090: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
a0a0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
a0b0: 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
a0c0: 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
a0d0: 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
a0e0: 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
a0f0: 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
a100: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
a110: 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
a120: 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
a130: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
a140: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
a150: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65  /.void sqliteCre
a160: 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
a170: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
a180: 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
a190: 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
a1a0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
a1b0: 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  me,    /* Name o
a1c0: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
a1d0: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
a1e0: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
a1f0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
a200: 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 20  able to index.  
a210: 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
a220: 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
a230: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  IdList *pList,  
a240: 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f   /* A list of co
a250: 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
a260: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
a270: 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f  rror,     /* OE_
a280: 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
a290: 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
a2a0: 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
a2b0: 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f  ken *pStart,   /
a2c0: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
a2d0: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61  en that begins a
a2e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
a2f0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
a300: 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a  en *pEnd      /*
a310: 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c   The ")" that cl
a320: 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20  oses the CREATE 
a330: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
a340: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
a350: 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  Tab;     /* Tabl
a360: 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
a370: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
a380: 65 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64  ex;   /* The ind
a390: 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
a3a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
a3b0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  e = 0;.  int i, 
a3c0: 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49  j;.  Token nullI
a3d0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
a3e0: 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72  * Fake token for
a3f0: 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73   an empty ID lis
a400: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64  t */.  sqlite *d
a410: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a420: 20 20 69 6e 74 20 68 69 64 65 4e 61 6d 65 20 3d    int hideName =
a430: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44   0;         /* D
a440: 6f 20 6e 6f 74 20 70 75 74 20 74 61 62 6c 65 20  o not put table 
a450: 6e 61 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68  name in the hash
a460: 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28   table */..  if(
a470: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
a480: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
a490: 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69  ailed ) goto exi
a4a0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
a4b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
a4c0: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
a4d0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
a4e0: 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
a4f0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
a500: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d  /.  if( pTable!=
a510: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
a520: 20 70 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20   pName!=0 );.   
a530: 20 70 54 61 62 20 3d 20 20 73 71 6c 69 74 65 54   pTab =  sqliteT
a540: 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  ableFromToken(pP
a550: 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20  arse, pTable);. 
a560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
a570: 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a  rt( pName==0 );.
a580: 20 20 20 20 70 54 61 62 20 3d 20 20 70 50 61 72      pTab =  pPar
a590: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
a5a0: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30   }.  if( pTab==0
a5b0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
a5c0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
a5d0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28  ate_index;.  if(
a5e0: 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
a5f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
a600: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
a610: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
a620: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
a630: 0a 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74  .      " may not
a640: 20 68 61 76 65 20 6e 65 77 20 69 6e 64 69 63 65   have new indice
a650: 73 20 61 64 64 65 64 22 2c 20 30 29 3b 0a 20 20  s added", 0);.  
a660: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
a670: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
a680: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
a690: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  }.  if( pTab->pS
a6a0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
a6b0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
a6c0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
a6d0: 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
a6e0: 20 69 6e 64 65 78 65 64 22 2c 20 30 29 3b 0a 20   indexed", 0);. 
a6f0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
a700: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  +;.    goto exit
a710: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
a720: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
a730: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
a740: 64 20 77 68 69 6c 65 20 72 65 2d 72 65 61 64 69  d while re-readi
a750: 6e 67 20 74 68 65 20 73 63 68 65 6d 61 20 66 72  ng the schema fr
a760: 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
a770: 0a 20 20 2a 2a 20 62 75 74 20 74 68 65 20 74 61  .  ** but the ta
a780: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
a790: 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 69  ith this index i
a7a0: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
a7b0: 62 6c 65 2c 20 69 74 20 63 61 6e 0a 20 20 2a 2a  ble, it can.  **
a7c0: 20 6f 6e 6c 79 20 6d 65 61 6e 20 74 68 61 74 20   only mean that 
a7d0: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 74  the table that t
a7e0: 68 69 73 20 69 6e 64 65 78 20 69 73 20 72 65 61  his index is rea
a7f0: 6c 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  lly associated w
a800: 69 74 68 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 20  ith is.  ** one 
a810: 77 68 6f 73 65 20 6e 61 6d 65 20 69 73 20 68 69  whose name is hi
a820: 64 64 65 6e 20 62 65 68 69 6e 64 20 61 20 74 65  dden behind a te
a830: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 77 69  mporary table wi
a840: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
a850: 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 69 74 73  ..  ** Since its
a860: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
a870: 73 75 70 70 72 65 73 73 65 64 2c 20 77 65 20 6e  suppressed, we n
a880: 65 65 64 20 74 6f 20 61 6c 73 6f 20 73 75 70 70  eed to also supp
a890: 72 65 73 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e  ress the.  ** in
a8a0: 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  dex..  */.  if( 
a8b0: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
a8c0: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 69 73 54   && !pParse->isT
a8d0: 65 6d 70 20 26 26 20 70 54 61 62 2d 3e 69 73 54  emp && pTab->isT
a8e0: 65 6d 70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  emp ){.    goto 
a8f0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
a900: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  x;.  }..  /*.  *
a910: 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
a920: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
a930: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
a940: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
a950: 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
a960: 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
a970: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
a980: 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
a990: 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
a9a0: 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
a9b0: 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
a9c0: 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
a9d0: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
a9e0: 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
a9f0: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
aa00: 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
aa10: 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
aa20: 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
aa30: 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
aa40: 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
aa50: 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
aa60: 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
aa70: 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
aa80: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
aa90: 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2c  cess this index,
aaa0: 20 62 75 74 20 77 65 20 77 69 6c 6c 20 6e 6f 74   but we will not
aab0: 0a 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 73 20  .  ** store its 
aac0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68  name in the hash
aad0: 20 74 61 62 6c 65 2e 20 20 53 65 74 20 74 68 65   table.  Set the
aae0: 20 68 69 64 65 4e 61 6d 65 20 66 6c 61 67 20 74   hideName flag t
aaf0: 6f 20 61 63 63 6f 6d 70 6c 69 73 68 0a 20 20 2a  o accomplish.  *
ab00: 2a 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  * this..  **.  *
ab10: 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
ab20: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
ab30: 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
ab40: 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
ab50: 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
ab60: 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
ab70: 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
ab80: 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
ab90: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
aba0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
abb0: 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
abc0: 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69  Another index wi
abd0: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
abe0: 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
abf0: 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a  TSameName;    /*
ac00: 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61   A table with sa
ac10: 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69  me name as the i
ac20: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d  ndex */.    zNam
ac30: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  e = sqliteTableN
ac40: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
ac50: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  me);.    if( zNa
ac60: 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
ac70: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
ac80: 20 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e      if( (pISameN
ac90: 61 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ame = sqliteFind
aca0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
acb0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
acc0: 28 20 70 49 53 61 6d 65 4e 61 6d 65 2d 3e 70 54  ( pISameName->pT
acd0: 61 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20  able->isTemp && 
ace0: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
acf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 68 69 64 65   ){.        hide
ad00: 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Name = 1;.      
ad10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
ad20: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
ad30: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
ad40: 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65   "index ", zName
ad50: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 20  , .           " 
ad60: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
ad70: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
ad80: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
ad90: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
ada0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
adb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
adc0: 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d  f( (pTSameName =
add0: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
ade0: 28 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20  (db, zName))!=0 
adf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 53  ){.      if( pTS
ae00: 61 6d 65 4e 61 6d 65 2d 3e 69 73 54 65 6d 70 20  ameName->isTemp 
ae10: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
ae20: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68  lag ){.        h
ae30: 69 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20  ideName = 1;.   
ae40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ae50: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
ae60: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
ae70: 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  sg, "there is al
ae80: 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
ae90: 6d 65 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20  med ",.         
aea0: 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20    zName, 0);.   
aeb0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
aec0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  r++;.        got
aed0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
aee0: 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
aef0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
af00: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
af10: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
af20: 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
af30: 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
af40: 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
af50: 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
af60: 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
af70: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
af80: 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e  "%d)",n);.    zN
af90: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
afa0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  iteSetString(&zN
afb0: 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e  ame, "(", pTab->
afc0: 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64  zName, " autoind
afd0: 65 78 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  ex ", zBuf, 0);.
afe0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
aff0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
b000: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 68  ate_index;.    h
b010: 69 64 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ideName = sqlite
b020: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
b030: 61 6d 65 29 21 3d 30 3b 0a 20 20 7d 0a 0a 20 20  ame)!=0;.  }..  
b040: 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
b050: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
b060: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
b070: 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
b080: 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
b090: 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
b0a0: 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
b0b0: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
b0c0: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
b0d0: 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
b0e0: 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
b0f0: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
b100: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
b110: 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
b120: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
b130: 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
b140: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
b150: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
b160: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
b170: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  IdListAppend(0, 
b180: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
b190: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
b1a0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
b1b0: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
b1c0: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
b1d0: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
b1e0: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
b1f0: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
b200: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
b210: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
b220: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
b240: 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d  zeof(int)*pList-
b250: 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49  >nId );.  if( pI
b260: 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  ndex==0 ) goto e
b270: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
b280: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
b290: 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
b2a0: 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65  ndex[1];.  pInde
b2b0: 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
b2c0: 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  *)&pIndex->aiCol
b2d0: 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b  umn[pList->nId];
b2e0: 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
b2f0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
b300: 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
b310: 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
b320: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
b330: 69 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64  ist->nId;.  pInd
b340: 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  ex->onError = pI
b350: 6e 64 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d  ndex->isUnique =
b360: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64   onError;.  pInd
b370: 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20  ex->autoIndex = 
b380: 70 4e 61 6d 65 3d 3d 30 3b 0a 0a 20 20 2f 2a 20  pName==0;..  /* 
b390: 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
b3a0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
b3b0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
b3c0: 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
b3d0: 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
b3e0: 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
b3f0: 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
b400: 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
b410: 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
b420: 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
b430: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ound..  */.  for
b440: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
b450: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  Id; i++){.    fo
b460: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
b470: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
b480: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
b490: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
b4a0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
b4b0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
b4c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b4d0: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
b4e0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
b4f0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
b500: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
b510: 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e  able ", pTab->zN
b520: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20  ame, .        " 
b530: 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
b540: 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b  med ", pList->a[
b550: 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  i].zName, 0);.  
b560: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
b570: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
b580: 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20  Free(pIndex);.  
b590: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
b5a0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
b5b0: 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  }.    pIndex->ai
b5c0: 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20  Column[i] = j;. 
b5d0: 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
b5e0: 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
b5f0: 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
b600: 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
b610: 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
b620: 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
b630: 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
b640: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
b650: 6c 61 69 6e 20 26 26 20 21 68 69 64 65 4e 61 6d  lain && !hideNam
b660: 65 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  e ){.    Index *
b670: 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
b680: 65 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  eHashInsert(&db-
b690: 3e 69 64 78 48 61 73 68 2c 20 70 49 6e 64 65 78  >idxHash, pIndex
b6a0: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
b6b0: 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78  zName)+1, pIndex
b6c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
b6d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
b6e0: 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
b6f0: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
b700: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
b710: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
b720: 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  x);.      goto e
b730: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
b740: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
b750: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
b760: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
b770: 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
b780: 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
b790: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
b7a0: 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
b7b0: 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
b7c0: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
b7d0: 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
b7e0: 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
b7f0: 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
b800: 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
b810: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
b820: 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
b830: 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44  operation of UPD
b840: 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53  ATE.  ** and INS
b850: 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ERT..  */.  if( 
b860: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
b870: 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
b880: 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  dex==0.       ||
b890: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
b8a0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
b8b0: 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ce){.    pIndex-
b8c0: 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
b8d0: 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d  Index;.    pTab-
b8e0: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
b8f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  ;.  }else{.    I
b900: 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
b910: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
b920: 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
b930: 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
b940: 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
b950: 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
b960: 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
b970: 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
b980: 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70   }.    pIndex->p
b990: 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
b9a0: 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72  Next;.    pOther
b9b0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
b9c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
b9d0: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31  he initFlag is 1
b9e0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
b9f0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
ba00: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
ba10: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61  qlite_master" ta
ba20: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
ba30: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74    So do not writ
ba40: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20  e to the disk.  
ba50: 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  ** again.  Extra
ba60: 63 74 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d  ct the table num
ba70: 62 65 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ber from the pPa
ba80: 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65  rse->newTnum fie
ba90: 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ld..  */.  if( p
baa0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
bab0: 26 26 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  && pTable!=0 ){.
bac0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
bad0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e   = pParse->newTn
bae0: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
baf0: 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   the initFlag is
bb00: 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
bb10: 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
bb20: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
bb30: 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
bb40: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
bb50: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
bb60: 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
bb70: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
bb80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
bb90: 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
bba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46  *.  ** The initF
bbb0: 6c 61 67 20 69 73 20 30 20 77 68 65 6e 20 74 68  lag is 0 when th
bbc0: 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
bbd0: 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
bbe0: 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
bbf0: 2e 20 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20  .  The initFlag 
bc00: 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
bc10: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
bc20: 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
bc30: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
bc40: 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
bc50: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
bc60: 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
bc70: 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
bc80: 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
bc90: 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
bca0: 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
bcb0: 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
bcc0: 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
bcd0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c  **.  ** If pTabl
bce0: 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
bcf0: 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
bd00: 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
bd10: 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
bd20: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
bd30: 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
bd40: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
bd50: 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
bd60: 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
bd70: 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
bd80: 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
bd90: 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
bda0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
bdb0: 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
bdc0: 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
bdd0: 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e  e if( pParse->in
bde0: 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20  itFlag==0 ){.   
bdf0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
be00: 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c   *v;.    int lbl
be10: 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74  1, lbl2;.    int
be20: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   i;.    int addr
be30: 3b 0a 20 20 20 20 69 6e 74 20 69 73 54 65 6d 70  ;.    int isTemp
be40: 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 3b   = pTab->isTemp;
be50: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
be60: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
be70: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
be80: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
be90: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
bea0: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
beb0: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
bec0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
bed0: 72 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b  rse, 0, isTemp);
bee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 4f 70 65  .      sqliteOpe
bef0: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
bf00: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  isTemp);.    }. 
bf10: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
bf20: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e  Op(v, OP_NewRecn
bf30: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  o, 0, 0);.    sq
bf40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
bf50: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
bf60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
bf70: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
bf80: 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41   "index", P3_STA
bf90: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
bfa0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bfb0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
bfc0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
bfd0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 6e  ngeP3(v, -1, pIn
bfe0: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  dex->zName, P3_S
bff0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
c000: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
c010: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
c020: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
c030: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
c040: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Tab->zName, P3_S
c050: 54 41 54 49 43 29 3b 0a 20 20 20 20 61 64 64 72  TATIC);.    addr
c060: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
c070: 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  Op(v, OP_CreateI
c080: 6e 64 65 78 2c 20 30 2c 20 69 73 54 65 6d 70 29  ndex, 0, isTemp)
c090: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
c0a0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
c0b0: 2c 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  , (char*)&pIndex
c0c0: 2d 3e 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54  ->tnum, P3_POINT
c0d0: 45 52 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ER);.    pIndex-
c0e0: 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69  >tnum = 0;.    i
c0f0: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
c100: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
c110: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
c120: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69   0);.      if( i
c130: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
c140: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c150: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78  (v, OP_OpenWrAux
c160: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
c170: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
c180: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c190: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
c1a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
c1b0: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
c1c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c1d0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
c1e0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  0);.    if( pSta
c1f0: 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20  rt && pEnd ){.  
c200: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
c210: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 53 74  d->z) - Addr(pSt
c220: 61 72 74 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20  art->z) + 1;.   
c230: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
c240: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
c250: 53 74 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20  Start->z, n);.  
c260: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
c270: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
c280: 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b  keRecord, 5, 0);
c290: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
c2a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
c2b0: 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tKey, 0, 0);.   
c2c0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
c2d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
c2e0: 64 64 4f 70 28 76 2c 20 69 73 54 65 6d 70 20 3f  ddOp(v, isTemp ?
c2f0: 20 4f 50 5f 4f 70 65 6e 41 75 78 20 3a 20 4f 50   OP_OpenAux : OP
c300: 5f 4f 70 65 6e 2c 20 32 2c 20 70 54 61 62 2d 3e  _Open, 2, pTab->
c310: 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  tnum);.      sql
c320: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
c330: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
c340: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
c350: 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c        lbl2 = sql
c360: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
c370: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
c380: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c390: 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c 32  _Rewind, 2, lbl2
c3a0: 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20  );.      lbl1 = 
c3b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
c3c0: 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 32 2c 20  v, OP_Recno, 2, 
c3d0: 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
c3e0: 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
c3f0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
c400: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c410: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
c420: 2c 20 32 2c 20 70 49 6e 64 65 78 2d 3e 61 69 43  , 2, pIndex->aiC
c430: 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20 20  olumn[i]);.     
c440: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
c450: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
c460: 61 6b 65 49 64 78 4b 65 79 2c 20 70 49 6e 64 65  akeIdxKey, pInde
c470: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  x->nColumn, 0);.
c480: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 66 69        if( db->fi
c490: 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 20 73  le_format>=4 ) s
c4a0: 71 6c 69 74 65 41 64 64 49 64 78 4b 65 79 54 79  qliteAddIdxKeyTy
c4b0: 70 65 28 76 2c 20 70 49 6e 64 65 78 29 3b 0a 20  pe(v, pIndex);. 
c4c0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
c4d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 50 75  ddOp(v, OP_IdxPu
c4e0: 74 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e  t, 1, pIndex->on
c4f0: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 29 3b  Error!=OE_None);
c500: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
c510: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
c520: 74 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  t, 2, lbl1);.   
c530: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
c540: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
c550: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
c560: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c570: 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20  Close, 2, 0);.  
c580: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c590: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
c5a0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
c5b0: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
c5c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  ){.      if( !is
c5d0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
c5e0: 73 71 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b  sqliteChangeCook
c5f0: 69 65 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 20  ie(db, v);.     
c600: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56   }.      sqliteV
c610: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
c620: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
c630: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
c640: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
c650: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
c660: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
c670: 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
c680: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
c690: 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74  :.  sqliteIdList
c6a0: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
c6b0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
c6c0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
c6d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
c6e0: 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
c6f0: 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
c700: 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
c710: 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
c720: 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
c730: 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
c740: 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 49  void sqliteDropI
c750: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
c760: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
c770: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
c780: 65 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ex;.  char *zNam
c790: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
c7a0: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
c7b0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
c7c0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
c7d0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
c7e0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
c7f0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54   zName = sqliteT
c800: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
c810: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
c820: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
c830: 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  n;.  pIndex = sq
c840: 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62  liteFindIndex(db
c850: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
c860: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
c870: 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
c880: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
c890: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
c8a0: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
c8b0: 68 20 69 6e 64 65 78 3a 20 22 2c 20 30 2c 20 0a  h index: ", 0, .
c8c0: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a          pName->z
c8d0: 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a  , pName->n, 0);.
c8e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
c8f0: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
c900: 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
c910: 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20  ->autoIndex ){. 
c920: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
c930: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
c940: 4d 73 67 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  Msg, "index asso
c950: 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
c960: 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
c970: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
c980: 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
c990: 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
c9a0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
c9b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
c9c0: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
c9d0: 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
c9e0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
c9f0: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
ca00: 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
ca10: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
ca20: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
ca30: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
ca40: 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b   dropIndex[] = {
ca50: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
ca60: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
ca70: 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20 7b  9), 0}, .      {
ca80: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
ca90: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
caa0: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
cab0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31  OP_MemStore,   1
cac0: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
cad0: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
cae0: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
caf0: 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
cb00: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
cb10: 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20       0, 1,      
cb20: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
cb30: 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
cb40: 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(8), 0},.    
cb50: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
cb60: 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 30     0, ADDR(3), 0
cb70: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  },.      { OP_Go
cb80: 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  to,       0, ADD
cb90: 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(9), 0},.      
cba0: 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
cbb0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
cbc0: 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a   /* 8 */.    };.
cbd0: 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20      int base;.  
cbe0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
cbf0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
cc00: 0a 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e  .    sqliteBegin
cc10: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
cc20: 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e  Parse, 0, pTab->
cc30: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  isTemp);.    sql
cc40: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
cc50: 6c 65 28 76 2c 20 70 54 61 62 2d 3e 69 73 54 65  le(v, pTab->isTe
cc60: 6d 70 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20  mp);.    base = 
cc70: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
cc80: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
cc90: 28 64 72 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f  (dropIndex), dro
cca0: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c  pIndex);.    sql
ccb0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
ccc0: 76 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e 64 65  v, base+1, pInde
ccd0: 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
cce0: 20 20 69 66 28 20 21 70 54 61 62 2d 3e 69 73 54    if( !pTab->isT
ccf0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  emp ){.      sql
cd00: 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  iteChangeCookie(
cd10: 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20  db, v);.    }.  
cd20: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
cd30: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
cd40: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
cd50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cd60: 44 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d  Destroy, pIndex-
cd70: 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 73 54  >tnum, pTab->isT
cd80: 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
cd90: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
cda0: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a  n(pParse);.  }..
cdb0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
cdc0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69  in-memory descri
cdd0: 70 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 69 6e  ption of this in
cde0: 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  dex..  */.  if( 
cdf0: 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
ce00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e   ){.    sqliteUn
ce10: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
ce20: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
ce30: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
ce40: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
ce50: 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  anges;.  }.}../*
ce60: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
ce70: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
ce80: 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
ce90: 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
cea0: 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
ceb0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
cec0: 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
ced0: 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
cee0: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
cef0: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 49 64  IdList *sqliteId
cf00: 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73  ListAppend(IdLis
cf10: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
cf20: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20  *pToken){.  if( 
cf30: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
cf40: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pList = sqliteMa
cf50: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c  lloc( sizeof(IdL
cf60: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
cf70: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
cf80: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  n 0;.  }.  if( (
cf90: 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37 29 3d  pList->nId & 7)=
cfa0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
cfb0: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b   IdList_item *a;
cfc0: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52  .    a = sqliteR
cfd0: 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
cfe0: 20 28 70 4c 69 73 74 2d 3e 6e 49 64 2b 38 29 2a   (pList->nId+8)*
cff0: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
d000: 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61  0]) );.    if( a
d010: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
d020: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
d030: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
d040: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
d050: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
d060: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c    }.  memset(&pL
d070: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49  ist->a[pList->nI
d080: 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  d], 0, sizeof(pL
d090: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69  ist->a[0]));.  i
d0a0: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
d0b0: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c   char **pz = &pL
d0c0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49  ist->a[pList->nI
d0d0: 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71  d].zName;.    sq
d0e0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70  liteSetNString(p
d0f0: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  z, pToken->z, pT
d100: 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  oken->n, 0);.   
d110: 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20   if( *pz==0 ){. 
d120: 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c 69 73       sqliteIdLis
d130: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
d140: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
d150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d160: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a   sqliteDequote(*
d170: 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pz);.    }.  }. 
d180: 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20   pList->nId++;. 
d190: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
d1a0: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
d1b0: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
d1c0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63  to the given Src
d1d0: 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
d1e0: 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a  new SrcList if.*
d1f0: 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65  * need be.  A ne
d200: 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74  w entry is creat
d210: 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ed in the SrcLis
d220: 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e  t even if pToken
d230: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
d240: 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73  A new SrcList is
d250: 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
d260: 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
d270: 61 69 6c 73 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  ails..*/.SrcList
d280: 20 2a 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41   *sqliteSrcListA
d290: 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70  ppend(SrcList *p
d2a0: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
d2b0: 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
d2c0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
d2d0: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
d2e0: 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  ( sizeof(IdList)
d2f0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
d300: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
d310: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73  .  }.  if( (pLis
d320: 74 2d 3e 6e 53 72 63 20 26 20 37 29 3d 3d 30 20  t->nSrc & 7)==0 
d330: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
d340: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  cList_item *a;. 
d350: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61     a = sqliteRea
d360: 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28  lloc(pList->a, (
d370: 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 38 29 2a 73  pList->nSrc+8)*s
d380: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
d390: 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d  ]) );.    if( a=
d3a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
d3b0: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
d3c0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
d3d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
d3e0: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
d3f0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c    }.  memset(&pL
d400: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
d410: 72 63 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  rc], 0, sizeof(p
d420: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
d430: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
d440: 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
d450: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
d460: 53 72 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Src].zName;.    
d470: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
d480: 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  (pz, pToken->z, 
d490: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
d4a0: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
d4b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63  .      sqliteSrc
d4c0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
d4d0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d4e0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
d4f0: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
d500: 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  e(*pz);.    }.  
d510: 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b  }.  pList->nSrc+
d520: 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  +;.  return pLis
d530: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  t;.}../*.** Add 
d540: 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20  an alias to the 
d550: 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20  last identifier 
d560: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65  on the given ide
d570: 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f  ntifier list..*/
d580: 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c  .void sqliteSrcL
d590: 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c  istAddAlias(SrcL
d5a0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
d5b0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
d5c0: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
d5d0: 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ->nSrc>0 ){.    
d5e0: 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e  int i = pList->n
d5f0: 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c  Src - 1;.    sql
d600: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
d610: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
d620: 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  s, pToken->z, pT
d630: 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  oken->n, 0);.   
d640: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 70   sqliteDequote(p
d650: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
d660: 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  s);.  }.}../*.**
d670: 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73   Delete an IdLis
d680: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d690: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  eIdListDelete(Id
d6a0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
d6b0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
d6c0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
d6d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
d6e0: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
d6f0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
d700: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
d710: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
d720: 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
d730: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
d740: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
d750: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
d760: 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
d770: 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
d780: 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
d790: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
d7a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49 64 4c 69  /.int sqliteIdLi
d7b0: 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
d7c0: 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
d7d0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
d7e0: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
d7f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
d800: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
d810: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
d820: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
d830: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
d840: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
d850: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
d860: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
d870: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
d880: 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74  n entire SrcList
d890: 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69   including all i
d8a0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e  ts substructure.
d8b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53  .*/.void sqliteS
d8c0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63  rcListDelete(Src
d8d0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
d8e0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
d8f0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
d900: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
d910: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
d920: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
d930: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
d940: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
d950: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  e(pList->a[i].zA
d960: 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
d970: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
d980: 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  && pList->a[i].p
d990: 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
d9a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d9b0: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
d9c0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29  List->a[i].pTab)
d9d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
d9e0: 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  teSelectDelete(p
d9f0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
da00: 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  ct);.    sqliteE
da10: 78 70 72 44 65 6c 65 74 65 28 70 4c 69 73 74 2d  xprDelete(pList-
da20: 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20  >a[i].pOn);.    
da30: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
da40: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  te(pList->a[i].p
da50: 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71  Using);.  }.  sq
da60: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
da70: 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
da80: 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
da90: 2a 20 54 68 65 20 43 4f 50 59 20 63 6f 6d 6d 61  * The COPY comma
daa0: 6e 64 20 69 73 20 66 6f 72 20 63 6f 6d 70 61 74  nd is for compat
dab0: 69 62 69 6c 69 74 79 20 77 69 74 68 20 50 6f 73  ibility with Pos
dac0: 74 67 72 65 53 51 4c 20 61 6e 64 20 73 70 65 63  tgreSQL and spec
dad0: 69 66 69 63 69 61 6c 6c 79 0a 2a 2a 20 66 6f 72  ificially.** for
dae0: 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20   the ability to 
daf0: 72 65 61 64 20 74 68 65 20 6f 75 74 70 75 74 20  read the output 
db00: 6f 66 20 70 67 5f 64 75 6d 70 2e 20 20 54 68 65  of pg_dump.  The
db10: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 0a 2a 2a   format is as.**
db20: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
db30: 20 20 20 43 4f 50 59 20 74 61 62 6c 65 20 46 52     COPY table FR
db40: 4f 4d 20 66 69 6c 65 20 5b 55 53 49 4e 47 20 44  OM file [USING D
db50: 45 4c 49 4d 49 54 45 52 53 20 73 74 72 69 6e 67  ELIMITERS string
db60: 5d 0a 2a 2a 0a 2a 2a 20 22 74 61 62 6c 65 22 20  ].**.** "table" 
db70: 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74  is an existing t
db80: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 57 65 20 77  able name.  We w
db90: 69 6c 6c 20 72 65 61 64 20 6c 69 6e 65 73 20 6f  ill read lines o
dba0: 66 20 63 6f 64 65 20 66 72 6f 6d 0a 2a 2a 20 66  f code from.** f
dbb0: 69 6c 65 20 74 6f 20 66 69 6c 6c 20 74 68 69 73  ile to fill this
dbc0: 20 74 61 62 6c 65 20 77 69 74 68 20 64 61 74 61   table with data
dbd0: 2e 20 20 46 69 6c 65 20 6d 69 67 68 74 20 62 65  .  File might be
dbe0: 20 22 73 74 64 69 6e 22 2e 20 20 54 68 65 20 6f   "stdin".  The o
dbf0: 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 65 6c 69 6d  ptional.** delim
dc00: 69 74 65 72 20 73 74 72 69 6e 67 20 69 64 65 6e  iter string iden
dc10: 74 69 66 69 65 73 20 74 68 65 20 66 69 65 6c 64  tifies the field
dc20: 20 73 65 70 61 72 61 74 6f 72 73 2e 20 20 54 68   separators.  Th
dc30: 65 20 64 65 66 61 75 6c 74 20 69 73 20 61 20 74  e default is a t
dc40: 61 62 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ab..*/.void sqli
dc50: 74 65 43 6f 70 79 28 0a 20 20 50 61 72 73 65 20  teCopy(.  Parse 
dc60: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
dc70: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
dc80: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
dc90: 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 2f  *pTableName,   /
dca0: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
dcb0: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  e table into whi
dcc0: 63 68 20 77 65 20 77 69 6c 6c 20 69 6e 73 65 72  ch we will inser
dcd0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 46  t */.  Token *pF
dce0: 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 54  ilename,    /* T
dcf0: 68 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69  he file from whi
dd00: 63 68 20 74 6f 20 6f 62 74 61 69 6e 20 69 6e 66  ch to obtain inf
dd10: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  ormation */.  To
dd20: 6b 65 6e 20 2a 70 44 65 6c 69 6d 69 74 65 72 2c  ken *pDelimiter,
dd30: 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 61     /* Use this a
dd40: 73 20 74 68 65 20 66 69 65 6c 64 20 64 65 6c 69  s the field deli
dd50: 6d 69 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  miter */.  int o
dd60: 6e 45 72 72 6f 72 20 20 20 20 20 20 20 20 20 20  nError          
dd70: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 69 66  /* What to do if
dd80: 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61   a constraint fa
dd90: 69 6c 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ils */.){.  Tabl
dda0: 65 20 2a 70 54 61 62 3b 0a 20 20 63 68 61 72 20  e *pTab;.  char 
ddb0: 2a 7a 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  *zTab;.  int i;.
ddc0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
ddd0: 20 61 64 64 72 2c 20 65 6e 64 3b 0a 20 20 49 6e   addr, end;.  In
dde0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 73 71 6c  dex *pIdx;.  sql
ddf0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
de00: 2d 3e 64 62 3b 0a 0a 20 20 7a 54 61 62 20 3d 20  ->db;..  zTab = 
de10: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
de20: 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e  romToken(pTableN
de30: 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ame);.  if( sqli
de40: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
de50: 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 67 6f   || zTab==0 ) go
de60: 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b  to copy_cleanup;
de70: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
de80: 54 61 62 6c 65 4e 61 6d 65 54 6f 54 61 62 6c 65  TableNameToTable
de90: 28 70 50 61 72 73 65 2c 20 7a 54 61 62 29 3b 0a  (pParse, zTab);.
dea0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61    sqliteFree(zTa
deb0: 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  b);.  if( pTab==
dec0: 30 20 29 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c  0 ) goto copy_cl
ded0: 65 61 6e 75 70 3b 0a 20 20 76 20 3d 20 73 71 6c  eanup;.  v = sql
dee0: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
def0: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
df00: 20 20 20 69 6e 74 20 6f 70 65 6e 4f 70 3b 0a 20     int openOp;. 
df10: 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72     sqliteBeginWr
df20: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
df30: 72 73 65 2c 20 31 2c 20 70 54 61 62 2d 3e 69 73  rse, 1, pTab->is
df40: 54 65 6d 70 29 3b 0a 20 20 20 20 61 64 64 72 20  Temp);.    addr 
df50: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
df60: 70 28 76 2c 20 4f 50 5f 46 69 6c 65 4f 70 65 6e  p(v, OP_FileOpen
df70: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
df80: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
df90: 76 2c 20 61 64 64 72 2c 20 70 46 69 6c 65 6e 61  v, addr, pFilena
dfa0: 6d 65 2d 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d 65  me->z, pFilename
dfb0: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
dfc0: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
dfd0: 20 61 64 64 72 29 3b 0a 20 20 20 20 6f 70 65 6e   addr);.    open
dfe0: 4f 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d  Op = pTab->isTem
dff0: 70 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78  p ? OP_OpenWrAux
e000: 20 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b   : OP_OpenWrite;
e010: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
e020: 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20  ddOp(v, openOp, 
e030: 30 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a  0, pTab->tnum);.
e040: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
e050: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
e060: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ab->zName, P3_ST
e070: 41 54 49 43 29 3b 0a 20 20 20 20 66 6f 72 28 69  ATIC);.    for(i
e080: 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =1, pIdx=pTab->p
e090: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
e0a0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69  x=pIdx->pNext, i
e0b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
e0c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
e0d0: 65 6e 4f 70 2c 20 69 2c 20 70 49 64 78 2d 3e 74  enOp, i, pIdx->t
e0e0: 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  num);.      sqli
e0f0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
e100: 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  , -1, pIdx->zNam
e110: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
e120: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
e130: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
e140: 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20  CountRows ){.   
e150: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
e160: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
e170: 2c 20 30 2c 20 30 29 3b 20 20 2f 2a 20 49 6e 69  , 0, 0);  /* Ini
e180: 74 69 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 20  tialize the row 
e190: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20  count */.    }. 
e1a0: 20 20 20 65 6e 64 20 3d 20 73 71 6c 69 74 65 56     end = sqliteV
e1b0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
e1c0: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
e1d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e1e0: 50 5f 46 69 6c 65 52 65 61 64 2c 20 70 54 61 62  P_FileRead, pTab
e1f0: 2d 3e 6e 43 6f 6c 2c 20 65 6e 64 29 3b 0a 20 20  ->nCol, end);.  
e200: 20 20 69 66 28 20 70 44 65 6c 69 6d 69 74 65 72    if( pDelimiter
e210: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e220: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
e230: 61 64 64 72 2c 20 70 44 65 6c 69 6d 69 74 65 72  addr, pDelimiter
e240: 2d 3e 7a 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d  ->z, pDelimiter-
e250: 3e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >n);.      sqlit
e260: 65 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76  eVdbeDequoteP3(v
e270: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c  , addr);.    }el
e280: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
e290: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
e2a0: 61 64 64 72 2c 20 22 5c 74 22 2c 20 31 29 3b 0a  addr, "\t", 1);.
e2b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
e2c0: 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a  ab->iPKey>=0 ){.
e2d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
e2e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65  AddOp(v, OP_File
e2f0: 43 6f 6c 75 6d 6e 2c 20 70 54 61 62 2d 3e 69 50  Column, pTab->iP
e300: 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  Key, 0);.      s
e310: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
e320: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
e330: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0, 0);.    }else
e340: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
e350: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
e360: 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20  wRecno, 0, 0);. 
e370: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
e380: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
e390: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e3a0: 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  i==pTab->iPKey )
e3b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
e3c0: 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79   integer primary
e3d0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20 66   key column is f
e3e0: 69 6c 6c 65 64 20 77 69 74 68 20 4e 55 4c 4c 20  illed with NULL 
e3f0: 73 69 6e 63 65 20 69 74 73 0a 20 20 20 20 20 20  since its.      
e400: 20 20 2a 2a 20 76 61 6c 75 65 20 69 73 20 61 6c    ** value is al
e410: 77 61 79 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  ways pulled from
e420: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
e430: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  er */.        sq
e440: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
e450: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
e460: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
e480: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69  beAddOp(v, OP_Fi
e490: 6c 65 43 6f 6c 75 6d 6e 2c 20 69 2c 20 30 29 3b  leColumn, i, 0);
e4a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e4b0: 20 20 20 73 71 6c 69 74 65 47 65 6e 65 72 61 74     sqliteGenerat
e4c0: 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b  eConstraintCheck
e4d0: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  s(pParse, pTab, 
e4e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 6f 6e 45 72  0, 0, 0, 0, onEr
e4f0: 72 6f 72 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  ror, addr);.    
e500: 73 71 6c 69 74 65 43 6f 6d 70 6c 65 74 65 49 6e  sqliteCompleteIn
e510: 73 65 72 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  sertion(pParse, 
e520: 70 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 30  pTab, 0, 0, 0, 0
e530: 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e  );.    if( (db->
e540: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
e550: 6f 75 6e 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a  ountRows)!=0 ){.
e560: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
e570: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
e580: 6d 6d 2c 20 31 2c 20 30 29 3b 20 20 2f 2a 20 49  mm, 1, 0);  /* I
e590: 6e 63 72 65 6d 65 6e 74 20 72 6f 77 20 63 6f 75  ncrement row cou
e5a0: 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  nt */.    }.    
e5b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e5c0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
e5d0: 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ddr);.    sqlite
e5e0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
e5f0: 28 76 2c 20 65 6e 64 29 3b 0a 20 20 20 20 73 71  (v, end);.    sq
e600: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
e610: 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b   OP_Noop, 0, 0);
e620: 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72  .    sqliteEndWr
e630: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
e640: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62  rse);.    if( db
e650: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
e660: 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20  _CountRows ){.  
e670: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
e680: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
e690: 43 6f 75 6e 74 2c 20 31 2c 20 30 29 3b 0a 20 20  Count, 1, 0);.  
e6a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
e6b0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
e6c0: 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Name, 0, 0);.   
e6d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
e6e0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 72 6f  ngeP3(v, -1, "ro
e6f0: 77 73 20 69 6e 73 65 72 74 65 64 22 2c 20 50 33  ws inserted", P3
e700: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
e710: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e720: 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20  v, OP_Callback, 
e730: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  1, 0);.    }.  }
e740: 0a 20 20 0a 63 6f 70 79 5f 63 6c 65 61 6e 75 70  .  .copy_cleanup
e750: 3a 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  :.  return;.}../
e760: 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6e 2d 73 74 61  *.** The non-sta
e770: 6e 64 61 72 64 20 56 41 43 55 55 4d 20 63 6f 6d  ndard VACUUM com
e780: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20  mand is used to 
e790: 63 6c 65 61 6e 20 75 70 20 74 68 65 20 64 61 74  clean up the dat
e7a0: 61 62 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70  abase,.** collap
e7b0: 73 65 20 66 72 65 65 20 73 70 61 63 65 2c 20 65  se free space, e
e7c0: 74 63 2e 20 20 49 74 20 69 73 20 6d 6f 64 65 6c  tc.  It is model
e7d0: 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 56 41  led after the VA
e7e0: 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  CUUM command.** 
e7f0: 69 6e 20 50 6f 73 74 67 72 65 53 51 4c 2e 0a 2a  in PostgreSQL..*
e800: 2a 0a 2a 2a 20 49 6e 20 76 65 72 73 69 6f 6e 20  *.** In version 
e810: 31 2e 30 2e 78 20 6f 66 20 53 51 4c 69 74 65 2c  1.0.x of SQLite,
e820: 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d   the VACUUM comm
e830: 61 6e 64 20 77 6f 75 6c 64 20 63 61 6c 6c 0a 2a  and would call.*
e840: 2a 20 67 64 62 6d 5f 72 65 6f 72 67 61 6e 69 7a  * gdbm_reorganiz
e850: 65 28 29 20 6f 6e 20 61 6c 6c 20 74 68 65 20 64  e() on all the d
e860: 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 2e 20  atabase tables. 
e870: 20 42 75 74 20 62 65 67 69 6e 6e 69 6e 67 0a 2a   But beginning.*
e880: 2a 20 77 69 74 68 20 32 2e 30 2e 30 2c 20 53 51  * with 2.0.0, SQ
e890: 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75  Lite no longer u
e8a0: 73 65 73 20 47 44 42 4d 20 73 6f 20 74 68 69 73  ses GDBM so this
e8b0: 20 63 6f 6d 6d 61 6e 64 20 68 61 73 0a 2a 2a 20   command has.** 
e8c0: 62 65 63 6f 6d 65 20 61 20 6e 6f 2d 6f 70 2e 0a  become a no-op..
e8d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 61  */.void sqliteVa
e8e0: 63 75 75 6d 28 50 61 72 73 65 20 2a 70 50 61 72  cuum(Parse *pPar
e8f0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  se, Token *pTabl
e900: 65 4e 61 6d 65 29 7b 0a 20 20 2f 2a 20 44 6f 20  eName){.  /* Do 
e910: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a  nothing */.}../*
e920: 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e  .** Begin a tran
e930: 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
e940: 73 71 6c 69 74 65 42 65 67 69 6e 54 72 61 6e 73  sqliteBeginTrans
e950: 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
e960: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
e970: 72 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  r){.  sqlite *db
e980: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
e990: 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
e9a0: 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
e9b0: 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBe==0 ) return;
e9c0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
e9d0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
e9e0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
e9f0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  turn;.  if( db->
ea00: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
ea10: 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 70 50  nTrans ){.    pP
ea20: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
ea30: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
ea40: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
ea50: 73 67 2c 20 22 63 61 6e 6e 6f 74 20 73 74 61 72  sg, "cannot star
ea60: 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
ea70: 22 0a 20 20 20 20 20 20 20 22 77 69 74 68 69 6e  ".       "within
ea80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c   a transaction",
ea90: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
eaa0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 42 65 67  .  }.  sqliteBeg
eab0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
eac0: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a  (pParse, 0, 0);.
ead0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
eae0: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
eaf0: 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f   db->onError = o
eb00: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
eb10: 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
eb20: 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
eb30: 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61  liteCommitTransa
eb40: 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
eb50: 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  rse){.  sqlite *
eb60: 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
eb70: 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
eb80: 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
eb90: 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72  ->pBe==0 ) retur
eba0: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
ebb0: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
ebc0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
ebd0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64  return;.  if( (d
ebe0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
ebf0: 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b  E_InTrans)==0 ){
ec00: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
ec10: 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  r++;.    sqliteS
ec20: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
ec30: 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20  ->zErrMsg, .    
ec40: 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69     "cannot commi
ec50: 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69  t - no transacti
ec60: 6f 6e 20 69 73 20 61 63 74 69 76 65 22 2c 20 30  on is active", 0
ec70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
ec80: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26   }.  db->flags &
ec90: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e  = ~SQLITE_InTran
eca0: 73 3b 0a 20 20 73 71 6c 69 74 65 45 6e 64 57 72  s;.  sqliteEndWr
ecb0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
ecc0: 72 73 65 29 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72  rse);.  db->onEr
ecd0: 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74  ror = OE_Default
ece0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
ecf0: 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
ed00: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
ed10: 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
ed20: 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
ed30: 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
ed40: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
ed50: 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
ed60: 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
ed70: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d  ==0 || db->pBe==
ed80: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
ed90: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
eda0: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
edb0: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
edc0: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
edd0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
ede0: 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  ns)==0 ){.    pP
edf0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
ee00: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
ee10: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
ee20: 73 67 2c 0a 20 20 20 20 20 20 20 22 63 61 6e 6e  sg,.       "cann
ee30: 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f  ot rollback - no
ee40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
ee50: 61 63 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20  active", 0);.   
ee60: 20 72 65 74 75 72 6e 3b 20 0a 20 20 7d 0a 20 20   return; .  }.  
ee70: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
ee80: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
ee90: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
eea0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
eeb0: 52 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b  Rollback, 0, 0);
eec0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
eed0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72   &= ~SQLITE_InTr
eee0: 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72  ans;.  db->onErr
eef0: 6f 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b  or = OE_Default;
ef00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
ef10: 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
ef20: 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
ef30: 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
ef40: 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
ef50: 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
ef60: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
ef70: 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
ef80: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
ef90: 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
efa0: 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
efb0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
efc0: 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
efd0: 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
efe0: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
eff0: 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
f000: 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 43   set if the setC
f010: 68 65 63 6b 70 6f 69 6e 74 20 70 61 72 61 6d 65  heckpoint parame
f020: 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20  ter is true.  A 
f030: 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
f040: 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20  d.** be set for 
f050: 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20  operations that 
f060: 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20  might fail (due 
f070: 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29  to a constraint)
f080: 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
f090: 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20  way through and 
f0a0: 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20  which will need 
f0b0: 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69  to undo some wri
f0c0: 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69  tes without havi
f0d0: 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63  ng to.** rollbac
f0e0: 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  k the whole tran
f0f0: 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70  saction.  For op
f100: 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61  erations where a
f110: 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ll constraints.*
f120: 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64  * can be checked
f130: 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
f140: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
f150: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74  the database, it
f160: 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63   is never.** nec
f170: 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61  essary to undo a
f180: 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63   write and the c
f190: 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
f1a0: 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a   not be set..**.
f1b0: 2a 2a 20 54 68 65 20 74 65 6d 70 4f 6e 6c 79 20  ** The tempOnly 
f1c0: 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
f1d0: 68 61 74 20 6f 6e 6c 79 20 74 65 6d 70 6f 72 61  hat only tempora
f1e0: 72 79 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62  ry tables will b
f1f0: 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 64 75 72  e changed.** dur
f200: 69 6e 67 20 74 68 69 73 20 77 72 69 74 65 20 6f  ing this write o
f210: 70 65 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  peration.  The p
f220: 72 69 6d 61 72 79 20 64 61 74 61 62 61 73 65 20  rimary database 
f230: 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  table is not.** 
f240: 77 72 69 74 65 2d 6c 6f 63 6b 65 64 2e 20 20 4f  write-locked.  O
f250: 6e 6c 79 20 74 68 65 20 74 65 6d 70 6f 72 61 72  nly the temporar
f260: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
f270: 67 65 74 73 20 61 20 77 72 69 74 65 20 6c 6f 63  gets a write loc
f280: 6b 2e 0a 2a 2a 20 4f 74 68 65 72 20 70 72 6f 63  k..** Other proc
f290: 65 73 73 65 73 20 63 61 6e 20 63 6f 6e 74 69 6e  esses can contin
f2a0: 75 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ue to read or wr
f2b0: 69 74 65 20 74 68 65 20 70 72 69 6d 61 72 79 20  ite the primary 
f2c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
f2d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42 65 67  /.void sqliteBeg
f2e0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
f2f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
f300: 69 6e 74 20 73 65 74 43 68 65 63 6b 70 6f 69 6e  int setCheckpoin
f310: 74 2c 20 69 6e 74 20 74 65 6d 70 4f 6e 6c 79 29  t, int tempOnly)
f320: 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76  {.  Vdbe *v;.  v
f330: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
f340: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
f350: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
f360: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 74 72 69   if( pParse->tri
f370: 67 53 74 61 63 6b 20 29 20 72 65 74 75 72 6e 3b  gStack ) return;
f380: 20 2f 2a 20 69 66 20 74 68 69 73 20 69 73 20 69   /* if this is i
f390: 6e 20 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20  n a trigger */. 
f3a0: 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62   if( (pParse->db
f3b0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
f3c0: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a  _InTrans)==0 ){.
f3d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
f3e0: 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
f3f0: 63 74 69 6f 6e 2c 20 74 65 6d 70 4f 6e 6c 79 2c  ction, tempOnly,
f400: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 74 65   0);.    if( !te
f410: 6d 70 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  mpOnly ){.      
f420: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
f430: 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  v, OP_VerifyCook
f440: 69 65 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  ie, pParse->db->
f450: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20 30  schema_cookie, 0
f460: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
f470: 3e 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20  >schemaVerified 
f480: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
f490: 73 65 20 69 66 28 20 73 65 74 43 68 65 63 6b 70  se if( setCheckp
f4a0: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  oint ){.    sqli
f4b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f4c0: 50 5f 43 68 65 63 6b 70 6f 69 6e 74 2c 20 30 2c  P_Checkpoint, 0,
f4d0: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
f4e0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f4f0: 74 68 61 74 20 63 6f 6e 63 6c 75 64 65 73 20 61  that concludes a
f500: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
f510: 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
f520: 64 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  d.** the databas
f530: 65 2e 20 20 54 68 69 73 20 69 73 20 61 20 63 6f  e.  This is a co
f540: 6d 70 61 6e 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  mpanion function
f550: 20 74 6f 20 42 65 67 69 6e 57 72 69 74 65 4f 70   to BeginWriteOp
f560: 65 72 61 74 69 6f 6e 28 29 2e 0a 2a 2a 20 49 66  eration()..** If
f570: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
f580: 61 73 20 73 74 61 72 74 65 64 2c 20 74 68 65 6e  as started, then
f590: 20 63 6f 6d 6d 69 74 20 69 74 2e 20 20 49 66 20   commit it.  If 
f5a0: 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 77 61 73  a checkpoint was
f5b0: 0a 2a 2a 20 73 74 61 72 74 65 64 20 74 68 65 6e  .** started then
f5c0: 20 63 6f 6d 6d 69 74 20 74 68 61 74 2e 0a 2a 2f   commit that..*/
f5d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 57  .void sqliteEndW
f5e0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
f5f0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
f600: 56 64 62 65 20 2a 76 3b 0a 20 20 69 66 28 20 70  Vdbe *v;.  if( p
f610: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
f620: 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66   ) return; /* if
f630: 20 74 68 69 73 20 69 73 20 69 6e 20 61 20 74 72   this is in a tr
f640: 69 67 67 65 72 20 2a 2f 0a 20 20 76 20 3d 20 73  igger */.  v = s
f650: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
f660: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
f670: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
f680: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
f690: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
f6a0: 61 6e 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ans ){.    /* Do
f6b0: 20 4e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65   Nothing */.  }e
f6c0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  lse{.    sqliteV
f6d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
f6e0: 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 20 20  ommit, 0, 0);.  
f6f0: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  }.}.../*.** Inte
f700: 72 70 72 65 74 20 74 68 65 20 67 69 76 65 6e 20  rpret the given 
f710: 73 74 72 69 6e 67 20 61 73 20 61 20 62 6f 6f 6c  string as a bool
f720: 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  ean value..*/.st
f730: 61 74 69 63 20 69 6e 74 20 67 65 74 42 6f 6f 6c  atic int getBool
f740: 65 61 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ean(char *z){.  
f750: 73 74 61 74 69 63 20 63 68 61 72 20 2a 61 7a 54  static char *azT
f760: 72 75 65 5b 5d 20 3d 20 7b 20 22 79 65 73 22 2c  rue[] = { "yes",
f770: 20 22 6f 6e 22 2c 20 22 74 72 75 65 22 20 7d 3b   "on", "true" };
f780: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
f790: 7a 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  z[0]==0 ) return
f7a0: 20 30 3b 0a 20 20 69 66 28 20 69 73 64 69 67 69   0;.  if( isdigi
f7b0: 74 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b 30 5d  t(z[0]) || (z[0]
f7c0: 3d 3d 27 2d 27 20 26 26 20 69 73 64 69 67 69 74  =='-' && isdigit
f7d0: 28 7a 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 72  (z[1])) ){.    r
f7e0: 65 74 75 72 6e 20 61 74 6f 69 28 7a 29 3b 0a 20  eturn atoi(z);. 
f7f0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
f800: 73 69 7a 65 6f 66 28 61 7a 54 72 75 65 29 2f 73  sizeof(azTrue)/s
f810: 69 7a 65 6f 66 28 61 7a 54 72 75 65 5b 30 5d 29  izeof(azTrue[0])
f820: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
f830: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c  sqliteStrICmp(z,
f840: 61 7a 54 72 75 65 5b 69 5d 29 3d 3d 30 20 29 20  azTrue[i])==0 ) 
f850: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
f860: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
f870: 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 70 72 61  ** Process a pra
f880: 67 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  gma statement.  
f890: 0a 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73 20 61  .**.** Pragmas a
f8a0: 72 65 20 6f 66 20 74 68 69 73 20 66 6f 72 6d 3a  re of this form:
f8b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52 41 47  .**.**      PRAG
f8c0: 4d 41 20 69 64 20 3d 20 76 61 6c 75 65 0a 2a 2a  MA id = value.**
f8d0: 0a 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69  .** The identifi
f8e0: 65 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  er might also be
f8f0: 20 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20   a string.  The 
f900: 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
f910: 67 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69  g, and.** identi
f920: 66 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65  fier, or a numbe
f930: 72 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67  r.  If minusFlag
f940: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
f950: 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  he value is.** a
f960: 20 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61 73   number that was
f970: 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
f980: 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2f 0a 76 6f  inus sign..*/.vo
f990: 69 64 20 73 71 6c 69 74 65 50 72 61 67 6d 61 28  id sqlitePragma(
f9a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
f9b0: 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b  oken *pLeft, Tok
f9c0: 65 6e 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20  en *pRight, int 
f9d0: 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 63 68  minusFlag){.  ch
f9e0: 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b 0a 20  ar *zLeft = 0;. 
f9f0: 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20   char *zRight = 
fa00: 30 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  0;.  sqlite *db 
fa10: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
fa20: 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 53   zLeft = sqliteS
fa30: 74 72 4e 44 75 70 28 70 4c 65 66 74 2d 3e 7a 2c  trNDup(pLeft->z,
fa40: 20 70 4c 65 66 74 2d 3e 6e 29 3b 0a 20 20 73 71   pLeft->n);.  sq
fa50: 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4c 65 66  liteDequote(zLef
fa60: 74 29 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73 46  t);.  if( minusF
fa70: 6c 61 67 20 29 7b 0a 20 20 20 20 7a 52 69 67 68  lag ){.    zRigh
fa80: 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t = 0;.    sqlit
fa90: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 7a 52 69  eSetNString(&zRi
faa0: 67 68 74 2c 20 22 2d 22 2c 20 31 2c 20 70 52 69  ght, "-", 1, pRi
fab0: 67 68 74 2d 3e 7a 2c 20 70 52 69 67 68 74 2d 3e  ght->z, pRight->
fac0: 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n, 0);.  }else{.
fad0: 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71 6c      zRight = sql
fae0: 69 74 65 53 74 72 4e 44 75 70 28 70 52 69 67 68  iteStrNDup(pRigh
faf0: 74 2d 3e 7a 2c 20 70 52 69 67 68 74 2d 3e 6e 29  t->z, pRight->n)
fb00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75  ;.    sqliteDequ
fb10: 6f 74 65 28 7a 52 69 67 68 74 29 3b 0a 20 20 7d  ote(zRight);.  }
fb20: 0a 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  . .  /*.  **  PR
fb30: 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 63 61 63  AGMA default_cac
fb40: 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52  he_size.  **  PR
fb50: 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 63 61 63  AGMA default_cac
fb60: 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20  he_size=N.  **. 
fb70: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
fb80: 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
fb90: 75 72 72 65 6e 74 20 70 65 72 73 69 73 74 65 6e  urrent persisten
fba0: 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68  t setting for th
fbb0: 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68  e.  ** page cach
fbc0: 65 20 73 69 7a 65 2e 20 20 54 68 65 20 76 61 6c  e size.  The val
fbd0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
fbe0: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
fbf0: 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20  r of.  ** pages 
fc00: 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
fc10: 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66  e.  The second f
fc20: 6f 72 6d 20 73 65 74 73 20 62 6f 74 68 20 74 68  orm sets both th
fc30: 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70  e current.  ** p
fc40: 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76  age cache size v
fc50: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 65 72  alue and the per
fc60: 73 69 73 74 65 6e 74 20 70 61 67 65 20 63 61 63  sistent page cac
fc70: 68 65 20 73 69 7a 65 20 76 61 6c 75 65 0a 20 20  he size value.  
fc80: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
fc90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
fca0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65    **.  ** The de
fcb0: 66 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65  fault cache size
fcc0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
fcd0: 74 61 2d 76 61 6c 75 65 20 32 20 6f 66 20 70 61  ta-value 2 of pa
fce0: 67 65 20 31 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ge 1 of the.  **
fcf0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
fd00: 20 54 68 65 20 63 61 63 68 65 20 73 69 7a 65 20   The cache size 
fd10: 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68 65 20  is actually the 
fd20: 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f  absolute value o
fd30: 66 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 6d 6f  f.  ** this memo
fd40: 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68  ry location.  Th
fd50: 65 20 73 69 67 6e 20 6f 66 20 6d 65 74 61 2d 76  e sign of meta-v
fd60: 61 6c 75 65 20 32 20 64 65 74 65 72 6d 69 6e 65  alue 2 determine
fd70: 73 20 74 68 65 0a 20 20 2a 2a 20 73 79 6e 63 68  s the.  ** synch
fd80: 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67 2e 20  ronous setting. 
fd90: 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   A negative valu
fda0: 65 20 6d 65 61 6e 73 20 73 79 6e 63 68 72 6f 6e  e means synchron
fdb0: 6f 75 73 20 69 73 20 6f 66 66 0a 20 20 2a 2a 20  ous is off.  ** 
fdc0: 61 6e 64 20 61 20 70 6f 73 69 74 69 76 65 20 76  and a positive v
fdd0: 61 6c 75 65 20 6d 65 61 6e 73 20 73 79 6e 63 68  alue means synch
fde0: 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 2e 0a 20 20  ronous is on..  
fdf0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  */.  if( sqliteS
fe00: 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 64 65  trICmp(zLeft,"de
fe10: 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65  fault_cache_size
fe20: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  ")==0 ){.    sta
fe30: 74 69 63 20 56 64 62 65 4f 70 20 67 65 74 43 61  tic VdbeOp getCa
fe40: 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20  cheSize[] = {.  
fe50: 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f      { OP_ReadCoo
fe60: 6b 69 65 2c 20 20 30 2c 20 32 2c 20 20 20 20 20  kie,  0, 2,     
fe70: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
fe80: 50 5f 41 62 73 56 61 6c 75 65 2c 20 20 20 20 30  P_AbsValue,    0
fe90: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
fea0: 20 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20        { OP_Dup, 
feb0: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20          0, 0,   
fec0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
fed0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20   OP_Integer,    
fee0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
fef0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c  ,.      { OP_Ne,
ff00: 20 20 20 20 20 20 20 20 20 20 30 2c 20 36 2c 20            0, 6, 
ff10: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
ff20: 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
ff30: 20 20 20 4d 41 58 5f 50 41 47 45 53 2c 30 2c 20     MAX_PAGES,0, 
ff40: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
ff50: 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30  olumnCount, 1, 0
ff60: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
ff70: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
ff80: 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  me,  0, 0,      
ff90: 20 20 22 63 61 63 68 65 5f 73 69 7a 65 22 7d 2c    "cache_size"},
ffa0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c  .      { OP_Call
ffb0: 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20  back,    1, 0,  
ffc0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
ffd0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
ffe0: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
fff0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
10000 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
10010 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d   if( pRight->z==
10020 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20  pLeft->z ){.    
10030 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
10040 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
10050 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a 65 29  ze(getCacheSize)
10060 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65 29 3b  , getCacheSize);
10070 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10080 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
10090 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f    int size = ato
100a0 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  i(zRight);.     
100b0 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69   if( size<0 ) si
100c0 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20  ze = -size;.    
100d0 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
100e0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
100f0 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
10100 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
10110 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10120 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  size, 0);.      
10130 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10140 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
10150 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 61  , 0, 2);.      a
10160 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
10170 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
10180 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
10190 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
101a0 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 61  p(v, OP_Ge, 0, a
101b0 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  ddr+3);.      sq
101c0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
101d0 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c   OP_Negative, 0,
101e0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
101f0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
10200 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 32  _SetCookie, 0, 2
10210 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
10220 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
10230 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
10240 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d  db->cache_size =
10250 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3c   db->cache_size<
10260 30 20 3f 20 2d 73 69 7a 65 20 3a 20 73 69 7a 65  0 ? -size : size
10270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74  ;.      sqliteBt
10280 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
10290 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63  db->pBe, db->cac
102a0 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  he_size);.    }.
102b0 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20    }else..  /*.  
102c0 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63 68 65  **  PRAGMA cache
102d0 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
102e0 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a  MA cache_size=N.
102f0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
10300 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72 74 73  rst form reports
10310 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
10320 61 6c 20 73 65 74 74 69 6e 67 20 66 6f 72 20 74  al setting for t
10330 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63  he.  ** page cac
10340 68 65 20 73 69 7a 65 2e 20 20 54 68 65 20 6c 6f  he size.  The lo
10350 63 61 6c 20 73 65 74 74 69 6e 67 20 63 61 6e 20  cal setting can 
10360 62 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  be different fro
10370 6d 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69  m.  ** the persi
10380 73 74 65 6e 74 20 63 61 63 68 65 20 73 69 7a 65  stent cache size
10390 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 73   value that is s
103a0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
103b0 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20  abase.  ** file 
103c0 69 74 73 65 6c 66 2e 20 20 54 68 65 20 76 61 6c  itself.  The val
103d0 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
103e0 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
103f0 72 20 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20  r of.  ** pages 
10400 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
10410 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66  e.  The second f
10420 6f 72 6d 20 73 65 74 73 20 74 68 65 20 6c 6f 63  orm sets the loc
10430 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63  al.  ** page cac
10440 68 65 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 20  he size value.  
10450 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  It does not chan
10460 67 65 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ge the persisten
10470 74 0a 20 20 2a 2a 20 63 61 63 68 65 20 73 69 7a  t.  ** cache siz
10480 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  e stored on the 
10490 64 69 73 6b 20 73 6f 20 74 68 65 20 63 61 63 68  disk so the cach
104a0 65 20 73 69 7a 65 20 77 69 6c 6c 20 72 65 76 65  e size will reve
104b0 72 74 0a 20 20 2a 2a 20 74 6f 20 69 74 73 20 64  rt.  ** to its d
104c0 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 68 65  efault value whe
104d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
104e0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 72 65 6f  s closed and reo
104f0 70 65 6e 65 64 2e 0a 20 20 2a 2a 20 4e 20 73 68  pened..  ** N sh
10500 6f 75 6c 64 20 62 65 20 61 20 70 6f 73 69 74 69  ould be a positi
10510 76 65 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2f  ve integer..  */
10520 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
10530 49 43 6d 70 28 7a 4c 65 66 74 2c 22 63 61 63 68  ICmp(zLeft,"cach
10540 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20  e_size")==0 ){. 
10550 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
10560 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b 5d 20   getCacheSize[] 
10570 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  = {.      { OP_C
10580 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30  olumnCount, 1, 0
10590 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
105a0 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
105b0 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  me,  0, 0,      
105c0 20 20 22 63 61 63 68 65 5f 73 69 7a 65 22 7d 2c    "cache_size"},
105d0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c  .      { OP_Call
105e0 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20  back,    1, 0,  
105f0 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
10600 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
10610 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
10620 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
10630 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
10640 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d   if( pRight->z==
10650 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20  pLeft->z ){.    
10660 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d    int size = db-
10670 3e 63 61 63 68 65 5f 73 69 7a 65 3b 3b 0a 20 20  >cache_size;;.  
10680 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29      if( size<0 )
10690 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20   size = -size;. 
106a0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
106b0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
106c0 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a 20 20  er, size, 0);.  
106d0 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
106e0 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
106f0 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69 7a  Size(getCacheSiz
10700 65 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a 65  e), getCacheSize
10710 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10720 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 61      int size = a
10730 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20 20 20  toi(zRight);.   
10740 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20 29 20     if( size<0 ) 
10750 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20  size = -size;.  
10760 20 20 20 20 69 66 28 20 64 62 2d 3e 63 61 63 68      if( db->cach
10770 65 5f 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20  e_size<0 ) size 
10780 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 64  = -size;.      d
10790 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  b->cache_size = 
107a0 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
107b0 74 65 42 74 72 65 65 53 65 74 43 61 63 68 65 53  teBtreeSetCacheS
107c0 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d  ize(db->pBe, db-
107d0 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
107e0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f    }.  }else..  /
107f0 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64  *.  **  PRAGMA d
10800 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f  efault_synchrono
10810 75 73 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  us.  **  PRAGMA 
10820 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e  default_synchron
10830 6f 75 73 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a  ous=BOOLEAN.  **
10840 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
10850 66 6f 72 6d 20 72 65 74 75 72 6e 73 20 74 68 65  form returns the
10860 20 70 65 72 73 69 73 74 65 6e 74 20 76 61 6c 75   persistent valu
10870 65 20 6f 66 20 74 68 65 20 22 73 79 6e 63 68 72  e of the "synchr
10880 6f 6e 6f 75 73 22 20 73 65 74 74 69 6e 67 0a 20  onous" setting. 
10890 20 2a 2a 20 74 68 61 74 20 69 73 20 73 74 6f 72   ** that is stor
108a0 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
108b0 73 65 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  se.  This is the
108c0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74   synchronous set
108d0 74 69 6e 67 20 74 68 61 74 0a 20 20 2a 2a 20 69  ting that.  ** i
108e0 73 20 75 73 65 64 20 77 68 65 6e 65 76 65 72 20  s used whenever 
108f0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
10900 6f 70 65 6e 65 64 20 75 6e 6c 65 73 73 20 6f 76  opened unless ov
10910 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 73 65  erridden by a se
10920 70 61 72 61 74 65 0a 20 20 2a 2a 20 22 73 79 6e  parate.  ** "syn
10930 63 68 72 6f 6e 6f 75 73 22 20 70 72 61 67 6d 61  chronous" pragma
10940 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  .  The second fo
10950 72 6d 20 63 68 61 6e 67 65 73 20 74 68 65 20 70  rm changes the p
10960 65 72 73 69 73 74 65 6e 74 20 61 6e 64 20 74 68  ersistent and th
10970 65 0a 20 20 2a 2a 20 6c 6f 63 61 6c 20 73 79 6e  e.  ** local syn
10980 63 68 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67  chronous setting
10990 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 67 69   to the value gi
109a0 76 65 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ven..  **.  ** I
109b0 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  f synchronous is
109c0 20 6f 6e 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c   on, SQLite will
109d0 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 73   do an fsync() s
109e0 79 73 74 65 6d 20 63 61 6c 6c 20 61 74 20 73 74  ystem call at st
109f0 72 61 74 65 67 69 63 0a 20 20 2a 2a 20 70 6f 69  rategic.  ** poi
10a00 6e 74 73 20 74 6f 20 69 6e 73 75 72 65 20 74 68  nts to insure th
10a10 61 74 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 6c  at all previousl
10a20 79 20 77 72 69 74 74 65 6e 20 64 61 74 61 20 68  y written data h
10a30 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e  as actually been
10a40 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 6f 6e  .  ** written on
10a50 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
10a60 61 63 65 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  ace before conti
10a70 6e 75 69 6e 67 2e 20 20 54 68 69 73 20 6d 6f 64  nuing.  This mod
10a80 65 20 69 6e 73 75 72 65 73 20 74 68 61 74 0a 20  e insures that. 
10a90 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
10aa0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
10ab0 69 6e 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  in a consistent 
10ac0 73 74 61 74 65 20 65 76 65 6e 74 20 69 66 20 74  state event if t
10ad0 68 65 20 6f 70 65 72 61 74 69 6e 67 0a 20 20 2a  he operating.  *
10ae0 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  * system crashes
10af0 20 6f 72 20 70 6f 77 65 72 20 74 6f 20 74 68 65   or power to the
10b00 20 63 6f 6d 70 75 74 65 72 20 69 73 20 69 6e 74   computer is int
10b10 65 72 72 75 70 74 65 64 20 75 6e 65 78 70 65 63  errupted unexpec
10b20 74 65 64 6c 79 2e 0a 20 20 2a 2a 20 57 68 65 6e  tedly..  ** When
10b30 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
10b40 6f 66 66 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c  off, SQLite will
10b50 20 6e 6f 74 20 77 61 69 74 20 66 6f 72 20 63 68   not wait for ch
10b60 61 6e 67 65 73 20 74 6f 20 61 63 74 75 61 6c 6c  anges to actuall
10b70 79 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  y.  ** be writte
10b80 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 62 65  n to the disk be
10b90 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
10ba0 20 20 41 73 20 73 6f 6f 6e 20 61 73 20 69 74 20    As soon as it 
10bb0 68 61 6e 64 73 20 63 68 61 6e 67 65 73 0a 20 20  hands changes.  
10bc0 2a 2a 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ** to the operat
10bd0 69 6e 67 20 73 79 73 74 65 6d 2c 20 69 74 20 61  ing system, it a
10be0 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
10bf0 63 68 61 6e 67 65 73 20 61 72 65 20 70 65 72 6d  changes are perm
10c00 61 6e 65 6e 74 20 61 6e 64 0a 20 20 2a 2a 20 69  anent and.  ** i
10c10 74 20 63 6f 6e 74 69 6e 75 65 73 20 67 6f 69 6e  t continues goin
10c20 67 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  g.  The database
10c30 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75   cannot be corru
10c40 70 74 65 64 20 62 79 20 61 20 70 72 6f 67 72 61  pted by a progra
10c50 6d 20 63 72 61 73 68 0a 20 20 2a 2a 20 65 76 65  m crash.  ** eve
10c60 6e 20 77 69 74 68 20 73 79 6e 63 68 72 6f 6e 6f  n with synchrono
10c70 75 73 20 6f 66 66 2c 20 62 75 74 20 61 6e 20 6f  us off, but an o
10c80 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
10c90 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c  crash or power l
10ca0 6f 73 73 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 70  oss.  ** could p
10cb0 6f 74 65 6e 74 69 61 6c 6c 79 20 63 6f 72 72 75  otentially corru
10cc0 70 74 20 64 61 74 61 2e 20 20 4f 6e 20 74 68 65  pt data.  On the
10cd0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 73 79 6e   other hand, syn
10ce0 63 68 72 6f 6e 6f 75 73 20 6f 66 66 20 69 73 0a  chronous off is.
10cf0 20 20 2a 2a 20 66 61 73 74 65 72 20 74 68 61 6e    ** faster than
10d00 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6f 6e 2e   synchronous on.
10d10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
10d20 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
10d30 22 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f  "default_synchro
10d40 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  nous")==0 ){.   
10d50 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 67   static VdbeOp g
10d60 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20  etSync[] = {.   
10d70 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
10d80 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
10d90 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
10da0 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c  _ReadCookie,  0,
10db0 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   2,        0},. 
10dc0 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
10dd0 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  r,     0, 0,    
10de0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
10df0 4f 50 5f 4c 74 2c 20 20 20 20 20 20 20 20 20 20  OP_Lt,          
10e00 30 2c 20 35 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 5,        0},
10e10 0a 20 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49  .      { OP_AddI
10e20 6d 6d 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 20  mm,      1, 0,  
10e30 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
10e40 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74  { OP_ColumnCount
10e50 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30  , 1, 0,        0
10e60 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  },.      { OP_Co
10e70 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c  lumnName,  0, 0,
10e80 20 20 20 20 20 20 20 20 22 73 79 6e 63 68 72 6f          "synchro
10e90 6e 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b 20  nous"},.      { 
10ea0 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20  OP_Callback,    
10eb0 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
10ec0 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65  .    };.    Vdbe
10ed0 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56   *v = sqliteGetV
10ee0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
10ef0 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
10f00 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67  rn;.    if( pRig
10f10 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20  ht->z==pLeft->z 
10f20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
10f30 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
10f40 41 72 72 61 79 53 69 7a 65 28 67 65 74 53 79 6e  ArraySize(getSyn
10f50 63 29 2c 20 67 65 74 53 79 6e 63 29 3b 0a 20 20  c), getSync);.  
10f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
10f70 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 69  nt addr;.      i
10f80 6e 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61  nt size = db->ca
10f90 63 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20  che_size;.      
10fa0 69 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a  if( size<0 ) siz
10fb0 65 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20  e = -size;.     
10fc0 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
10fd0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
10fe0 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
10ff0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
11000 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
11010 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73  , 0, 2);.      s
11020 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11030 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
11040 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
11050 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
11060 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
11070 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
11080 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11090 4e 65 2c 20 30 2c 20 61 64 64 72 2b 33 29 3b 0a  Ne, 0, addr+3);.
110a0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
110b0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
110c0 6d 6d 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 30  mm, MAX_PAGES, 0
110d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
110e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
110f0 62 73 56 61 6c 75 65 2c 20 30 2c 20 30 29 3b 0a  bsValue, 0, 0);.
11100 20 20 20 20 20 20 69 66 28 20 21 67 65 74 42 6f        if( !getBo
11110 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
11120 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
11130 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
11140 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a  egative, 0, 0);.
11150 20 20 20 20 20 20 20 20 73 69 7a 65 20 3d 20 2d          size = -
11160 73 69 7a 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  size;.      }.  
11170 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
11180 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
11190 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20  kie, 0, 2);.    
111a0 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
111b0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
111c0 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63 61 63  );.      db->cac
111d0 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a  he_size = size;.
111e0 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65        sqliteBtre
111f0 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 64 62  eSetCacheSize(db
11200 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65  ->pBe, db->cache
11210 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _size);.    }.  
11220 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }else..  /*.  **
11230 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
11240 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 20 50 52 41  onous.  **   PRA
11250 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  GMA synchronous=
11260 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a  BOOLEAN.  **.  *
11270 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74 20  * Return or set 
11280 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
11290 6f 66 20 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f  of the synchrono
112a0 75 73 20 66 6c 61 67 2e 20 20 43 68 61 6e 67 69  us flag.  Changi
112b0 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c 6f 63 61  ng.  ** the loca
112c0 6c 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74  l value does not
112d0 20 6d 61 6b 65 20 63 68 61 6e 67 65 73 20 74 6f   make changes to
112e0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
112f0 6e 64 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61  nd the.  ** defa
11300 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  ult value will b
11310 65 20 72 65 73 74 6f 72 65 64 20 74 68 65 20 6e  e restored the n
11320 65 78 74 20 74 69 6d 65 20 74 68 65 20 64 61 74  ext time the dat
11330 61 62 61 73 65 20 69 73 0a 20 20 2a 2a 20 6f 70  abase is.  ** op
11340 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ened..  */.  if(
11350 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
11360 4c 65 66 74 2c 22 73 79 6e 63 68 72 6f 6e 6f 75  Left,"synchronou
11370 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  s")==0 ){.    st
11380 61 74 69 63 20 56 64 62 65 4f 70 20 67 65 74 53  atic VdbeOp getS
11390 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ync[] = {.      
113a0 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74  { OP_ColumnCount
113b0 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30  , 1, 0,        0
113c0 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  },.      { OP_Co
113d0 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c  lumnName,  0, 0,
113e0 20 20 20 20 20 20 20 20 22 73 79 6e 63 68 72 6f          "synchro
113f0 6e 6f 75 73 22 7d 2c 0a 20 20 20 20 20 20 7b 20  nous"},.      { 
11400 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20  OP_Callback,    
11410 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
11420 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65  .    };.    Vdbe
11430 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56   *v = sqliteGetV
11440 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
11450 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
11460 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67  rn;.    if( pRig
11470 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20  ht->z==pLeft->z 
11480 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
11490 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
114a0 6e 74 65 67 65 72 2c 20 64 62 2d 3e 63 61 63 68  nteger, db->cach
114b0 65 5f 73 69 7a 65 3e 3d 30 2c 20 30 29 3b 0a 20  e_size>=0, 0);. 
114c0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
114d0 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
114e0 79 53 69 7a 65 28 67 65 74 53 79 6e 63 29 2c 20  ySize(getSync), 
114f0 67 65 74 53 79 6e 63 29 3b 0a 20 20 20 20 7d 65  getSync);.    }e
11500 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  lse{.      int s
11510 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f  ize = db->cache_
11520 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
11530 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20  size<0 ) size = 
11540 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  -size;.      if(
11550 20 21 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69   !getBoolean(zRi
11560 67 68 74 29 20 29 20 73 69 7a 65 20 3d 20 2d 73  ght) ) size = -s
11570 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63  ize;.      db->c
11580 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
11590 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74  ;.      sqliteBt
115a0 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
115b0 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63  db->pBe, db->cac
115c0 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  he_size);.    }.
115d0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
115e0 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
115f0 66 74 2c 20 22 74 72 69 67 67 65 72 5f 6f 76 65  ft, "trigger_ove
11600 72 68 65 61 64 5f 74 65 73 74 22 29 3d 3d 30 20  rhead_test")==0 
11610 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
11620 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
11630 0a 20 20 20 20 20 20 61 6c 77 61 79 73 5f 63 6f  .      always_co
11640 64 65 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70  de_trigger_setup
11650 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
11660 0a 20 20 20 20 20 20 61 6c 77 61 79 73 5f 63 6f  .      always_co
11670 64 65 5f 74 72 69 67 67 65 72 5f 73 65 74 75 70  de_trigger_setup
11680 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
11690 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
116a0 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
116b0 22 76 64 62 65 5f 74 72 61 63 65 22 29 3d 3d 30  "vdbe_trace")==0
116c0 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42   ){.    if( getB
116d0 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
116e0 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
116f0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 56 64 62 65  s |= SQLITE_Vdbe
11700 54 72 61 63 65 3b 0a 20 20 20 20 7d 65 6c 73 65  Trace;.    }else
11710 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
11720 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 56 64 62  s &= ~SQLITE_Vdb
11730 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 0a 20 20  eTrace;.    }.  
11740 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
11750 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
11760 2c 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e  , "full_column_n
11770 61 6d 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ames")==0 ){.   
11780 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
11790 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
117a0 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
117b0 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
117c0 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
117d0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
117e0 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
117f0 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  Names;.    }.  }
11800 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69  else..  if( sqli
11810 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
11820 20 22 73 68 6f 77 5f 64 61 74 61 74 79 70 65 73   "show_datatypes
11830 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ")==0 ){.    if(
11840 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67   getBoolean(zRig
11850 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ht) ){.      db-
11860 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
11870 5f 52 65 70 6f 72 74 54 79 70 65 73 3b 0a 20 20  _ReportTypes;.  
11880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
11890 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
118a0 49 54 45 5f 52 65 70 6f 72 74 54 79 70 65 73 3b  ITE_ReportTypes;
118b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
118c0 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
118d0 43 6d 70 28 7a 4c 65 66 74 2c 20 22 72 65 73 75  Cmp(zLeft, "resu
118e0 6c 74 5f 73 65 74 5f 64 65 74 61 69 6c 73 22 29  lt_set_details")
118f0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67  ==0 ){.    if( g
11900 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
11910 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  ) ){.      db->f
11920 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 52  lags |= SQLITE_R
11930 65 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20  esultDetails;.  
11940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
11950 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
11960 49 54 45 5f 52 65 73 75 6c 74 44 65 74 61 69 6c  ITE_ResultDetail
11970 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  s;.    }.  }else
11980 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74  ..  if( sqliteSt
11990 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 63 6f  rICmp(zLeft, "co
119a0 75 6e 74 5f 63 68 61 6e 67 65 73 22 29 3d 3d 30  unt_changes")==0
119b0 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42   ){.    if( getB
119c0 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
119d0 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
119e0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 6f 75 6e  s |= SQLITE_Coun
119f0 74 52 6f 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65  tRows;.    }else
11a00 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
11a10 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 43 6f 75  s &= ~SQLITE_Cou
11a20 6e 74 52 6f 77 73 3b 0a 20 20 20 20 7d 0a 20 20  ntRows;.    }.  
11a30 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c  }else..  if( sql
11a40 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
11a50 2c 20 22 65 6d 70 74 79 5f 72 65 73 75 6c 74 5f  , "empty_result_
11a60 63 61 6c 6c 62 61 63 6b 73 22 29 3d 3d 30 20 29  callbacks")==0 )
11a70 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f  {.    if( getBoo
11a80 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a  lean(zRight) ){.
11a90 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
11aa0 7c 3d 20 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61  |= SQLITE_NullCa
11ab0 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  llback;.    }els
11ac0 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  e{.      db->fla
11ad0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4e 75  gs &= ~SQLITE_Nu
11ae0 6c 6c 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20  llCallback;.    
11af0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
11b00 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
11b10 4c 65 66 74 2c 20 22 74 61 62 6c 65 5f 69 6e 66  Left, "table_inf
11b20 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61  o")==0 ){.    Ta
11b30 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 56  ble *pTab;.    V
11b40 64 62 65 20 2a 76 3b 0a 20 20 20 20 70 54 61 62  dbe *v;.    pTab
11b50 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
11b60 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a  le(db, zRight);.
11b70 20 20 20 20 69 66 28 20 70 54 61 62 20 29 20 76      if( pTab ) v
11b80 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
11b90 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
11ba0 28 20 70 54 61 62 20 26 26 20 76 20 29 7b 0a 20  ( pTab && v ){. 
11bb0 20 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65       static Vdbe
11bc0 4f 70 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66  Op tableInfoPref
11bd0 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ace[] = {.      
11be0 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75    { OP_ColumnCou
11bf0 6e 74 2c 20 35 2c 20 30 2c 20 20 20 20 20 20 20  nt, 5, 0,       
11c00 30 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  0},.        { OP
11c10 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c  _ColumnName,  0,
11c20 20 30 2c 20 20 20 20 20 20 20 22 63 69 64 22 7d   0,       "cid"}
11c30 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
11c40 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30  olumnName,  1, 0
11c50 2c 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c  ,       "name"},
11c60 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
11c70 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c  lumnName,  2, 0,
11c80 20 20 20 20 20 20 20 22 74 79 70 65 22 7d 2c 0a         "type"},.
11c90 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c          { OP_Col
11ca0 75 6d 6e 4e 61 6d 65 2c 20 20 33 2c 20 30 2c 20  umnName,  3, 0, 
11cb0 20 20 20 20 20 20 22 6e 6f 74 6e 75 6c 6c 22 7d        "notnull"}
11cc0 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43  ,.        { OP_C
11cd0 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 34 2c 20 30  olumnName,  4, 0
11ce0 2c 20 20 20 20 20 20 20 22 64 66 6c 74 5f 76 61  ,       "dflt_va
11cf0 6c 75 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  lue"},.      };.
11d00 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
11d10 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
11d20 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
11d30 69 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65  ize(tableInfoPre
11d40 66 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f  face), tableInfo
11d50 50 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20  Preface);.      
11d60 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c  sqliteViewGetCol
11d70 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
11d80 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f   pTab);.      fo
11d90 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
11da0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
11db0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
11dc0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
11dd0 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , i, 0);.       
11de0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11df0 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
11e00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
11e10 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
11e20 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43  (v, -1, pTab->aC
11e30 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f  ol[i].zName, P3_
11e40 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
11e50 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11e60 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
11e70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
11e80 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
11e90 28 76 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20  (v, -1, .       
11ea0 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
11eb0 5d 2e 7a 54 79 70 65 20 3f 20 70 54 61 62 2d 3e  ].zType ? pTab->
11ec0 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 3a 20  aCol[i].zType : 
11ed0 22 6e 75 6d 65 72 69 63 22 2c 20 50 33 5f 53 54  "numeric", P3_ST
11ee0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73  ATIC);.        s
11ef0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
11f00 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
11f10 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e  ab->aCol[i].notN
11f20 75 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ull, 0);.       
11f30 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11f40 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
11f50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
11f60 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
11f70 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43  (v, -1, pTab->aC
11f80 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 2c 20 50 33 5f  ol[i].zDflt, P3_
11f90 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
11fa0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
11fb0 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
11fc0 20 35 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   5, 0);.      }.
11fd0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
11fe0 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
11ff0 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64 65 78  mp(zLeft, "index
12000 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20 20  _info")==0 ){.  
12010 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
12020 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
12030 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
12040 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 46 69   pIdx = sqliteFi
12050 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 52 69 67  ndIndex(db, zRig
12060 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  ht);.    if( pId
12070 78 20 29 20 76 20 3d 20 73 71 6c 69 74 65 47 65  x ) v = sqliteGe
12080 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
12090 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20 76     if( pIdx && v
120a0 20 29 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63   ){.      static
120b0 20 56 64 62 65 4f 70 20 74 61 62 6c 65 49 6e 66   VdbeOp tableInf
120c0 6f 50 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20  oPreface[] = {. 
120d0 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
120e0 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20 30 2c 20 20  mnCount, 3, 0,  
120f0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 20       0},.       
12100 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
12110 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  0, 0,       "
12120 73 65 71 6e 6f 22 7d 2c 0a 20 20 20 20 20 20 20  seqno"},.       
12130 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
12140 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  1, 0,       "
12150 63 69 64 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b  cid"},.        {
12160 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
12170 20 32 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 61   2, 0,       "na
12180 6d 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20  me"},.      };. 
12190 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
121a0 20 20 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70    pTab = pIdx->p
121b0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 73 71 6c  Table;.      sql
121c0 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
121d0 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61  (v, ArraySize(ta
121e0 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c  bleInfoPreface),
121f0 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63   tableInfoPrefac
12200 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  e);.      for(i=
12210 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
12220 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
12230 20 20 69 6e 74 20 63 6e 75 6d 20 3d 20 70 49 64    int cnum = pId
12240 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
12250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
12260 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
12270 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20  teger, i, 0);.  
12280 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
12290 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
122a0 67 65 72 2c 20 63 6e 75 6d 2c 20 30 29 3b 0a 20  ger, cnum, 0);. 
122b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
122c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
122d0 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
122e0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
122f0 2d 3e 6e 43 6f 6c 3e 63 6e 75 6d 20 29 3b 0a 20  ->nCol>cnum );. 
12300 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
12310 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
12320 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d   pTab->aCol[cnum
12330 5d 2e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ].zName, P3_STAT
12340 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
12350 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12360 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c 20  OP_Callback, 3, 
12370 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
12380 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
12390 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
123a0 4c 65 66 74 2c 20 22 69 6e 64 65 78 5f 6c 69 73  Left, "index_lis
123b0 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e  t")==0 ){.    In
123c0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54  dex *pIdx;.    T
123d0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
123e0 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 70 54 61  Vdbe *v;.    pTa
123f0 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
12400 62 6c 65 28 64 62 2c 20 7a 52 69 67 68 74 29 3b  ble(db, zRight);
12410 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
12420 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74  .      v = sqlit
12430 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
12440 3b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  ;.      pIdx = p
12450 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
12460 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 20   }.    if( pTab 
12470 26 26 20 70 49 64 78 20 26 26 20 76 20 29 7b 0a  && pIdx && v ){.
12480 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b        int i = 0;
12490 20 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 56   .      static V
124a0 64 62 65 4f 70 20 69 6e 64 65 78 4c 69 73 74 50  dbeOp indexListP
124b0 72 65 66 61 63 65 5b 5d 20 3d 20 7b 0a 20 20 20  reface[] = {.   
124c0 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
124d0 43 6f 75 6e 74 2c 20 33 2c 20 30 2c 20 20 20 20  Count, 3, 0,    
124e0 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 7b     0},.        {
124f0 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
12500 20 30 2c 20 30 2c 20 20 20 20 20 20 20 22 73 65   0, 0,       "se
12510 71 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f  q"},.        { O
12520 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31  P_ColumnName,  1
12530 2c 20 30 2c 20 20 20 20 20 20 20 22 6e 61 6d 65  , 0,       "name
12540 22 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  "},.        { OP
12550 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c  _ColumnName,  2,
12560 20 30 2c 20 20 20 20 20 20 20 22 75 6e 69 71 75   0,       "uniqu
12570 65 22 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 0a 20  e"},.      };.. 
12580 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
12590 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
125a0 79 53 69 7a 65 28 69 6e 64 65 78 4c 69 73 74 50  ySize(indexListP
125b0 72 65 66 61 63 65 29 2c 20 69 6e 64 65 78 4c 69  reface), indexLi
125c0 73 74 50 72 65 66 61 63 65 29 3b 0a 20 20 20 20  stPreface);.    
125d0 20 20 77 68 69 6c 65 28 70 49 64 78 29 7b 0a 20    while(pIdx){. 
125e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
125f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
12600 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20  eger, i, 0);.   
12610 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
12620 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
12630 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
12640 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
12650 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49 64 78  geP3(v, -1, pIdx
12660 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
12670 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
12680 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
12690 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78  OP_Integer, pIdx
126a0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
126b0 6e 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ne, 0);.        
126c0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
126d0 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20  v, OP_Callback, 
126e0 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 2b  3, 0);.        +
126f0 2b 69 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  +i;.        pIdx
12700 20 3d 20 70 49 64 78 2d 3e 70 4e 65 78 74 3b 0a   = pIdx->pNext;.
12710 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12720 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 4e  }else..#ifndef N
12730 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69  DEBUG.  if( sqli
12740 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  teStrICmp(zLeft,
12750 20 22 70 61 72 73 65 72 5f 74 72 61 63 65 22 29   "parser_trace")
12760 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72  ==0 ){.    exter
12770 6e 20 76 6f 69 64 20 73 71 6c 69 74 65 50 61 72  n void sqlitePar
12780 73 65 72 54 72 61 63 65 28 46 49 4c 45 2a 2c 20  serTrace(FILE*, 
12790 63 68 61 72 20 2a 29 3b 0a 20 20 20 20 69 66 28  char *);.    if(
127a0 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67   getBoolean(zRig
127b0 68 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ht) ){.      sql
127c0 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28 73  iteParserTrace(s
127d0 74 64 6f 75 74 2c 20 22 70 61 72 73 65 72 3a 20  tdout, "parser: 
127e0 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
127f0 20 20 20 20 20 73 71 6c 69 74 65 50 61 72 73 65       sqliteParse
12800 72 54 72 61 63 65 28 30 2c 20 30 29 3b 0a 20 20  rTrace(0, 0);.  
12810 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
12820 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  if..  if( sqlite
12830 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
12840 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22  integrity_check"
12850 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )==0 ){.    stat
12860 69 63 20 56 64 62 65 4f 70 20 63 68 65 63 6b 44  ic VdbeOp checkD
12870 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  b[] = {.      { 
12880 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20  OP_SetInsert,   
12890 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 32 22  0, 0,        "2"
128a0 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70  },.      { OP_Op
128b0 65 6e 2c 20 20 20 20 20 20 20 20 30 2c 20 32 2c  en,        0, 2,
128c0 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
128d0 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
128e0 20 20 20 20 30 2c 20 36 2c 20 20 20 20 20 20 20      0, 6,       
128f0 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
12900 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 30 2c 20  Column,      0, 
12910 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  3,        0},   
12920 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 3 */.      {
12930 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 20   OP_SetInsert,  
12940 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
12950 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78  ,.      { OP_Nex
12960 74 2c 20 20 20 20 20 20 20 20 30 2c 20 33 2c 20  t,        0, 3, 
12970 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
12980 20 7b 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43   { OP_IntegrityC
12990 6b 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  k, 0, 0,        
129a0 30 7d 2c 20 20 20 20 2f 2a 20 36 20 2a 2f 0a 20  0},    /* 6 */. 
129b0 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
129c0 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20  Count, 1, 0,    
129d0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
129e0 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20  OP_ColumnName,  
129f0 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 69 6e  0, 0,        "in
12a00 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22 7d 2c  tegrity_check"},
12a10 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c  .      { OP_Call
12a20 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20  back,    1, 0,  
12a30 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
12a40 7b 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20  { OP_SetInsert, 
12a50 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 22    1, 0,        "
12a60 32 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  2"},.      { OP_
12a70 4f 70 65 6e 41 75 78 2c 20 20 20 20 20 31 2c 20  OpenAux,     1, 
12a80 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  2,        0},.  
12a90 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
12aa0 20 20 20 20 20 20 31 2c 20 31 36 2c 20 20 20 20        1, 16,    
12ab0 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
12ac0 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 31  P_Column,      1
12ad0 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 3,        0}, 
12ae0 20 20 20 2f 2a 20 31 33 20 2a 2f 0a 20 20 20 20     /* 13 */.    
12af0 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65 72 74    { OP_SetInsert
12b00 2c 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20  ,   1, 0,       
12b10 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
12b20 4e 65 78 74 2c 20 20 20 20 20 20 20 20 31 2c 20  Next,        1, 
12b30 31 33 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  13,       0},.  
12b40 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 72 69      { OP_Integri
12b50 74 79 43 6b 2c 20 31 2c 20 31 2c 20 20 20 20 20  tyCk, 1, 1,     
12b60 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 36 20     0},    /* 16 
12b70 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61  */.      { OP_Ca
12b80 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c  llback,    1, 0,
12b90 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
12ba0 7d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  };.    Vdbe *v =
12bb0 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
12bc0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
12bd0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
12be0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
12bf0 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
12c00 69 7a 65 28 63 68 65 63 6b 44 62 29 2c 20 63 68  ize(checkDb), ch
12c10 65 63 6b 44 62 29 3b 0a 20 20 7d 65 6c 73 65 0a  eckDb);.  }else.
12c20 0a 20 20 7b 7d 0a 20 20 73 71 6c 69 74 65 46 72  .  {}.  sqliteFr
12c30 65 65 28 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c  ee(zLeft);.  sql
12c40 69 74 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b  iteFree(zRight);
12c50 0a 7d 0a                                         .}.