/ Hex Artifact Content
Login

Artifact 415dce8886aabb6d45851caed7014707056d668b:


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 37 20 32 30  ild.c,v 1.117 20
0310: 30 32 2f 31 32 2f 30 33 20 30 32 3a 32 32 3a 35  02/12/03 02:22:5
0320: 32 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  2 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 28 20 6e 20 29 3b 0a 20 20 69 66  alloc( n );.  if
5800: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74  ( zStmt==0 ) ret
5810: 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28  urn 0;.  strcpy(
5820: 7a 53 74 6d 74 2c 20 70 2d 3e 69 73 54 65 6d 70  zStmt, p->isTemp
5830: 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20   ? "CREATE TEMP 
5840: 54 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54  TABLE " : "CREAT
5850: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
5860: 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b  = strlen(zStmt);
5870: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
5880: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
5890: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
58a0: 20 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   '(';.  for(i=0;
58b0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
58c0: 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53  {.    strcpy(&zS
58d0: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
58e0: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26     k += strlen(&
58f0: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
5900: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
5910: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
5920: 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e   &k, p->aCol[i].
5930: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74  zName);.  }.  st
5940: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
5950: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
5960: 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zStmt;.}../*.** 
5970: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5980: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
5990: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
59a0: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
59b0: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
59c0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
59d0: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
59e0: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
59f0: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
5a00: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
5a10: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
5a20: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
5a30: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
5a40: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
5a50: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
5a60: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
5a70: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
5a80: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
5a90: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
5aa0: 73 6b 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68  sk,.** unless th
5ab0: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
5ac0: 79 20 74 61 62 6c 65 20 6f 72 20 69 6e 69 74 46  y table or initF
5ad0: 6c 61 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e  lag==1.  When in
5ae0: 69 74 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74  itFlag==1,.** it
5af0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
5b00: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
5b10: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
5b20: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
5b30: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
5b40: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
5b50: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
5b60: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
5b70: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
5b80: 61 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e  anges, so the en
5b90: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
5ba0: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
5bb0: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
5bc0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
5bd0: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
5be0: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
5bf0: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
5c00: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
5c10: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
5c20: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
5c30: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
5c40: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
5c50: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
5c60: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
5c70: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
5c80: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
5c90: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
5ca0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
5cb0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
5cc0: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
5cd0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
5ce0: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
5cf0: 69 64 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c  id sqliteEndTabl
5d00: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
5d10: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65   Token *pEnd, Se
5d20: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
5d30: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
5d40: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
5d50: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  e->db;..  if( (p
5d60: 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63  End==0 && pSelec
5d70: 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d  t==0) || pParse-
5d80: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
5d90: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
5da0: 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50  return;.  p = pP
5db0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
5dc0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
5dd0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  turn;..  /* Add 
5de0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
5df0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
5e00: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
5e10: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
5e20: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
5e30: 2d 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d 30 20 7c  ->nameClash==0 |
5e40: 7c 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  | pParse->initFl
5e50: 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ag==1 );.  if( p
5e60: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
5e70: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 61 6d  0 && pParse->nam
5e80: 65 43 6c 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  eClash==0 ){.   
5e90: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
5ea0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
5eb0: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
5ec0: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
5ed0: 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
5ee0: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
5ef0: 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69  me)+1, p);.    i
5f00: 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20  f( pOld ){.     
5f10: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64   assert( p==pOld
5f20: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
5f30: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
5f40: 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72  inside HashInser
5f50: 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  t() */.      ret
5f60: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  urn;.    }.    f
5f70: 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65  or(pFKey=p->pFKe
5f80: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
5f90: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
5fa0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  ){.      int nTo
5fb0: 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d   = strlen(pFKey-
5fc0: 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20  >zTo) + 1;.     
5fd0: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
5fe0: 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64  = sqliteHashFind
5ff0: 28 26 64 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b  (&db->aFKey, pFK
6000: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  ey->zTo, nTo);. 
6010: 20 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49       sqliteHashI
6020: 6e 73 65 72 74 28 26 64 62 2d 3e 61 46 4b 65 79  nsert(&db->aFKey
6030: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
6040: 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d  o, pFKey);.    }
6050: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
6060: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
6070: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
6080: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
6090: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
60a0: 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ges;.  }..  /* I
60b0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 67  f the table is g
60c0: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
60d0: 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 63 6f 6e  SELECT, then con
60e0: 73 74 72 75 63 74 20 74 68 65 0a 20 20 2a 2a 20  struct the.  ** 
60f0: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
6100: 61 6e 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  and the text of 
6110: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  the table..  */.
6120: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
6130: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  .    Table *pSel
6140: 54 61 62 20 3d 20 73 71 6c 69 74 65 52 65 73 75  Tab = sqliteResu
6150: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
6160: 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63 74  arse, 0, pSelect
6170: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54  );.    if( pSelT
6180: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
6190: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
61a0: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  Col==0 );.    p-
61b0: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
61c0: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 43  >nCol;.    p->aC
61d0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
61e0: 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d  ol;.    pSelTab-
61f0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70  >nCol = 0;.    p
6200: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
6210: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
6220: 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54  teTable(0, pSelT
6230: 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ab);.  }..  /* I
6240: 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69  f the initFlag i
6250: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
6260: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
6270: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
6280: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
6290: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
62a0: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
62b0: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
62c0: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
62d0: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
62e0: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
62f0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
6300: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
6310: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 50  able from the pP
6320: 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69  arse->newTnum fi
6330: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
6340: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
6350: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
6360: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
6370: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
6380: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
6390: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
63a0: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
63b0: 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  = pParse->newTnu
63c0: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
63d0: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
63e0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
63f0: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
6400: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
6410: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
6420: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
6430: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
6440: 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a  ecord number.  *
6450: 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  * for the new ta
6460: 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64  ble entry should
6470: 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74   already be on t
6480: 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
6490: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
64a0: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
64b0: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
64c0: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
64d0: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
64e0: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
64f0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
6500: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
6510: 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  ( !pParse->initF
6520: 6c 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  lag ){.    int n
6530: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a  ;.    Vdbe *v;..
6540: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65      v = sqliteGe
6550: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
6560: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
6570: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d  turn;.    if( p-
6580: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
6590: 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
65a0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
65b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
65c0: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
65d0: 6c 65 2c 20 30 2c 20 70 2d 3e 69 73 54 65 6d 70  le, 0, p->isTemp
65e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
65f0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
6600: 31 2c 20 28 63 68 61 72 20 2a 29 26 70 2d 3e 74  1, (char *)&p->t
6610: 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  num, P3_POINTER)
6620: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6630: 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
6640: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6650: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
6660: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
6670: 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  }.    p->tnum = 
6680: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  0;.    sqliteVdb
6690: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
66a0: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  l, 1, 0);.    sq
66b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
66c0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
66d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  );.    if( p->pS
66e0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
66f0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
6700: 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 74 61 62  geP3(v, -1, "tab
6710: 6c 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  le", P3_STATIC);
6720: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6730: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
6740: 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 76 69 65  geP3(v, -1, "vie
6750: 77 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  w", P3_STATIC);.
6760: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6770: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6780: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
6790: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
67a0: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e  ngeP3(v, -1, p->
67b0: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
67c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
67d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
67e0: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
67f0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
6800: 50 33 28 76 2c 20 2d 31 2c 20 70 2d 3e 7a 4e 61  P3(v, -1, p->zNa
6810: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
6820: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6830: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 34  dOp(v, OP_Dup, 4
6840: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6850: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6860: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
6870: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
6880: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20  {.      char *z 
6890: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
68a0: 74 28 70 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  t(p);.      n = 
68b0: 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20  z ? strlen(z) : 
68c0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  0;.      sqliteV
68d0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
68e0: 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  1, z, n);.      
68f0: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
6900: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6910: 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20  assert( pEnd!=0 
6920: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64  );.      n = Add
6930: 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64  r(pEnd->z) - Add
6940: 72 28 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74  r(pParse->sFirst
6950: 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20  Token.z) + 1;.  
6960: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
6970: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 50  angeP3(v, -1, pP
6980: 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65  arse->sFirstToke
6990: 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  n.z, n);.    }. 
69a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
69b0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
69c0: 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20  ord, 5, 0);.    
69d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
69e0: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
69f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
6a00: 21 70 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20 20  !p->isTemp ){.  
6a10: 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65      sqliteChange
6a20: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20  Cookie(db, v);. 
6a30: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
6a40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
6a50: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
6a60: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
6a70: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70        int op = p
6a80: 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70  ->isTemp ? OP_Op
6a90: 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f 4f 70 65  enWrAux : OP_Ope
6aa0: 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 73 71  nWrite;.      sq
6ab0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6ac0: 20 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20   op, 1, 0);.    
6ad0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
6ae0: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
6af0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
6b00: 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c  Select, SRT_Tabl
6b10: 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  e, 1, 0, 0, 0);.
6b20: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6b30: 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
6b40: 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 7d  n(pParse);.  }.}
6b50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ../*.** The pars
6b60: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
6b70: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
6b80: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
6b90: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
6ba0: 74 65 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  teCreateView(.  
6bb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6bc0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
6bd0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
6be0: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
6bf0: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
6c00: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
6c10: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
6c20: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
6c30: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e,      /* The t
6c40: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
6c50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
6c60: 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74  view */.  Select
6c70: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
6c80: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
6c90: 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  nt that will bec
6ca0: 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77  ome the new view
6cb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
6cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
6cd0: 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59   for a TEMPORARY
6ce0: 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61   view */.){.  Ta
6cf0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
6d00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6d10: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
6d20: 0a 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61  .  sqliteStartTa
6d30: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67  ble(pParse, pBeg
6d40: 69 6e 2c 20 70 4e 61 6d 65 2c 20 69 73 54 65 6d  in, pName, isTem
6d50: 70 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  p);.  p = pParse
6d60: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
6d70: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
6d80: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
6d90: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
6da0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
6db0: 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
6dc0: 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
6dd0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
6de0: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
6df0: 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
6e00: 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
6e10: 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
6e20: 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
6e30: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
6e40: 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
6e50: 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
6e60: 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
6e70: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
6e80: 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
6e90: 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
6ea0: 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 5f 65  current sqlite_e
6eb0: 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
6ec0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
6ed0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 53 65  elect = sqliteSe
6ee0: 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63 74 29  lectDup(pSelect)
6ef0: 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74  ;.  sqliteSelect
6f00: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
6f10: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
6f20: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
6f30: 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c  sqliteViewGetCol
6f40: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
6f50: 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   p);.  }..  /* L
6f60: 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
6f70: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
6f80: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
6f90: 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
6fa0: 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
6fb0: 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
6fc0: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
6fd0: 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
6fe0: 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21  =0 && sEnd.z[0]!
6ff0: 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
7000: 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
7010: 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
7020: 20 20 6e 20 3d 20 28 28 69 6e 74 29 73 45 6e 64    n = ((int)sEnd
7030: 2e 7a 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69  .z) - (int)pBegi
7040: 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67  n->z;.  z = pBeg
7050: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
7060: 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d  n>0 && (z[n-1]==
7070: 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a  ';' || isspace(z
7080: 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20  [n-1])) ){ n--; 
7090: 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
70a0: 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
70b0: 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
70c0: 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29 20 74  liteEndTable() t
70d0: 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
70e0: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
70f0: 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
7100: 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 70 50  qliteEndTable(pP
7110: 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b  arse, &sEnd, 0);
7120: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
7130: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
7140: 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69  ructure pTable i
7150: 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e  s really a VIEW.
7160: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61    Fill in the na
7170: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  mes of.** the co
7180: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65  lumns of the vie
7190: 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20  w in the pTable 
71a0: 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
71b0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
71c0: 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
71d0: 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
71e0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
71f0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 65  message in pPare
7200: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  ->zErrMsg..*/.in
7210: 74 20 73 71 6c 69 74 65 56 69 65 77 47 65 74 43  t sqliteViewGetC
7220: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
7230: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
7240: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72  *pTable){.  Expr
7250: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
7260: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
7270: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
7280: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
7290: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
72a0: 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73  e );..  /* A pos
72b0: 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
72c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
72d0: 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
72e0: 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
72f0: 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
7300: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
7310: 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
7320: 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
7330: 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
7340: 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
7350: 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
7360: 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
7370: 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
7380: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
7390: 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
73a0: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
73b0: 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
73c0: 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
73d0: 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
73e0: 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
73f0: 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
7400: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
7410: 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
7420: 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
7430: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
7440: 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
7450: 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
7460: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
7470: 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75  his error is cau
7480: 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ght previously a
7490: 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd so the follow
74a0: 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68  ing test.  ** sh
74b0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c  ould always fail
74c0: 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c  .  But we will l
74d0: 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65  eave it in place
74e0: 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65   just to be safe
74f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
7500: 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
7510: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
7520: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
7530: 4d 73 67 2c 20 22 76 69 65 77 20 22 2c 20 70 54  Msg, "view ", pT
7540: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  able->zName,.   
7550: 20 20 20 20 20 20 22 20 69 73 20 63 69 72 63 75        " is circu
7560: 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
7570: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
7580: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
7590: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
75a0: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
75b0: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
75c0: 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
75d0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
75e0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
75f0: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
7600: 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30  ); /* If nCol==0
7610: 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75  , then pTable mu
7620: 73 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a  st be a VIEW */.
7630: 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d    pSel = pTable-
7640: 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20  >pSelect;..  /* 
7650: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
7660: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 52 65 73 75  ll to sqliteResu
7670: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
7680: 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a  will expand any.
7690: 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74    ** "*" element
76a0: 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20  s in this list. 
76b0: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65   But we will nee
76c0: 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
76d0: 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20   list.  ** back 
76e0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
76f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66  configuration af
7700: 74 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20  terwards, so we 
7710: 73 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20  save a copy of. 
7720: 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
7730: 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f   in pEList..  */
7740: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
7750: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c  ->pEList;.  pSel
7760: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
7770: 65 45 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c  eExprListDup(pEL
7780: 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  ist);.  if( pSel
7790: 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ->pEList==0 ){. 
77a0: 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20     pSel->pEList 
77b0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65  = pEList;.    re
77c0: 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c  turn 1;  /* Mall
77d0: 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d  oc failed */.  }
77e0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
77f0: 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20  = -1;.  pSelTab 
7800: 3d 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65  = sqliteResultSe
7810: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
7820: 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66  , 0, pSel);.  if
7830: 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
7840: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
7850: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
7860: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70  pTable->nCol = p
7870: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
7880: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
7890: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
78a0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
78b0: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  l = 0;.    pSelT
78c0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
78d0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61    sqliteDeleteTa
78e0: 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b  ble(0, pSelTab);
78f0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d  .    pParse->db-
7900: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
7910: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20  _UnresetViews;. 
7920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62   }else{.    pTab
7930: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
7940: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20    nErr++;.  }.  
7950: 73 71 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69  sqliteSelectUnbi
7960: 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69  nd(pSel);.  sqli
7970: 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  teExprListDelete
7980: 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a  (pSel->pEList);.
7990: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
79a0: 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72   pEList;.  retur
79b0: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a  n nErr;  .}../*.
79c0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
79d0: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74  umn names from t
79e0: 68 65 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a  he VIEW pTable..
79f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7a00: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
7a10: 6e 65 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20  never any other 
7a20: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
7a30: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68   modified..** Th
7a40: 65 20 76 69 65 77 20 70 61 73 73 65 64 20 69 6e  e view passed in
7a50: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
7a60: 6d 69 67 68 74 20 64 65 70 65 6e 64 20 64 69 72  might depend dir
7a70: 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63  ectly or indirec
7a80: 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f  tly.** on the mo
7a90: 64 69 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65  dified or delete
7aa0: 64 20 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65  d table so we ne
7ab0: 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20  ed to clear the 
7ac0: 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61  old column.** na
7ad0: 6d 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  mes so that they
7ae0: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75   will be recompu
7af0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
7b00: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
7b10: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54  setColumnNames(T
7b20: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
7b30: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 54   int i;.  if( pT
7b40: 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c  able==0 || pTabl
7b50: 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20  e->pSelect==0 ) 
7b60: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54  return;.  if( pT
7b70: 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 20  able->nCol==0 ) 
7b80: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
7b90: 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  0; i<pTable->nCo
7ba0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  l; i++){.    sql
7bb0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
7bc0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[i].zName);.
7bd0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
7be0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  Table->aCol[i].z
7bf0: 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Dflt);.    sqlit
7c00: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
7c10: 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20  ol[i].zType);.  
7c20: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
7c30: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20  Table->aCol);.  
7c40: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
7c50: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
7c60: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
7c70: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
7c80: 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
7c90: 20 56 49 45 57 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VIEW..*/.void s
7ca0: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
7cb0: 6c 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  l(sqlite *db){. 
7cc0: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
7cd0: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
7ce0: 20 53 51 4c 49 54 45 5f 55 6e 72 65 73 65 74 56   SQLITE_UnresetV
7cf0: 69 65 77 73 29 3d 3d 30 20 29 20 72 65 74 75 72  iews)==0 ) retur
7d00: 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  n;.  for(i=sqlit
7d10: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
7d20: 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69 3d 73  tblHash); i; i=s
7d30: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
7d40: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
7d50: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
7d60: 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
7d70: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
7d80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 69 65  .      sqliteVie
7d90: 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  wResetColumnName
7da0: 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  s(pTab);.    }. 
7db0: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26   }.  db->flags &
7dc0: 3d 20 7e 53 51 4c 49 54 45 5f 55 6e 72 65 73 65  = ~SQLITE_Unrese
7dd0: 74 56 69 65 77 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tViews;.}../*.**
7de0: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
7df0: 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c 65 20  look up a table 
7e00: 77 69 74 68 20 74 68 61 74 20 6e 61 6d 65 2e 20  with that name. 
7e10: 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c   If not found, l
7e20: 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  eave.** an error
7e30: 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20   for the parser 
7e40: 74 6f 20 66 69 6e 64 20 61 6e 64 20 72 65 74 75  to find and retu
7e50: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c  rn NULL..*/.Tabl
7e60: 65 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 46 72  e *sqliteTableFr
7e70: 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70  omToken(Parse *p
7e80: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
7e90: 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ok){.  char *zNa
7ea0: 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  me;.  Table *pTa
7eb0: 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  b;.  zName = sql
7ec0: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
7ed0: 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69  Token(pTok);.  i
7ee0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
7ef0: 74 75 72 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d  turn 0;.  pTab =
7f00: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
7f10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
7f20: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
7f30: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  e(zName);.  if( 
7f40: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
7f50: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
7f60: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
7f70: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
7f80: 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  : ", 0, .       
7f90: 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e   pTok->z, pTok->
7fa0: 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  n, 0);.    pPars
7fb0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20  e->nErr++;.  }. 
7fc0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
7fd0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
7fe0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
7ff0: 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
8000: 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
8010: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
8020: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
8030: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
8040: 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
8050: 20 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c 65   sqliteDropTable
8060: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8070: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e  Token *pName, in
8080: 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61 62  t isView){.  Tab
8090: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64  le *pTable;.  Vd
80a0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73  be *v;.  int bas
80b0: 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  e;.  sqlite *db 
80c0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
80d0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
80e0: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
80f0: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
8100: 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 73  rn;.  pTable = s
8110: 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f  qliteTableFromTo
8120: 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ken(pParse, pNam
8130: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  e);.  if( pTable
8140: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8150: 69 66 28 20 70 54 61 62 6c 65 2d 3e 72 65 61 64  if( pTable->read
8160: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  Only ){.    sqli
8170: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
8180: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
8190: 61 62 6c 65 20 22 2c 20 70 54 61 62 6c 65 2d 3e  able ", pTable->
81a0: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 22  zName, .       "
81b0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
81c0: 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50  ped", 0);.    pP
81d0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
81e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
81f0: 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
8200: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  able->pSelect==0
8210: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
8220: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
8230: 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73 65 20 44  >zErrMsg, "use D
8240: 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
8250: 65 74 65 20 74 61 62 6c 65 20 22 2c 0a 20 20 20  ete table ",.   
8260: 20 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65     pTable->zName
8270: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
8280: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
8290: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
82a0: 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 6c  !isView && pTabl
82b0: 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  e->pSelect ){.  
82c0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
82d0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
82e0: 73 67 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  sg, "use DROP VI
82f0: 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
8300: 77 20 22 2c 0a 20 20 20 20 20 20 70 54 61 62 6c  w ",.      pTabl
8310: 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  e->zName, 0);.  
8320: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
8330: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8340: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
8350: 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
8360: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
8370: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a  he master table.
8380: 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20    ** on disk..  
8390: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
83a0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
83b0: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
83c0: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f  tatic VdbeOp dro
83d0: 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20  pTable[] = {.   
83e0: 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
83f0: 20 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20      0, ADDR(8), 
8400: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
8410: 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30  String,     0, 0
8420: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  ,        0}, /* 
8430: 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  1 */.      { OP_
8440: 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31  MemStore,   1, 1
8450: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
8460: 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c     { OP_MemLoad,
8470: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
8480: 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20   0}, /* 3 */.   
8490: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20     { OP_Column, 
84a0: 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20      0, 2,       
84b0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
84c0: 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Ne,         0, A
84d0: 44 44 52 28 37 29 2c 20 20 30 7d 2c 0a 20 20 20  DDR(7),  0},.   
84e0: 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20     { OP_Delete, 
84f0: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
8500: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
8510: 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41  Next,       0, A
8520: 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a 20  DDR(3),  0}, /* 
8530: 37 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  7 */.    };.    
8540: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
8550: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
8560: 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 42 65  er;.    sqliteBe
8570: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
8580: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61  n(pParse, 0, pTa
8590: 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20  ble->isTemp);.  
85a0: 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74    sqliteOpenMast
85b0: 65 72 54 61 62 6c 65 28 76 2c 20 70 54 61 62 6c  erTable(v, pTabl
85c0: 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  e->isTemp);.    
85d0: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
85e0: 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
85f0: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
8600: 65 69 6e 67 20 64 72 6f 70 70 65 64 20 2a 2f 0a  eing dropped */.
8610: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
8620: 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 3b  Table->pTrigger;
8630: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69  .    while( pTri
8640: 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 54 6f  gger ){.      To
8650: 6b 65 6e 20 74 74 3b 0a 20 20 20 20 20 20 74 74  ken tt;.      tt
8660: 2e 7a 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72  .z = pTable->pTr
8670: 69 67 67 65 72 2d 3e 6e 61 6d 65 3b 0a 20 20 20  igger->name;.   
8680: 20 20 20 74 74 2e 6e 20 3d 20 73 74 72 6c 65 6e     tt.n = strlen
8690: 28 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65  (pTable->pTrigge
86a0: 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  r->name);.      
86b0: 73 71 6c 69 74 65 44 72 6f 70 54 72 69 67 67 65  sqliteDropTrigge
86c0: 72 28 70 50 61 72 73 65 2c 20 26 74 74 2c 20 31  r(pParse, &tt, 1
86d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
86e0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
86f0: 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
8700: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
8710: 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
8720: 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65  .        pTrigge
8730: 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69  r = pTable->pTri
8740: 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gger;.      }.  
8750: 20 20 7d 0a 20 20 20 20 62 61 73 65 20 3d 20 73    }.    base = s
8760: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
8770: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
8780: 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70  dropTable), drop
8790: 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69  Table);.    sqli
87a0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
87b0: 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62 6c 65  , base+1, pTable
87c0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
87d0: 20 69 66 28 20 21 70 54 61 62 6c 65 2d 3e 69 73   if( !pTable->is
87e0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Temp ){.      sq
87f0: 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65  liteChangeCookie
8800: 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20  (db, v);.    }. 
8810: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8820: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
8830: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  0, 0);.    if( !
8840: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
8850: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
8860: 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70  v, OP_Destroy, p
8870: 54 61 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54 61  Table->tnum, pTa
8880: 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20  ble->isTemp);.  
8890: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
88a0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  ble->pIndex; pId
88b0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
88c0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ext){.        sq
88d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
88e0: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 64   OP_Destroy, pId
88f0: 78 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 6c 65 2d  x->tnum, pTable-
8900: 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  >isTemp);.      
8910: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
8920: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
8930: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
8940: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
8950: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63  e in-memory desc
8960: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
8970: 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
8980: 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20 74 68  Exception: if th
8990: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
89a0: 62 65 67 61 6e 20 77 69 74 68 20 74 68 65 20 45  began with the E
89b0: 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a  XPLAIN keyword,.
89c0: 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61    ** then no cha
89d0: 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 6d  nges should be m
89e0: 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ade..  */.  if( 
89f0: 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
8a00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e   ){.    sqliteUn
8a10: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
8a20: 6c 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  le(db, pTable);.
8a30: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
8a40: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
8a50: 61 6e 67 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c  anges;.  }.  sql
8a60: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
8a70: 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  db);.}../*.** Th
8a80: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 73 74  is routine const
8a90: 72 75 63 74 73 20 61 20 50 33 20 73 74 72 69 6e  ructs a P3 strin
8aa0: 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 61  g suitable for a
8ab0: 6e 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 0a  n OP_MakeIdxKey.
8ac0: 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20 61 64  ** opcode and ad
8ad0: 64 73 20 74 68 61 74 20 50 33 20 73 74 72 69 6e  ds that P3 strin
8ae0: 67 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  g to the most re
8af0: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
8b00: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 69  instruction.** i
8b10: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
8b20: 63 68 69 6e 65 2e 20 20 54 68 65 20 50 33 20 73  chine.  The P3 s
8b30: 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 73 20 6f  tring consists o
8b40: 66 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61  f a single chara
8b50: 63 74 65 72 0a 2a 2a 20 66 6f 72 20 65 61 63 68  cter.** for each
8b60: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 69   column in the i
8b70: 6e 64 65 78 20 70 49 64 78 20 6f 66 20 74 61 62  ndex pIdx of tab
8b80: 6c 65 20 70 54 61 62 2e 20 20 49 66 20 74 68 65  le pTab.  If the
8b90: 20 63 6f 6c 75 6d 6e 20 75 73 65 73 0a 2a 2a 20   column uses.** 
8ba0: 61 20 6e 75 6d 65 72 69 63 20 73 6f 72 74 20 6f  a numeric sort o
8bb0: 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20 50  rder, then the P
8bc0: 33 20 73 74 72 69 6e 67 20 63 68 61 72 61 63 74  3 string charact
8bd0: 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  er corresponding
8be0: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 63 6f 6c 75   to.** that colu
8bf0: 6d 6e 20 69 73 20 27 6e 27 2e 20 20 49 66 20 74  mn is 'n'.  If t
8c00: 68 65 20 63 6f 6c 75 6d 6e 20 75 73 65 73 20 61  he column uses a
8c10: 20 74 65 78 74 20 73 6f 72 74 20 6f 72 64 65 72   text sort order
8c20: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 50 33  , then the.** P3
8c30: 20 73 74 72 69 6e 67 20 69 73 20 27 74 27 2e 20   string is 't'. 
8c40: 20 53 65 65 20 74 68 65 20 4f 50 5f 4d 61 6b 65   See the OP_Make
8c50: 49 64 78 4b 65 79 20 6f 70 63 6f 64 65 20 64 6f  IdxKey opcode do
8c60: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 0a  cumentation for.
8c70: 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  ** additional in
8c80: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 65 65 20  formation.  See 
8c90: 61 6c 73 6f 20 74 68 65 20 73 71 6c 69 74 65 41  also the sqliteA
8ca0: 64 64 4b 65 79 54 79 70 65 28 29 20 72 6f 75 74  ddKeyType() rout
8cb0: 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ine..*/.void sql
8cc0: 69 74 65 41 64 64 49 64 78 4b 65 79 54 79 70 65  iteAddIdxKeyType
8cd0: 28 56 64 62 65 20 2a 76 2c 20 49 6e 64 65 78 20  (Vdbe *v, Index 
8ce0: 2a 70 49 64 78 29 7b 0a 20 20 63 68 61 72 20 2a  *pIdx){.  char *
8cf0: 7a 54 79 70 65 3b 0a 20 20 54 61 62 6c 65 20 2a  zType;.  Table *
8d00: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  pTab;.  int i, n
8d10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
8d20: 21 3d 30 20 26 26 20 70 49 64 78 2d 3e 70 54 61  !=0 && pIdx->pTa
8d30: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 70 54 61 62  ble!=0 );.  pTab
8d40: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
8d50: 0a 20 20 6e 20 3d 20 70 49 64 78 2d 3e 6e 43 6f  .  n = pIdx->nCo
8d60: 6c 75 6d 6e 3b 0a 20 20 7a 54 79 70 65 20 3d 20  lumn;.  zType = 
8d70: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 2b  sqliteMalloc( n+
8d80: 31 20 29 3b 0a 20 20 69 66 28 20 7a 54 79 70 65  1 );.  if( zType
8d90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8da0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
8db0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  +){.    int iCol
8dc0: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
8dd0: 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[i];.    assert
8de0: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
8df0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  l<pTab->nCol );.
8e00: 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61      if( (pTab->a
8e10: 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 6f 72 74 4f 72  Col[iCol].sortOr
8e20: 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f  der & SQLITE_SO_
8e30: 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54  TYPEMASK)==SQLIT
8e40: 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20  E_SO_TEXT ){.   
8e50: 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 74     zType[i] = 't
8e60: 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ';.    }else{.  
8e70: 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27      zType[i] = '
8e80: 6e 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n';.    }.  }.  
8e90: 7a 54 79 70 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zType[n] = 0;.  
8ea0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
8eb0: 50 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c  P3(v, -1, zType,
8ec0: 20 6e 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   n);.  sqliteFre
8ed0: 65 28 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(zType);.}../*.
8ee0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8ef0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
8f00: 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
8f10: 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
8f20: 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
8f30: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8f40: 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
8f50: 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
8f60: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
8f70: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
8f80: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
8f90: 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
8fa0: 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
8fb0: 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
8fc0: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
8fd0: 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
8fe0: 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
8ff0: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
9000: 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f  eferred to.  pTo
9010: 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66  Col is a list of
9020: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f   tables in the o
9030: 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c  ther.** pTo tabl
9040: 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
9050: 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f  gn key points to
9060: 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
9070: 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
9080: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
9090: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
90a0: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
90b0: 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
90c0: 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
90d0: 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
90e0: 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
90f0: 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
9100: 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
9110: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
9120: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
9130: 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
9140: 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
9150: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9160: 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77   field.  The new
9170: 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20   FKey.** is not 
9180: 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e  linked into db->
9190: 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f  aFKey at this po
91a0: 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20  int - that does 
91b0: 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e  not happen.** un
91c0: 74 69 6c 20 73 71 6c 69 74 65 45 6e 64 54 61 62  til sqliteEndTab
91d0: 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le()..**.** The 
91e0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
91f0: 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
9200: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
9210: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
9220: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 44 65 66 65  ** to sqliteDefe
9230: 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
9240: 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
9250: 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
9260: 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74  void sqliteCreat
9270: 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
9280: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9290: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
92a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69  ontext */.  IdLi
92b0: 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 20  st *pFromCol,   
92c0: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
92d0: 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
92e0: 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
92f0: 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
9300: 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
9310: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
9320: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64  er table */.  Id
9330: 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
9340: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
9350: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
9360: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
9370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
9380: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
9390: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
93a0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  .){.  Table *p =
93b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
93c0: 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
93d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
93e0: 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
93f0: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
9400: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
9410: 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
9420: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
9430: 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  Err ) goto fk_en
9440: 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
9450: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
9460: 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
9470: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
9480: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
9490: 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
94a0: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 31  & pToCol->nId!=1
94b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
94c0: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
94d0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 66 6f  se->zErrMsg, "fo
94e0: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 22 2c 20  reign key on ", 
94f0: 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  -1,.         p->
9500: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
9510: 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  , -1, .         
9520: 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e  " should referen
9530: 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75  ce only one colu
9540: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 22 2c 20 2d  mn of table ", -
9550: 31 2c 0a 20 20 20 20 20 20 20 20 20 70 54 6f 2d  1,.         pTo-
9560: 3e 7a 2c 20 70 54 6f 2d 3e 6e 2c 20 30 29 3b 0a  >z, pTo->n, 0);.
9570: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
9580: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  rr++;.      goto
9590: 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
95a0: 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
95b0: 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
95c0: 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d  && pToCol->nId!=
95d0: 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b  pFromCol->nId ){
95e0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
95f0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
9600: 72 72 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20  rrMsg, .        
9610: 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
9620: 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
9630: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
9640: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
9650: 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
9660: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
9670: 63 65 64 20 74 61 62 6c 65 22 2c 20 30 29 3b 0a  ced table", 0);.
9680: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
9690: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ++;.    goto fk_
96a0: 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
96b0: 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
96c0: 6c 2d 3e 6e 49 64 3b 0a 20 20 7d 0a 20 20 6e 42  l->nId;.  }.  nB
96d0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46  yte = sizeof(*pF
96e0: 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65  Key) + nCol*size
96f0: 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30  of(pFKey->aCol[0
9700: 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b  ]) + pTo->n + 1;
9710: 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
9720: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9730: 70 54 6f 43 6f 6c 2d 3e 6e 49 64 3b 20 69 2b 2b  pToCol->nId; i++
9740: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
9750: 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d  = strlen(pToCol-
9760: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31  >a[i].zName) + 1
9770: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
9780: 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Key = sqliteMall
9790: 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  oc( nByte );.  i
97a0: 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f  f( pFKey==0 ) go
97b0: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b  to fk_end;.  pFK
97c0: 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
97d0: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
97e0: 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
97f0: 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
9800: 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61  y[1];.  pFKey->a
9810: 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43  Col = (struct sC
9820: 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d  olMap*)z;.  z +=
9830: 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
9840: 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20  ColMap)*nCol;.  
9850: 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a  pFKey->zTo = z;.
9860: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d    memcpy(z, pTo-
9870: 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a  >z, pTo->n);.  z
9880: 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  [pTo->n] = 0;.  
9890: 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
98a0: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
98b0: 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  = 0;.  pFKey->nC
98c0: 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
98d0: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
98e0: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
98f0: 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
9900: 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
9910: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
9920: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
9930: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
9940: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
9950: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
9960: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
9970: 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
9980: 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
9990: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
99a0: 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
99b0: 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
99c0: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
99d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
99e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
99f0: 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
9a00: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
9a10: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
9a20: 45 72 72 4d 73 67 2c 20 22 75 6e 6b 6e 6f 77 6e  ErrMsg, "unknown
9a30: 20 63 6f 6c 75 6d 6e 20 5c 22 22 2c 20 0a 20 20   column \"", .  
9a40: 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
9a50: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 22 5c  ->a[i].zName, "\
9a60: 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
9a70: 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 30 29   definition", 0)
9a80: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
9a90: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
9aa0: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
9ab0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9ac0: 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
9ad0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9ae0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
9af0: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
9b00: 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
9b10: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
9b20: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
9b30: 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  = z;.      memcp
9b40: 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
9b50: 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
9b60: 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
9b70: 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
9b80: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
9b90: 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
9ba0: 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43    pFKey->deleteC
9bb0: 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78  onf = flags & 0x
9bc0: 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64  ff;.  pFKey->upd
9bd0: 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ateConf = (flags
9be0: 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a   >> 8 ) & 0xff;.
9bf0: 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43    pFKey->insertC
9c00: 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
9c10: 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20  16 ) & 0xff;..  
9c20: 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
9c30: 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
9c40: 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
9c50: 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
9c60: 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
9c70: 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
9c80: 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72  _end:.  sqliteFr
9c90: 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73 71 6c  ee(pFKey);.  sql
9ca0: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
9cb0: 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c  pFromCol);.  sql
9cc0: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
9cd0: 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
9ce0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9cf0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
9d00: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
9d10: 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
9d20: 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
9d30: 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
9d40: 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
9d50: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
9d60: 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
9d70: 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
9d80: 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
9d90: 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
9da0: 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
9db0: 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
9dc0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
9dd0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
9de0: 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
9df0: 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
9e00: 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
9e10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 65 66  /.void sqliteDef
9e20: 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72  erForeignKey(Par
9e30: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
9e40: 69 73 44 65 66 65 72 72 65 64 29 7b 0a 20 20 54  isDeferred){.  T
9e50: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b  able *pTab;.  FK
9e60: 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28  ey *pFKey;.  if(
9e70: 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   (pTab = pParse-
9e80: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c  >pNewTable)==0 |
9e90: 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d  | (pFKey = pTab-
9ea0: 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74  >pFKey)==0 ) ret
9eb0: 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73  urn;.  pFKey->is
9ec0: 44 65 66 65 72 72 65 64 20 3d 20 69 73 44 65 66  Deferred = isDef
9ed0: 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erred;.}../*.** 
9ee0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
9ef0: 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
9f00: 62 6c 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20  ble.  pIndex is 
9f10: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
9f20: 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54  index .** and pT
9f30: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
9f40: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
9f50: 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
9f60: 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
9f70: 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
9f80: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
9f90: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
9fa0: 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
9fb0: 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
9fc0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
9fd0: 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
9fe0: 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
9ff0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
a000: 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
a010: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
a020: 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
a030: 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
a040: 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
a050: 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
a060: 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
a070: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
a080: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
a090: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
a0a0: 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
a0b0: 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
a0c0: 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
a0d0: 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
a0e0: 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
a0f0: 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
a100: 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
a110: 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
a120: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
a130: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
a140: 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64  ction.  .*/.void
a150: 20 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64   sqliteCreateInd
a160: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
a170: 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  rse,   /* All in
a180: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
a190: 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
a1a0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
a1b0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
a1c0: 69 6e 64 65 78 2e 20 20 4d 61 79 20 62 65 20 4e  index.  May be N
a1d0: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
a1e0: 70 54 61 62 6c 65 2c 20 20 20 2f 2a 20 4e 61 6d  pTable,   /* Nam
a1f0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
a200: 6f 20 69 6e 64 65 78 2e 20 20 55 73 65 20 70 50  o index.  Use pP
a210: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
a220: 69 66 20 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74  if 0 */.  IdList
a230: 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20   *pList,   /* A 
a240: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
a250: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
a260: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
a270: 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
a280: 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
a290: 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
a2a0: 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
a2b0: 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20  Start,   /* The 
a2c0: 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
a2d0: 74 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54  t begins a CREAT
a2e0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
a2f0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  t */.  Token *pE
a300: 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  nd      /* The "
a310: 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74  )" that closes t
a320: 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
a330: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  statement */.){.
a340: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
a350: 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
a360: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49  e indexed */.  I
a370: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
a380: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
a390: 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
a3a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
a3b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54  .  int i, j;.  T
a3c0: 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20  oken nullId;    
a3d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65           /* Fake
a3e0: 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
a3f0: 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
a400: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
a410: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
a420: 68 69 64 65 4e 61 6d 65 20 3d 20 30 3b 20 20 20  hideName = 0;   
a430: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
a440: 70 75 74 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  put table name i
a450: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
a460: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73   */..  if( pPars
a470: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
a480: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
a490: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
a4a0: 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a  te_index;..  /*.
a4b0: 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
a4c0: 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
a4d0: 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
a4e0: 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
a4f0: 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
a500: 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  ( pTable!=0 ){. 
a510: 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
a520: 21 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  !=0 );.    pTab 
a530: 3d 20 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72  =  sqliteTableFr
a540: 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20  omToken(pParse, 
a550: 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  pTable);.  }else
a560: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
a570: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame==0 );.    pT
a580: 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e  ab =  pParse->pN
a590: 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  ewTable;.  }.  i
a5a0: 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50  f( pTab==0 || pP
a5b0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
a5c0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
a5d0: 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  dex;.  if( pTab-
a5e0: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
a5f0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
a600: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
a610: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61  g, "table ", pTa
a620: 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  b->zName, .     
a630: 20 22 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20   " may not have 
a640: 6e 65 77 20 69 6e 64 69 63 65 73 20 61 64 64 65  new indices adde
a650: 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  d", 0);.    pPar
a660: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
a670: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
a680: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
a690: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
a6a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
a6b0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
a6c0: 7a 45 72 72 4d 73 67 2c 20 22 76 69 65 77 73 20  zErrMsg, "views 
a6d0: 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
a6e0: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
a6f0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
a700: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
a710: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
a720: 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78  /* If this index
a730: 20 69 73 20 63 72 65 61 74 65 64 20 77 68 69 6c   is created whil
a740: 65 20 72 65 2d 72 65 61 64 69 6e 67 20 74 68 65  e re-reading the
a750: 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 73 71 6c   schema from sql
a760: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
a770: 62 75 74 20 74 68 65 20 74 61 62 6c 65 20 61 73  but the table as
a780: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
a790: 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 74 65  is index is a te
a7a0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 69  mporary table, i
a7b0: 74 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  t can.  ** only 
a7c0: 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 74 61  mean that the ta
a7d0: 62 6c 65 20 74 68 61 74 20 74 68 69 73 20 69 6e  ble that this in
a7e0: 64 65 78 20 69 73 20 72 65 61 6c 6c 79 20 61 73  dex is really as
a7f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 69 73  sociated with is
a800: 0a 20 20 2a 2a 20 6f 6e 65 20 77 68 6f 73 65 20  .  ** one whose 
a810: 6e 61 6d 65 20 69 73 20 68 69 64 64 65 6e 20 62  name is hidden b
a820: 65 68 69 6e 64 20 61 20 74 65 6d 70 6f 72 61 72  ehind a temporar
a830: 79 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  y table with the
a840: 20 73 61 6d 65 20 6e 61 6d 65 2e 0a 20 20 2a 2a   same name..  **
a850: 20 53 69 6e 63 65 20 69 74 73 20 74 61 62 6c 65   Since its table
a860: 20 68 61 73 20 62 65 65 6e 20 73 75 70 70 72 65   has been suppre
a870: 73 73 65 64 2c 20 77 65 20 6e 65 65 64 20 74 6f  ssed, we need to
a880: 20 61 6c 73 6f 20 73 75 70 70 72 65 73 73 20 74   also suppress t
a890: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20  he.  ** index.. 
a8a0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
a8b0: 2d 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 21 70  ->initFlag && !p
a8c0: 50 61 72 73 65 2d 3e 69 73 54 65 6d 70 20 26 26  Parse->isTemp &&
a8d0: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b   pTab->isTemp ){
a8e0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
a8f0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
a900: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
a910: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
a920: 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
a930: 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
a940: 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
a950: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
a960: 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
a970: 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
a980: 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
a990: 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
a9a0: 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
a9b0: 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
a9c0: 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
a9d0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
a9e0: 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
a9f0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
aa00: 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
aa10: 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
aa20: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
aa30: 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
aa40: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
aa50: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
aa60: 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
aa70: 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
aa80: 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
aa90: 68 69 73 20 69 6e 64 65 78 2c 20 62 75 74 20 77  his index, but w
aaa0: 65 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  e will not.  ** 
aab0: 73 74 6f 72 65 20 69 74 73 20 6e 61 6d 65 20 69  store its name i
aac0: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
aad0: 2e 20 20 53 65 74 20 74 68 65 20 68 69 64 65 4e  .  Set the hideN
aae0: 61 6d 65 20 66 6c 61 67 20 74 6f 20 61 63 63 6f  ame flag to acco
aaf0: 6d 70 6c 69 73 68 0a 20 20 2a 2a 20 74 68 69 73  mplish.  ** this
ab00: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
ab10: 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
ab20: 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
ab30: 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
ab40: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
ab50: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
ab60: 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
ab70: 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
ab80: 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
ab90: 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
aba0: 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61   Index *pISameNa
abb0: 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  me;    /* Anothe
abc0: 72 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  r index with the
abd0: 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   same name */.  
abe0: 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e    Table *pTSameN
abf0: 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62  ame;    /* A tab
ac00: 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d  le with same nam
ac10: 65 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a  e as the index *
ac20: 2f 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  /.    zName = sq
ac30: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f  liteTableNameFro
ac40: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
ac50: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
ac60: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
ac70: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
ac80: 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20  ( (pISameName = 
ac90: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
aca0: 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29  db, zName))!=0 )
acb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 53 61  {.      if( pISa
acc0: 6d 65 4e 61 6d 65 2d 3e 70 54 61 62 6c 65 2d 3e  meName->pTable->
acd0: 69 73 54 65 6d 70 20 26 26 20 70 50 61 72 73 65  isTemp && pParse
ace0: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
acf0: 20 20 20 20 20 20 68 69 64 65 4e 61 6d 65 20 3d        hideName =
ad00: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
ad10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53  .        sqliteS
ad20: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
ad30: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64 65  ->zErrMsg, "inde
ad40: 78 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20  x ", zName, .   
ad50: 20 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64          " alread
ad60: 79 20 65 78 69 73 74 73 22 2c 20 30 29 3b 0a 20  y exists", 0);. 
ad70: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
ad80: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67  Err++;.        g
ad90: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
ada0: 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
adb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 54     }.    if( (pT
adc0: 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74  SameName = sqlit
add0: 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
ade0: 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  Name))!=0 ){.   
adf0: 20 20 20 69 66 28 20 70 54 53 61 6d 65 4e 61 6d     if( pTSameNam
ae00: 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70 50 61  e->isTemp && pPa
ae10: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b  rse->initFlag ){
ae20: 0a 20 20 20 20 20 20 20 20 68 69 64 65 4e 61 6d  .        hideNam
ae30: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  e = 1;.      }el
ae40: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
ae50: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
ae60: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
ae70: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
ae80: 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 2c  a table named ",
ae90: 0a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  .           zNam
aea0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  e, 0);.        p
aeb0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
aec0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
aed0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
aee0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
aef0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
af00: 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74  Buf[30];.    int
af10: 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
af20: 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
af30: 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
af40: 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
af50: 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
af60: 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72  , n++){}.    spr
af70: 69 6e 74 66 28 7a 42 75 66 2c 22 25 64 29 22 2c  intf(zBuf,"%d)",
af80: 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  n);.    zName = 
af90: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  0;.    sqliteSet
afa0: 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22  String(&zName, "
afb0: 28 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  (", pTab->zName,
afc0: 20 22 20 61 75 74 6f 69 6e 64 65 78 20 22 2c 20   " autoindex ", 
afd0: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 69 66  zBuf, 0);.    if
afe0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
aff0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
b000: 64 65 78 3b 0a 20 20 20 20 68 69 64 65 4e 61 6d  dex;.    hideNam
b010: 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e  e = sqliteFindIn
b020: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 21 3d  dex(db, zName)!=
b030: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
b040: 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
b050: 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
b060: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
b070: 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
b080: 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
b090: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
b0a0: 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
b0b0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
b0c0: 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
b0d0: 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
b0e0: 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
b0f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
b100: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c  t==0 ){.    null
b110: 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Id.z = pTab->aCo
b120: 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e  l[pTab->nCol-1].
b130: 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49  zName;.    nullI
b140: 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c  d.n = strlen(nul
b150: 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73  lId.z);.    pLis
b160: 74 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74  t = sqliteIdList
b170: 41 70 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49  Append(0, &nullI
b180: 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  d);.    if( pLis
b190: 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
b1a0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
b1b0: 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
b1c0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
b1d0: 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
b1e0: 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  */.  pIndex = sq
b1f0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
b200: 6f 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c  of(Index) + strl
b210: 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a  en(zName) + 1 +.
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69          sizeof(i
b240: 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29  nt)*pList->nId )
b250: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
b260: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
b270: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49  eate_index;.  pI
b280: 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  ndex->aiColumn =
b290: 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31   (int*)&pIndex[1
b2a0: 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ];.  pIndex->zNa
b2b0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e  me = (char*)&pIn
b2c0: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c  dex->aiColumn[pL
b2d0: 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72  ist->nId];.  str
b2e0: 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
b2f0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  e, zName);.  pIn
b300: 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
b310: 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
b320: 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
b330: 49 64 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  Id;.  pIndex->on
b340: 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
b350: 69 73 55 6e 69 71 75 65 20 3d 20 6f 6e 45 72 72  isUnique = onErr
b360: 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75  or;.  pIndex->au
b370: 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d  toIndex = pName=
b380: 3d 30 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74  =0;..  /* Scan t
b390: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
b3a0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
b3b0: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
b3c0: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64  ed and.  ** load
b3d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69   the column indi
b3e0: 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64  ces into the Ind
b3f0: 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  ex structure.  R
b400: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20  eport an error. 
b410: 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d   ** if any colum
b420: 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  n is not found..
b430: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
b440: 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
b450: 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  +){.    for(j=0;
b460: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
b470: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
b480: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69  qliteStrICmp(pLi
b490: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
b4a0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
b4b0: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
b4c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
b4d0: 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
b4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
b4f0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
b500: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
b510: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a  , pTab->zName, .
b520: 20 20 20 20 20 20 20 20 22 20 68 61 73 20 6e 6f          " has no
b530: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c   column named ",
b540: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
b550: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  me, 0);.      pP
b560: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
b570: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
b580: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f  Index);.      go
b590: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
b5a0: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
b5b0: 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
b5c0: 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20  [i] = j;.  }..  
b5d0: 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
b5e0: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
b5f0: 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
b600: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
b610: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
b620: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
b630: 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  . .  */.  if( !p
b640: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26  Parse->explain &
b650: 26 20 21 68 69 64 65 4e 61 6d 65 20 29 7b 0a 20  & !hideName ){. 
b660: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
b670: 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49   p = sqliteHashI
b680: 6e 73 65 72 74 28 26 64 62 2d 3e 69 64 78 48 61  nsert(&db->idxHa
b690: 73 68 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  sh, pIndex->zNam
b6a0: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
b6b0: 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  +1, pIndex);.   
b6c0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
b6d0: 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65  assert( p==pInde
b6e0: 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  x );  /* Malloc 
b6f0: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
b700: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
b710: 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20  Free(pIndex);.  
b720: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
b730: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
b740: 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
b750: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
b760: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20  Changes;.  }..  
b770: 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61  /* When adding a
b780: 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  n index to the l
b790: 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66  ist of indices f
b7a0: 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65  or a table, make
b7b0: 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69  .  ** sure all i
b7c0: 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f  ndices labeled O
b7d0: 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61  E_Replace come a
b7e0: 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c  fter all those l
b7f0: 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49  abeled.  ** OE_I
b800: 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20  gnore.  This is 
b810: 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68  necessary for th
b820: 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  e correct operat
b830: 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20  ion of UPDATE.  
b840: 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20  ** and INSERT.. 
b850: 20 2a 2f 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f   */.  if( onErro
b860: 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
b870: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
b880: 0a 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d  .       || pTab-
b890: 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
b8a0: 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
b8b0: 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
b8c0: 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
b8d0: 0a 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65  .    pTab->pInde
b8e0: 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65  x = pIndex;.  }e
b8f0: 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  lse{.    Index *
b900: 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
b910: 49 6e 64 65 78 3b 0a 20 20 20 20 77 68 69 6c 65  Index;.    while
b920: 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
b930: 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
b940: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
b950: 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 70  place ){.      p
b960: 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
b970: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
b980: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
b990: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
b9a0: 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
b9b0: 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a  t = pIndex;.  }.
b9c0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69  .  /* If the ini
b9d0: 74 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d 65  tFlag is 1 it me
b9e0: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
b9f0: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
ba00: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
ba10: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
ba20: 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64   the disk.  So d
ba30: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
ba40: 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61  he disk.  ** aga
ba50: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
ba60: 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72   table number fr
ba70: 6f 6d 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e  om the pParse->n
ba80: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20  ewTnum field..  
ba90: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
baa0: 3e 69 6e 69 74 46 6c 61 67 20 26 26 20 70 54 61  >initFlag && pTa
bab0: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 49  ble!=0 ){.    pI
bac0: 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 70 50 61  ndex->tnum = pPa
bad0: 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20  rse->newTnum;.  
bae0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69  }..  /* If the i
baf0: 6e 69 74 46 6c 61 67 20 69 73 20 30 20 74 68 65  nitFlag is 0 the
bb00: 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
bb10: 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
bb20: 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
bb30: 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
bb40: 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
bb50: 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
bb60: 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
bb70: 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
bb80: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
bb90: 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
bba0: 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   The initFlag is
bbb0: 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72   0 when the user
bbc0: 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20   first enters a 
bbd0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20  CREATE INDEX .  
bbe0: 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65  ** command.  The
bbf0: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20 77   initFlag is 1 w
bc00: 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69  hen a database i
bc10: 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20  s opened and .  
bc20: 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ** CREATE INDEX 
bc30: 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72  statements are r
bc40: 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ead out of the m
bc50: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e  aster table.  In
bc60: 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72  .  ** the latter
bc70: 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20   case the index 
bc80: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f  already exists o
bc90: 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73  n disk, which is
bca0: 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   why.  ** we don
bcb0: 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65  't want to recre
bcc0: 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a  ate it..  **.  *
bcd0: 2a 20 49 66 20 70 54 61 62 6c 65 3d 3d 30 20 69  * If pTable==0 i
bce0: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
bcf0: 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
bd00: 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  as a primary key
bd10: 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20  .  ** or UNIQUE 
bd20: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20  constraint of a 
bd30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
bd40: 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
bd50: 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
bd60: 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
bd70: 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
bd80: 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
bd90: 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
bda0: 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20  ation.  ** step 
bdb0: 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
bdc0: 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
bdd0: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
bde0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
bdf0: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
be00: 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c     int lbl1, lbl
be10: 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  2;.    int i;.  
be20: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
be30: 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 70 54 61  int isTemp = pTa
be40: 62 2d 3e 69 73 54 65 6d 70 3b 0a 0a 20 20 20 20  b->isTemp;..    
be50: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
be60: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
be70: 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
be80: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
be90: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
bea0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
beb0: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
bec0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
bed0: 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 20  , isTemp);.     
bee0: 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65   sqliteOpenMaste
bef0: 72 54 61 62 6c 65 28 76 2c 20 69 73 54 65 6d 70  rTable(v, isTemp
bf00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
bf10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
bf20: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20  OP_NewRecno, 0, 
bf30: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
bf40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
bf50: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
bf60: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
bf70: 65 50 33 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65  eP3(v, -1, "inde
bf80: 78 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  x", P3_STATIC);.
bf90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
bfa0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
bfb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
bfc0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
bfd0: 76 2c 20 2d 31 2c 20 70 49 6e 64 65 78 2d 3e 7a  v, -1, pIndex->z
bfe0: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
bff0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
c000: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
c010: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ng, 0, 0);.    s
c020: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
c030: 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a  3(v, -1, pTab->z
c040: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
c050: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
c060: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c070: 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
c080: 30 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20 20  0, isTemp);.    
c090: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
c0a0: 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P3(v, addr, (cha
c0b0: 72 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  r*)&pIndex->tnum
c0c0: 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20  , P3_POINTER);. 
c0d0: 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
c0e0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54 61  = 0;.    if( pTa
c0f0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
c100: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c110: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
c120: 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20       if( isTemp 
c130: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c140: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
c150: 5f 4f 70 65 6e 57 72 41 75 78 2c 20 31 2c 20 30  _OpenWrAux, 1, 0
c160: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
c170: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
c180: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
c190: 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a  enWrite, 1, 0);.
c1a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c1b0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
c1c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
c1d0: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
c1e0: 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20    if( pStart && 
c1f0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 6e 20  pEnd ){.      n 
c200: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
c210: 2d 20 41 64 64 72 28 70 53 74 61 72 74 2d 3e 7a  - Addr(pStart->z
c220: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
c230: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
c240: 76 2c 20 61 64 64 72 2c 20 70 53 74 61 72 74 2d  v, addr, pStart-
c250: 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >z, n);.    }.  
c260: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
c270: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
c280: 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20 20 20 73  rd, 5, 0);.    s
c290: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c2a0: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
c2b0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
c2c0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  Table ){.      s
c2d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c2e0: 2c 20 69 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70  , isTemp ? OP_Op
c2f0: 65 6e 41 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 2c  enAux : OP_Open,
c300: 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b   2, pTab->tnum);
c310: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
c320: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
c330: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pTab->zName, P3
c340: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
c350: 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 56 64 62  lbl2 = sqliteVdb
c360: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
c370: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
c380: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
c390: 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  d, 2, lbl2);.   
c3a0: 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65     lbl1 = sqlite
c3b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c3c0: 52 65 63 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20  Recno, 2, 0);.  
c3d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c3e0: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
c3f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
c400: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c410: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70   OP_Column, 2, p
c420: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
c430: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
c440: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
c450: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78  Op(v, OP_MakeIdx
c460: 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  Key, pIndex->nCo
c470: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
c480: 69 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  if( db->file_for
c490: 6d 61 74 3e 3d 34 20 29 20 73 71 6c 69 74 65 41  mat>=4 ) sqliteA
c4a0: 64 64 49 64 78 4b 65 79 54 79 70 65 28 76 2c 20  ddIdxKeyType(v, 
c4b0: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 73  pIndex);.      s
c4c0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
c4d0: 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20  , OP_IdxPut, 1, 
c4e0: 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
c4f0: 3d 4f 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20  =OE_None);.     
c500: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c510: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20  (v, OP_Next, 2, 
c520: 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  lbl1);.      sql
c530: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
c540: 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20  bel(v, lbl2);.  
c550: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c560: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
c570: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   2, 0);.      sq
c580: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c590: 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29   OP_Close, 1, 0)
c5a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c5b0: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
c5c0: 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20 29     if( !isTemp )
c5d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c5e0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
c5f0: 20 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   v);.      }.   
c600: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
c610: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
c620: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
c630: 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61  iteEndWriteOpera
c640: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
c650: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c    }.  }..  /* Cl
c660: 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
c670: 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
c680: 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71  eate_index:.  sq
c690: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
c6a0: 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  (pList);.  sqlit
c6b0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
c6c0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
c6d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
c6e0: 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
c6f0: 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
c700: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
c710: 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
c720: 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
c730: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
c740: 71 6c 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50  qliteDropIndex(P
c750: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
c760: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49  ken *pName){.  I
c770: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
c780: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56  char *zName;.  V
c790: 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
c7a0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
c7b0: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
c7c0: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
c7d0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
c7e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7a 4e 61 6d 65   return;.  zName
c7f0: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
c800: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
c810: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  e);.  if( zName=
c820: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
c830: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 46 69  Index = sqliteFi
c840: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
c850: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
c860: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  (zName);.  if( p
c870: 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
c880: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
c890: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
c8a0: 67 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  g, "no such inde
c8b0: 78 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20  x: ", 0, .      
c8c0: 20 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d    pName->z, pNam
c8d0: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50  e->n, 0);.    pP
c8e0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
c8f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
c900: 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  if( pIndex->auto
c910: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
c920: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
c930: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
c940: 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
c950: 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
c960: 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
c970: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
c980: 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
c990: 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  d", 0);.    pPar
c9a0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
c9b0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
c9c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c9d0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
c9e0: 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
c9f0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
ca00: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
ca10: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
ca20: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61  if( v ){.    sta
ca30: 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70 49  tic VdbeOp dropI
ca40: 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndex[] = {.     
ca50: 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
ca60: 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d    0, ADDR(9), 0}
ca70: 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  , .      { OP_St
ca80: 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20  ring,     0, 0, 
ca90: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a        0}, /* 1 *
caa0: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  /.      { OP_Mem
cab0: 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20  Store,   1, 1,  
cac0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
cad0: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20   OP_MemLoad,    
cae0: 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  1, 0,       0}, 
caf0: 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
cb00: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
cb10: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
cb20: 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20       { OP_Eq,   
cb30: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29        0, ADDR(8)
cb40: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
cb50: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
cb60: 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(3), 0},.   
cb70: 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20     { OP_Goto,   
cb80: 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
cb90: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
cba0: 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
cbb0: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38 20         0}, /* 8 
cbc0: 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
cbd0: 74 20 62 61 73 65 3b 0a 20 20 20 20 54 61 62 6c  t base;.    Tabl
cbe0: 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
cbf0: 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 20 20 73  ->pTable;..    s
cc00: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
cc10: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
cc20: 20 30 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70   0, pTab->isTemp
cc30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65  );.    sqliteOpe
cc40: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
cc50: 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b 0a 20  pTab->isTemp);. 
cc60: 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
cc70: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
cc80: 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49   ArraySize(dropI
cc90: 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78  ndex), dropIndex
cca0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
ccb0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
ccc0: 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  e+1, pIndex->zNa
ccd0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  me, 0);.    if( 
cce0: 21 70 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b  !pTab->isTemp ){
ccf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43 68 61  .      sqliteCha
cd00: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29  ngeCookie(db, v)
cd10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
cd20: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
cd30: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
cd40: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
cd50: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
cd60: 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  y, pIndex->tnum,
cd70: 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b 0a   pTab->isTemp);.
cd80: 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69      sqliteEndWri
cd90: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
cda0: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  se);.  }..  /* D
cdb0: 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  elete the in-mem
cdc0: 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ory description 
cdd0: 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  of this index.. 
cde0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
cdf0: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
ce00: 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e    sqliteUnlinkAn
ce10: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  dDeleteIndex(db,
ce20: 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64 62   pIndex);.    db
ce30: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
ce40: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
ce50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  .  }.}../*.** Ap
ce60: 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
ce70: 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
ce80: 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
ce90: 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
cea0: 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
ceb0: 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
cec0: 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
ced0: 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
cee0: 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
cef0: 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70   *sqliteIdListAp
cf00: 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69  pend(IdList *pLi
cf10: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
cf20: 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  n){.  if( pList=
cf30: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
cf40: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
cf50: 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
cf60: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
cf70: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
cf80: 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d   }.  if( (pList-
cf90: 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20 29 7b 0a  >nId & 7)==0 ){.
cfa0: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
cfb0: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61  t_item *a;.    a
cfc0: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
cfd0: 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73  (pList->a, (pLis
cfe0: 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66  t->nId+8)*sizeof
cff0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b  (pList->a[0]) );
d000: 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  .    if( a==0 ){
d010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c  .      sqliteIdL
d020: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
d030: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
d040: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
d050: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
d060: 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61  memset(&pList->a
d070: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c  [pList->nId], 0,
d080: 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
d090: 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f  [0]));.  if( pTo
d0a0: 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ken ){.    char 
d0b0: 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61  **pz = &pList->a
d0c0: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61  [pList->nId].zNa
d0d0: 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  me;.    sqliteSe
d0e0: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f  tNString(pz, pTo
d0f0: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
d100: 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a  n, 0);.    if( *
d110: 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  pz==0 ){.      s
d120: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
d130: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
d140: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
d150: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
d160: 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20  eDequote(*pz);. 
d170: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74     }.  }.  pList
d180: 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72  ->nId++;.  retur
d190: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
d1a0: 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74  * Append a new t
d1b0: 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65  able name to the
d1c0: 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20   given SrcList. 
d1d0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72   Create a new Sr
d1e0: 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  cList if.** need
d1f0: 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   be.  A new entr
d200: 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  y is created in 
d210: 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e  the SrcList even
d220: 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55   if pToken is NU
d230: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  LL..**.** A new 
d240: 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
d250: 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
d260: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
d270: 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
d280: 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  teSrcListAppend(
d290: 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
d2a0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
d2b0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
d2c0: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
d2d0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
d2e0: 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
d2f0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
d300: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
d310: 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 53 72   if( (pList->nSr
d320: 63 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  c & 7)==0 ){.   
d330: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
d340: 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 20 3d  item *a;.    a =
d350: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
d360: 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d  List->a, (pList-
d370: 3e 6e 53 72 63 2b 38 29 2a 73 69 7a 65 6f 66 28  >nSrc+8)*sizeof(
d380: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a  pList->a[0]) );.
d390: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
d3a0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 72 63 4c        sqliteSrcL
d3b0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
d3c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
d3d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
d3e0: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
d3f0: 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61  memset(&pList->a
d400: 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c 20 30  [pList->nSrc], 0
d410: 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
d420: 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54  a[0]));.  if( pT
d430: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  oken ){.    char
d440: 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e   **pz = &pList->
d450: 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a  a[pList->nSrc].z
d460: 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Name;.    sqlite
d470: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
d480: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
d490: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ->n, 0);.    if(
d4a0: 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20   *pz==0 ){.     
d4b0: 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65   sqliteSrcListDe
d4c0: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
d4d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
d4e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
d4f0: 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29  liteDequote(*pz)
d500: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c  ;.    }.  }.  pL
d510: 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72  ist->nSrc++;.  r
d520: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
d530: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69  /*.** Add an ali
d540: 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69  as to the last i
d550: 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65  dentifier on the
d560: 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65   given identifie
d570: 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
d580: 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41 64 64  sqliteSrcListAdd
d590: 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70  Alias(SrcList *p
d5a0: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
d5b0: 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
d5c0: 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63  t && pList->nSrc
d5d0: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  >0 ){.    int i 
d5e0: 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 2d 20  = pList->nSrc - 
d5f0: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  1;.    sqliteSet
d600: 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e  NString(&pList->
d610: 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f  a[i].zAlias, pTo
d620: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
d630: 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 0);.    sqlit
d640: 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e  eDequote(pList->
d650: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
d660: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
d670: 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
d680: 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73  void sqliteIdLis
d690: 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a  tDelete(IdList *
d6a0: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
d6b0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
d6c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
d6d0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
d6e0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
d6f0: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
d700: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
d710: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
d720: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
d730: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
d740: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d750: 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
d760: 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
d770: 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
d780: 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
d790: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
d7a0: 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e 64 65  sqliteIdListInde
d7b0: 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
d7c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
d7d0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
d7e0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
d7f0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
d800: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
d810: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
d820: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70   sqliteStrICmp(p
d830: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
d840: 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  , zName)==0 ) re
d850: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
d860: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
d870: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
d880: 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
d890: 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
d8a0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
d8b0: 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74  id sqliteSrcList
d8c0: 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a  Delete(SrcList *
d8d0: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
d8e0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
d8f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
d900: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
d910: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  rc; i++){.    sq
d920: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
d930: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
d940: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
d950: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b  t->a[i].zAlias);
d960: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
d970: 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69  a[i].pTab && pLi
d980: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69  st->a[i].pTab->i
d990: 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
d9a0: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
d9b0: 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e  Table(0, pList->
d9c0: 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20  a[i].pTab);.    
d9d0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65  }.    sqliteSele
d9e0: 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e  ctDelete(pList->
d9f0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
da00: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
da10: 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ete(pList->a[i].
da20: 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
da30: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
da40: 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29  st->a[i].pUsing)
da50: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
da60: 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
da70: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
da80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
da90: 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 69 73 20  COPY command is 
daa0: 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  for compatibilit
dab0: 79 20 77 69 74 68 20 50 6f 73 74 67 72 65 53 51  y with PostgreSQ
dac0: 4c 20 61 6e 64 20 73 70 65 63 69 66 69 63 69 61  L and specificia
dad0: 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68 65 20 61  lly.** for the a
dae0: 62 69 6c 69 74 79 20 74 6f 20 72 65 61 64 20 74  bility to read t
daf0: 68 65 20 6f 75 74 70 75 74 20 6f 66 20 70 67 5f  he output of pg_
db00: 64 75 6d 70 2e 20 20 54 68 65 20 66 6f 72 6d 61  dump.  The forma
db10: 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f  t is as.** follo
db20: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50  ws:.**.**    COP
db30: 59 20 74 61 62 6c 65 20 46 52 4f 4d 20 66 69 6c  Y table FROM fil
db40: 65 20 5b 55 53 49 4e 47 20 44 45 4c 49 4d 49 54  e [USING DELIMIT
db50: 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a  ERS string].**.*
db60: 2a 20 22 74 61 62 6c 65 22 20 69 73 20 61 6e 20  * "table" is an 
db70: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6e  existing table n
db80: 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c 20 72 65  ame.  We will re
db90: 61 64 20 6c 69 6e 65 73 20 6f 66 20 63 6f 64 65  ad lines of code
dba0: 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f   from.** file to
dbb0: 20 66 69 6c 6c 20 74 68 69 73 20 74 61 62 6c 65   fill this table
dbc0: 20 77 69 74 68 20 64 61 74 61 2e 20 20 46 69 6c   with data.  Fil
dbd0: 65 20 6d 69 67 68 74 20 62 65 20 22 73 74 64 69  e might be "stdi
dbe0: 6e 22 2e 20 20 54 68 65 20 6f 70 74 69 6f 6e 61  n".  The optiona
dbf0: 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65 72 20 73  l.** delimiter s
dc00: 74 72 69 6e 67 20 69 64 65 6e 74 69 66 69 65 73  tring identifies
dc10: 20 74 68 65 20 66 69 65 6c 64 20 73 65 70 61 72   the field separ
dc20: 61 74 6f 72 73 2e 20 20 54 68 65 20 64 65 66 61  ators.  The defa
dc30: 75 6c 74 20 69 73 20 61 20 74 61 62 2e 0a 2a 2f  ult is a tab..*/
dc40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 70 79  .void sqliteCopy
dc50: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
dc60: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
dc70: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
dc80: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
dc90: 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 54 68 65 20  eName,   /* The 
dca0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
dcb0: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
dcc0: 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a 2f 0a 20  will insert */. 
dcd0: 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e 61 6d   Token *pFilenam
dce0: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c  e,    /* The fil
dcf0: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
dd00: 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69  obtain informati
dd10: 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
dd20: 44 65 6c 69 6d 69 74 65 72 2c 20 20 20 2f 2a 20  Delimiter,   /* 
dd30: 55 73 65 20 74 68 69 73 20 61 73 20 74 68 65 20  Use this as the 
dd40: 66 69 65 6c 64 20 64 65 6c 69 6d 69 74 65 72 20  field delimiter 
dd50: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
dd60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
dd70: 74 20 74 6f 20 64 6f 20 69 66 20 61 20 63 6f 6e  t to do if a con
dd80: 73 74 72 61 69 6e 74 20 66 61 69 6c 73 20 2a 2f  straint fails */
dd90: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
dda0: 62 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 3b  b;.  char *zTab;
ddb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
ddc0: 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64 72 2c   *v;.  int addr,
ddd0: 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a 70   end;.  Index *p
dde0: 49 64 78 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64  Idx;.  sqlite *d
ddf0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
de00: 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65  .  zTab = sqlite
de10: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
de20: 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  en(pTableName);.
de30: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c    if( sqlite_mal
de40: 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 7a 54  loc_failed || zT
de50: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63 6f 70  ab==0 ) goto cop
de60: 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 61  y_cleanup;.  pTa
de70: 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  b = sqliteTableN
de80: 61 6d 65 54 6f 54 61 62 6c 65 28 70 50 61 72 73  ameToTable(pPars
de90: 65 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69  e, zTab);.  sqli
dea0: 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20  teFree(zTab);.  
deb0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
dec0: 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b  to copy_cleanup;
ded0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
dee0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
def0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74  if( v ){.    int
df00: 20 6f 70 65 6e 4f 70 3b 0a 20 20 20 20 73 71 6c   openOp;.    sql
df10: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
df20: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
df30: 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b  , pTab->isTemp);
df40: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
df50: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
df60: 50 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30  P_FileOpen, 0, 0
df70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
df80: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
df90: 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c  r, pFilename->z,
dfa0: 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a   pFilename->n);.
dfb0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
dfc0: 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29  quoteP3(v, addr)
dfd0: 3b 0a 20 20 20 20 6f 70 65 6e 4f 70 20 3d 20 70  ;.    openOp = p
dfe0: 54 61 62 2d 3e 69 73 54 65 6d 70 20 3f 20 4f 50  Tab->isTemp ? OP
dff0: 5f 4f 70 65 6e 57 72 41 75 78 20 3a 20 4f 50 5f  _OpenWrAux : OP_
e000: 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 73  OpenWrite;.    s
e010: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
e020: 2c 20 6f 70 65 6e 4f 70 2c 20 30 2c 20 70 54 61  , openOp, 0, pTa
e030: 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71  b->tnum);.    sq
e040: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
e050: 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e  (v, -1, pTab->zN
e060: 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ame, P3_STATIC);
e070: 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49  .    for(i=1, pI
e080: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
e090: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
e0a0: 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20  ->pNext, i++){. 
e0b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
e0c0: 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20  ddOp(v, openOp, 
e0d0: 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a  i, pIdx->tnum);.
e0e0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
e0f0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
e100: 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  pIdx->zName, P3_
e110: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20  STATIC);.    }. 
e120: 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
e130: 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52   & SQLITE_CountR
e140: 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ows ){.      sql
e150: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
e160: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
e170: 29 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  );  /* Initializ
e180: 65 20 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 20  e the row count 
e190: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 64  */.    }.    end
e1a0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
e1b0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 61  eLabel(v);.    a
e1c0: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
e1d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65  AddOp(v, OP_File
e1e0: 52 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  Read, pTab->nCol
e1f0: 2c 20 65 6e 64 29 3b 0a 20 20 20 20 69 66 28 20  , end);.    if( 
e200: 70 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a 20 20  pDelimiter ){.  
e210: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
e220: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
e230: 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20 70  pDelimiter->z, p
e240: 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20  Delimiter->n);. 
e250: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44       sqliteVdbeD
e260: 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72  equoteP3(v, addr
e270: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
e280: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
e290: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
e2a0: 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  "\t", 1);.    }.
e2b0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50      if( pTab->iP
e2c0: 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key>=0 ){.      
e2d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e2e0: 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d 6e  v, OP_FileColumn
e2f0: 2c 20 70 54 61 62 2d 3e 69 50 4b 65 79 2c 20 30  , pTab->iPKey, 0
e300: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
e310: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
e320: 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b  ustBeInt, 0, 0);
e330: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e340: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
e350: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
e360: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
e370: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
e380: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
e390: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61        if( i==pTa
e3a0: 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
e3b0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
e3c0: 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63  er primary key c
e3d0: 6f 6c 75 6d 6e 20 69 73 20 66 69 6c 6c 65 64 20  olumn is filled 
e3e0: 77 69 74 68 20 4e 55 4c 4c 20 73 69 6e 63 65 20  with NULL since 
e3f0: 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  its.        ** v
e400: 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73 20 70  alue is always p
e410: 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 72  ulled from the r
e420: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a 2f 0a  ecord number */.
e430: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
e440: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
e450: 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ring, 0, 0);.   
e460: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e470: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
e480: 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75  p(v, OP_FileColu
e490: 6d 6e 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  mn, i, 0);.     
e4a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
e4b0: 69 74 65 47 65 6e 65 72 61 74 65 43 6f 6e 73 74  iteGenerateConst
e4c0: 72 61 69 6e 74 43 68 65 63 6b 73 28 70 50 61 72  raintChecks(pPar
e4d0: 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 2c 20  se, pTab, 0, 0, 
e4e0: 30 2c 20 30 2c 20 6f 6e 45 72 72 6f 72 2c 20 61  0, 0, onError, a
e4f0: 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ddr);.    sqlite
e500: 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f  CompleteInsertio
e510: 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
e520: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
e530: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
e540: 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
e550: 77 73 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ws)!=0 ){.      
e560: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e570: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c  v, OP_AddImm, 1,
e580: 20 30 29 3b 20 20 2f 2a 20 49 6e 63 72 65 6d 65   0);  /* Increme
e590: 6e 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a  nt row count */.
e5a0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e5b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e5c0: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a  Goto, 0, addr);.
e5d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65      sqliteVdbeRe
e5e0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
e5f0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  d);.    sqliteVd
e600: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
e610: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  op, 0, 0);.    s
e620: 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
e630: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
e640: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
e650: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
e660: 52 6f 77 73 20 29 7b 0a 20 20 20 20 20 20 73 71  Rows ){.      sq
e670: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
e680: 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c   OP_ColumnCount,
e690: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
e6a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
e6b0: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
e6c0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
e6d0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
e6e0: 76 2c 20 2d 31 2c 20 22 72 6f 77 73 20 69 6e 73  v, -1, "rows ins
e6f0: 65 72 74 65 64 22 2c 20 50 33 5f 53 54 41 54 49  erted", P3_STATI
e700: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
e710: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e720: 43 61 6c 6c 62 61 63 6b 2c 20 31 2c 20 30 29 3b  Callback, 1, 0);
e730: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 63 6f  .    }.  }.  .co
e740: 70 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 72 65  py_cleanup:.  re
e750: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
e760: 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20  he non-standard 
e770: 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 69  VACUUM command i
e780: 73 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20  s used to clean 
e790: 75 70 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  up the database,
e7a0: 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66 72 65  .** collapse fre
e7b0: 65 20 73 70 61 63 65 2c 20 65 74 63 2e 20 20 49  e space, etc.  I
e7c0: 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20 61 66  t is modelled af
e7d0: 74 65 72 20 74 68 65 20 56 41 43 55 55 4d 20 63  ter the VACUUM c
e7e0: 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50 6f 73  ommand.** in Pos
e7f0: 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a 2a 20 49  tgreSQL..**.** I
e800: 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30 2e 78 20  n version 1.0.x 
e810: 6f 66 20 53 51 4c 69 74 65 2c 20 74 68 65 20 56  of SQLite, the V
e820: 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 77 6f  ACUUM command wo
e830: 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67 64 62 6d  uld call.** gdbm
e840: 5f 72 65 6f 72 67 61 6e 69 7a 65 28 29 20 6f 6e  _reorganize() on
e850: 20 61 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73   all the databas
e860: 65 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20 62  e tables.  But b
e870: 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68  eginning.** with
e880: 20 32 2e 30 2e 30 2c 20 53 51 4c 69 74 65 20 6e   2.0.0, SQLite n
e890: 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 47 44  o longer uses GD
e8a0: 42 4d 20 73 6f 20 74 68 69 73 20 63 6f 6d 6d 61  BM so this comma
e8b0: 6e 64 20 68 61 73 0a 2a 2a 20 62 65 63 6f 6d 65  nd has.** become
e8c0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f 69   a no-op..*/.voi
e8d0: 64 20 73 71 6c 69 74 65 56 61 63 75 75 6d 28 50  d sqliteVacuum(P
e8e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
e8f0: 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 29  ken *pTableName)
e900: 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e  {.  /* Do nothin
e910: 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  g */.}../*.** Be
e920: 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
e930: 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
e940: 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
e950: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e960: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
e970: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69  sqlite *db;..  i
e980: 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
e990: 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
e9a0: 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30  =0 || db->pBe==0
e9b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
e9c0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
e9d0: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
e9e0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
e9f0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
ea00: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
ea10: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
ea20: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nErr++;.    sqli
ea30: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
ea40: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 63  rse->zErrMsg, "c
ea50: 61 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72  annot start a tr
ea60: 61 6e 73 61 63 74 69 6f 6e 20 22 0a 20 20 20 20  ansaction ".    
ea70: 20 20 20 22 77 69 74 68 69 6e 20 61 20 74 72 61     "within a tra
ea80: 6e 73 61 63 74 69 6f 6e 22 2c 20 30 29 3b 0a 20  nsaction", 0);. 
ea90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
eaa0: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
eab0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
eac0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 64 62 2d 3e  e, 0, 0);.  db->
ead0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
eae0: 49 6e 54 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f  InTrans;.  db->o
eaf0: 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72  nError = onError
eb00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
eb10: 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  t a transaction.
eb20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f  */.void sqliteCo
eb30: 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28  mmitTransaction(
eb40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
eb50: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20    sqlite *db;.. 
eb60: 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
eb70: 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
eb80: 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d  )==0 || db->pBe=
eb90: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
eba0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
ebb0: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
ebc0: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
ebd0: 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ;.  if( (db->fla
ebe0: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
ebf0: 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ans)==0 ){.    p
ec00: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
ec10: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
ec20: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
ec30: 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 22 63 61  Msg, .       "ca
ec40: 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f  nnot commit - no
ec50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
ec60: 61 63 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20  active", 0);.   
ec70: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64   return;.  }.  d
ec80: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
ec90: 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20 73  ITE_InTrans;.  s
eca0: 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
ecb0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
ecc0: 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20    db->onError = 
ecd0: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f  OE_Default;.}../
ece0: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
ecf0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
ed00: 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61  oid sqliteRollba
ed10: 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  ckTransaction(Pa
ed20: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
ed30: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64  sqlite *db;.  Vd
ed40: 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
ed50: 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
ed60: 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
ed70: 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65   db->pBe==0 ) re
ed80: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
ed90: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
eda0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
edb0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
edc0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
edd0: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30  LITE_InTrans)==0
ede0: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
edf0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nErr++;.    sqli
ee00: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
ee10: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 0a 20 20  rse->zErrMsg,.  
ee20: 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 72 6f 6c       "cannot rol
ee30: 6c 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73  lback - no trans
ee40: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
ee50: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
ee60: 6e 3b 20 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  n; .  }.  v = sq
ee70: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
ee80: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
ee90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
eea0: 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c 62 61  dOp(v, OP_Rollba
eeb0: 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  ck, 0, 0);.  }. 
eec0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
eed0: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
eee0: 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f   db->onError = O
eef0: 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a  E_Default;.}../*
ef00: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
ef10: 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
ef20: 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
ef30: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
ef40: 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
ef50: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
ef60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ef70: 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
ef80: 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
ef90: 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
efa0: 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
efb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
efc0: 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
efd0: 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
efe0: 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
eff0: 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
f000: 66 20 74 68 65 20 73 65 74 43 68 65 63 6b 70 6f  f the setCheckpo
f010: 69 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  int parameter is
f020: 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
f030: 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
f040: 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
f050: 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
f060: 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
f070: 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
f080: 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
f090: 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
f0a0: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
f0b0: 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
f0c0: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
f0d0: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
f0e0: 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
f0f0: 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
f100: 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
f110: 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
f120: 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
f130: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
f140: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
f150: 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
f160: 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
f170: 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
f180: 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
f190: 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
f1a0: 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e set..**.** The
f1b0: 20 74 65 6d 70 4f 6e 6c 79 20 66 6c 61 67 20 69   tempOnly flag i
f1c0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 6f 6e  ndicates that on
f1d0: 6c 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ly temporary tab
f1e0: 6c 65 73 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  les will be chan
f1f0: 67 65 64 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68  ged.** during th
f200: 69 73 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  is write operati
f210: 6f 6e 2e 20 20 54 68 65 20 70 72 69 6d 61 72 79  on.  The primary
f220: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
f230: 69 73 20 6e 6f 74 0a 2a 2a 20 77 72 69 74 65 2d  is not.** write-
f240: 6c 6f 63 6b 65 64 2e 20 20 4f 6e 6c 79 20 74 68  locked.  Only th
f250: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  e temporary data
f260: 62 61 73 65 20 66 69 6c 65 20 67 65 74 73 20 61  base file gets a
f270: 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 20   write lock..** 
f280: 4f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  Other processes 
f290: 63 61 6e 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  can continue to 
f2a0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
f2b0: 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61  e primary databa
f2c0: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  se file..*/.void
f2d0: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
f2e0: 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
f2f0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65   *pParse, int se
f300: 74 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 6e 74  tCheckpoint, int
f310: 20 74 65 6d 70 4f 6e 6c 79 29 7b 0a 20 20 56 64   tempOnly){.  Vd
f320: 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c  be *v;.  v = sql
f330: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
f340: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
f350: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
f360: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
f370: 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 69 66   ) return; /* if
f380: 20 74 68 69 73 20 69 73 20 69 6e 20 61 20 74 72   this is in a tr
f390: 69 67 67 65 72 20 2a 2f 0a 20 20 69 66 28 20 28  igger */.  if( (
f3a0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
f3b0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
f3c0: 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ns)==0 ){.    sq
f3d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
f3e0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
f3f0: 20 74 65 6d 70 4f 6e 6c 79 2c 20 30 29 3b 0a 20   tempOnly, 0);. 
f400: 20 20 20 69 66 28 20 21 74 65 6d 70 4f 6e 6c 79     if( !tempOnly
f410: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f420: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f430: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 70 50  VerifyCookie, pP
f440: 61 72 73 65 2d 3e 64 62 2d 3e 73 63 68 65 6d 61  arse->db->schema
f450: 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20  _cookie, 0);.   
f460: 20 20 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d     pParse->schem
f470: 61 56 65 72 69 66 69 65 64 20 3d 20 31 3b 0a 20  aVerified = 1;. 
f480: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
f490: 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 29   setCheckpoint )
f4a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
f4b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63  AddOp(v, OP_Chec
f4c0: 6b 70 6f 69 6e 74 2c 20 30 2c 20 30 29 3b 0a 20  kpoint, 0, 0);. 
f4d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
f4e0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63  rate code that c
f4f0: 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72  oncludes an oper
f500: 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68  ation that may h
f510: 61 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74  ave changed.** t
f520: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
f530: 69 73 20 69 73 20 61 20 63 6f 6d 70 61 6e 69 6f  is is a companio
f540: 6e 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 42 65  n function to Be
f550: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
f560: 6e 28 29 2e 0a 2a 2a 20 49 66 20 61 20 74 72 61  n()..** If a tra
f570: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
f580: 72 74 65 64 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  rted, then commi
f590: 74 20 69 74 2e 20 20 49 66 20 61 20 63 68 65 63  t it.  If a chec
f5a0: 6b 70 6f 69 6e 74 20 77 61 73 0a 2a 2a 20 73 74  kpoint was.** st
f5b0: 61 72 74 65 64 20 74 68 65 6e 20 63 6f 6d 6d 69  arted then commi
f5c0: 74 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20  t that..*/.void 
f5d0: 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70  sqliteEndWriteOp
f5e0: 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
f5f0: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
f600: 76 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  v;.  if( pParse-
f610: 3e 74 72 69 67 53 74 61 63 6b 20 29 20 72 65 74  >trigStack ) ret
f620: 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73 20  urn; /* if this 
f630: 69 73 20 69 6e 20 61 20 74 72 69 67 67 65 72 20  is in a trigger 
f640: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
f650: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f660: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
f670: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
f680: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
f690: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b  QLITE_InTrans ){
f6a0: 0a 20 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69  .    /* Do Nothi
f6b0: 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ng */.  }else{. 
f6c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
f6d0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c  Op(v, OP_Commit,
f6e0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a   0, 0);.  }.}...
f6f0: 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  /*.** Interpret 
f700: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
f710: 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   as a boolean va
f720: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
f730: 6e 74 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63 68  nt getBoolean(ch
f740: 61 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63  ar *z){.  static
f750: 20 63 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d 20   char *azTrue[] 
f760: 3d 20 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22 2c  = { "yes", "on",
f770: 20 22 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e 74   "true" };.  int
f780: 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d   i;.  if( z[0]==
f790: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f7a0: 69 66 28 20 69 73 64 69 67 69 74 28 7a 5b 30 5d  if( isdigit(z[0]
f7b0: 29 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20  ) || (z[0]=='-' 
f7c0: 26 26 20 69 73 64 69 67 69 74 28 7a 5b 31 5d 29  && isdigit(z[1])
f7d0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
f7e0: 61 74 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66  atoi(z);.  }.  f
f7f0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
f800: 28 61 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66 28  (azTrue)/sizeof(
f810: 61 7a 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b 29  azTrue[0]); i++)
f820: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
f830: 53 74 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75 65  StrICmp(z,azTrue
f840: 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  [i])==0 ) return
f850: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
f860: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f   0;.}../*.** Pro
f870: 63 65 73 73 20 61 20 70 72 61 67 6d 61 20 73 74  cess a pragma st
f880: 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  atement.  .**.**
f890: 20 50 72 61 67 6d 61 73 20 61 72 65 20 6f 66 20   Pragmas are of 
f8a0: 74 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  this form:.**.**
f8b0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 64 20        PRAGMA id 
f8c0: 3d 20 76 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54 68  = value.**.** Th
f8d0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 6d 69 67  e identifier mig
f8e0: 68 74 20 61 6c 73 6f 20 62 65 20 61 20 73 74 72  ht also be a str
f8f0: 69 6e 67 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ing.  The value 
f900: 69 73 20 61 20 73 74 72 69 6e 67 2c 20 61 6e 64  is a string, and
f910: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2c 20  .** identifier, 
f920: 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66  or a number.  If
f930: 20 6d 69 6e 75 73 46 6c 61 67 20 69 73 20 74 72   minusFlag is tr
f940: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ue, then the val
f950: 75 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65  ue is.** a numbe
f960: 72 20 74 68 61 74 20 77 61 73 20 70 72 65 63 65  r that was prece
f970: 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73  ded by a minus s
f980: 69 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ign..*/.void sql
f990: 69 74 65 50 72 61 67 6d 61 28 50 61 72 73 65 20  itePragma(Parse 
f9a0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
f9b0: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
f9c0: 69 67 68 74 2c 20 69 6e 74 20 6d 69 6e 75 73 46  ight, int minusF
f9d0: 6c 61 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c  lag){.  char *zL
f9e0: 65 66 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  eft = 0;.  char 
f9f0: 2a 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 73  *zRight = 0;.  s
fa00: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
fa10: 73 65 2d 3e 64 62 3b 0a 0a 20 20 7a 4c 65 66 74  se->db;..  zLeft
fa20: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
fa30: 28 70 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66 74  (pLeft->z, pLeft
fa40: 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65  ->n);.  sqliteDe
fa50: 71 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20  quote(zLeft);.  
fa60: 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b  if( minusFlag ){
fa70: 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 30 3b  .    zRight = 0;
fa80: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
fa90: 74 72 69 6e 67 28 26 7a 52 69 67 68 74 2c 20 22  tring(&zRight, "
faa0: 2d 22 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e 7a  -", 1, pRight->z
fab0: 2c 20 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29 3b  , pRight->n, 0);
fac0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52  .  }else{.    zR
fad0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 53 74 72  ight = sqliteStr
fae0: 4e 44 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c 20  NDup(pRight->z, 
faf0: 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20 20  pRight->n);.    
fb00: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 52  sqliteDequote(zR
fb10: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f  ight);.  }. .  /
fb20: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64  *.  **  PRAGMA d
fb30: 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a  efault_cache_siz
fb40: 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64  e.  **  PRAGMA d
fb50: 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a  efault_cache_siz
fb60: 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e=N.  **.  ** Th
fb70: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70  e first form rep
fb80: 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  orts the current
fb90: 20 70 65 72 73 69 73 74 65 6e 74 20 73 65 74 74   persistent sett
fba0: 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ing for the.  **
fbb0: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
fbc0: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  .  The value ret
fbd0: 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78  urned is the max
fbe0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20  imum number of. 
fbf0: 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65   ** pages in the
fc00: 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 54 68   page cache.  Th
fc10: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
fc20: 74 73 20 62 6f 74 68 20 74 68 65 20 63 75 72 72  ts both the curr
fc30: 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 63 61  ent.  ** page ca
fc40: 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65 20 61  che size value a
fc50: 6e 64 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  nd the persisten
fc60: 74 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  t page cache siz
fc70: 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 73 74 6f  e value.  ** sto
fc80: 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
fc90: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20  ase file..  **. 
fca0: 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   ** The default 
fcb0: 63 61 63 68 65 20 73 69 7a 65 20 69 73 20 73 74  cache size is st
fcc0: 6f 72 65 64 20 69 6e 20 6d 65 74 61 2d 76 61 6c  ored in meta-val
fcd0: 75 65 20 32 20 6f 66 20 70 61 67 65 20 31 20 6f  ue 2 of page 1 o
fce0: 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  f the.  ** datab
fcf0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 63  ase file.  The c
fd00: 61 63 68 65 20 73 69 7a 65 20 69 73 20 61 63 74  ache size is act
fd10: 75 61 6c 6c 79 20 74 68 65 20 61 62 73 6f 6c 75  ually the absolu
fd20: 74 65 20 76 61 6c 75 65 20 6f 66 0a 20 20 2a 2a  te value of.  **
fd30: 20 74 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63   this memory loc
fd40: 61 74 69 6f 6e 2e 20 20 54 68 65 20 73 69 67 6e  ation.  The sign
fd50: 20 6f 66 20 6d 65 74 61 2d 76 61 6c 75 65 20 32   of meta-value 2
fd60: 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 0a   determines the.
fd70: 20 20 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73    ** synchronous
fd80: 20 73 65 74 74 69 6e 67 2e 20 20 41 20 6e 65 67   setting.  A neg
fd90: 61 74 69 76 65 20 76 61 6c 75 65 20 6d 65 61 6e  ative value mean
fda0: 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  s synchronous is
fdb0: 20 6f 66 66 0a 20 20 2a 2a 20 61 6e 64 20 61 20   off.  ** and a 
fdc0: 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 6d  positive value m
fdd0: 65 61 6e 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73  eans synchronous
fde0: 20 69 73 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69   is on..  */.  i
fdf0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
fe00: 28 7a 4c 65 66 74 2c 22 64 65 66 61 75 6c 74 5f  (zLeft,"default_
fe10: 63 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20  cache_size")==0 
fe20: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
fe30: 62 65 4f 70 20 67 65 74 43 61 63 68 65 53 69 7a  beOp getCacheSiz
fe40: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  e[] = {.      { 
fe50: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20  OP_ReadCookie,  
fe60: 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
fe70: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 41 62 73 56  .      { OP_AbsV
fe80: 61 6c 75 65 2c 20 20 20 20 30 2c 20 30 2c 20 20  alue,    0, 0,  
fe90: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
fea0: 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20  { OP_Dup,       
feb0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
fec0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e  },.      { OP_In
fed0: 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c  teger,     0, 0,
fee0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
fef0: 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20    { OP_Ne,      
ff00: 20 20 20 20 30 2c 20 36 2c 20 20 20 20 20 20 20      0, 6,       
ff10: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
ff20: 49 6e 74 65 67 65 72 2c 20 20 20 20 20 4d 41 58  Integer,     MAX
ff30: 5f 50 41 47 45 53 2c 30 2c 20 30 7d 2c 0a 20 20  _PAGES,0, 0},.  
ff40: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43      { OP_ColumnC
ff50: 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20  ount, 1, 0,     
ff60: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
ff70: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30  P_ColumnName,  0
ff80: 2c 20 30 2c 20 20 20 20 20 20 20 20 22 63 61 63  , 0,        "cac
ff90: 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20 20 20 20  he_size"},.     
ffa0: 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20   { OP_Callback, 
ffb0: 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
ffc0: 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56  0},.    };.    V
ffd0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47  dbe *v = sqliteG
ffe0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
fff0: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
10000 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
10010 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d  Right->z==pLeft-
10020 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
10030 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
10040 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74  v, ArraySize(get
10050 43 61 63 68 65 53 69 7a 65 29 2c 20 67 65 74 43  CacheSize), getC
10060 61 63 68 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  acheSize);.    }
10070 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
10080 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  addr;.      int 
10090 73 69 7a 65 20 3d 20 61 74 6f 69 28 7a 52 69 67  size = atoi(zRig
100a0 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ht);.      if( s
100b0 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d  ize<0 ) size = -
100c0 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
100d0 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  teBeginWriteOper
100e0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
100f0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
10100 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
10110 5f 49 6e 74 65 67 65 72 2c 20 73 69 7a 65 2c 20  _Integer, size, 
10120 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
10130 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10140 52 65 61 64 43 6f 6f 6b 69 65 2c 20 30 2c 20 32  ReadCookie, 0, 2
10150 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
10160 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
10170 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
10180 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10190 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
101a0 50 5f 47 65 2c 20 30 2c 20 61 64 64 72 2b 33 29  P_Ge, 0, addr+3)
101b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
101c0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
101d0 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20  gative, 0, 0);. 
101e0 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
101f0 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
10200 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20  okie, 0, 2);.   
10210 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
10220 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
10230 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63 61  e);.      db->ca
10240 63 68 65 5f 73 69 7a 65 20 3d 20 64 62 2d 3e 63  che_size = db->c
10250 61 63 68 65 5f 73 69 7a 65 3c 30 20 3f 20 2d 73  ache_size<0 ? -s
10260 69 7a 65 20 3a 20 73 69 7a 65 3b 0a 20 20 20 20  ize : size;.    
10270 20 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74    sqliteBtreeSet
10280 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42  CacheSize(db->pB
10290 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a  e, db->cache_siz
102a0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
102b0 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  e..  /*.  **  PR
102c0 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 0a  AGMA cache_size.
102d0 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63 61 63    **  PRAGMA cac
102e0 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20  he_size=N.  **. 
102f0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f   ** The first fo
10300 72 6d 20 72 65 70 6f 72 74 73 20 74 68 65 20 63  rm reports the c
10310 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20 73 65 74  urrent local set
10320 74 69 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a  ting for the.  *
10330 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  * page cache siz
10340 65 2e 20 20 54 68 65 20 6c 6f 63 61 6c 20 73 65  e.  The local se
10350 74 74 69 6e 67 20 63 61 6e 20 62 65 20 64 69 66  tting can be dif
10360 66 65 72 65 6e 74 20 66 72 6f 6d 0a 20 20 2a 2a  ferent from.  **
10370 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
10380 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75 65  cache size value
10390 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20   that is stored 
103a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  in the database.
103b0 20 20 2a 2a 20 66 69 6c 65 20 69 74 73 65 6c 66    ** file itself
103c0 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  .  The value ret
103d0 75 72 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78  urned is the max
103e0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20  imum number of. 
103f0 20 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65   ** pages in the
10400 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 54 68   page cache.  Th
10410 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65  e second form se
10420 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a 20 20 2a  ts the local.  *
10430 2a 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a  * page cache siz
10440 65 20 76 61 6c 75 65 2e 20 20 49 74 20 64 6f 65  e value.  It doe
10450 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  s not change the
10460 20 70 65 72 73 69 73 74 65 6e 74 0a 20 20 2a 2a   persistent.  **
10470 20 63 61 63 68 65 20 73 69 7a 65 20 73 74 6f 72   cache size stor
10480 65 64 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 73  ed on the disk s
10490 6f 20 74 68 65 20 63 61 63 68 65 20 73 69 7a 65  o the cache size
104a0 20 77 69 6c 6c 20 72 65 76 65 72 74 0a 20 20 2a   will revert.  *
104b0 2a 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74  * to its default
104c0 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20   value when the 
104d0 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73  database is clos
104e0 65 64 20 61 6e 64 20 72 65 6f 70 65 6e 65 64 2e  ed and reopened.
104f0 0a 20 20 2a 2a 20 4e 20 73 68 6f 75 6c 64 20 62  .  ** N should b
10500 65 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74  e a positive int
10510 65 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eger..  */.  if(
10520 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
10530 4c 65 66 74 2c 22 63 61 63 68 65 5f 73 69 7a 65  Left,"cache_size
10540 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  ")==0 ){.    sta
10550 74 69 63 20 56 64 62 65 4f 70 20 67 65 74 43 61  tic VdbeOp getCa
10560 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20  cheSize[] = {.  
10570 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43      { OP_ColumnC
10580 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20  ount, 1, 0,     
10590 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
105a0 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30  P_ColumnName,  0
105b0 2c 20 30 2c 20 20 20 20 20 20 20 20 22 63 61 63  , 0,        "cac
105c0 68 65 5f 73 69 7a 65 22 7d 2c 0a 20 20 20 20 20  he_size"},.     
105d0 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20   { OP_Callback, 
105e0 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
105f0 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56  0},.    };.    V
10600 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47  dbe *v = sqliteG
10610 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
10620 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
10630 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
10640 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d  Right->z==pLeft-
10650 3e 7a 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >z ){.      int 
10660 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68 65  size = db->cache
10670 5f 73 69 7a 65 3b 3b 0a 20 20 20 20 20 20 69 66  _size;;.      if
10680 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20  ( size<0 ) size 
10690 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 73  = -size;.      s
106a0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
106b0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 73 69  , OP_Integer, si
106c0 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ze, 0);.      sq
106d0 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
106e0 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 67  t(v, ArraySize(g
106f0 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20 67 65  etCacheSize), ge
10700 74 43 61 63 68 65 53 69 7a 65 29 3b 0a 20 20 20  tCacheSize);.   
10710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
10720 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28 7a 52  t size = atoi(zR
10730 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ight);.      if(
10740 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d   size<0 ) size =
10750 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66   -size;.      if
10760 28 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  ( db->cache_size
10770 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a  <0 ) size = -siz
10780 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63 61 63  e;.      db->cac
10790 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a  he_size = size;.
107a0 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65        sqliteBtre
107b0 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 64 62  eSetCacheSize(db
107c0 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61 63 68 65  ->pBe, db->cache
107d0 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  _size);.    }.  
107e0 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }else..  /*.  **
107f0 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74    PRAGMA default
10800 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 2a  _synchronous.  *
10810 2a 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c  *  PRAGMA defaul
10820 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 42 4f  t_synchronous=BO
10830 4f 4c 45 41 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OLEAN.  **.  ** 
10840 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
10850 65 74 75 72 6e 73 20 74 68 65 20 70 65 72 73 69  eturns the persi
10860 73 74 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  stent value of t
10870 68 65 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22  he "synchronous"
10880 20 73 65 74 74 69 6e 67 0a 20 20 2a 2a 20 74 68   setting.  ** th
10890 61 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  at is stored in 
108a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
108b0 68 69 73 20 69 73 20 74 68 65 20 73 79 6e 63 68  his is the synch
108c0 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67 20 74  ronous setting t
108d0 68 61 74 0a 20 20 2a 2a 20 69 73 20 75 73 65 64  hat.  ** is used
108e0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 64 61   whenever the da
108f0 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
10900 20 75 6e 6c 65 73 73 20 6f 76 65 72 72 69 64 64   unless overridd
10910 65 6e 20 62 79 20 61 20 73 65 70 61 72 61 74 65  en by a separate
10920 0a 20 20 2a 2a 20 22 73 79 6e 63 68 72 6f 6e 6f  .  ** "synchrono
10930 75 73 22 20 70 72 61 67 6d 61 2e 20 20 54 68 65  us" pragma.  The
10940 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 68 61   second form cha
10950 6e 67 65 73 20 74 68 65 20 70 65 72 73 69 73 74  nges the persist
10960 65 6e 74 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a  ent and the.  **
10970 20 6c 6f 63 61 6c 20 73 79 6e 63 68 72 6f 6e 6f   local synchrono
10980 75 73 20 73 65 74 74 69 6e 67 20 74 6f 20 74 68  us setting to th
10990 65 20 76 61 6c 75 65 20 67 69 76 65 6e 2e 0a 20  e value given.. 
109a0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 73 79 6e 63   **.  ** If sync
109b0 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 2c 20 53  hronous is on, S
109c0 51 4c 69 74 65 20 77 69 6c 6c 20 64 6f 20 61 6e  QLite will do an
109d0 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20   fsync() system 
109e0 63 61 6c 6c 20 61 74 20 73 74 72 61 74 65 67 69  call at strategi
109f0 63 0a 20 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  c.  ** points to
10a00 20 69 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c   insure that all
10a10 20 70 72 65 76 69 6f 75 73 6c 79 20 77 72 69 74   previously writ
10a20 74 65 6e 20 64 61 74 61 20 68 61 73 20 61 63 74  ten data has act
10a30 75 61 6c 6c 79 20 62 65 65 6e 0a 20 20 2a 2a 20  ually been.  ** 
10a40 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
10a50 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65   disk surface be
10a60 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  fore continuing.
10a70 20 20 54 68 69 73 20 6d 6f 64 65 20 69 6e 73 75    This mode insu
10a80 72 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  res that.  ** th
10a90 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  e database will 
10aa0 61 6c 77 61 79 73 20 62 65 20 69 6e 20 61 20 63  always be in a c
10ab0 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 20  onsistent state 
10ac0 65 76 65 6e 74 20 69 66 20 74 68 65 20 6f 70 65  event if the ope
10ad0 72 61 74 69 6e 67 0a 20 20 2a 2a 20 73 79 73 74  rating.  ** syst
10ae0 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f  em crashes or po
10af0 77 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 70 75  wer to the compu
10b00 74 65 72 20 69 73 20 69 6e 74 65 72 72 75 70 74  ter is interrupt
10b10 65 64 20 75 6e 65 78 70 65 63 74 65 64 6c 79 2e  ed unexpectedly.
10b20 0a 20 20 2a 2a 20 57 68 65 6e 20 73 79 6e 63 68  .  ** When synch
10b30 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 53  ronous is off, S
10b40 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 77  QLite will not w
10b50 61 69 74 20 66 6f 72 20 63 68 61 6e 67 65 73 20  ait for changes 
10b60 74 6f 20 61 63 74 75 61 6c 6c 79 0a 20 20 2a 2a  to actually.  **
10b70 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
10b80 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 63  he disk before c
10b90 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 41 73 20 73  ontinuing.  As s
10ba0 6f 6f 6e 20 61 73 20 69 74 20 68 61 6e 64 73 20  oon as it hands 
10bb0 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
10bc0 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
10bd0 73 74 65 6d 2c 20 69 74 20 61 73 73 75 6d 65 73  stem, it assumes
10be0 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 67 65   that the change
10bf0 73 20 61 72 65 20 70 65 72 6d 61 6e 65 6e 74 20  s are permanent 
10c00 61 6e 64 0a 20 20 2a 2a 20 69 74 20 63 6f 6e 74  and.  ** it cont
10c10 69 6e 75 65 73 20 67 6f 69 6e 67 2e 20 20 54 68  inues going.  Th
10c20 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
10c30 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 62  t be corrupted b
10c40 79 20 61 20 70 72 6f 67 72 61 6d 20 63 72 61 73  y a program cras
10c50 68 0a 20 20 2a 2a 20 65 76 65 6e 20 77 69 74 68  h.  ** even with
10c60 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6f 66 66   synchronous off
10c70 2c 20 62 75 74 20 61 6e 20 6f 70 65 72 61 74 69  , but an operati
10c80 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 20  ng system crash 
10c90 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 0a 20 20  or power loss.  
10ca0 2a 2a 20 63 6f 75 6c 64 20 70 6f 74 65 6e 74 69  ** could potenti
10cb0 61 6c 6c 79 20 63 6f 72 72 75 70 74 20 64 61 74  ally corrupt dat
10cc0 61 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  a.  On the other
10cd0 20 68 61 6e 64 2c 20 73 79 6e 63 68 72 6f 6e 6f   hand, synchrono
10ce0 75 73 20 6f 66 66 20 69 73 0a 20 20 2a 2a 20 66  us off is.  ** f
10cf0 61 73 74 65 72 20 74 68 61 6e 20 73 79 6e 63 68  aster than synch
10d00 72 6f 6e 6f 75 73 20 6f 6e 2e 0a 20 20 2a 2f 0a  ronous on..  */.
10d10 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
10d20 43 6d 70 28 7a 4c 65 66 74 2c 22 64 65 66 61 75  Cmp(zLeft,"defau
10d30 6c 74 5f 73 79 6e 63 68 72 6f 6e 6f 75 73 22 29  lt_synchronous")
10d40 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
10d50 63 20 56 64 62 65 4f 70 20 67 65 74 53 79 6e 63  c VdbeOp getSync
10d60 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
10d70 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30  P_Integer,     0
10d80 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
10d90 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43        { OP_ReadC
10da0 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c 20 20 20  ookie,  0, 2,   
10db0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
10dc0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20   OP_Integer,    
10dd0 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
10de0 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4c 74 2c  ,.      { OP_Lt,
10df0 20 20 20 20 20 20 20 20 20 20 30 2c 20 35 2c 20            0, 5, 
10e00 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
10e10 20 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20 20   { OP_AddImm,   
10e20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
10e30 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  0},.      { OP_C
10e40 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30  olumnCount, 1, 0
10e50 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
10e60 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
10e70 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  me,  0, 0,      
10e80 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 7d    "synchronous"}
10e90 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c  ,.      { OP_Cal
10ea0 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20  lback,    1, 0, 
10eb0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
10ec0 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
10ed0 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
10ee0 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
10ef0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10f00 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d    if( pRight->z=
10f10 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20  =pLeft->z ){.   
10f20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10f30 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
10f40 69 7a 65 28 67 65 74 53 79 6e 63 29 2c 20 67 65  ize(getSync), ge
10f50 74 53 79 6e 63 29 3b 0a 20 20 20 20 7d 65 6c 73  tSync);.    }els
10f60 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  e{.      int add
10f70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  r;.      int siz
10f80 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  e = db->cache_si
10f90 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  ze;.      if( si
10fa0 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73  ze<0 ) size = -s
10fb0 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ize;.      sqlit
10fc0 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
10fd0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
10fe0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
10ff0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11000 52 65 61 64 43 6f 6f 6b 69 65 2c 20 30 2c 20 32  ReadCookie, 0, 2
11010 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
11020 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
11030 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
11040 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
11050 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
11060 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
11070 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
11080 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 30 2c  dOp(v, OP_Ne, 0,
11090 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20   addr+3);.      
110a0 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
110b0 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 4d 41  v, OP_AddImm, MA
110c0 58 5f 50 41 47 45 53 2c 20 30 29 3b 0a 20 20 20  X_PAGES, 0);.   
110d0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
110e0 4f 70 28 76 2c 20 4f 50 5f 41 62 73 56 61 6c 75  Op(v, OP_AbsValu
110f0 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
11100 69 66 28 20 21 67 65 74 42 6f 6f 6c 65 61 6e 28  if( !getBoolean(
11110 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
11120 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
11130 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76  Op(v, OP_Negativ
11140 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
11150 20 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a    size = -size;.
11160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
11170 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
11180 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 30   OP_SetCookie, 0
11190 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
111a0 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
111b0 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ion(pParse);.   
111c0 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a     db->cache_siz
111d0 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e = size;.      
111e0 73 71 6c 69 74 65 42 74 72 65 65 53 65 74 43 61  sqliteBtreeSetCa
111f0 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c  cheSize(db->pBe,
11200 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29   db->cache_size)
11210 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
11220 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
11230 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a  GMA synchronous.
11240 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 79    **   PRAGMA sy
11250 6e 63 68 72 6f 6e 6f 75 73 3d 42 4f 4f 4c 45 41  nchronous=BOOLEA
11260 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75  N.  **.  ** Retu
11270 72 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f  rn or set the lo
11280 63 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65  cal value of the
11290 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 66 6c 61   synchronous fla
112a0 67 2e 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a  g.  Changing.  *
112b0 2a 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  * the local valu
112c0 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20  e does not make 
112d0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
112e0 69 73 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65  isk file and the
112f0 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61  .  ** default va
11300 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74  lue will be rest
11310 6f 72 65 64 20 74 68 65 20 6e 65 78 74 20 74 69  ored the next ti
11320 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  me the database 
11330 69 73 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 2e 0a  is.  ** opened..
11340 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
11350 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22  eStrICmp(zLeft,"
11360 73 79 6e 63 68 72 6f 6e 6f 75 73 22 29 3d 3d 30  synchronous")==0
11370 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
11380 64 62 65 4f 70 20 67 65 74 53 79 6e 63 5b 5d 20  dbeOp getSync[] 
11390 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  = {.      { OP_C
113a0 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20 30  olumnCount, 1, 0
113b0 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
113c0 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
113d0 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  me,  0, 0,      
113e0 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 7d    "synchronous"}
113f0 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c  ,.      { OP_Cal
11400 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20  lback,    1, 0, 
11410 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
11420 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
11430 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
11440 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
11450 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11460 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d    if( pRight->z=
11470 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20  =pLeft->z ){.   
11480 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
11490 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
114a0 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  , db->cache_size
114b0 3e 3d 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  >=0, 0);.      s
114c0 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
114d0 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
114e0 67 65 74 53 79 6e 63 29 2c 20 67 65 74 53 79 6e  getSync), getSyn
114f0 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  c);.    }else{. 
11500 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
11510 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 0a  db->cache_size;.
11520 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30        if( size<0
11530 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b   ) size = -size;
11540 0a 20 20 20 20 20 20 69 66 28 20 21 67 65 74 42  .      if( !getB
11550 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29  oolean(zRight) )
11560 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20   size = -size;. 
11570 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73       db->cache_s
11580 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ize = size;.    
11590 20 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74    sqliteBtreeSet
115a0 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42  CacheSize(db->pB
115b0 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a  e, db->cache_siz
115c0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
115d0 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  e..  if( sqliteS
115e0 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 74  trICmp(zLeft, "t
115f0 72 69 67 67 65 72 5f 6f 76 65 72 68 65 61 64 5f  rigger_overhead_
11600 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  test")==0 ){.   
11610 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
11620 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
11630 20 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72 69   always_code_tri
11640 67 67 65 72 5f 73 65 74 75 70 20 3d 20 31 3b 0a  gger_setup = 1;.
11650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11660 20 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72 69   always_code_tri
11670 67 67 65 72 5f 73 65 74 75 70 20 3d 20 30 3b 0a  gger_setup = 0;.
11680 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
11690 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
116a0 6d 70 28 7a 4c 65 66 74 2c 20 22 76 64 62 65 5f  mp(zLeft, "vdbe_
116b0 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  trace")==0 ){.  
116c0 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
116d0 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
116e0 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
116f0 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 3b  QLITE_VdbeTrace;
11700 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11710 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
11720 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65  SQLITE_VdbeTrace
11730 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
11740 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
11750 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 66 75 6c  ICmp(zLeft, "ful
11760 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 22 29  l_column_names")
11770 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67  ==0 ){.    if( g
11780 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
11790 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  ) ){.      db->f
117a0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46  lags |= SQLITE_F
117b0 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20  ullColNames;.   
117c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
117d0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
117e0 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b  TE_FullColNames;
117f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
11800 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
11810 43 6d 70 28 7a 4c 65 66 74 2c 20 22 73 68 6f 77  Cmp(zLeft, "show
11820 5f 64 61 74 61 74 79 70 65 73 22 29 3d 3d 30 20  _datatypes")==0 
11830 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  ){.    if( getBo
11840 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
11850 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
11860 20 7c 3d 20 53 51 4c 49 54 45 5f 52 65 70 6f 72   |= SQLITE_Repor
11870 74 54 79 70 65 73 3b 0a 20 20 20 20 7d 65 6c 73  tTypes;.    }els
11880 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  e{.      db->fla
11890 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 52 65  gs &= ~SQLITE_Re
118a0 70 6f 72 74 54 79 70 65 73 3b 0a 20 20 20 20 7d  portTypes;.    }
118b0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
118c0 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
118d0 65 66 74 2c 20 22 72 65 73 75 6c 74 5f 73 65 74  eft, "result_set
118e0 5f 64 65 74 61 69 6c 73 22 29 3d 3d 30 20 29 7b  _details")==0 ){
118f0 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c  .    if( getBool
11900 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20  ean(zRight) ){. 
11910 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
11920 3d 20 53 51 4c 49 54 45 5f 52 65 73 75 6c 74 44  = SQLITE_ResultD
11930 65 74 61 69 6c 73 3b 0a 20 20 20 20 7d 65 6c 73  etails;.    }els
11940 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  e{.      db->fla
11950 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 52 65  gs &= ~SQLITE_Re
11960 73 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20  sultDetails;.   
11970 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
11980 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
11990 7a 4c 65 66 74 2c 20 22 63 6f 75 6e 74 5f 63 68  zLeft, "count_ch
119a0 61 6e 67 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  anges")==0 ){.  
119b0 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e    if( getBoolean
119c0 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (zRight) ){.    
119d0 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
119e0 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b  QLITE_CountRows;
119f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11a00 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
11a10 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
11a20 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
11a30 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
11a40 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 65 6d 70  ICmp(zLeft, "emp
11a50 74 79 5f 72 65 73 75 6c 74 5f 63 61 6c 6c 62 61  ty_result_callba
11a60 63 6b 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  cks")==0 ){.    
11a70 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a  if( getBoolean(z
11a80 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
11a90 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
11aa0 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b  ITE_NullCallback
11ab0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11ac0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
11ad0 7e 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c  ~SQLITE_NullCall
11ae0 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  back;.    }.  }e
11af0 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
11b00 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
11b10 22 74 61 62 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30  "table_info")==0
11b20 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
11b30 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  Tab;.    Vdbe *v
11b40 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
11b50 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
11b60 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66   zRight);.    if
11b70 28 20 70 54 61 62 20 29 20 76 20 3d 20 73 71 6c  ( pTab ) v = sql
11b80 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
11b90 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  e);.    if( pTab
11ba0 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73   && v ){.      s
11bb0 74 61 74 69 63 20 56 64 62 65 4f 70 20 74 61 62  tatic VdbeOp tab
11bc0 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20  leInfoPreface[] 
11bd0 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50  = {.        { OP
11be0 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 35 2c  _ColumnCount, 5,
11bf0 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   0,       0},.  
11c00 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
11c10 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20  nName,  0, 0,   
11c20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20      "cid"},.    
11c30 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
11c40 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20  ame,  1, 0,     
11c50 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20    "name"},.     
11c60 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
11c70 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20  me,  2, 0,      
11c80 20 22 74 79 70 65 22 7d 2c 0a 20 20 20 20 20 20   "type"},.      
11c90 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
11ca0 65 2c 20 20 33 2c 20 30 2c 20 20 20 20 20 20 20  e,  3, 0,       
11cb0 22 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20  "notnull"},.    
11cc0 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
11cd0 61 6d 65 2c 20 20 34 2c 20 30 2c 20 20 20 20 20  ame,  4, 0,     
11ce0 20 20 22 64 66 6c 74 5f 76 61 6c 75 65 22 7d 2c    "dflt_value"},
11cf0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
11d00 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c  int i;.      sql
11d10 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
11d20 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61  (v, ArraySize(ta
11d30 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c  bleInfoPreface),
11d40 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63   tableInfoPrefac
11d50 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
11d60 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
11d70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
11d80 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
11d90 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
11da0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
11db0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
11dc0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
11dd0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11de0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11df0 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
11e00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
11e10 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
11e20 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  , pTab->aCol[i].
11e30 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
11e40 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11e50 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11e60 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
11e70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
11e80 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
11e90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  , .           pT
11ea0 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  ab->aCol[i].zTyp
11eb0 65 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e ? pTab->aCol[i
11ec0 5d 2e 7a 54 79 70 65 20 3a 20 22 6e 75 6d 65 72  ].zType : "numer
11ed0 69 63 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ic", P3_STATIC);
11ee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
11ef0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
11f00 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 61 43  nteger, pTab->aC
11f10 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20 30  ol[i].notNull, 0
11f20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11f30 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11f40 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
11f50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
11f60 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
11f70 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  , pTab->aCol[i].
11f80 7a 44 66 6c 74 2c 20 50 33 5f 53 54 41 54 49 43  zDflt, P3_STATIC
11f90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11fa0 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
11fb0 5f 43 61 6c 6c 62 61 63 6b 2c 20 35 2c 20 30 29  _Callback, 5, 0)
11fc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11fd0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
11fe0 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
11ff0 66 74 2c 20 22 69 6e 64 65 78 5f 69 6e 66 6f 22  ft, "index_info"
12000 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65  )==0 ){.    Inde
12010 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 61 62  x *pIdx;.    Tab
12020 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 56 64  le *pTab;.    Vd
12030 62 65 20 2a 76 3b 0a 20 20 20 20 70 49 64 78 20  be *v;.    pIdx 
12040 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
12050 78 28 64 62 2c 20 7a 52 69 67 68 74 29 3b 0a 20  x(db, zRight);. 
12060 20 20 20 69 66 28 20 70 49 64 78 20 29 20 76 20     if( pIdx ) v 
12070 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
12080 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
12090 20 70 49 64 78 20 26 26 20 76 20 29 7b 0a 20 20   pIdx && v ){.  
120a0 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
120b0 70 20 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61  p tableInfoPrefa
120c0 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ce[] = {.       
120d0 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e   { OP_ColumnCoun
120e0 74 2c 20 33 2c 20 30 2c 20 20 20 20 20 20 20 30  t, 3, 0,       0
120f0 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  },.        { OP_
12100 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20  ColumnName,  0, 
12110 30 2c 20 20 20 20 20 20 20 22 73 65 71 6e 6f 22  0,       "seqno"
12120 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f  },.        { OP_
12130 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20  ColumnName,  1, 
12140 30 2c 20 20 20 20 20 20 20 22 63 69 64 22 7d 2c  0,       "cid"},
12150 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
12160 6c 75 6d 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c  lumnName,  2, 0,
12170 20 20 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a         "name"},.
12180 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
12190 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 54 61 62  nt i;.      pTab
121a0 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
121b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
121c0 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
121d0 72 61 79 53 69 7a 65 28 74 61 62 6c 65 49 6e 66  raySize(tableInf
121e0 6f 50 72 65 66 61 63 65 29 2c 20 74 61 62 6c 65  oPreface), table
121f0 49 6e 66 6f 50 72 65 66 61 63 65 29 3b 0a 20 20  InfoPreface);.  
12200 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
12210 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
12220 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
12230 63 6e 75 6d 20 3d 20 70 49 64 78 2d 3e 61 69 43  cnum = pIdx->aiC
12240 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
12250 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
12260 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
12270 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   i, 0);.        
12280 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
12290 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 63  v, OP_Integer, c
122a0 6e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  num, 0);.       
122b0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
122c0 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
122d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73  , 0);.        as
122e0 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
122f0 3e 63 6e 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  >cnum );.       
12300 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
12310 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d  eP3(v, -1, pTab-
12320 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d  >aCol[cnum].zNam
12330 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
12340 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
12350 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
12360 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20  lback, 3, 0);.  
12370 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
12380 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
12390 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
123a0 22 69 6e 64 65 78 5f 6c 69 73 74 22 29 3d 3d 30  "index_list")==0
123b0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
123c0 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Idx;.    Table *
123d0 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a  pTab;.    Vdbe *
123e0 76 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  v;.    pTab = sq
123f0 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62  liteFindTable(db
12400 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69  , zRight);.    i
12410 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20  f( pTab ){.     
12420 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
12430 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
12440 20 20 70 49 64 78 20 3d 20 70 54 61 62 2d 3e 70    pIdx = pTab->p
12450 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  Index;.    }.   
12460 20 69 66 28 20 70 54 61 62 20 26 26 20 70 49 64   if( pTab && pId
12470 78 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20  x && v ){.      
12480 69 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20  int i = 0; .    
12490 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
124a0 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65  indexListPreface
124b0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
124c0 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c   OP_ColumnCount,
124d0 20 33 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   3, 0,       0},
124e0 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  .        { OP_Co
124f0 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c  lumnName,  0, 0,
12500 20 20 20 20 20 20 20 22 73 65 71 22 7d 2c 0a 20         "seq"},. 
12510 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
12520 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20  mnName,  1, 0,  
12530 20 20 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20       "name"},.  
12540 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
12550 6e 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20  nName,  2, 0,   
12560 20 20 20 20 22 75 6e 69 71 75 65 22 7d 2c 0a 20      "unique"},. 
12570 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 73       };..      s
12580 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
12590 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
125a0 69 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65  indexListPreface
125b0 29 2c 20 69 6e 64 65 78 4c 69 73 74 50 72 65 66  ), indexListPref
125c0 61 63 65 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ace);.      whil
125d0 65 28 70 49 64 78 29 7b 0a 20 20 20 20 20 20 20  e(pIdx){.       
125e0 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
125f0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12600 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  i, 0);.        s
12610 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
12620 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
12630 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
12640 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
12650 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  , -1, pIdx->zNam
12660 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
12670 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
12680 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
12690 65 67 65 72 2c 20 70 49 64 78 2d 3e 6f 6e 45 72  eger, pIdx->onEr
126a0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 20 30 29  ror!=OE_None, 0)
126b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
126c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
126d0 43 61 6c 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b  Callback, 3, 0);
126e0 0a 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20  .        ++i;.  
126f0 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 49 64        pIdx = pId
12700 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
12710 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
12720 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
12730 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
12740 43 6d 70 28 7a 4c 65 66 74 2c 20 22 70 61 72 73  Cmp(zLeft, "pars
12750 65 72 5f 74 72 61 63 65 22 29 3d 3d 30 20 29 7b  er_trace")==0 ){
12760 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64  .    extern void
12770 20 73 71 6c 69 74 65 50 61 72 73 65 72 54 72 61   sqliteParserTra
12780 63 65 28 46 49 4c 45 2a 2c 20 63 68 61 72 20 2a  ce(FILE*, char *
12790 29 3b 0a 20 20 20 20 69 66 28 20 67 65 74 42 6f  );.    if( getBo
127a0 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
127b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 50 61 72  .      sqlitePar
127c0 73 65 72 54 72 61 63 65 28 73 74 64 6f 75 74 2c  serTrace(stdout,
127d0 20 22 70 61 72 73 65 72 3a 20 22 29 3b 0a 20 20   "parser: ");.  
127e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
127f0 71 6c 69 74 65 50 61 72 73 65 72 54 72 61 63 65  qliteParserTrace
12800 28 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (0, 0);.    }.  
12810 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
12820 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
12830 70 28 7a 4c 65 66 74 2c 20 22 69 6e 74 65 67 72  p(zLeft, "integr
12840 69 74 79 5f 63 68 65 63 6b 22 29 3d 3d 30 20 29  ity_check")==0 )
12850 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
12860 65 4f 70 20 63 68 65 63 6b 44 62 5b 5d 20 3d 20  eOp checkDb[] = 
12870 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74  {.      { OP_Set
12880 49 6e 73 65 72 74 2c 20 20 20 30 2c 20 30 2c 20  Insert,   0, 0, 
12890 20 20 20 20 20 20 20 22 32 22 7d 2c 0a 20 20 20         "2"},.   
128a0 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20 20     { OP_Open,   
128b0 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20       0, 2,      
128c0 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
128d0 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 30 2c  _Rewind,      0,
128e0 20 36 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   6,        0},. 
128f0 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
12900 2c 20 20 20 20 20 20 30 2c 20 33 2c 20 20 20 20  ,      0, 3,    
12910 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20 33 20      0},    /* 3 
12920 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65  */.      { OP_Se
12930 74 49 6e 73 65 72 74 2c 20 20 20 30 2c 20 30 2c  tInsert,   0, 0,
12940 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
12950 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
12960 20 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20      0, 3,       
12970 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
12980 49 6e 74 65 67 72 69 74 79 43 6b 2c 20 30 2c 20  IntegrityCk, 0, 
12990 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20  0,        0},   
129a0 20 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 6 */.      {
129b0 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c   OP_ColumnCount,
129c0 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
129d0 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  ,.      { OP_Col
129e0 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20  umnName,  0, 0, 
129f0 20 20 20 20 20 20 20 22 69 6e 74 65 67 72 69 74         "integrit
12a00 79 5f 63 68 65 63 6b 22 7d 2c 0a 20 20 20 20 20  y_check"},.     
12a10 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20   { OP_Callback, 
12a20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
12a30 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  0},.      { OP_S
12a40 65 74 49 6e 73 65 72 74 2c 20 20 20 31 2c 20 30  etInsert,   1, 0
12a50 2c 20 20 20 20 20 20 20 20 22 32 22 7d 2c 0a 20  ,        "2"},. 
12a60 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 41 75       { OP_OpenAu
12a70 78 2c 20 20 20 20 20 31 2c 20 32 2c 20 20 20 20  x,     1, 2,    
12a80 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
12a90 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20  OP_Rewind,      
12aa0 31 2c 20 31 36 2c 20 20 20 20 20 20 20 30 7d 2c  1, 16,       0},
12ab0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
12ac0 6d 6e 2c 20 20 20 20 20 20 31 2c 20 33 2c 20 20  mn,      1, 3,  
12ad0 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
12ae0 31 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50  13 */.      { OP
12af0 5f 53 65 74 49 6e 73 65 72 74 2c 20 20 20 31 2c  _SetInsert,   1,
12b00 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
12b10 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
12b20 20 20 20 20 20 20 20 31 2c 20 31 33 2c 20 20 20         1, 13,   
12b30 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
12b40 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 2c 20  OP_IntegrityCk, 
12b50 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 1,        0},
12b60 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20      /* 16 */.   
12b70 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
12b80 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
12b90 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
12ba0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
12bb0 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
12bc0 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
12bd0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
12be0 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
12bf0 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 63 68  (v, ArraySize(ch
12c00 65 63 6b 44 62 29 2c 20 63 68 65 63 6b 44 62 29  eckDb), checkDb)
12c10 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b 7d 0a  ;.  }else..  {}.
12c20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 65    sqliteFree(zLe
12c30 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ft);.  sqliteFre
12c40 65 28 7a 52 69 67 68 74 29 3b 0a 7d 0a           e(zRight);.}.