/ Hex Artifact Content
Login

Artifact c288c2428ad34542d6357619f4c30d0a761fe55f:


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 39 39 20 32 30 30  ild.c,v 1.99 200
0310: 32 2f 30 36 2f 32 35 20 31 33 3a 31 36 3a 30 33  2/06/25 13:16:03
0320: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0330: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0340: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0350: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  type.h>../*.** T
0360: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0370: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77  alled when a new
0380: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
0390: 73 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a  s beginning to.*
03a0: 2a 20 62 65 20 70 61 72 73 65 64 2e 20 20 43 68  * be parsed.  Ch
03b0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
03c0: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
03d0: 20 64 61 74 61 62 61 73 65 20 6e 65 65 64 73 0a   database needs.
03e0: 2a 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66 72  ** to be read fr
03f0: 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  om the SQLITE_MA
0400: 53 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45 5f  STER and SQLITE_
0410: 54 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62 6c  TEMP_MASTER tabl
0420: 65 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65  es..** If it doe
0430: 73 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74 2e  s, then read it.
0440: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42  .*/.void sqliteB
0450: 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 20  eginParse(Parse 
0460: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78 70  *pParse, int exp
0470: 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71 6c  lainFlag){.  sql
0480: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
0490: 2d 3e 64 62 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ->db;.  pParse->
04a0: 65 78 70 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69  explain = explai
04b0: 6e 46 6c 61 67 3b 0a 20 20 69 66 28 28 64 62 2d  nFlag;.  if((db-
04c0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
04d0: 49 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30 20  Initialized)==0 
04e0: 26 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46  && pParse->initF
04f0: 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  lag==0 ){.    in
0500: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e 69  t rc = sqliteIni
0510: 74 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e 7a  t(db, &pParse->z
0520: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28  ErrMsg);.    if(
0530: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
0540: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
0550: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 70  rc = rc;.      p
0560: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
0570: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
0580: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
0590: 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
05a0: 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74   single SQL stat
05b0: 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a  ement has been.*
05c0: 2a 20 70 61 72 73 65 64 20 61 6e 64 20 77 65 20  * parsed and we 
05d0: 77 61 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20  want to execute 
05e0: 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f  the VDBE code to
05f0: 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74   implement .** t
0600: 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  hat statement.  
0610: 50 72 69 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75  Prior action rou
0620: 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61 76  tines should hav
0630: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e  e already.** con
0640: 73 74 72 75 63 74 65 64 20 56 44 42 45 20 63 6f  structed VDBE co
0650: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  de to do the wor
0660: 6b 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61  k of the SQL sta
0670: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20  tement..** This 
0680: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73  routine just has
0690: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
06a0: 56 44 42 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  VDBE code..**.**
06b0: 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61 6e   Note that if an
06c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
06d0: 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   it might be the
06e0: 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f   case that.** no
06f0: 20 56 44 42 45 20 63 6f 64 65 20 77 61 73 20 67   VDBE code was g
0700: 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  enerated..*/.voi
0710: 64 20 73 71 6c 69 74 65 45 78 65 63 28 50 61 72  d sqliteExec(Par
0720: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0730: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
0740: 4b 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  K;.  sqlite *db 
0750: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
0760: 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  if( sqlite_mallo
0770: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
0780: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
0790: 3e 70 56 64 62 65 20 26 26 20 70 50 61 72 73 65  >pVdbe && pParse
07a0: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
07b0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
07c0: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  lain ){.      rc
07d0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4c 69 73   = sqliteVdbeLis
07e0: 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  t(pParse->pVdbe,
07f0: 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61   pParse->xCallba
0800: 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72 67  ck, pParse->pArg
0810: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 50               &pP
0830: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  arse->zErrMsg);.
0840: 20 20 20 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63        db->next_c
0850: 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65  ookie = db->sche
0860: 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 7d  ma_cookie;.    }
0870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49 4c 45  else{.      FILE
0880: 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66   *trace = (db->f
0890: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
08a0: 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74  beTrace)!=0 ? st
08b0: 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 20 20  dout : 0;.      
08c0: 73 71 6c 69 74 65 56 64 62 65 54 72 61 63 65 28  sqliteVdbeTrace(
08d0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 74  pParse->pVdbe, t
08e0: 72 61 63 65 29 3b 0a 20 20 20 20 20 20 72 63 20  race);.      rc 
08f0: 3d 20 73 71 6c 69 74 65 56 64 62 65 45 78 65 63  = sqliteVdbeExec
0900: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
0910: 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63  pParse->xCallbac
0920: 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c  k, pParse->pArg,
0930: 20 0a 20 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 26 70 50 61              &pPa
0950: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  rse->zErrMsg, db
0960: 2d 3e 70 42 75 73 79 41 72 67 2c 0a 20 20 20 20  ->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 64 62 2d 3e 78 42 75 73 79 43        db->xBusyC
0990: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20  allback);.      
09a0: 69 66 28 20 72 63 20 29 20 70 50 61 72 73 65 2d  if( rc ) pParse-
09b0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nErr++;.    }. 
09c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 6c     sqliteVdbeDel
09d0: 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ete(pParse->pVdb
09e0: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
09f0: 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20 20 70  pVdbe = 0;.    p
0a00: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
0a10: 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72  et = 0;.    pPar
0a20: 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
0a30: 20 70 50 61 72 73 65 2d 3e 73 63 68 65 6d 61 56   pParse->schemaV
0a40: 65 72 69 66 69 65 64 20 3d 20 30 3b 0a 20 20 7d  erified = 0;.  }
0a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
0a60: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
0a70: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
0a80: 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61  scribes .** a pa
0a90: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
0aa0: 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  e table given th
0ab0: 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61  e name.** of tha
0ac0: 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  t table.  Return
0ad0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
0ae0: 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  nd..*/.Table *sq
0af0: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73 71  liteFindTable(sq
0b00: 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20  lite *db, const 
0b10: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
0b20: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20  Table *p;.  p = 
0b30: 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26  sqliteHashFind(&
0b40: 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  db->tblHash, zNa
0b50: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
0b60: 29 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  )+1);.  return p
0b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0b80: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0b90: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0ba0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0bb0: 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
0bc0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
0bd0: 66 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 2a 2a  f that index..**
0be0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
0bf0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e  not found..*/.In
0c00: 64 65 78 20 2a 73 71 6c 69 74 65 46 69 6e 64 49  dex *sqliteFindI
0c10: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
0c20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0c30: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  me){.  Index *p;
0c40: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73  .  p = sqliteHas
0c50: 68 46 69 6e 64 28 26 64 62 2d 3e 69 64 78 48 61  hFind(&db->idxHa
0c60: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  sh, zName, strle
0c70: 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 72  n(zName)+1);.  r
0c80: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
0c90: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76  * Remove the giv
0ca0: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  en index from th
0cb0: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
0cc0: 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20  le, and free.** 
0cd0: 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  its memory struc
0ce0: 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tures..**.** The
0cf0: 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65   index is remove
0d00: 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
0d10: 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ase hash tables 
0d20: 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  but.** it is not
0d30: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
0d40: 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69 74  he Table that it
0d50: 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c   indexes..** Unl
0d60: 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  inking from the 
0d70: 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f  Table must be do
0d80: 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ne by the callin
0d90: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
0da0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
0db0: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  eDeleteIndex(sql
0dc0: 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  ite *db, Index *
0dd0: 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c  p){.  Index *pOl
0de0: 64 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  d;.  assert( db!
0df0: 3d 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d  =0 && p->zName!=
0e00: 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71  0 );.  pOld = sq
0e10: 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26  liteHashInsert(&
0e20: 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 2d 3e  db->idxHash, p->
0e30: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d  zName, strlen(p-
0e40: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20  >zName)+1, 0);. 
0e50: 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26 20   if( pOld!=0 && 
0e60: 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20 73  pOld!=p ){.    s
0e70: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
0e80: 26 64 62 2d 3e 69 64 78 48 61 73 68 2c 20 70 4f  &db->idxHash, pO
0e90: 6c 64 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  ld->zName, strle
0ea0: 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31  n(pOld->zName)+1
0eb0: 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20 73  , pOld);.  }.  s
0ec0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
0ed0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
0ee0: 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72  e given index fr
0ef0: 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68  om its table, th
0f00: 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68 65  en remove.** the
0f10: 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20   index from the 
0f20: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
0f30: 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d 65   and free its me
0f40: 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75 72  mory.** structur
0f50: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
0f60: 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  teUnlinkAndDelet
0f70: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64  eIndex(sqlite *d
0f80: 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  b, Index *pIndex
0f90: 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  ){.  if( pIndex-
0fa0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d  >pTable->pIndex=
0fb0: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 70  =pIndex ){.    p
0fc0: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
0fd0: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e  Index = pIndex->
0fe0: 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
0ff0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
1000: 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e    for(p=pIndex->
1010: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
1020: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  p && p->pNext!=p
1030: 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78  Index; p=p->pNex
1040: 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 20 26  t){}.    if( p &
1050: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
1060: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  ex ){.      p->p
1070: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
1080: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
1090: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e    sqliteDeleteIn
10a0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
10b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
10c0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
10d0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
10e0: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
10f0: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 64 61 74 61  ables of.** data
1100: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
1110: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
1120: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c  s called to recl
1130: 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65  aim memory.** be
1140: 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  fore the connect
1150: 69 6f 6e 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ion closes.  It 
1160: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
1170: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
1180: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
1190: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
11a0: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
11b0: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  saction..*/.void
11c0: 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74 65   sqliteResetInte
11d0: 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74  rnalSchema(sqlit
11e0: 65 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c  e *db){.  HashEl
11f0: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
1200: 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20  h temp1;.  Hash 
1210: 74 65 6d 70 32 3b 0a 0a 20 20 74 65 6d 70 31 20  temp2;..  temp1 
1220: 3d 20 64 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  = db->tblHash;. 
1230: 20 74 65 6d 70 32 20 3d 20 64 62 2d 3e 74 72 69   temp2 = db->tri
1240: 67 48 61 73 68 3b 0a 20 20 73 71 6c 69 74 65 48  gHash;.  sqliteH
1250: 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 74 72 69  ashInit(&db->tri
1260: 67 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41  gHash, SQLITE_HA
1270: 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20  SH_STRING, 0);. 
1280: 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61 72   sqliteHashClear
1290: 28 26 64 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a  (&db->idxHash);.
12a0: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
12b0: 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d  teHashFirst(&tem
12c0: 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  p2); pElem; pEle
12d0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
12e0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 72  (pElem)){.    Tr
12f0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 20  igger *pTrigger 
1300: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
1310: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 73 71 6c  (pElem);.    sql
1320: 69 74 65 44 65 6c 65 74 65 54 72 69 67 67 65 72  iteDeleteTrigger
1330: 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 7d 0a  (pTrigger);.  }.
1340: 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c 65 61    sqliteHashClea
1350: 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 73 71 6c  r(&temp2);.  sql
1360: 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62 2d  iteHashInit(&db-
1370: 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45  >tblHash, SQLITE
1380: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29  _HASH_STRING, 0)
1390: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
13a0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
13b0: 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45  emp1); pElem; pE
13c0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
13d0: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
13e0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
13f0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
1400: 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  em);.    sqliteD
1410: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1420: 54 61 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Tab);.  }.  sqli
1430: 74 65 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d  teHashClear(&tem
1440: 70 31 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  p1);.  db->flags
1450: 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 49 6e 69   &= ~(SQLITE_Ini
1460: 74 69 61 6c 69 7a 65 64 7c 53 51 4c 49 54 45 5f  tialized|SQLITE_
1470: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a  InternChanges);.
1480: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1490: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
14a0: 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
14b0: 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20  ack occurs.  If 
14c0: 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63  there were.** sc
14d0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
14e0: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
14f0: 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76  ion, then we hav
1500: 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  e to reset the.*
1510: 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  * internal hash 
1520: 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61  tables and reloa
1530: 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b  d them from disk
1540: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1550: 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c  RollbackInternal
1560: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a  Changes(sqlite *
1570: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66  db){.  if( db->f
1580: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
1590: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20  ternChanges ){. 
15a0: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e     sqliteResetIn
15b0: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 29  ternalSchema(db)
15c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
15d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
15e0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
15f0: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
1600: 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74  oid sqliteCommit
1610: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
1620: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 64  sqlite *db){.  d
1630: 62 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b->schema_cookie
1640: 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b   = db->next_cook
1650: 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  ie;.  db->flags 
1660: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
1670: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
1680: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
1690: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
16a0: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
16b0: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
16c0: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
16d0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
16e0: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
16f0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
1700: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
1710: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
1720: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
1730: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
1740: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
1750: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
1760: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
1770: 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73   But it does des
1780: 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73  troy.** memory s
1790: 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65  tructures of the
17a0: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
17b0: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
17c0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65  le..**.** Indice
17d0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
17e0: 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  h the table are 
17f0: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
1800: 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73  e "db".** data s
1810: 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21 3d  tructure if db!=
1820: 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55  NULL.  If db==NU
1830: 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61  LL, indices atta
1840: 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  ched to.** the t
1850: 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64  able are deleted
1860: 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73 75  , but it is assu
1870: 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61 6c  med they have al
1880: 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e  ready been.** un
1890: 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  linked..*/.void 
18a0: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
18b0: 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61  e(sqlite *db, Ta
18c0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
18d0: 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20 2a  int i;.  Index *
18e0: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
18f0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
1900: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1910: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
1920: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Col; i++){.    s
1930: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
1940: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
1950: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
1960: 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d  (pTable->aCol[i]
1970: 2e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c  .zDflt);.    sql
1980: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
1990: 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a  aCol[i].zType);.
19a0: 20 20 7d 0a 20 20 66 6f 72 28 70 49 6e 64 65 78    }.  for(pIndex
19b0: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65   = pTable->pInde
19c0: 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
19d0: 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  x=pNext){.    pN
19e0: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
19f0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  ext;.    sqliteD
1a00: 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70  eleteIndex(db, p
1a10: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71  Index);.  }.  sq
1a20: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
1a30: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
1a40: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
1a50: 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c  ol);.  sqliteSel
1a60: 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65  ectDelete(pTable
1a70: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->pSelect);.  sq
1a80: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29  liteFree(pTable)
1a90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
1aa0: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
1ab0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
1ac0: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
1ad0: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
1ae0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
1af0: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
1b00: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1b10: 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e  d sqliteUnlinkAn
1b20: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
1b30: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
1b40: 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c  p){.  Table *pOl
1b50: 64 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  d;.  assert( db!
1b60: 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73  =0 );.  pOld = s
1b70: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
1b80: 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  &db->tblHash, p-
1b90: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
1ba0: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
1bb0: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
1bc0: 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a  0 || pOld==p );.
1bd0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61    sqliteDeleteTa
1be0: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ble(db, p);.}../
1bf0: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74  *.** Construct t
1c00: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 75 73 65  he name of a use
1c10: 72 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  r table or index
1c20: 20 66 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a   from a token..*
1c30: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
1c40: 6c 64 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6f  ld the name is o
1c50: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1c60: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
1c70: 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72 65 65 64  must.** be freed
1c80: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
1c90: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61  function..*/.cha
1ca0: 72 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e 61  r *sqliteTableNa
1cb0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65  meFromToken(Toke
1cc0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
1cd0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1ce0: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
1cf0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
1d00: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4e  sqliteDequote(zN
1d10: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ame);.  return z
1d20: 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Name;.}../*.** G
1d30: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1d40: 6f 70 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72  open the appropr
1d50: 69 61 74 65 20 6d 61 73 74 65 72 20 74 61 62 6c  iate master tabl
1d60: 65 2e 20 20 54 68 65 20 74 61 62 6c 65 0a 2a 2a  e.  The table.**
1d70: 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20   opened will be 
1d80: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 66 6f  SQLITE_MASTER fo
1d90: 72 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62  r persistent tab
1da0: 6c 65 73 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  les and .** SQLI
1db0: 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 66  TE_TEMP_MASTER f
1dc0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  or temporary tab
1dd0: 6c 65 73 2e 20 20 54 68 65 20 74 61 62 6c 65 20  les.  The table 
1de0: 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  is opened.** on 
1df0: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
1e00: 64 20 73 71 6c 69 74 65 4f 70 65 6e 4d 61 73 74  d sqliteOpenMast
1e10: 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c  erTable(Vdbe *v,
1e20: 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20   int isTemp){.  
1e30: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
1e40: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
1e50: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 41 75  p(v, OP_OpenWrAu
1e60: 78 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 73 71  x, 0, 2);.    sq
1e70: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
1e80: 28 76 2c 20 2d 31 2c 20 54 45 4d 50 5f 4d 41 53  (v, -1, TEMP_MAS
1e90: 54 45 52 5f 4e 41 4d 45 2c 20 50 33 5f 53 54 41  TER_NAME, P3_STA
1ea0: 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TIC);.  }else{. 
1eb0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
1ec0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
1ed0: 74 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 73  te, 0, 2);.    s
1ee0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
1ef0: 33 28 76 2c 20 2d 31 2c 20 4d 41 53 54 45 52 5f  3(v, -1, MASTER_
1f00: 4e 41 4d 45 2c 20 50 33 5f 53 54 41 54 49 43 29  NAME, P3_STATIC)
1f10: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ;.  }.}../*.** B
1f20: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
1f30: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
1f40: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
1f50: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
1f60: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
1f70: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
1f80: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
1f90: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
1fa0: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
1fb0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
1fc0: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
1fd0: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
1fe0: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
1ff0: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
2000: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
2010: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
2020: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
2030: 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e  .** pStart token
2040: 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20 61   is the CREATE a
2050: 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  nd pName is the 
2060: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
2070: 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20   isTemp.** flag 
2080: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  is true if the t
2090: 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
20a0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78  tored in the aux
20b0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a  iliary database.
20c0: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
20d0: 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  of in the main d
20e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
20f0: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
2100: 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e  the case.** when
2110: 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22   the "TEMP" or "
2120: 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f  TEMPORARY" keywo
2130: 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  rd occurs in bet
2140: 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61  ween.** CREATE a
2150: 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  nd TABLE..**.** 
2160: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  The new table re
2170: 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69  cord is initiali
2180: 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70  zed and put in p
2190: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
21a0: 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20  ..** As more of 
21b0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
21c0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
21d0: 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c  rsed, additional
21e0: 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69   action.** routi
21f0: 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  nes will be call
2200: 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69  ed to add more i
2210: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
2220: 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74  is record..** At
2230: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2240: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
2250: 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69  tement, the sqli
2260: 74 65 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  teEndTable() rou
2270: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
2280: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
2290: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
22a0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
22b0: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
22c0: 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65  sqliteStartTable
22d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22e0: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 54  Token *pStart, T
22f0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  oken *pName, int
2300: 20 69 73 54 65 6d 70 29 7b 0a 20 20 54 61 62 6c   isTemp){.  Tabl
2310: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64  e *pTable;.  Ind
2320: 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72  ex *pIdx;.  char
2330: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74   *zName;.  sqlit
2340: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
2350: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
2360: 20 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74    pParse->sFirst
2370: 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b  Token = *pStart;
2380: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
2390: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
23a0: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
23b0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
23c0: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  urn;..  /* Befor
23d0: 65 20 74 72 79 69 6e 67 20 74 6f 20 63 72 65 61  e trying to crea
23e0: 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  te a temporary t
23f0: 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  able, make sure 
2400: 74 68 65 20 42 74 72 65 65 20 66 6f 72 0a 20 20  the Btree for.  
2410: 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f  ** holding tempo
2420: 72 61 72 79 20 74 61 62 6c 65 73 20 69 73 20 6f  rary tables is o
2430: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  pen..  */.  if( 
2440: 69 73 54 65 6d 70 20 26 26 20 64 62 2d 3e 70 42  isTemp && db->pB
2450: 65 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eTemp==0 ){.    
2460: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 42  int rc = sqliteB
2470: 74 72 65 65 4f 70 65 6e 28 30 2c 20 30 2c 20 4d  treeOpen(0, 0, M
2480: 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 70  AX_PAGES, &db->p
2490: 42 65 54 65 6d 70 29 3b 0a 20 20 20 20 69 66 28  BeTemp);.    if(
24a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
24c0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
24d0: 3e 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c  >zErrMsg, "unabl
24e0: 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
24f0: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
2500: 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
2510: 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
2520: 72 61 72 79 20 74 61 62 6c 65 73 22 2c 20 30 29  rary tables", 0)
2530: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2540: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
2550: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
2560: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
2570: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29  SQLITE_InTrans )
2580: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2590: 69 74 65 42 74 72 65 65 42 65 67 69 6e 54 72 61  iteBtreeBeginTra
25a0: 6e 73 28 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b  ns(db->pBeTemp);
25b0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
25c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25d0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
25e0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
25f0: 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20 74  rrMsg, "unable t
2600: 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f  o get a write lo
2610: 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20  ck on ".        
2620: 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79    "the temporary
2630: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c   database file",
2640: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
2650: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
2660: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2670: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2680: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
2690: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
26a0: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
26b0: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
26c0: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
26d0: 72 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 49  r table name.  I
26e0: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
26f0: 73 73 61 67 65 20 69 66 20 69 74 20 64 6f 65 73  ssage if it does
2700: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ..  **.  ** If w
2710: 65 20 61 72 65 20 72 65 2d 72 65 61 64 69 6e 67  e are re-reading
2720: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
2730: 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  er table because
2740: 20 6f 66 20 61 20 73 63 68 65 6d 61 0a 20 20 2a   of a schema.  *
2750: 2a 20 63 68 61 6e 67 65 20 61 6e 64 20 61 20 6e  * change and a n
2760: 65 77 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62  ew permanent tab
2770: 6c 65 20 69 73 20 66 6f 75 6e 64 20 77 68 6f 73  le is found whos
2780: 65 20 6e 61 6d 65 20 63 6f 6c 6c 69 64 65 73 20  e name collides 
2790: 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 65 78 69  with.  ** an exi
27a0: 73 74 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  sting temporary 
27b0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 69 67 6e 6f  table, then igno
27c0: 72 65 20 74 68 65 20 6e 65 77 20 70 65 72 6d 61  re the new perma
27d0: 6e 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  nent table..  **
27e0: 20 57 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   We will continu
27f0: 65 20 70 61 72 73 69 6e 67 2c 20 62 75 74 20 74  e parsing, but t
2800: 68 65 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65 43  he pParse->nameC
2810: 6c 61 73 68 20 66 6c 61 67 20 77 69 6c 6c 20 62  lash flag will b
2820: 65 20 73 65 74 0a 20 20 2a 2a 20 73 6f 20 77 65  e set.  ** so we
2830: 20 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f 20 64 69   will know to di
2840: 73 63 61 72 64 20 74 68 65 20 74 61 62 6c 65 20  scard the table 
2850: 72 65 63 6f 72 64 20 6f 6e 63 65 20 70 61 72 73  record once pars
2860: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
2870: 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65 20  ..  */.  pTable 
2880: 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c  = sqliteFindTabl
2890: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
28a0: 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b  if( pTable!=0 ){
28b0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d  .    if( pTable-
28c0: 3e 69 73 54 65 6d 70 20 26 26 20 70 50 61 72 73  >isTemp && pPars
28d0: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
28e0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 61 6d       pParse->nam
28f0: 65 43 6c 61 73 68 20 3d 20 31 3b 0a 20 20 20 20  eClash = 1;.    
2900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2910: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
2920: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
2930: 22 74 61 62 6c 65 20 22 2c 20 30 2c 20 70 4e 61  "table ", 0, pNa
2940: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c  me->z, pName->n,
2950: 0a 20 20 20 20 20 20 20 20 20 20 22 20 61 6c 72  .          " alr
2960: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 30 2c  eady exists", 0,
2970: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2980: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
2990: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
29a0: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
29b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
29c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 61 6d  .    pParse->nam
29d0: 65 43 6c 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a  eClash = 0;.  }.
29e0: 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73 71    if( (pIdx = sq
29f0: 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62  liteFindIndex(db
2a00: 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 26 26 0a  , zName))!=0 &&.
2a10: 20 20 20 20 20 20 20 20 20 20 28 21 70 49 64 78            (!pIdx
2a20: 2d 3e 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70  ->pTable->isTemp
2a30: 20 7c 7c 20 21 70 50 61 72 73 65 2d 3e 69 6e 69   || !pParse->ini
2a40: 74 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 73 71  tFlag) ){.    sq
2a50: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
2a60: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
2a70: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
2a80: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
2a90: 20 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e 61 6d   ", .       zNam
2aa0: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
2ab0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
2ac0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
2ad0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2ae0: 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  }.  pTable = sql
2af0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
2b00: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
2b10: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ( pTable==0 ){. 
2b20: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
2b30: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
2b40: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
2b50: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
2b60: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
2b70: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  0;.  pTable->aCo
2b80: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
2b90: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
2ba0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
2bb0: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 73 54  0;.  pTable->isT
2bc0: 65 6d 70 20 3d 20 69 73 54 65 6d 70 3b 0a 20 20  emp = isTemp;.  
2bd0: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
2be0: 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 44 65  Table ) sqliteDe
2bf0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50  leteTable(db, pP
2c00: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
2c10: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
2c20: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
2c30: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
2c40: 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20  rating the code 
2c50: 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74  that will insert
2c60: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
2c70: 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  d into.  ** the 
2c80: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
2c90: 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ble.  Note in pa
2ca0: 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65  rticular that we
2cb0: 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20   must go ahead. 
2cc0: 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65   ** and allocate
2cd0: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
2ce0: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
2cf0: 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66   entry now.  Bef
2d00: 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49  ore any.  ** PRI
2d10: 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
2d20: 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  UE keywords are 
2d30: 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b  parsed.  Those k
2d40: 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75  eywords will cau
2d50: 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  se.  ** indices 
2d60: 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e  to be created an
2d70: 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  d the table reco
2d80: 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66  rd must come bef
2d90: 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e  ore the .  ** in
2da0: 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74  dices.  Hence, t
2db0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
2dc0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d   for the table m
2dd0: 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
2de0: 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  .  ** now..  */.
2df0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69    if( !pParse->i
2e00: 6e 69 74 46 6c 61 67 20 26 26 20 28 76 20 3d 20  nitFlag && (v = 
2e10: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
2e20: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
2e30: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
2e40: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
2e50: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  e, 0);.    if( !
2e60: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
2e70: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2e80: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
2e90: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20  b->file_format, 
2ea0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2eb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2ec0: 53 65 74 43 6f 6f 6b 69 65 2c 20 30 2c 20 31 29  SetCookie, 0, 1)
2ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2ee0: 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  teOpenMasterTabl
2ef0: 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20  e(v, isTemp);.  
2f00: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
2f10: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
2f20: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
2f30: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2f40: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
2f50: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
2f60: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
2f70: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
2f80: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
2f90: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
2fa0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
2fb0: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
2fc0: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
2fd0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
2fe0: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
2ff0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
3000: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
3010: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
3020: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
3030: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
3040: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
3050: 20 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62    sqliteStartTab
3060: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
3070: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
3080: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
3090: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
30a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
30b0: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
30c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
30d0: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
30e0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
30f0: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
3100: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
3110: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75  r *z = 0;.  Colu
3120: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
3130: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
3140: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
3150: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 53 65 74  urn;.  sqliteSet
3160: 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d  NString(&z, pNam
3170: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
3180: 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  0);.  if( z==0 )
3190: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
31a0: 65 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66  eDequote(z);.  f
31b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
31c0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
31d0: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
31e0: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
31f0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
3200: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
3210: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
3220: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
3230: 75 6d 6e 20 6e 61 6d 65 3a 20 22 2c 20 7a 2c 20  umn name: ", z, 
3240: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
3250: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
3260: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
3270: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
3280: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
3290: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
32a0: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
32b0: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
32c0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70  sqliteRealloc( p
32d0: 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c  ->aCol, (p->nCol
32e0: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
32f0: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
3300: 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
3310: 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  n;.    p->aCol =
3320: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
3330: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
3340: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
3350: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
3360: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
3370: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
3380: 0a 20 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64  .  pCol->sortOrd
3390: 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e  er = SQLITE_SO_N
33a0: 55 4d 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b  UM;.  p->nCol++;
33b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
33c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
33d0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
33e0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
33f0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
3400: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
3410: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
3420: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
3430: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
3440: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
3450: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
3460: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
3470: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
3480: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
3490: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
34a0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
34b0: 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  iteAddNotNull(Pa
34c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
34d0: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
34e0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
34f0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
3500: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
3510: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
3520: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
3530: 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c  ( i>=0 ) p->aCol
3540: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  [i].notNull = on
3550: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
3560: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3570: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
3580: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
3590: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
35a0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
35b0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
35c0: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
35d0: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
35e0: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
35f0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
3600: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
3610: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
3620: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
3630: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
3640: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
3650: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
3660: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
3670: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
3680: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
3690: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
36a0: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
36b0: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
36c0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
36d0: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
36e0: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
36f0: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
3700: 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50  eAddColumnType(P
3710: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
3720: 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b  ken *pFirst, Tok
3730: 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61  en *pLast){.  Ta
3740: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c  ble *p;.  int i,
3750: 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63   j;.  int n;.  c
3760: 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20  har *z, **pz;.  
3770: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
3780: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
3790: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
37a0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
37b0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
37c0: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
37d0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
37e0: 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c  i];.  pz = &pCol
37f0: 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70  ->zType;.  n = p
3800: 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70  Last->n + Addr(p
3810: 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28  Last->z) - Addr(
3820: 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71  pFirst->z);.  sq
3830: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70  liteSetNString(p
3840: 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e 2c  z, pFirst->z, n,
3850: 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b 0a   0);.  z = *pz;.
3860: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
3870: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  urn;.  for(i=j=0
3880: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
3890: 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a    int c = z[i];.
38a0: 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
38b0: 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  c) ) continue;. 
38c0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20     z[j++] = c;. 
38d0: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
38e0: 20 70 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72   pCol->sortOrder
38f0: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d   = SQLITE_SO_NUM
3900: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69  ;.  for(i=0; z[i
3910: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69  ]; i++){.    swi
3920: 74 63 68 28 20 7a 5b 69 5d 20 29 7b 0a 20 20 20  tch( z[i] ){.   
3930: 20 20 20 63 61 73 65 20 27 63 27 3a 0a 20 20 20     case 'c':.   
3940: 20 20 20 63 61 73 65 20 27 43 27 3a 20 7b 0a 20     case 'C': {. 
3950: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
3960: 65 53 74 72 4e 49 43 6d 70 28 26 7a 5b 69 5d 2c  eStrNICmp(&z[i],
3970: 22 63 68 61 72 22 2c 34 29 3d 3d 30 20 7c 7c 0a  "char",4)==0 ||.
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26  sqliteStrNICmp(&
39a0: 7a 5b 69 5d 2c 22 63 6c 6f 62 22 2c 34 29 3d 3d  z[i],"clob",4)==
39b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
39c0: 43 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d  Col->sortOrder =
39d0: 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b   SQLITE_SO_TEXT;
39e0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
39f0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
3a00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3a10: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27    }.      case '
3a20: 78 27 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27  x':.      case '
3a30: 58 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  X': {.        if
3a40: 28 20 69 3e 3d 32 20 26 26 20 73 71 6c 69 74 65  ( i>=2 && sqlite
3a50: 53 74 72 4e 49 43 6d 70 28 26 7a 5b 69 2d 32 5d  StrNICmp(&z[i-2]
3a60: 2c 22 74 65 78 74 22 2c 34 29 3d 3d 30 20 29 7b  ,"text",4)==0 ){
3a70: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
3a80: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c  >sortOrder = SQL
3a90: 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20  ITE_SO_TEXT;.   
3aa0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
3ab0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3ac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3ad0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
3ae0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3b00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67  }.}../*.** The g
3b10: 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68  iven token is th
3b20: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
3b30: 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c  for the last col
3b40: 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20  umn added to.** 
3b50: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
3b60: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
3b70: 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e  uction.  If "min
3b80: 75 73 46 6c 61 67 22 20 69 73 20 74 72 75 65 2c  usFlag" is true,
3b90: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
3ba0: 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73   value token was
3bb0: 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
3bc0: 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a  inus sign..**.**
3bd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3be0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
3bf0: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
3c00: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
3c10: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
3c20: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
3c30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3c40: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
3c50: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
3c60: 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20  oken *pVal, int 
3c70: 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54 61  minusFlag){.  Ta
3c80: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
3c90: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20  .  char **pz;.  
3ca0: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
3cb0: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
3cc0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
3cd0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
3ce0: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
3cf0: 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d  pz = &p->aCol[i]
3d00: 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69  .zDflt;.  if( mi
3d10: 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  nusFlag ){.    s
3d20: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
3d30: 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c  pz, "-", 1, pVal
3d40: 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29  ->z, pVal->n, 0)
3d50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
3d60: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
3d70: 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61  pz, pVal->z, pVa
3d80: 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  l->n, 0);.  }.  
3d90: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70  sqliteDequote(*p
3da0: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  z);.}../*.** Des
3db0: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
3dc0: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
3dd0: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
3de0: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
3df0: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
3e00: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
3e10: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
3e20: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
3e30: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
3e40: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
3e50: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
3e60: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
3e70: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
3e80: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
3e90: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
3ea0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
3eb0: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
3ec0: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
3ed0: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
3ee0: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
3ef0: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
3f00: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
3f10: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
3f20: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
3f30: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
3f40: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
3f50: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
3f60: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
3f70: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
3f80: 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20 28  s the row id.  (
3f90: 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f  Exception:.** Fo
3fa0: 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
3fb0: 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
3fc0: 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c 20  lder databases, 
3fd0: 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a  do not do this.*
3fe0: 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * if the file fo
3ff0: 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d  rmat version num
4000: 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
4010: 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54 61   1.)  Set the Ta
4020: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
4030: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
4040: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4050: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
4060: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
4070: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
4080: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
4090: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
40a0: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
40b0: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
40c0: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
40d0: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
40e0: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
40f0: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
4100: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
4110: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
4120: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
4130: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
4140: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4150: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
4160: 74 65 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  teAddPrimaryKey(
4170: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
4180: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  dList *pList, in
4190: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
41a0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
41b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
41c0: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30   char *zType = 0
41d0: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d  ;.  int iCol = -
41e0: 31 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  1;.  if( pTab==0
41f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
4200: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
4210: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
4220: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
4230: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
4240: 65 20 5c 22 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e \"", pTab->zNa
4250: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 5c 22  me, .        "\"
4260: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
4270: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
4280: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
4290: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
42a0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  urn;.  }.  pTab-
42b0: 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  >hasPrimKey = 1;
42c0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
42d0: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
42e0: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
42f0: 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 73 74 2d  }else if( pList-
4300: 3e 6e 49 64 3d 3d 31 20 29 7b 0a 20 20 20 20 66  >nId==1 ){.    f
4310: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
4320: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
4330: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
4340: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69  qliteStrICmp(pLi
4350: 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  st->a[0].zName, 
4360: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
4370: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
4380: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4390: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  if( iCol>=0 && i
43a0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
43b0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54  {.    zType = pT
43c0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
43d0: 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Type;.  }.  if( 
43e0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65  pParse->db->file
43f0: 5f 66 6f 72 6d 61 74 3e 3d 31 20 26 26 20 0a 20  _format>=1 && . 
4400: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
4410: 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  && sqliteStrICmp
4420: 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52  (zType, "INTEGER
4430: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61  ")==0 ){.    pTa
4440: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
4450: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
4460: 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20  nf = onError;.  
4470: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
4480: 65 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  eCreateIndex(pPa
4490: 72 73 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  rse, 0, 0, pList
44a0: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29  , onError, 0, 0)
44b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
44c0: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
44d0: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
44e0: 74 79 70 65 20 67 69 76 65 6e 20 74 68 65 20 63  type given the c
44f0: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 74 6f  ollation type to
4500: 6b 65 6e 2e 0a 2a 2a 20 52 65 70 6f 72 74 20 61  ken..** Report a
4510: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 74  n error if the t
4520: 79 70 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ype is undefined
4530: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 43  ..*/.int sqliteC
4540: 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65  ollateType(Parse
4550: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
4560: 2a 70 54 79 70 65 29 7b 0a 20 20 69 66 28 20 70  *pType){.  if( p
4570: 54 79 70 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Type==0 ) return
4580: 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 4b 3b 0a   SQLITE_SO_UNK;.
4590: 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d    if( pType->n==
45a0: 34 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e 49  4 && sqliteStrNI
45b0: 43 6d 70 28 70 54 79 70 65 2d 3e 7a 2c 20 22 74  Cmp(pType->z, "t
45c0: 65 78 74 22 2c 20 34 29 3d 3d 30 20 29 7b 0a 20  ext", 4)==0 ){. 
45d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
45e0: 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 7d 0a 20 20  _SO_TEXT;.  }.  
45f0: 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 37 20  if( pType->n==7 
4600: 26 26 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d  && sqliteStrNICm
4610: 70 28 70 54 79 70 65 2d 3e 7a 2c 20 22 6e 75 6d  p(pType->z, "num
4620: 65 72 69 63 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  eric", 7)==0 ){.
4630: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4640: 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 7d 0a 20 20  E_SO_NUM;.  }.  
4650: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
4660: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
4670: 67 2c 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c  g, "unknown coll
4680: 61 74 69 6e 67 20 74 79 70 65 3a 20 22 2c 20 2d  ating type: ", -
4690: 31 2c 0a 20 20 20 20 70 54 79 70 65 2d 3e 7a 2c  1,.    pType->z,
46a0: 20 70 54 79 70 65 2d 3e 6e 2c 20 30 29 3b 0a 20   pType->n, 0);. 
46b0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
46c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
46d0: 5f 53 4f 5f 55 4e 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  _SO_UNK;.}../*.*
46e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
46f0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
4700: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
4710: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
4720: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
4730: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
4740: 74 2e 20 20 41 20 22 43 4f 4c 4c 41 54 45 22 20  t.  A "COLLATE" 
4750: 63 6c 61 75 73 65 20 68 61 73 0a 2a 2a 20 62 65  clause has.** be
4760: 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c  en seen on a col
4770: 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  umn.  This routi
4780: 6e 65 20 73 65 74 73 20 74 68 65 20 43 6f 6c 75  ne sets the Colu
4790: 6d 6e 2e 73 6f 72 74 4f 72 64 65 72 20 6f 6e 0a  mn.sortOrder on.
47a0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
47b0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
47c0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
47d0: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c  oid sqliteAddCol
47e0: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
47f0: 70 50 61 72 73 65 2c 20 69 6e 74 20 63 6f 6c 6c  pParse, int coll
4800: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
4810: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  p;.  int i;.  if
4820: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
4830: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
4840: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
4850: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e  nCol-1;.  if( i>
4860: 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  =0 ) p->aCol[i].
4870: 73 6f 72 74 4f 72 64 65 72 20 3d 20 63 6f 6c 6c  sortOrder = coll
4880: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Type;.}../*.** C
4890: 6f 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e 65  ome up with a ne
48a0: 77 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66  w random value f
48b0: 6f 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  or the schema co
48c0: 6f 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  okie.  Make sure
48d0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75  .** the new valu
48e0: 65 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  e is different f
48f0: 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a  rom the old..**.
4900: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
4910: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
4920: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
4930: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
4940: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
4950: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
4960: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
4970: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
4980: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
4990: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
49a0: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
49b0: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
49c0: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
49d0: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
49e0: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
49f0: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
4a00: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
4a10: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
4a20: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
4a30: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
4a40: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
4a50: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
4a60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
4a70: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
4a80: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
4a90: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
4aa0: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
4ab0: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
4ac0: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
4ad0: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
4ae0: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
4af0: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
4b00: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
4b10: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
4b20: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
4b30: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
4b40: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
4b50: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
4b60: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
4b70: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
4b80: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
4b90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 68  */.void sqliteCh
4ba0: 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74  angeCookie(sqlit
4bb0: 65 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 29 7b  e *db, Vdbe *v){
4bc0: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f  .  if( db->next_
4bd0: 63 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 73 63 68 65  cookie==db->sche
4be0: 6d 61 5f 63 6f 6f 6b 69 65 20 29 7b 0a 20 20 20  ma_cookie ){.   
4bf0: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
4c00: 20 3d 20 64 62 2d 3e 73 63 68 65 6d 61 5f 63 6f   = db->schema_co
4c10: 6f 6b 69 65 20 2b 20 73 71 6c 69 74 65 52 61 6e  okie + sqliteRan
4c20: 64 6f 6d 42 79 74 65 28 29 20 2b 20 31 3b 0a 20  domByte() + 1;. 
4c30: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
4c40: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
4c50: 6e 67 65 73 3b 0a 20 20 20 20 73 71 6c 69 74 65  nges;.    sqlite
4c60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4c70: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78  Integer, db->nex
4c80: 74 5f 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20  t_cookie, 0);.  
4c90: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4ca0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
4cb0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  e, 0, 0);.  }.}.
4cc0: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
4cd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
4ce0: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
4cf0: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
4d00: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
4d10: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
4d20: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
4d30: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
4d40: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
4d50: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
4d60: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a   terminator..*/.
4d70: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
4d80: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
4d90: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
4da0: 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 20    int needQuote 
4db0: 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  = 0;.  for(n=0; 
4dc0: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
4dd0: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27 27 20     if( *z=='\'' 
4de0: 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f 74  ){ n++; needQuot
4df0: 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  e=1; }.  }.  ret
4e00: 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75 6f 74  urn n + needQuot
4e10: 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  e*2;.}../*.** Wr
4e20: 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65  ite an identifie
4e30: 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  r onto the end o
4e40: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
4e50: 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74  ng.  Add.** quot
4e60: 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20  e characters as 
4e70: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
4e80: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
4e90: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
4ea0: 64 78 2c 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  dx, char *zIdent
4eb0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  ){.  int i, j, n
4ec0: 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20  eedQuote;.  i = 
4ed0: 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30  *pIdx;.  for(j=0
4ee0: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
4ef0: 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c  ){.    if( !isal
4f00: 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26  num(zIdent[j]) &
4f10: 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27  & zIdent[j]!='_'
4f20: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
4f30: 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64  needQuote =  zId
4f40: 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64  ent[j]!=0 || isd
4f50: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a  igit(zIdent[0]).
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 20 7c 7c 20 73 71 6c 69 74 65 4b 65 79 77 6f    || sqliteKeywo
4f80: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
4f90: 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20  )!=TK_ID;.  if( 
4fa0: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
4fb0: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72  +] = '\'';.  for
4fc0: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
4fd0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b   j++){.    z[i++
4fe0: 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20  ] = zIdent[j];. 
4ff0: 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d     if( zIdent[j]
5000: 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d 20  =='\'' ) z[i++] 
5010: 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66  = '\'';.  }.  if
5020: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
5030: 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a  i++] = '\'';.  z
5040: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
5050: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
5060: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
5070: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5080: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
5090: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
50a0: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
50b0: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
50c0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
50d0: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
50e0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
50f0: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
5100: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
5110: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
5120: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
5130: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62  ateTableStmt(Tab
5140: 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  le *p){.  int i,
5150: 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   k, n;.  char *z
5160: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
5170: 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e  ep, *zSep2, *zEn
5180: 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f  d;.  n = 0;.  fo
5190: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
51a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  ; i++){.    n +=
51b0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
51c0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[i].zName);.
51d0: 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74    }.  n += ident
51e0: 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29  Length(p->zName)
51f0: 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20 29 7b 0a  ;.  if( n<40 ){.
5200: 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20      zSep = "";. 
5210: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a     zSep2 = ",";.
5220: 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a      zEnd = ")";.
5230: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65    }else{.    zSe
5240: 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20  p = "\n  ";.    
5250: 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b  zSep2 = ",\n  ";
5260: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29  .    zEnd = "\n)
5270: 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35  ";.  }.  n += 35
5280: 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20   + 6*p->nCol;.  
5290: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  zStmt = sqliteMa
52a0: 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 69 66 28  lloc( n );.  if(
52b0: 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75   zStmt==0 ) retu
52c0: 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a  rn 0;.  strcpy(z
52d0: 53 74 6d 74 2c 20 70 2d 3e 69 73 54 65 6d 70 20  Stmt, p->isTemp 
52e0: 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  ? "CREATE TEMP T
52f0: 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45  ABLE " : "CREATE
5300: 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d   TABLE ");.  k =
5310: 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a   strlen(zStmt);.
5320: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
5330: 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  , &k, p->zName);
5340: 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20  .  zStmt[k++] = 
5350: 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  '(';.  for(i=0; 
5360: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
5370: 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74  .    strcpy(&zSt
5380: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
5390: 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a    k += strlen(&z
53a0: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
53b0: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
53c0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
53d0: 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  &k, p->aCol[i].z
53e0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74 72  Name);.  }.  str
53f0: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
5400: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
5410: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Stmt;.}../*.** T
5420: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5430: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
5440: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
5450: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
5460: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5470: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
5480: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
5490: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
54a0: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
54b0: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
54c0: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
54d0: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
54e0: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
54f0: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
5500: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
5510: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
5520: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
5530: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
5540: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
5550: 6b 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 74 68 69  k,.** unless thi
5560: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
5570: 20 74 61 62 6c 65 20 6f 72 20 69 6e 69 74 46 6c   table or initFl
5580: 61 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69  ag==1.  When ini
5590: 74 46 6c 61 67 3d 3d 31 2c 0a 2a 2a 20 69 74 20  tFlag==1,.** it 
55a0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
55b0: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
55c0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
55d0: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
55e0: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
55f0: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
5600: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
5610: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
5620: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
5630: 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74  nges, so the ent
5640: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
5650: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
5660: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
5670: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
5680: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
5690: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
56a0: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
56b0: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
56c0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
56d0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
56e0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
56f0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
5700: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
5710: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
5720: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
5730: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
5740: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
5750: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
5760: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
5770: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
5780: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
5790: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
57a0: 64 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65  d sqliteEndTable
57b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
57c0: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c  Token *pEnd, Sel
57d0: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
57e0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c   Table *p;.  sql
57f0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
5800: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45  ->db;..  if( (pE
5810: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
5820: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
5830: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
5840: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
5850: 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61  eturn;.  p = pPa
5860: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
5870: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
5880: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74  urn;..  /* Add t
5890: 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
58a0: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
58b0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
58c0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
58d0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
58e0: 3e 6e 61 6d 65 43 6c 61 73 68 3d 3d 30 20 7c 7c  >nameClash==0 ||
58f0: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
5900: 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50  g==1 );.  if( pP
5910: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30  arse->explain==0
5920: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 61 6d 65   && pParse->name
5930: 43 6c 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  Clash==0 ){.    
5940: 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
5950: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61   pOld = sqliteHa
5960: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 74 62  shInsert(&db->tb
5970: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
5980: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
5990: 29 2b 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  )+1, p);.    if(
59a0: 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
59b0: 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
59c0: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
59d0: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
59e0: 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
59f0: 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  ) */.      retur
5a00: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  n;.    }.    pPa
5a10: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
5a20: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62   0;.    db->nTab
5a30: 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  le++;.    db->fl
5a40: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
5a50: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
5a60: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61  ..  /* If the ta
5a70: 62 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ble is generated
5a80: 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20   from a SELECT, 
5a90: 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 20 74  then construct t
5aa0: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20  he.  ** list of 
5ab0: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20  columns and the 
5ac0: 74 65 78 74 20 6f 66 20 74 68 65 20 74 61 62 6c  text of the tabl
5ad0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  e..  */.  if( pS
5ae0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 54 61 62  elect ){.    Tab
5af0: 6c 65 20 2a 70 53 65 6c 54 61 62 20 3d 20 73 71  le *pSelTab = sq
5b00: 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53  liteResultSetOfS
5b10: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c  elect(pParse, 0,
5b20: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69   pSelect);.    i
5b30: 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
5b40: 72 65 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65  return;.    asse
5b50: 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29  rt( p->aCol==0 )
5b60: 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20  ;.    p->nCol = 
5b70: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
5b80: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
5b90: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
5ba0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
5bb0: 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  0;.    pSelTab->
5bc0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  aCol = 0;.    sq
5bd0: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
5be0: 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 7d  0, pSelTab);.  }
5bf0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e  ..  /* If the in
5c00: 69 74 46 6c 61 67 20 69 73 20 31 20 69 74 20 6d  itFlag is 1 it m
5c10: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
5c20: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
5c30: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
5c40: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
5c50: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
5c60: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
5c70: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
5c80: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
5c90: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
5ca0: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
5cb0: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
5cc0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
5cd0: 6d 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6e 65  m the pParse->ne
5ce0: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54  wTnum field.  (T
5cf0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  he page number. 
5d00: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
5d10: 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62  been put there b
5d20: 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e  y the sqliteOpen
5d30: 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a  Cb routine.).  *
5d40: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
5d50: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
5d60: 70 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73 65  p->tnum = pParse
5d70: 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a  ->newTnum;.  }..
5d80: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
5d90: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
5da0: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
5db0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
5dc0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
5dd0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
5de0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
5df0: 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75  .  The record nu
5e00: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
5e10: 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72  e new table entr
5e20: 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  y should already
5e30: 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b   be on the stack
5e40: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
5e50: 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
5e60: 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
5e70: 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
5e80: 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
5e90: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
5ea0: 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
5eb0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
5ec0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
5ed0: 65 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20  e->initFlag ){. 
5ee0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
5ef0: 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20  be *v;..    v = 
5f00: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
5f10: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
5f20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5f30: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
5f40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
5f50: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
5f60: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  */.      sqliteV
5f70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
5f80: 72 65 61 74 65 54 61 62 6c 65 2c 20 30 2c 20 70  reateTable, 0, p
5f90: 2d 3e 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 20  ->isTemp);.     
5fa0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
5fb0: 65 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP3(v, -1, (char
5fc0: 20 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f   *)&p->tnum, P3_
5fd0: 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65  POINTER);.    }e
5fe0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
5ff0: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71  view */.      sq
6000: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6010: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
6020: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  0);.    }.    p-
6030: 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 73  >tnum = 0;.    s
6040: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6050: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
6060: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
6070: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
6080: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ng, 0, 0);.    i
6090: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
60a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
60b0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
60c0: 2d 31 2c 20 22 74 61 62 6c 65 22 2c 20 50 33 5f  -1, "table", P3_
60d0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 65 6c  STATIC);.    }el
60e0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
60f0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
6100: 2d 31 2c 20 22 76 69 65 77 22 2c 20 50 33 5f 53  -1, "view", P3_S
6110: 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  TATIC);.    }.  
6120: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6130: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
6140: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
6150: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
6160: 20 2d 31 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50   -1, p->zName, P
6170: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
6180: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6190: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
61a0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
61b0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
61c0: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  , p->zName, P3_S
61d0: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
61e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
61f0: 50 5f 44 75 70 2c 20 34 2c 20 30 29 3b 0a 20 20  P_Dup, 4, 0);.  
6200: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6210: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  p(v, OP_String, 
6220: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
6230: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
6240: 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65  char *z = create
6250: 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20  TableStmt(p);.  
6260: 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c      n = z ? strl
6270: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20  en(z) : 0;.     
6280: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
6290: 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29  eP3(v, -1, z, n)
62a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
62b0: 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ee(z);.    }else
62c0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
62d0: 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20  pEnd!=0 );.     
62e0: 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e   n = Addr(pEnd->
62f0: 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73 65  z) - Addr(pParse
6300: 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 29  ->sFirstToken.z)
6310: 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 1;.      sqli
6320: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
6330: 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 46  , -1, pParse->sF
6340: 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b  irstToken.z, n);
6350: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6360: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6370: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20  _MakeRecord, 5, 
6380: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
6390: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
63a0: 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a  tIntKey, 0, 0);.
63b0: 20 20 20 20 69 66 28 20 21 70 2d 3e 69 73 54 65      if( !p->isTe
63c0: 6d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  mp ){.      sqli
63d0: 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  teChangeCookie(d
63e0: 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  b, v);.    }.   
63f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6400: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
6410: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65   0);.    if( pSe
6420: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  lect ){.      in
6430: 74 20 6f 70 20 3d 20 70 2d 3e 69 73 54 65 6d 70  t op = p->isTemp
6440: 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78 20   ? OP_OpenWrAux 
6450: 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  : OP_OpenWrite;.
6460: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
6470: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20  AddOp(v, op, 1, 
6480: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
6490: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
64a0: 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 70    sqliteSelect(p
64b0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
64c0: 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c  SRT_Table, 1, 0,
64d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
64e0: 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65    sqliteEndWrite
64f0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
6500: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6510: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
6520: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
6530: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
6540: 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76   a new VIEW.*/.v
6550: 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65  oid sqliteCreate
6560: 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
6570: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
6580: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
6590: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
65a0: 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
65b0: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
65c0: 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
65d0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
65e0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
65f0: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
6600: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
6610: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
6620: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
6630: 74 20 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54  t    /* A SELECT
6640: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
6650: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
6660: 6e 65 77 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20  new view */.){. 
6670: 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 54   Token sEnd;.  T
6680: 61 62 6c 65 20 2a 70 3b 0a 20 20 63 6f 6e 73 74  able *p;.  const
6690: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
66a0: 6e 2c 20 6f 66 66 73 65 74 3b 0a 0a 20 20 73 71  n, offset;..  sq
66b0: 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28 70  liteStartTable(p
66c0: 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70  Parse, pBegin, p
66d0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 70 20 3d 20  Name, 0);.  p = 
66e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
66f0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  e;.  if( p==0 ){
6700: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65 63  .    sqliteSelec
6710: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
6720: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
6730: 7d 0a 20 20 2f 2a 20 49 67 6e 6f 72 65 20 4f 52  }.  /* Ignore OR
6740: 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 20 6f  DER BY clauses o
6750: 6e 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  n a SELECT */.  
6760: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72  if( pSelect->pOr
6770: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
6780: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
6790: 65 28 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65  e(pSelect->pOrde
67a0: 72 42 79 29 3b 0a 20 20 20 20 70 53 65 6c 65 63  rBy);.    pSelec
67b0: 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  t->pOrderBy = 0;
67c0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 53 65 6c 65 63  .  }.  p->pSelec
67d0: 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 69  t = pSelect;.  i
67e0: 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  f( !pParse->init
67f0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20  Flag ){.    if( 
6800: 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c  sqliteViewGetCol
6810: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
6820: 20 70 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   p) ){.      ret
6830: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
6840: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
6850: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
6860: 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26  ( sEnd.z[0]!=0 &
6870: 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  & sEnd.z[0]!=';'
6880: 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
6890: 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
68a0: 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
68b0: 3d 20 28 28 69 6e 74 29 73 45 6e 64 2e 7a 29 20  = ((int)sEnd.z) 
68c0: 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d 3e 7a  - (int)pBegin->z
68d0: 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e  ;.  z = pBegin->
68e0: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  z;.  while( n>0 
68f0: 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  && (z[n-1]==';' 
6900: 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31  || isspace(z[n-1
6910: 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ])) ){ n--; }.  
6920: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
6930: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
6940: 20 20 7a 20 3d 20 70 2d 3e 70 53 65 6c 65 63 74    z = p->pSelect
6950: 2d 3e 7a 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->zSelect = sqli
6960: 74 65 53 74 72 4e 44 75 70 28 7a 2c 20 6e 29 3b  teStrNDup(z, n);
6970: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
6980: 6f 66 66 73 65 74 20 3d 20 28 28 69 6e 74 29 7a  offset = ((int)z
6990: 29 20 2d 20 28 69 6e 74 29 70 42 65 67 69 6e 2d  ) - (int)pBegin-
69a0: 3e 7a 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  >z;.    sqliteSe
69b0: 6c 65 63 74 4d 6f 76 65 53 74 72 69 6e 67 73 28  lectMoveStrings(
69c0: 70 2d 3e 70 53 65 6c 65 63 74 2c 20 6f 66 66 73  p->pSelect, offs
69d0: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45  et);.    sqliteE
69e0: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ndTable(pParse, 
69f0: 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 7d 0a 20  &sEnd, 0);.  }. 
6a00: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
6a10: 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
6a20: 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
6a30: 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
6a40: 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
6a50: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
6a60: 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
6a70: 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
6a80: 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
6a90: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
6aa0: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
6ab0: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
6ac0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
6ad0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 65 2d 3e  ssage in pPare->
6ae0: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
6af0: 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c  sqliteViewGetCol
6b00: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
6b10: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
6b20: 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69  Table){.  ExprLi
6b30: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65  st *pEList;.  Se
6b40: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61  lect *pSel;.  Ta
6b50: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
6b60: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20  int nErr = 0;.. 
6b70: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
6b80: 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  );..  /* A posit
6b90: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
6ba0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
6bb0: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
6bc0: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
6bd0: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
6be0: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
6bf0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
6c00: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
6c10: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
6c20: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
6c30: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
6c40: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
6c50: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
6c60: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
6c70: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
6c80: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
6c90: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
6ca0: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
6cb0: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
6cc0: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
6cd0: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
6ce0: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
6cf0: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
6d00: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
6d10: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
6d20: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
6d30: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2f 0a 20 20  ROM one;.  */.  
6d40: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
6d50: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
6d60: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
6d70: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 76 69 65  e->zErrMsg, "vie
6d80: 77 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  w ", pTable->zNa
6d90: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 22 20 69  me,.         " i
6da0: 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
6db0: 69 6e 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70  ined", 0);.    p
6dc0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
6dd0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
6de0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
6df0: 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
6e00: 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
6e10: 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65  ompute the table
6e20: 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 61   names..  */.  a
6e30: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
6e40: 53 65 6c 65 63 74 20 29 3b 20 2f 2a 20 49 66 20  Select ); /* If 
6e50: 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 70 54  nCol==0, then pT
6e60: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 20 56  able must be a V
6e70: 49 45 57 20 2a 2f 0a 20 20 70 53 65 6c 20 3d 20  IEW */.  pSel = 
6e80: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3b  pTable->pSelect;
6e90: 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  ..  /* Note that
6ea0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
6eb0: 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65  iteResultSetOfSe
6ec0: 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
6ed0: 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
6ee0: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 69 73  elements in this
6ef0: 20 6c 69 73 74 2e 20 20 42 75 74 20 77 65 20 77   list.  But we w
6f00: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72 65 73 74  ill need to rest
6f10: 6f 72 65 20 74 68 65 20 6c 69 73 74 0a 20 20 2a  ore the list.  *
6f20: 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  * back to its or
6f30: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
6f40: 74 69 6f 6e 20 61 66 74 65 72 77 61 72 64 73 2c  tion afterwards,
6f50: 20 73 6f 20 77 65 20 73 61 76 65 20 61 20 63 6f   so we save a co
6f60: 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 6f  py of.  ** the o
6f70: 72 69 67 69 6e 61 6c 20 69 6e 20 70 45 4c 69 73  riginal in pELis
6f80: 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74  t..  */.  pEList
6f90: 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3b   = pSel->pEList;
6fa0: 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20  .  pSel->pEList 
6fb0: 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  = sqliteExprList
6fc0: 44 75 70 28 70 45 4c 69 73 74 29 3b 0a 20 20 69  Dup(pEList);.  i
6fd0: 66 28 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d  f( pSel->pEList=
6fe0: 3d 30 20 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e  =0 ){.    pSel->
6ff0: 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b  pEList = pEList;
7000: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20  .    return 1;  
7010: 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  /* Malloc failed
7020: 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65   */.  }.  pTable
7030: 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70  ->nCol = -1;.  p
7040: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 52  SelTab = sqliteR
7050: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
7060: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c  (pParse, 0, pSel
7070: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62  );.  if( pSelTab
7080: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7090: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
70a0: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
70b0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
70c0: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  Col;.    pTable-
70d0: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
70e0: 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54  >aCol;.    pSelT
70f0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
7100: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
7110: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  = 0;.    sqliteD
7120: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
7130: 65 6c 54 61 62 29 3b 0a 20 20 20 20 70 50 61 72  elTab);.    pPar
7140: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  se->db->flags |=
7150: 20 53 51 4c 49 54 45 5f 55 6e 72 65 73 65 74 56   SQLITE_UnresetV
7160: 69 65 77 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iews;.  }else{. 
7170: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
7180: 3d 20 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  = 0;.    nErr++;
7190: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 53 65 6c  .  }.  sqliteSel
71a0: 65 63 74 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b  ectUnbind(pSel);
71b0: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73  .  sqliteExprLis
71c0: 74 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45  tDelete(pSel->pE
71d0: 4c 69 73 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70  List);.  pSel->p
71e0: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
71f0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
7200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
7210: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
7220: 20 66 72 6f 6d 20 74 68 65 20 56 49 45 57 20 70   from the VIEW p
7230: 54 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Table..**.** Thi
7240: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7250: 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 79  led whenever any
7260: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 6f 72 20   other table or 
7270: 76 69 65 77 20 69 73 20 6d 6f 64 69 66 69 65 64  view is modified
7280: 2e 0a 2a 2a 20 54 68 65 20 76 69 65 77 20 70 61  ..** The view pa
7290: 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72  ssed into this r
72a0: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 70  outine might dep
72b0: 65 6e 64 20 64 69 72 65 63 74 6c 79 20 6f 72 20  end directly or 
72c0: 69 6e 64 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e  indirectly.** on
72d0: 20 74 68 65 20 6d 6f 64 69 66 69 65 64 20 6f 72   the modified or
72e0: 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 20 73   deleted table s
72f0: 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6c 65  o we need to cle
7300: 61 72 20 74 68 65 20 6f 6c 64 20 63 6f 6c 75 6d  ar the old colum
7310: 6e 0a 2a 2a 20 6e 61 6d 65 73 20 73 6f 20 74 68  n.** names so th
7320: 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  at they will be 
7330: 72 65 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73  recomputed..*/.s
7340: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
7350: 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e  eViewResetColumn
7360: 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61  Names(Table *pTa
7370: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
7380: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 7c   if( pTable==0 |
7390: 7c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  | pTable->pSelec
73a0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
73b0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
73c0: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  l==0 ) return;. 
73d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
73e0: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
73f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
7400: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  Table->aCol[i].z
7410: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
7420: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
7430: 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20  ol[i].zDflt);.  
7440: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
7450: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79  ble->aCol[i].zTy
7460: 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pe);.  }.  sqlit
7470: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
7480: 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  ol);.  pTable->a
7490: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
74a0: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a  e->nCol = 0;.}..
74b0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
74c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
74d0: 6d 20 65 76 65 72 79 20 56 49 45 57 2e 0a 2a 2f  m every VIEW..*/
74e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77  .void sqliteView
74f0: 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 20  ResetAll(sqlite 
7500: 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  *db){.  HashElem
7510: 20 2a 69 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e   *i;.  if( (db->
7520: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 55  flags & SQLITE_U
7530: 6e 72 65 73 65 74 56 69 65 77 73 29 3d 3d 30 20  nresetViews)==0 
7540: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
7550: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
7560: 74 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 29 3b  t(&db->tblHash);
7570: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
7580: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61  Next(i)){.    Ta
7590: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
75a0: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
75b0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
75c0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
75d0: 6c 69 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c  liteViewResetCol
75e0: 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a  umnNames(pTab);.
75f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e      }.  }.  db->
7600: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
7610: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 7d  _UnresetViews;.}
7620: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
7630: 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61  token, look up a
7640: 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 61 74   table with that
7650: 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66   name.  If not f
7660: 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61  ound, leave.** a
7670: 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20  n error for the 
7680: 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20 61  parser to find a
7690: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
76a0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
76b0: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50  TableFromToken(P
76c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
76d0: 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68  ken *pTok){.  ch
76e0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62  ar *zName;.  Tab
76f0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d  le *pTab;.  zNam
7700: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  e = sqliteTableN
7710: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
7720: 6b 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  k);.  if( zName=
7730: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7740: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69   pTab = sqliteFi
7750: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
7760: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
7770: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
7780: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
7790: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
77a0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
77b0: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
77c0: 68 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20 0a  h table: ", 0, .
77d0: 20 20 20 20 20 20 20 20 70 54 6f 6b 2d 3e 7a 2c          pTok->z,
77e0: 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b 0a 20 20   pTok->n, 0);.  
77f0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
7800: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
7810: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Tab;.}../*.** Th
7820: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
7830: 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77  lled to do the w
7840: 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ork of a DROP TA
7850: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
7860: 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  * pName is the n
7870: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
7880: 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a   to be dropped..
7890: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72  */.void sqliteDr
78a0: 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
78b0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
78c0: 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29  ame, int isView)
78d0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
78e0: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
78f0: 69 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69  int base;.  sqli
7900: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
7910: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
7920: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
7930: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
7940: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61   ) return;.  pTa
7950: 62 6c 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ble = sqliteTabl
7960: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
7970: 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  e, pName);.  if(
7980: 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74   pTable==0 ) ret
7990: 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  urn;.  if( pTabl
79a0: 65 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  e->readOnly ){. 
79b0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
79c0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
79d0: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70  Msg, "table ", p
79e0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20  Table->zName, . 
79f0: 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20        " may not 
7a00: 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
7a10: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7a20: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r++;.    return;
7a30: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69 65  .  }.  if( isVie
7a40: 77 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65  w && pTable->pSe
7a50: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
7a60: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
7a70: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
7a80: 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
7a90: 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
7aa0: 20 22 2c 0a 20 20 20 20 20 20 70 54 61 62 6c 65   ",.      pTable
7ab0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
7ac0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
7ad0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7ae0: 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26  .  if( !isView &
7af0: 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  & pTable->pSelec
7b00: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  t ){.    sqliteS
7b10: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
7b20: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 75 73 65 20  ->zErrMsg, "use 
7b30: 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
7b40: 65 74 65 20 76 69 65 77 20 22 2c 0a 20 20 20 20  ete view ",.    
7b50: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c    pTable->zName,
7b60: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
7b70: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
7b80: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  urn;.  }..  /* G
7b90: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
7ba0: 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
7bb0: 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
7bc0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
7bd0: 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
7be0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
7bf0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
7c00: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
7c10: 65 4f 70 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20  eOp dropTable[] 
7c20: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  = {.      { OP_R
7c30: 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44  ewind,     0, AD
7c40: 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20  DR(8),  0},.    
7c50: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
7c60: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
7c70: 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20  0}, /* 1 */.    
7c80: 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c    { OP_MemStore,
7c90: 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20     1, 1,        
7ca0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d  0},.      { OP_M
7cb0: 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c  emLoad,    1, 0,
7cc0: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33          0}, /* 3
7cd0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43   */.      { OP_C
7ce0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c  olumn,     0, 2,
7cf0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
7d00: 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20    { OP_Ne,      
7d10: 20 20 20 30 2c 20 41 44 44 52 28 37 29 2c 20 20     0, ADDR(7),  
7d20: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
7d30: 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
7d40: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
7d50: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
7d60: 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20     0, ADDR(3),  
7d70: 30 7d 2c 20 2f 2a 20 37 20 2a 2f 0a 20 20 20 20  0}, /* 7 */.    
7d80: 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  };.    Index *pI
7d90: 64 78 3b 0a 20 20 20 20 54 72 69 67 67 65 72 20  dx;.    Trigger 
7da0: 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73  *pTrigger;.    s
7db0: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
7dc0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
7dd0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f   0);.    sqliteO
7de0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
7df0: 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70  , pTable->isTemp
7e00: 29 3b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  );.    /* Drop a
7e10: 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f  ll triggers asso
7e20: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
7e30: 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
7e40: 70 65 64 20 2a 2f 0a 20 20 20 20 70 54 72 69 67  ped */.    pTrig
7e50: 67 65 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54  ger = pTable->pT
7e60: 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c  rigger;.    whil
7e70: 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
7e80: 20 20 20 20 20 54 6f 6b 65 6e 20 74 74 3b 0a 20       Token tt;. 
7e90: 20 20 20 20 20 74 74 2e 7a 20 3d 20 70 54 61 62       tt.z = pTab
7ea0: 6c 65 2d 3e 70 54 72 69 67 67 65 72 2d 3e 6e 61  le->pTrigger->na
7eb0: 6d 65 3b 0a 20 20 20 20 20 20 74 74 2e 6e 20 3d  me;.      tt.n =
7ec0: 20 73 74 72 6c 65 6e 28 70 54 61 62 6c 65 2d 3e   strlen(pTable->
7ed0: 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 29 3b  pTrigger->name);
7ee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 72 6f  .      sqliteDro
7ef0: 70 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  pTrigger(pParse,
7f00: 20 26 74 74 2c 20 31 29 3b 0a 20 20 20 20 20 20   &tt, 1);.      
7f10: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
7f20: 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ain ){.        p
7f30: 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
7f40: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
7f50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7f60: 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 6c  pTrigger = pTabl
7f70: 65 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  e->pTrigger;.   
7f80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
7f90: 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ase = sqliteVdbe
7fa0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
7fb0: 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c 65  aySize(dropTable
7fc0: 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a 20  ), dropTable);. 
7fd0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
7fe0: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP3(v, base+1,
7ff0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20   pTable->zName, 
8000: 30 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  0);.    if( !pTa
8010: 62 6c 65 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20  ble->isTemp ){. 
8020: 20 20 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67       sqliteChang
8030: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a  eCookie(db, v);.
8040: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8050: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8060: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
8070: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b    if( !isView ){
8080: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
8090: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
80a0: 74 72 6f 79 2c 20 70 54 61 62 6c 65 2d 3e 74 6e  troy, pTable->tn
80b0: 75 6d 2c 20 70 54 61 62 6c 65 2d 3e 69 73 54 65  um, pTable->isTe
80c0: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  mp);.      for(p
80d0: 49 64 78 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64  Idx=pTable->pInd
80e0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
80f0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
8100: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
8110: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
8120: 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  oy, pIdx->tnum, 
8130: 70 54 61 62 6c 65 2d 3e 69 73 54 65 6d 70 29 3b  pTable->isTemp);
8140: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8150: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
8160: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
8170: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  e);.  }..  /* De
8180: 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lete the in-memo
8190: 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  ry description o
81a0: 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a  f the table..  *
81b0: 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
81c0: 3a 20 69 66 20 74 68 65 20 53 51 4c 20 73 74 61  : if the SQL sta
81d0: 74 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69 74  tement began wit
81e0: 68 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65  h the EXPLAIN ke
81f0: 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  yword,.  ** then
8200: 20 6e 6f 20 63 68 61 6e 67 65 73 20 73 68 6f 75   no changes shou
8210: 6c 64 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f  ld be made..  */
8220: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
8230: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73  explain ){.    s
8240: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
8250: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
8260: 61 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d 3e 66  able);.    db->f
8270: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
8280: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
8290: 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  }.  sqliteViewRe
82a0: 73 65 74 41 6c 6c 28 64 62 29 3b 0a 7d 0a 0a 2f  setAll(db);.}../
82b0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
82c0: 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
82d0: 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65  QL table.  pInde
82e0: 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  x is the name of
82f0: 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
8300: 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74 68 65  nd pTable is the
8310: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
8320: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
8330: 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
8340: 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
8350: 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
8360: 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
8370: 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
8380: 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
8390: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
83a0: 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
83b0: 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
83c0: 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
83d0: 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
83e0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
83f0: 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
8400: 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
8410: 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
8420: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
8430: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
8440: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
8450: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
8460: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
8470: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
8480: 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
8490: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
84a0: 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
84b0: 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
84c0: 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
84d0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
84e0: 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
84f0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
8500: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
8510: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
8520: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61  .void sqliteCrea
8530: 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
8540: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41   *pParse,   /* A
8550: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
8560: 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
8570: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
8580: 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e,    /* Name of
8590: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 79   the index.  May
85a0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
85b0: 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 2f  ken *pTable,   /
85c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
85d0: 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 20 55  ble to index.  U
85e0: 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
85f0: 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 49  able if 0 */.  I
8600: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  dList *pList,   
8610: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
8620: 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
8630: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
8640: 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41  ror,     /* OE_A
8650: 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
8660: 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
8670: 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
8680: 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a  en *pStart,   /*
8690: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
86a0: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20  n that begins a 
86b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
86c0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
86d0: 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20  n *pEnd      /* 
86e0: 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
86f0: 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
8700: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
8710: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
8720: 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
8730: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
8740: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
8750: 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  x;   /* The inde
8760: 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
8770: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
8780: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
8790: 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
87a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
87b0: 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20   Fake token for 
87c0: 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74  an empty ID list
87d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62   */.  sqlite *db
87e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
87f0: 20 69 6e 74 20 68 69 64 65 4e 61 6d 65 20 3d 20   int hideName = 
8800: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  0;         /* Do
8810: 20 6e 6f 74 20 70 75 74 20 74 61 62 6c 65 20 6e   not put table n
8820: 61 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  ame in the hash 
8830: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20  table */..  if( 
8840: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
8850: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
8860: 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
8870: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
8880: 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
8890: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
88a0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
88b0: 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
88c0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
88d0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30  .  if( pTable!=0
88e0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
88f0: 70 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20  pName!=0 );.    
8900: 70 54 61 62 20 3d 20 20 73 71 6c 69 74 65 54 61  pTab =  sqliteTa
8910: 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  bleFromToken(pPa
8920: 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  rse, pTable);.  
8930: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8940: 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  t( pName==0 );. 
8950: 20 20 20 70 54 61 62 20 3d 20 20 70 50 61 72 73     pTab =  pPars
8960: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
8970: 7d 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  }.  if( pTab==0 
8980: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
8990: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
89a0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  te_index;.  if( 
89b0: 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  pTab->readOnly )
89c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
89d0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
89e0: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
89f0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a  , pTab->zName, .
8a00: 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20        " may not 
8a10: 68 61 76 65 20 6e 65 77 20 69 6e 64 69 63 65 73  have new indices
8a20: 20 61 64 64 65 64 22 2c 20 30 29 3b 0a 20 20 20   added", 0);.   
8a30: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
8a40: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
8a50: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
8a60: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
8a70: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
8a80: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
8a90: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 76  rse->zErrMsg, "v
8aa0: 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
8ab0: 69 6e 64 65 78 65 64 22 2c 20 30 29 3b 0a 20 20  indexed", 0);.  
8ac0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
8ad0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
8ae0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
8af0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
8b00: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
8b10: 20 77 68 69 6c 65 20 72 65 2d 72 65 61 64 69 6e   while re-readin
8b20: 67 20 74 68 65 20 73 63 68 65 6d 61 20 66 72 6f  g the schema fro
8b30: 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  m sqlite_master.
8b40: 20 20 2a 2a 20 62 75 74 20 74 68 65 20 74 61 62    ** but the tab
8b50: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
8b60: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  th this index is
8b70: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
8b80: 6c 65 2c 20 69 74 20 63 61 6e 0a 20 20 2a 2a 20  le, it can.  ** 
8b90: 6f 6e 6c 79 20 6d 65 61 6e 20 74 68 61 74 20 74  only mean that t
8ba0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 74 68  he table that th
8bb0: 69 73 20 69 6e 64 65 78 20 69 73 20 72 65 61 6c  is index is real
8bc0: 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ly associated wi
8bd0: 74 68 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 20 77  th is.  ** one w
8be0: 68 6f 73 65 20 6e 61 6d 65 20 69 73 20 68 69 64  hose name is hid
8bf0: 64 65 6e 20 62 65 68 69 6e 64 20 61 20 74 65 6d  den behind a tem
8c00: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 77 69 74  porary table wit
8c10: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
8c20: 0a 20 20 2a 2a 20 53 69 6e 63 65 20 69 74 73 20  .  ** Since its 
8c30: 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 73  table has been s
8c40: 75 70 70 72 65 73 73 65 64 2c 20 77 65 20 6e 65  uppressed, we ne
8c50: 65 64 20 74 6f 20 61 6c 73 6f 20 73 75 70 70 72  ed to also suppr
8c60: 65 73 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64  ess the.  ** ind
8c70: 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ex..  */.  if( p
8c80: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
8c90: 26 26 20 21 70 50 61 72 73 65 2d 3e 69 73 54 65  && !pParse->isTe
8ca0: 6d 70 20 26 26 20 70 54 61 62 2d 3e 69 73 54 65  mp && pTab->isTe
8cb0: 6d 70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  mp ){.    goto e
8cc0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
8cd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
8ce0: 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
8cf0: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
8d00: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
8d10: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
8d20: 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
8d30: 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
8d40: 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
8d50: 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
8d60: 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
8d70: 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
8d80: 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
8d90: 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
8da0: 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
8db0: 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
8dc0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
8dd0: 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
8de0: 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
8df0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
8e00: 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
8e10: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
8e20: 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
8e30: 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
8e40: 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
8e50: 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
8e60: 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2c 20  ess this index, 
8e70: 62 75 74 20 77 65 20 77 69 6c 6c 20 6e 6f 74 0a  but we will not.
8e80: 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 73 20 6e    ** store its n
8e90: 61 6d 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  ame in the hash 
8ea0: 74 61 62 6c 65 2e 20 20 53 65 74 20 74 68 65 20  table.  Set the 
8eb0: 68 69 64 65 4e 61 6d 65 20 66 6c 61 67 20 74 6f  hideName flag to
8ec0: 20 61 63 63 6f 6d 70 6c 69 73 68 0a 20 20 2a 2a   accomplish.  **
8ed0: 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
8ee0: 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
8ef0: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
8f00: 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
8f10: 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
8f20: 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
8f30: 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
8f40: 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
8f50: 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
8f60: 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
8f70: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53  {.    Index *pIS
8f80: 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41  ameName;    /* A
8f90: 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74  nother index wit
8fa0: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
8fb0: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
8fc0: 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
8fd0: 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d  A table with sam
8fe0: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e  e name as the in
8ff0: 64 65 78 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65  dex */.    zName
9000: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
9010: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
9020: 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  e);.    if( zNam
9030: 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
9040: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
9050: 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61     if( (pISameNa
9060: 6d 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49  me = sqliteFindI
9070: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 29  ndex(db, zName))
9080: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
9090: 20 70 49 53 61 6d 65 4e 61 6d 65 2d 3e 70 54 61   pISameName->pTa
90a0: 62 6c 65 2d 3e 69 73 54 65 6d 70 20 26 26 20 70  ble->isTemp && p
90b0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
90c0: 29 7b 0a 20 20 20 20 20 20 20 20 68 69 64 65 4e  ){.        hideN
90d0: 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ame = 1;.      }
90e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
90f0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
9100: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
9110: 22 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65 2c  "index ", zName,
9120: 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 61   .           " a
9130: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
9140: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  0);.        pPar
9150: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
9160: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
9170: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
9180: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
9190: 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20  ( (pTSameName = 
91a0: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
91b0: 64 62 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 20 29  db, zName))!=0 )
91c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 53 61  {.      if( pTSa
91d0: 6d 65 4e 61 6d 65 2d 3e 69 73 54 65 6d 70 20 26  meName->isTemp &
91e0: 26 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  & pParse->initFl
91f0: 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 68 69  ag ){.        hi
9200: 64 65 4e 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20  deName = 1;.    
9210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9220: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
9230: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
9240: 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  g, "there is alr
9250: 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
9260: 65 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ed ",.          
9270: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
9280: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
9290: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ++;.        goto
92a0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
92b0: 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
92c0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
92d0: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
92e0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64    int n;.    Ind
92f0: 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66  ex *pLoop;.    f
9300: 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70  or(pLoop=pTab->p
9310: 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f  Index, n=1; pLoo
9320: 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
9330: 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  pNext, n++){}.  
9340: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22    sprintf(zBuf,"
9350: 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61  %d)",n);.    zNa
9360: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  me = 0;.    sqli
9370: 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  teSetString(&zNa
9380: 6d 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e 7a  me, "(", pTab->z
9390: 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64 65  Name, " autoinde
93a0: 78 20 22 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  x ", zBuf, 0);. 
93b0: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
93c0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
93d0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 68 69  te_index;.    hi
93e0: 64 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 46  deName = sqliteF
93f0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
9400: 6d 65 29 21 3d 30 3b 0a 20 20 7d 0a 0a 20 20 2f  me)!=0;.  }..  /
9410: 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
9420: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
9430: 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
9440: 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
9450: 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
9460: 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
9470: 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
9480: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
9490: 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
94a0: 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
94b0: 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
94c0: 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
94d0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
94e0: 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62   nullId.z = pTab
94f0: 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
9500: 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l-1].zName;.    
9510: 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65  nullId.n = strle
9520: 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20  n(nullId.z);.   
9530: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49   pList = sqliteI
9540: 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26  dListAppend(0, &
9550: 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28  nullId);.    if(
9560: 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
9570: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
9580: 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20  ex;.  }..  /* . 
9590: 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
95a0: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
95b0: 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78  . .  */.  pIndex
95c0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
95d0: 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b   sizeof(Index) +
95e0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b   strlen(zName) +
95f0: 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20   1 +.           
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
9610: 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e  eof(int)*pList->
9620: 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  nId );.  if( pIn
9630: 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  dex==0 ) goto ex
9640: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
9650: 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  .  pIndex->aiCol
9660: 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e  umn = (int*)&pIn
9670: 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78  dex[1];.  pIndex
9680: 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ->zName = (char*
9690: 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  )&pIndex->aiColu
96a0: 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a  mn[pList->nId];.
96b0: 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d    strcpy(pIndex-
96c0: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  >zName, zName);.
96d0: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
96e0: 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
96f0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69  x->nColumn = pLi
9700: 73 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65  st->nId;.  pInde
9710: 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e  x->onError = pIn
9720: 64 65 78 2d 3e 69 73 55 6e 69 71 75 65 20 3d 20  dex->isUnique = 
9730: 6f 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53  onError;..  /* S
9740: 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
9750: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
9760: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
9770: 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
9780: 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
9790: 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
97a0: 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
97b0: 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
97c0: 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
97d0: 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
97e0: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
97f0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
9800: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  d; i++){.    for
9810: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
9820: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
9830: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
9840: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
9850: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
9860: 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  j].zName)==0 ) b
9870: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9880: 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
9890: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
98a0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
98b0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
98c0: 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  ble ", pTab->zNa
98d0: 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20 68  me, .        " h
98e0: 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
98f0: 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  ed ", pList->a[i
9900: 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ].zName, 0);.   
9910: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
9920: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  +;.      sqliteF
9930: 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20  ree(pIndex);.   
9940: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
9950: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
9960: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
9970: 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
9980: 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
9990: 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
99a0: 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
99b0: 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
99c0: 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
99d0: 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
99e0: 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69  tures. .  */.  i
99f0: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
9a00: 61 69 6e 20 26 26 20 21 68 69 64 65 4e 61 6d 65  ain && !hideName
9a10: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
9a20: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
9a30: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
9a40: 69 64 78 48 61 73 68 2c 20 70 49 6e 64 65 78 2d  idxHash, pIndex-
9a50: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a  >zName, strlen(z
9a60: 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29  Name)+1, pIndex)
9a70: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
9a80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
9a90: 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
9aa0: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
9ab0: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  ailed */.      s
9ac0: 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78  qliteFree(pIndex
9ad0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
9ae0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
9af0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66  .    }.    db->f
9b00: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
9b10: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
9b20: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
9b30: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
9b40: 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
9b50: 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
9b60: 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
9b70: 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
9b80: 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
9b90: 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
9ba0: 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
9bb0: 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
9bc0: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
9bd0: 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  or the correct o
9be0: 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41  peration of UPDA
9bf0: 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45  TE.  ** and INSE
9c00: 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  RT..  */.  if( o
9c10: 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
9c20: 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64  ce || pTab->pInd
9c30: 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ex==0.       || 
9c40: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
9c50: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
9c60: 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  e){.    pIndex->
9c70: 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
9c80: 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e  ndex;.    pTab->
9c90: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
9ca0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
9cb0: 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
9cc0: 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
9cd0: 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
9ce0: 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
9cf0: 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
9d00: 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
9d10: 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
9d20: 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
9d30: 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e  }.    pIndex->pN
9d40: 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
9d50: 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72 2d  ext;.    pOther-
9d60: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
9d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
9d80: 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31 20  e initFlag is 1 
9d90: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
9da0: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
9db0: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
9dc0: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61 62  lite_master" tab
9dd0: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20  le on the disk. 
9de0: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
9df0: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20 2a   to the disk.  *
9e00: 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  * again.  Extrac
9e10: 74 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d 62  t the table numb
9e20: 65 72 20 66 72 6f 6d 20 74 68 65 20 70 50 61 72  er from the pPar
9e30: 73 65 2d 3e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  se->newTnum fiel
9e40: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
9e50: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20 26  arse->initFlag &
9e60: 26 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20  & pTable!=0 ){. 
9e70: 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
9e80: 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  = pParse->newTnu
9e90: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
9ea0: 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20  the initFlag is 
9eb0: 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  0 then create th
9ec0: 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e  e index on disk.
9ed0: 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f    This.  ** invo
9ee0: 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65  lves writing the
9ef0: 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
9f00: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
9f10: 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a   filling in the.
9f20: 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
9f30: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
9f40: 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a  e contents..  **
9f50: 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c  .  ** The initFl
9f60: 61 67 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  ag is 0 when the
9f70: 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
9f80: 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
9f90: 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
9fa0: 20 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69    The initFlag i
9fb0: 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
9fc0: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
9fd0: 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
9fe0: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
9ff0: 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
a000: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
a010: 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
a020: 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
a030: 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
a040: 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
a050: 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
a060: 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
a070: 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
a080: 2a 0a 20 20 2a 2a 20 49 66 20 70 54 61 62 6c 65  *.  ** If pTable
a090: 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
a0a0: 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
a0b0: 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72  ated as a primar
a0c0: 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e  y key.  ** or UN
a0d0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
a0e0: 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  of a CREATE TABL
a0f0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
a100: 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
a110: 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
a120: 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
a130: 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
a140: 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
a150: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
a160: 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
a170: 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
a180: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69   if( pParse->ini
a190: 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20  tFlag==0 ){.    
a1a0: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
a1b0: 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31  *v;.    int lbl1
a1c0: 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20  , lbl2;.    int 
a1d0: 69 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  i;.    int addr;
a1e0: 0a 20 20 20 20 69 6e 74 20 69 73 54 65 6d 70 20  .    int isTemp 
a1f0: 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 3b 0a  = pTab->isTemp;.
a200: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47  .    v = sqliteG
a210: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a220: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
a230: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
a240: 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  index;.    if( p
a250: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
a260: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
a270: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
a280: 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  se, 0);.      sq
a290: 6c 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61  liteOpenMasterTa
a2a0: 62 6c 65 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a  ble(v, isTemp);.
a2b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a2c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a2d0: 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b  NewRecno, 0, 0);
a2e0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
a2f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
a300: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
a310: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
a320: 28 76 2c 20 2d 31 2c 20 22 69 6e 64 65 78 22 2c  (v, -1, "index",
a330: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
a340: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a350: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
a360: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
a370: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
a380: 2d 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  -1, pIndex->zNam
a390: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
a3a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
a3b0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
a3c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
a3d0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
a3e0: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  , -1, pTab->zNam
a3f0: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
a400: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
a410: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a420: 43 72 65 61 74 65 49 6e 64 65 78 2c 20 30 2c 20  CreateIndex, 0, 
a430: 69 73 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  isTemp);.    sql
a440: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
a450: 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
a460: 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 50  &pIndex->tnum, P
a470: 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20  3_POINTER);.    
a480: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30  pIndex->tnum = 0
a490: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
a4a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a4b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a4c0: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
a4d0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
a4e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
a4f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
a500: 65 6e 57 72 41 75 78 2c 20 31 2c 20 30 29 3b 0a  enWrAux, 1, 0);.
a510: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a520: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
a530: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
a540: 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  rite, 1, 0);.   
a550: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
a560: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
a570: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
a580: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ng, 0, 0);.    i
a590: 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
a5a0: 64 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41  d ){.      n = A
a5b0: 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41  ddr(pEnd->z) - A
a5c0: 64 64 72 28 70 53 74 61 72 74 2d 3e 7a 29 20 2b  ddr(pStart->z) +
a5d0: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
a5e0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
a5f0: 61 64 64 72 2c 20 70 53 74 61 72 74 2d 3e 7a 2c  addr, pStart->z,
a600: 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   n);.    }.    s
a610: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a620: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
a630: 20 35 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   5, 0);.    sqli
a640: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
a650: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
a660: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  0);.    if( pTab
a670: 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  le ){.      sqli
a680: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 69  teVdbeAddOp(v, i
a690: 73 54 65 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 41  sTemp ? OP_OpenA
a6a0: 75 78 20 3a 20 4f 50 5f 4f 70 65 6e 2c 20 32 2c  ux : OP_Open, 2,
a6b0: 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pTab->tnum);.  
a6c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
a6d0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
a6e0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  ab->zName, P3_ST
a6f0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 6c 62 6c  ATIC);.      lbl
a700: 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  2 = sqliteVdbeMa
a710: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
a720: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
a730: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
a740: 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20  2, lbl2);.      
a750: 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62  lbl1 = sqliteVdb
a760: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63  eAddOp(v, OP_Rec
a770: 6e 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  no, 2, 0);.     
a780: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
a790: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
a7a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a7b0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
a7c0: 5f 43 6f 6c 75 6d 6e 2c 20 32 2c 20 70 49 6e 64  _Column, 2, pInd
a7d0: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  ex->aiColumn[i])
a7e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a7f0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
a800: 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79  v, OP_MakeIdxKey
a810: 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  , pIndex->nColum
a820: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  n, 0);.      sql
a830: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
a840: 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49  OP_IdxPut, 1, pI
a850: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
a860: 45 5f 4e 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73  E_None);.      s
a870: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a880: 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62  , OP_Next, 2, lb
a890: 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l1);.      sqlit
a8a0: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
a8b0: 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20  l(v, lbl2);.    
a8c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
a8d0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32  p(v, OP_Close, 2
a8e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
a8f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
a900: 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a  P_Close, 1, 0);.
a910: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
a920: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  able!=0 ){.     
a930: 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a   if( !isTemp ){.
a940: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 43 68          sqliteCh
a950: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
a960: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a970: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a980: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
a990: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
a9a0: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
a9b0: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  on(pParse);.    
a9c0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  }.  }..  /* Clea
a9d0: 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
a9e0: 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
a9f0: 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  te_index:.  sqli
aa00: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
aa10: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  List);.  sqliteF
aa20: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
aa30: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
aa40: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
aa50: 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
aa60: 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
aa70: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
aa80: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
aa90: 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
aaa0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
aab0: 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72  iteDropIndex(Par
aac0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
aad0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  n *pName){.  Ind
aae0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 63 68  ex *pIndex;.  ch
aaf0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62  ar *zName;.  Vdb
ab00: 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a  e *v;.  sqlite *
ab10: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ab20: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
ab30: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
ab40: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
ab50: 65 74 75 72 6e 3b 0a 20 20 7a 4e 61 6d 65 20 3d  eturn;.  zName =
ab60: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
ab70: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
ab80: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
ab90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e   ) return;.  pIn
aba0: 64 65 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  dex = sqliteFind
abb0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29  Index(db, zName)
abc0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
abd0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  Name);.  if( pIn
abe0: 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex==0 ){.    sq
abf0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
ac00: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
ac10: 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
ac20: 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   ", 0, .        
ac30: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
ac40: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  >n, 0);.    pPar
ac50: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
ac60: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
ac70: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ac80: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
ac90: 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
aca0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
acb0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
acc0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
acd0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61  if( v ){.    sta
ace0: 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70 49  tic VdbeOp dropI
acf0: 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndex[] = {.     
ad00: 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
ad10: 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d    0, ADDR(9), 0}
ad20: 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  , .      { OP_St
ad30: 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20  ring,     0, 0, 
ad40: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a        0}, /* 1 *
ad50: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  /.      { OP_Mem
ad60: 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20  Store,   1, 1,  
ad70: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
ad80: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20   OP_MemLoad,    
ad90: 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  1, 0,       0}, 
ada0: 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
adb0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
adc0: 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
add0: 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20       { OP_Eq,   
ade0: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29        0, ADDR(8)
adf0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
ae00: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
ae10: 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(3), 0},.   
ae20: 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20     { OP_Goto,   
ae30: 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
ae40: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
ae50: 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
ae60: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38 20         0}, /* 8 
ae70: 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
ae80: 74 20 62 61 73 65 3b 0a 20 20 20 20 54 61 62 6c  t base;.    Tabl
ae90: 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
aea0: 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 20 20 73  ->pTable;..    s
aeb0: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
aec0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
aed0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f   0);.    sqliteO
aee0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
aef0: 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29 3b  , pTab->isTemp);
af00: 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69  .    base = sqli
af10: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
af20: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
af30: 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64  pIndex), dropInd
af40: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  ex);.    sqliteV
af50: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
af60: 61 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a  ase+1, pIndex->z
af70: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Name, 0);.    if
af80: 28 20 21 70 54 61 62 2d 3e 69 73 54 65 6d 70 20  ( !pTab->isTemp 
af90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 43  ){.      sqliteC
afa0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
afb0: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
afc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
afd0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
afe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
aff0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
b000: 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  roy, pIndex->tnu
b010: 6d 2c 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 29  m, pTab->isTemp)
b020: 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57  ;.    sqliteEndW
b030: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
b040: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
b050: 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d   Delete the in-m
b060: 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f  emory descriptio
b070: 6e 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e  n of this index.
b080: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
b090: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
b0a0: 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b      sqliteUnlink
b0b0: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64  AndDeleteIndex(d
b0c0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  b, pIndex);.    
b0d0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
b0e0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
b0f0: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
b100: 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
b110: 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
b120: 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
b130: 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
b140: 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
b150: 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
b160: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
b170: 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
b180: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
b190: 73 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74  st *sqliteIdList
b1a0: 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70  Append(IdList *p
b1b0: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
b1c0: 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
b1d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
b1e0: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
b1f0: 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  ( sizeof(IdList)
b200: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
b210: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
b220: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73  .  }.  if( (pLis
b230: 74 2d 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20 29  t->nId & 7)==0 )
b240: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
b250: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
b260: 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c   a = sqliteReall
b270: 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c  oc(pList->a, (pL
b280: 69 73 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65  ist->nId+8)*size
b290: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
b2a0: 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20  );.    if( a==0 
b2b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49  ){.      sqliteI
b2c0: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
b2d0: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
b2e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
b2f0: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
b300: 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
b310: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20  >a[pList->nId], 
b320: 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
b330: 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
b340: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  Token ){.    cha
b350: 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d  r **pz = &pList-
b360: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a  >a[pList->nId].z
b370: 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Name;.    sqlite
b380: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
b390: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
b3a0: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ->n, 0);.    if(
b3b0: 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20   *pz==0 ){.     
b3c0: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
b3d0: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
b3e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
b3f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
b400: 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  iteDequote(*pz);
b410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69  .    }.  }.  pLi
b420: 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74  st->nId++;.  ret
b430: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
b440: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
b450: 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
b460: 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
b470: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
b480: 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
b490: 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
b4a0: 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
b4b0: 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
b4c0: 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20  en if pToken is 
b4d0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  NULL..**.** A ne
b4e0: 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74  w SrcList is ret
b4f0: 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
b500: 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
b510: 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
b520: 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e  liteSrcListAppen
b530: 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  d(SrcList *pList
b540: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
b550: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
b560: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
b570: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
b580: 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
b590: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
b5a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
b5b0: 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e  .  if( (pList->n
b5c0: 53 72 63 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20  Src & 7)==0 ){. 
b5d0: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
b5e0: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61  t_item *a;.    a
b5f0: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
b600: 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73  (pList->a, (pLis
b610: 74 2d 3e 6e 53 72 63 2b 38 29 2a 73 69 7a 65 6f  t->nSrc+8)*sizeo
b620: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
b630: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
b640: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 72  {.      sqliteSr
b650: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  cListDelete(pLis
b660: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
b670: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
b680: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
b690: 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
b6a0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2c  >a[pList->nSrc],
b6b0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
b6c0: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
b6d0: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 63 68  pToken ){.    ch
b6e0: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74  ar **pz = &pList
b6f0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
b700: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69  .zName;.    sqli
b710: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
b720: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
b730: 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69  en->n, 0);.    i
b740: 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20 20  f( *pz==0 ){.   
b750: 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74     sqliteSrcList
b760: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
b770: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
b780: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b790: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70  sqliteDequote(*p
b7a0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
b7b0: 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20  pList->nSrc++;. 
b7c0: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
b7d0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61  ../*.** Add an a
b7e0: 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74  lias to the last
b7f0: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74   identifier on t
b800: 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66  he given identif
b810: 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ier list..*/.voi
b820: 64 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41  d sqliteSrcListA
b830: 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20  ddAlias(SrcList 
b840: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
b850: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
b860: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53  ist && pList->nS
b870: 72 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  rc>0 ){.    int 
b880: 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20  i = pList->nSrc 
b890: 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  - 1;.    sqliteS
b8a0: 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74  etNString(&pList
b8b0: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70  ->a[i].zAlias, p
b8c0: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
b8d0: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ->n, 0);.    sql
b8e0: 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74  iteDequote(pList
b8f0: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a  ->a[i].zAlias);.
b900: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
b910: 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
b920: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c  /.void sqliteIdL
b930: 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74  istDelete(IdList
b940: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
b950: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
b960: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
b970: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
b980: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
b990: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
b9a0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
b9b0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
b9c0: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
b9d0: 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
b9e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
b9f0: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
ba00: 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
ba10: 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
ba20: 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
ba30: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
ba40: 74 20 73 71 6c 69 74 65 49 64 4c 69 73 74 49 6e  t sqliteIdListIn
ba50: 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
ba60: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
ba70: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
ba80: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
ba90: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
baa0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
bab0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
bac0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
bad0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
bae0: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
baf0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
bb00: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
bb10: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
bb20: 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63  tire SrcList inc
bb30: 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73  luding all its s
bb40: 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  ubstructure..*/.
bb50: 76 6f 69 64 20 73 71 6c 69 74 65 53 72 63 4c 69  void sqliteSrcLi
bb60: 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
bb70: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
bb80: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
bb90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
bba0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
bbb0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
bbc0: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
bbd0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
bbe0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
bbf0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
bc00: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
bc10: 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70  ->a[i].pTab && p
bc20: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d  List->a[i].pTab-
bc30: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a  >isTransient ){.
bc40: 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
bc50: 74 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74  teTable(0, pList
bc60: 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20  ->a[i].pTab);.  
bc70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 53 65    }.    sqliteSe
bc80: 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74  lectDelete(pList
bc90: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
bca0: 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44  .    sqliteExprD
bcb0: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
bcc0: 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ].pOn);.    sqli
bcd0: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
bce0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e  List->a[i].pUsin
bcf0: 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
bd00: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
bd10: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
bd20: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  st);.}../*.** Th
bd30: 65 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 69  e COPY command i
bd40: 73 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c  s for compatibil
bd50: 69 74 79 20 77 69 74 68 20 50 6f 73 74 67 72 65  ity with Postgre
bd60: 53 51 4c 20 61 6e 64 20 73 70 65 63 69 66 69 63  SQL and specific
bd70: 69 61 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68 65  ially.** for the
bd80: 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65 61 64   ability to read
bd90: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 70   the output of p
bda0: 67 5f 64 75 6d 70 2e 20 20 54 68 65 20 66 6f 72  g_dump.  The for
bdb0: 6d 61 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c  mat is as.** fol
bdc0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43  lows:.**.**    C
bdd0: 4f 50 59 20 74 61 62 6c 65 20 46 52 4f 4d 20 66  OPY table FROM f
bde0: 69 6c 65 20 5b 55 53 49 4e 47 20 44 45 4c 49 4d  ile [USING DELIM
bdf0: 49 54 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a 2a  ITERS string].**
be00: 0a 2a 2a 20 22 74 61 62 6c 65 22 20 69 73 20 61  .** "table" is a
be10: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
be20: 20 6e 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c 20   name.  We will 
be30: 72 65 61 64 20 6c 69 6e 65 73 20 6f 66 20 63 6f  read lines of co
be40: 64 65 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20  de from.** file 
be50: 74 6f 20 66 69 6c 6c 20 74 68 69 73 20 74 61 62  to fill this tab
be60: 6c 65 20 77 69 74 68 20 64 61 74 61 2e 20 20 46  le with data.  F
be70: 69 6c 65 20 6d 69 67 68 74 20 62 65 20 22 73 74  ile might be "st
be80: 64 69 6e 22 2e 20 20 54 68 65 20 6f 70 74 69 6f  din".  The optio
be90: 6e 61 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65 72  nal.** delimiter
bea0: 20 73 74 72 69 6e 67 20 69 64 65 6e 74 69 66 69   string identifi
beb0: 65 73 20 74 68 65 20 66 69 65 6c 64 20 73 65 70  es the field sep
bec0: 61 72 61 74 6f 72 73 2e 20 20 54 68 65 20 64 65  arators.  The de
bed0: 66 61 75 6c 74 20 69 73 20 61 20 74 61 62 2e 0a  fault is a tab..
bee0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f  */.void sqliteCo
bef0: 70 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  py(.  Parse *pPa
bf00: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
bf10: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
bf20: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
bf30: 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 54 68  bleName,   /* Th
bf40: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
bf50: 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  ble into which w
bf60: 65 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a 2f  e will insert */
bf70: 0a 20 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e  .  Token *pFilen
bf80: 61 6d 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 66  ame,    /* The f
bf90: 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ile from which t
bfa0: 6f 20 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61  o obtain informa
bfb0: 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
bfc0: 2a 70 44 65 6c 69 6d 69 74 65 72 2c 20 20 20 2f  *pDelimiter,   /
bfd0: 2a 20 55 73 65 20 74 68 69 73 20 61 73 20 74 68  * Use this as th
bfe0: 65 20 66 69 65 6c 64 20 64 65 6c 69 6d 69 74 65  e field delimite
bff0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  r */.  int onErr
c000: 6f 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  or          /* W
c010: 68 61 74 20 74 6f 20 64 6f 20 69 66 20 61 20 63  hat to do if a c
c020: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 73 20  onstraint fails 
c030: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
c040: 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61  Tab;.  char *zTa
c050: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  b;.  int i;.  Vd
c060: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64  be *v;.  int add
c070: 72 2c 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20  r, end;.  Index 
c080: 2a 70 49 64 78 3b 0a 20 20 73 71 6c 69 74 65 20  *pIdx;.  sqlite 
c090: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c0a0: 3b 0a 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69  ;..  zTab = sqli
c0b0: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
c0c0: 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29  oken(pTableName)
c0d0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d  ;.  if( sqlite_m
c0e0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20  alloc_failed || 
c0f0: 7a 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 63  zTab==0 ) goto c
c100: 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70  opy_cleanup;.  p
c110: 54 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  Tab = sqliteTabl
c120: 65 4e 61 6d 65 54 6f 54 61 62 6c 65 28 70 50 61  eNameToTable(pPa
c130: 72 73 65 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71  rse, zTab);.  sq
c140: 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a  liteFree(zTab);.
c150: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
c160: 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75  goto copy_cleanu
c170: 70 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  p;.  v = sqliteG
c180: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
c190: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69    if( v ){.    i
c1a0: 6e 74 20 6f 70 65 6e 4f 70 3b 0a 20 20 20 20 73  nt openOp;.    s
c1b0: 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f  qliteBeginWriteO
c1c0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
c1d0: 20 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20   1);.    addr = 
c1e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
c1f0: 76 2c 20 4f 50 5f 46 69 6c 65 4f 70 65 6e 2c 20  v, OP_FileOpen, 
c200: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
c210: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
c220: 20 61 64 64 72 2c 20 70 46 69 6c 65 6e 61 6d 65   addr, pFilename
c230: 2d 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e  ->z, pFilename->
c240: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  n);.    sqliteVd
c250: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61  beDequoteP3(v, a
c260: 64 64 72 29 3b 0a 20 20 20 20 6f 70 65 6e 4f 70  ddr);.    openOp
c270: 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70 20   = pTab->isTemp 
c280: 3f 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78 20 3a  ? OP_OpenWrAux :
c290: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
c2a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
c2b0: 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 30 2c  Op(v, openOp, 0,
c2c0: 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pTab->tnum);.  
c2d0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
c2e0: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP3(v, -1, pTab
c2f0: 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54  ->zName, P3_STAT
c300: 49 43 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  IC);.    for(i=1
c310: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
c320: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
c330: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b  pIdx->pNext, i++
c340: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
c350: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e  dbeAddOp(v, open
c360: 4f 70 2c 20 69 2c 20 70 49 64 78 2d 3e 74 6e 75  Op, i, pIdx->tnu
c370: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
c380: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
c390: 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  -1, pIdx->zName,
c3a0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
c3b0: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66   }.    if( db->f
c3c0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
c3d0: 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 20  untRows ){.     
c3e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
c3f0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
c400: 30 2c 20 30 29 3b 20 20 2f 2a 20 49 6e 69 74 69  0, 0);  /* Initi
c410: 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 20 63 6f  alize the row co
c420: 75 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  unt */.    }.   
c430: 20 65 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62   end = sqliteVdb
c440: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
c450: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c460: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c470: 46 69 6c 65 52 65 61 64 2c 20 70 54 61 62 2d 3e  FileRead, pTab->
c480: 6e 43 6f 6c 2c 20 65 6e 64 29 3b 0a 20 20 20 20  nCol, end);.    
c490: 69 66 28 20 70 44 65 6c 69 6d 69 74 65 72 20 29  if( pDelimiter )
c4a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
c4b0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
c4c0: 64 72 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e  dr, pDelimiter->
c4d0: 7a 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e  z, pDelimiter->n
c4e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
c4f0: 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20  dbeDequoteP3(v, 
c500: 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  addr);.    }else
c510: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
c520: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
c530: 64 72 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20  dr, "\t", 1);.  
c540: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62    }.    if( pTab
c550: 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
c560: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c570: 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f  dOp(v, OP_FileCo
c580: 6c 75 6d 6e 2c 20 70 54 61 62 2d 3e 69 50 4b 65  lumn, pTab->iPKe
c590: 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  y, 0);.      sql
c5a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
c5b0: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c  OP_MustBeInt, 0,
c5c0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
c5d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
c5e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
c5f0: 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ecno, 0, 0);.   
c600: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
c610: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
c620: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  +){.      if( i=
c630: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
c640: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
c650: 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
c660: 65 79 20 63 6f 6c 75 6d 6e 20 69 73 20 66 69 6c  ey column is fil
c670: 6c 65 64 20 77 69 74 68 20 4e 55 4c 4c 20 73 69  led with NULL si
c680: 6e 63 65 20 69 74 73 0a 20 20 20 20 20 20 20 20  nce its.        
c690: 2a 2a 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61  ** value is alwa
c6a0: 79 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74  ys pulled from t
c6b0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
c6c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
c6d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
c6e0: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
c6f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c700: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
c710: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65  AddOp(v, OP_File
c720: 43 6f 6c 75 6d 6e 2c 20 69 2c 20 30 29 3b 0a 20  Column, i, 0);. 
c730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c740: 20 73 71 6c 69 74 65 47 65 6e 65 72 61 74 65 43   sqliteGenerateC
c750: 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
c760: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c  pParse, pTab, 0,
c770: 20 30 2c 20 30 2c 20 30 2c 20 6f 6e 45 72 72 6f   0, 0, 0, onErro
c780: 72 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71  r, addr);.    sq
c790: 6c 69 74 65 43 6f 6d 70 6c 65 74 65 49 6e 73 65  liteCompleteInse
c7a0: 72 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  rtion(pParse, pT
c7b0: 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  ab, 0, 0, 0, 0);
c7c0: 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  .    if( (db->fl
c7d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
c7e0: 6e 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20  ntRows)!=0 ){.  
c7f0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
c800: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
c810: 2c 20 31 2c 20 30 29 3b 20 20 2f 2a 20 49 6e 63  , 1, 0);  /* Inc
c820: 72 65 6d 65 6e 74 20 72 6f 77 20 63 6f 75 6e 74  rement row count
c830: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   */.    }.    sq
c840: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c850: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
c860: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  r);.    sqliteVd
c870: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
c880: 2c 20 65 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69  , end);.    sqli
c890: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
c8a0: 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  P_Noop, 0, 0);. 
c8b0: 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74     sqliteEndWrit
c8c0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
c8d0: 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  e);.    if( db->
c8e0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
c8f0: 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20  ountRows ){.    
c900: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
c910: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f  p(v, OP_ColumnCo
c920: 75 6e 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  unt, 1, 0);.    
c930: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
c940: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61  p(v, OP_ColumnNa
c950: 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  me, 0, 0);.     
c960: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
c970: 65 50 33 28 76 2c 20 2d 31 2c 20 22 72 6f 77 73  eP3(v, -1, "rows
c980: 20 69 6e 73 65 72 74 65 64 22 2c 20 50 33 5f 53   inserted", P3_S
c990: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
c9a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
c9b0: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 31 2c   OP_Callback, 1,
c9c0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
c9d0: 20 0a 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3a 0a   .copy_cleanup:.
c9e0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
c9f0: 2a 2a 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64  ** The non-stand
ca00: 61 72 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61  ard VACUUM comma
ca10: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c  nd is used to cl
ca20: 65 61 6e 20 75 70 20 74 68 65 20 64 61 74 61 62  ean up the datab
ca30: 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65  ase,.** collapse
ca40: 20 66 72 65 65 20 73 70 61 63 65 2c 20 65 74 63   free space, etc
ca50: 2e 20 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65  .  It is modelle
ca60: 64 20 61 66 74 65 72 20 74 68 65 20 56 41 43 55  d after the VACU
ca70: 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e  UM command.** in
ca80: 20 50 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a   PostgreSQL..**.
ca90: 2a 2a 20 49 6e 20 76 65 72 73 69 6f 6e 20 31 2e  ** In version 1.
caa0: 30 2e 78 20 6f 66 20 53 51 4c 69 74 65 2c 20 74  0.x of SQLite, t
cab0: 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e  he VACUUM comman
cac0: 64 20 77 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20  d would call.** 
cad0: 67 64 62 6d 5f 72 65 6f 72 67 61 6e 69 7a 65 28  gdbm_reorganize(
cae0: 29 20 6f 6e 20 61 6c 6c 20 74 68 65 20 64 61 74  ) on all the dat
caf0: 61 62 61 73 65 20 74 61 62 6c 65 73 2e 20 20 42  abase tables.  B
cb00: 75 74 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  ut beginning.** 
cb10: 77 69 74 68 20 32 2e 30 2e 30 2c 20 53 51 4c 69  with 2.0.0, SQLi
cb20: 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65  te no longer use
cb30: 73 20 47 44 42 4d 20 73 6f 20 74 68 69 73 20 63  s GDBM so this c
cb40: 6f 6d 6d 61 6e 64 20 68 61 73 0a 2a 2a 20 62 65  ommand has.** be
cb50: 63 6f 6d 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  come a no-op..*/
cb60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 61 63 75  .void sqliteVacu
cb70: 75 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  um(Parse *pParse
cb80: 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e  , Token *pTableN
cb90: 61 6d 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f  ame){.  /* Do no
cba0: 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  thing */.}../*.*
cbb0: 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
cbc0: 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
cbd0: 6c 69 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63  liteBeginTransac
cbe0: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
cbf0: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
cc00: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
cc10: 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
cc20: 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
cc30: 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 42  db)==0 || db->pB
cc40: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
cc50: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
cc60: 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c  r || sqlite_mall
cc70: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
cc80: 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c  rn;.  if( db->fl
cc90: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
cca0: 72 61 6e 73 20 29 20 72 65 74 75 72 6e 3b 0a 20  rans ) return;. 
ccb0: 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74   sqliteBeginWrit
ccc0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
ccd0: 65 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  e, 0);.  db->fla
cce0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 54  gs |= SQLITE_InT
ccf0: 72 61 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72  rans;.  db->onEr
cd00: 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d  ror = onError;.}
cd10: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
cd20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
cd30: 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d 69  void sqliteCommi
cd40: 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
cd50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
cd60: 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66  qlite *db;..  if
cd70: 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
cd80: 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
cd90: 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20  0 || db->pBe==0 
cda0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
cdb0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
cdc0: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
cdd0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
cde0: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
cdf0: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
ce00: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
ce10: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
ce20: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20  QLITE_InTrans;. 
ce30: 20 73 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f   sqliteEndWriteO
ce40: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
ce50: 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20  ;.  db->onError 
ce60: 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 7d 0a  = OE_Default;.}.
ce70: 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
ce80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
ce90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c  .void sqliteRoll
cea0: 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
ceb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
cec0: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
ced0: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
cee0: 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
cef0: 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
cf00: 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20  || db->pBe==0 ) 
cf10: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
cf20: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
cf30: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
cf40: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
cf50: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
cf60: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d  SQLITE_InTrans)=
cf70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76  =0 ) return;.  v
cf80: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
cf90: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
cfa0: 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  v ){.    sqliteV
cfb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
cfc0: 6f 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b 0a  ollback, 0, 0);.
cfd0: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
cfe0: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61  &= ~SQLITE_InTra
cff0: 6e 73 3b 0a 20 20 64 62 2d 3e 6f 6e 45 72 72 6f  ns;.  db->onErro
d000: 72 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  r = OE_Default;.
d010: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
d020: 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
d030: 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
d040: 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
d050: 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
d060: 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
d070: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
d080: 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
d090: 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
d0a0: 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
d0b0: 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
d0c0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
d0d0: 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
d0e0: 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
d0f0: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
d100: 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
d110: 73 65 74 20 69 66 20 74 68 65 20 73 65 74 43 68  set if the setCh
d120: 65 63 6b 70 6f 69 6e 74 20 70 61 72 61 6d 65 74  eckpoint paramet
d130: 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
d140: 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
d150: 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
d160: 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
d170: 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
d180: 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
d190: 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
d1a0: 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
d1b0: 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
d1c0: 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
d1d0: 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
d1e0: 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
d1f0: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
d200: 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
d210: 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
d220: 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
d230: 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
d240: 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
d250: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
d260: 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
d270: 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
d280: 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
d290: 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
d2a0: 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
d2b0: 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76  not be set..*/.v
d2c0: 6f 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e 57  oid sqliteBeginW
d2d0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
d2e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
d2f0: 20 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 29 7b   setCheckpoint){
d300: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20  .  Vdbe *v;.  v 
d310: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
d320: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
d330: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d340: 69 66 28 20 70 50 61 72 73 65 2d 3e 74 72 69 67  if( pParse->trig
d350: 53 74 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 20  Stack ) return; 
d360: 2f 2a 20 69 66 20 74 68 69 73 20 69 73 20 69 6e  /* if this is in
d370: 20 61 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20   a trigger */.  
d380: 69 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d  if( (pParse->db-
d390: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
d3a0: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20  InTrans)==0 ){. 
d3b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
d3c0: 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
d3d0: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tion, 0, 0);.   
d3e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d3f0: 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
d400: 6b 69 65 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d  kie, pParse->db-
d410: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2c 20  >schema_cookie, 
d420: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
d430: 73 63 68 65 6d 61 56 65 72 69 66 69 65 64 20 3d  schemaVerified =
d440: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
d450: 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 29 7b  setCheckpoint ){
d460: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
d470: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b  ddOp(v, OP_Check
d480: 70 6f 69 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  point, 0, 0);.  
d490: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
d4a0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f  ate code that co
d4b0: 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61  ncludes an opera
d4c0: 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61  tion that may ha
d4d0: 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68  ve changed.** th
d4e0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
d4f0: 73 20 69 73 20 61 20 63 6f 6d 70 61 6e 69 6f 6e  s is a companion
d500: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 42 65 67   function to Beg
d510: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
d520: 28 29 2e 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  ()..** If a tran
d530: 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
d540: 74 65 64 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ted, then commit
d550: 20 69 74 2e 20 20 49 66 20 61 20 63 68 65 63 6b   it.  If a check
d560: 70 6f 69 6e 74 20 77 61 73 0a 2a 2a 20 73 74 61  point was.** sta
d570: 72 74 65 64 20 74 68 65 6e 20 63 6f 6d 6d 69 74  rted then commit
d580: 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   that..*/.void s
d590: 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
d5a0: 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
d5b0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
d5c0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
d5d0: 74 72 69 67 53 74 61 63 6b 20 29 20 72 65 74 75  trigStack ) retu
d5e0: 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73 20 69  rn; /* if this i
d5f0: 73 20 69 6e 20 61 20 74 72 69 67 67 65 72 20 2a  s in a trigger *
d600: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
d610: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
d620: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
d630: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
d640: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
d650: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a  LITE_InTrans ){.
d660: 20 20 20 20 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e      /* Do Nothin
d670: 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  g */.  }else{.  
d680: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d690: 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20  p(v, OP_Commit, 
d6a0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  0, 0);.  }.}.../
d6b0: 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74  *.** Interpret t
d6c0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
d6d0: 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  as a boolean val
d6e0: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
d6f0: 74 20 67 65 74 42 6f 6f 6c 65 61 6e 28 63 68 61  t getBoolean(cha
d700: 72 20 2a 7a 29 7b 0a 20 20 73 74 61 74 69 63 20  r *z){.  static 
d710: 63 68 61 72 20 2a 61 7a 54 72 75 65 5b 5d 20 3d  char *azTrue[] =
d720: 20 7b 20 22 79 65 73 22 2c 20 22 6f 6e 22 2c 20   { "yes", "on", 
d730: 22 74 72 75 65 22 20 7d 3b 0a 20 20 69 6e 74 20  "true" };.  int 
d740: 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 30  i;.  if( z[0]==0
d750: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d760: 66 28 20 69 73 64 69 67 69 74 28 7a 5b 30 5d 29  f( isdigit(z[0])
d770: 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 26   || (z[0]=='-' &
d780: 26 20 69 73 64 69 67 69 74 28 7a 5b 31 5d 29 29  & isdigit(z[1]))
d790: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   ){.    return a
d7a0: 74 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20 20 66 6f  toi(z);.  }.  fo
d7b0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
d7c0: 61 7a 54 72 75 65 29 2f 73 69 7a 65 6f 66 28 61  azTrue)/sizeof(a
d7d0: 7a 54 72 75 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b  zTrue[0]); i++){
d7e0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53  .    if( sqliteS
d7f0: 74 72 49 43 6d 70 28 7a 2c 61 7a 54 72 75 65 5b  trICmp(z,azTrue[
d800: 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  i])==0 ) return 
d810: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
d820: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  0;.}../*.** Proc
d830: 65 73 73 20 61 20 70 72 61 67 6d 61 20 73 74 61  ess a pragma sta
d840: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
d850: 50 72 61 67 6d 61 73 20 61 72 65 20 6f 66 20 74  Pragmas are of t
d860: 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  his form:.**.** 
d870: 20 20 20 20 20 50 52 41 47 4d 41 20 69 64 20 3d       PRAGMA id =
d880: 20 76 61 6c 75 65 0a 2a 2a 0a 2a 2a 20 54 68 65   value.**.** The
d890: 20 69 64 65 6e 74 69 66 69 65 72 20 6d 69 67 68   identifier migh
d8a0: 74 20 61 6c 73 6f 20 62 65 20 61 20 73 74 72 69  t also be a stri
d8b0: 6e 67 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  ng.  The value i
d8c0: 73 20 61 20 73 74 72 69 6e 67 2c 20 61 6e 64 0a  s a string, and.
d8d0: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f  ** identifier, o
d8e0: 72 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66 20  r a number.  If 
d8f0: 6d 69 6e 75 73 46 6c 61 67 20 69 73 20 74 72 75  minusFlag is tru
d900: 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  e, then the valu
d910: 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65 72  e is.** a number
d920: 20 74 68 61 74 20 77 61 73 20 70 72 65 63 65 64   that was preced
d930: 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69  ed by a minus si
d940: 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gn..*/.void sqli
d950: 74 65 50 72 61 67 6d 61 28 50 61 72 73 65 20 2a  tePragma(Parse *
d960: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
d970: 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69  Left, Token *pRi
d980: 67 68 74 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c  ght, int minusFl
d990: 61 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4c 65  ag){.  char *zLe
d9a0: 66 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ft = 0;.  char *
d9b0: 7a 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 73 71  zRight = 0;.  sq
d9c0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
d9d0: 65 2d 3e 64 62 3b 0a 0a 20 20 7a 4c 65 66 74 20  e->db;..  zLeft 
d9e0: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
d9f0: 70 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d  pLeft->z, pLeft-
da00: 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71  >n);.  sqliteDeq
da10: 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20 69  uote(zLeft);.  i
da20: 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a  f( minusFlag ){.
da30: 20 20 20 20 7a 52 69 67 68 74 20 3d 20 30 3b 0a      zRight = 0;.
da40: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
da50: 72 69 6e 67 28 26 7a 52 69 67 68 74 2c 20 22 2d  ring(&zRight, "-
da60: 22 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e 7a 2c  ", 1, pRight->z,
da70: 20 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29 3b 0a   pRight->n, 0);.
da80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 69    }else{.    zRi
da90: 67 68 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ght = sqliteStrN
daa0: 44 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c 20 70  Dup(pRight->z, p
dab0: 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20 20 73  Right->n);.    s
dac0: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 52 69  qliteDequote(zRi
dad0: 67 68 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a  ght);.  }. .  /*
dae0: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65  .  **  PRAGMA de
daf0: 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65  fault_cache_size
db00: 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65  .  **  PRAGMA de
db10: 66 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65  fault_cache_size
db20: 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  =N.  **.  ** The
db30: 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f   first form repo
db40: 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  rts the current 
db50: 70 65 72 73 69 73 74 65 6e 74 20 73 65 74 74 69  persistent setti
db60: 6e 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ng for the.  ** 
db70: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e  page cache size.
db80: 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75    The value retu
db90: 72 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78 69  rned is the maxi
dba0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  mum number of.  
dbb0: 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ** pages in the 
dbc0: 70 61 67 65 20 63 61 63 68 65 2e 20 20 54 68 65  page cache.  The
dbd0: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74   second form set
dbe0: 73 20 62 6f 74 68 20 74 68 65 20 63 75 72 72 65  s both the curre
dbf0: 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63  nt.  ** page cac
dc00: 68 65 20 73 69 7a 65 20 76 61 6c 75 65 20 61 6e  he size value an
dc10: 64 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  d the persistent
dc20: 20 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65   page cache size
dc30: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 73 74 6f 72   value.  ** stor
dc40: 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
dc50: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20  se file..  **.  
dc60: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 63  ** The default c
dc70: 61 63 68 65 20 73 69 7a 65 20 69 73 20 73 74 6f  ache size is sto
dc80: 72 65 64 20 69 6e 20 6d 65 74 61 2d 76 61 6c 75  red in meta-valu
dc90: 65 20 32 20 6f 66 20 70 61 67 65 20 31 20 6f 66  e 2 of page 1 of
dca0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
dcb0: 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 63 61  se file.  The ca
dcc0: 63 68 65 20 73 69 7a 65 20 69 73 20 61 63 74 75  che size is actu
dcd0: 61 6c 6c 79 20 74 68 65 20 61 62 73 6f 6c 75 74  ally the absolut
dce0: 65 20 76 61 6c 75 65 20 6f 66 0a 20 20 2a 2a 20  e value of.  ** 
dcf0: 74 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  this memory loca
dd00: 74 69 6f 6e 2e 20 20 54 68 65 20 73 69 67 6e 20  tion.  The sign 
dd10: 6f 66 20 6d 65 74 61 2d 76 61 6c 75 65 20 32 20  of meta-value 2 
dd20: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 0a 20  determines the. 
dd30: 20 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   ** synchronous 
dd40: 73 65 74 74 69 6e 67 2e 20 20 41 20 6e 65 67 61  setting.  A nega
dd50: 74 69 76 65 20 76 61 6c 75 65 20 6d 65 61 6e 73  tive value means
dd60: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
dd70: 6f 66 66 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70  off.  ** and a p
dd80: 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 6d 65  ositive value me
dd90: 61 6e 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ans synchronous 
dda0: 69 73 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  is on..  */.  if
ddb0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
ddc0: 7a 4c 65 66 74 2c 22 64 65 66 61 75 6c 74 5f 63  zLeft,"default_c
ddd0: 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29  ache_size")==0 )
dde0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
ddf0: 65 4f 70 20 67 65 74 43 61 63 68 65 53 69 7a 65  eOp getCacheSize
de00: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
de10: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30  P_ReadCookie,  0
de20: 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
de30: 20 20 20 20 20 20 7b 20 4f 50 5f 41 62 73 56 61        { OP_AbsVa
de40: 6c 75 65 2c 20 20 20 20 30 2c 20 30 2c 20 20 20  lue,    0, 0,   
de50: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
de60: 20 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20 20   OP_Dup,        
de70: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
de80: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74  ,.      { OP_Int
de90: 65 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20  eger,     0, 0, 
dea0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
deb0: 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20   { OP_Ne,       
dec0: 20 20 20 30 2c 20 36 2c 20 20 20 20 20 20 20 20     0, 6,        
ded0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  0},.      { OP_I
dee0: 6e 74 65 67 65 72 2c 20 20 20 20 20 4d 41 58 5f  nteger,     MAX_
def0: 50 41 47 45 53 2c 30 2c 20 30 7d 2c 0a 20 20 20  PAGES,0, 0},.   
df00: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f     { OP_ColumnCo
df10: 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20  unt, 1, 0,      
df20: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
df30: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c  _ColumnName,  0,
df40: 20 30 2c 20 20 20 20 20 20 20 20 22 63 61 63 68   0,        "cach
df50: 65 5f 73 69 7a 65 22 7d 2c 0a 20 20 20 20 20 20  e_size"},.      
df60: 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20  { OP_Callback,  
df70: 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30    1, 0,        0
df80: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64  },.    };.    Vd
df90: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65  be *v = sqliteGe
dfa0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
dfb0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
dfc0: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52  turn;.    if( pR
dfd0: 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e  ight->z==pLeft->
dfe0: 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  z ){.      sqlit
dff0: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
e000: 2c 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 43  , ArraySize(getC
e010: 61 63 68 65 53 69 7a 65 29 2c 20 67 65 74 43 61  acheSize), getCa
e020: 63 68 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65  cheSize);.    }e
e030: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  lse{.      int a
e040: 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  ddr;.      int s
e050: 69 7a 65 20 3d 20 61 74 6f 69 28 7a 52 69 67 68  ize = atoi(zRigh
e060: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  t);.      if( si
e070: 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73  ze<0 ) size = -s
e080: 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ize;.      sqlit
e090: 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  eBeginWriteOpera
e0a0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 29 3b  tion(pParse, 0);
e0b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
e0c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
e0d0: 65 67 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a  eger, size, 0);.
e0e0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
e0f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64  AddOp(v, OP_Read
e100: 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20  Cookie, 0, 2);. 
e110: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
e120: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
e130: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
e140: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
e150: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65  beAddOp(v, OP_Ge
e160: 2c 20 30 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20  , 0, addr+3);.  
e170: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
e180: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69  dOp(v, OP_Negati
e190: 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ve, 0, 0);.     
e1a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
e1b0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
e1c0: 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20 20 20 73  , 0, 2);.      s
e1d0: 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
e1e0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
e1f0: 20 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f        db->cache_
e200: 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68 65  size = db->cache
e210: 5f 73 69 7a 65 3c 30 20 3f 20 2d 73 69 7a 65 20  _size<0 ? -size 
e220: 3a 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  : size;.      sq
e230: 6c 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68  liteBtreeSetCach
e240: 65 53 69 7a 65 28 64 62 2d 3e 70 42 65 2c 20 64  eSize(db->pBe, d
e250: 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  b->cache_size);.
e260: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
e270: 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41   /*.  **  PRAGMA
e280: 20 63 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a   cache_size.  **
e290: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
e2a0: 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ize=N.  **.  ** 
e2b0: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72  The first form r
e2c0: 65 70 6f 72 74 73 20 74 68 65 20 63 75 72 72 65  eports the curre
e2d0: 6e 74 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67  nt local setting
e2e0: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61   for the.  ** pa
e2f0: 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20 20  ge cache size.  
e300: 54 68 65 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e  The local settin
e310: 67 20 63 61 6e 20 62 65 20 64 69 66 66 65 72 65  g can be differe
e320: 6e 74 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  nt from.  ** the
e330: 20 70 65 72 73 69 73 74 65 6e 74 20 63 61 63 68   persistent cach
e340: 65 20 73 69 7a 65 20 76 61 6c 75 65 20 74 68 61  e size value tha
e350: 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  t is stored in t
e360: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
e370: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 20 20 54   file itself.  T
e380: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
e390: 64 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  d is the maximum
e3a0: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
e3b0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
e3c0: 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 73 65  e cache.  The se
e3d0: 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74  cond form sets t
e3e0: 68 65 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70 61  he local.  ** pa
e3f0: 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61  ge cache size va
e400: 6c 75 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  lue.  It does no
e410: 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 65 72  t change the per
e420: 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 63 61 63  sistent.  ** cac
e430: 68 65 20 73 69 7a 65 20 73 74 6f 72 65 64 20 6f  he size stored o
e440: 6e 20 74 68 65 20 64 69 73 6b 20 73 6f 20 74 68  n the disk so th
e450: 65 20 63 61 63 68 65 20 73 69 7a 65 20 77 69 6c  e cache size wil
e460: 6c 20 72 65 76 65 72 74 0a 20 20 2a 2a 20 74 6f  l revert.  ** to
e470: 20 69 74 73 20 64 65 66 61 75 6c 74 20 76 61 6c   its default val
e480: 75 65 20 77 68 65 6e 20 74 68 65 20 64 61 74 61  ue when the data
e490: 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64 20 61  base is closed a
e4a0: 6e 64 20 72 65 6f 70 65 6e 65 64 2e 0a 20 20 2a  nd reopened..  *
e4b0: 2a 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 61 20  * N should be a 
e4c0: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
e4d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
e4e0: 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  iteStrICmp(zLeft
e4f0: 2c 22 63 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d  ,"cache_size")==
e500: 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
e510: 56 64 62 65 4f 70 20 67 65 74 43 61 63 68 65 53  VdbeOp getCacheS
e520: 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ize[] = {.      
e530: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74  { OP_ColumnCount
e540: 2c 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30  , 1, 0,        0
e550: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  },.      { OP_Co
e560: 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c  lumnName,  0, 0,
e570: 20 20 20 20 20 20 20 20 22 63 61 63 68 65 5f 73          "cache_s
e580: 69 7a 65 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ize"},.      { O
e590: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31  P_Callback,    1
e5a0: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
e5b0: 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 20      };.    Vdbe 
e5c0: 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64  *v = sqliteGetVd
e5d0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
e5e0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
e5f0: 6e 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  n;.    if( pRigh
e600: 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29  t->z==pLeft->z )
e610: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
e620: 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a   = db->cache_siz
e630: 65 3b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  e;;.      if( si
e640: 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73  ze<0 ) size = -s
e650: 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ize;.      sqlit
e660: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
e670: 5f 49 6e 74 65 67 65 72 2c 20 73 69 7a 65 2c 20  _Integer, size, 
e680: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
e690: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
e6a0: 20 41 72 72 61 79 53 69 7a 65 28 67 65 74 43 61   ArraySize(getCa
e6b0: 63 68 65 53 69 7a 65 29 2c 20 67 65 74 43 61 63  cheSize), getCac
e6c0: 68 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  heSize);.    }el
e6d0: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  se{.      int si
e6e0: 7a 65 20 3d 20 61 74 6f 69 28 7a 52 69 67 68 74  ze = atoi(zRight
e6f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
e700: 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73 69  e<0 ) size = -si
e710: 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  ze;.      if( db
e720: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3c 30 20 29  ->cache_size<0 )
e730: 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a 20   size = -size;. 
e740: 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65 5f 73       db->cache_s
e750: 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ize = size;.    
e760: 20 20 73 71 6c 69 74 65 42 74 72 65 65 53 65 74    sqliteBtreeSet
e770: 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 70 42  CacheSize(db->pB
e780: 65 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a  e, db->cache_siz
e790: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
e7a0: 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52  e..  /*.  **  PR
e7b0: 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 73 79 6e  AGMA default_syn
e7c0: 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 50  chronous.  **  P
e7d0: 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 73 79  RAGMA default_sy
e7e0: 6e 63 68 72 6f 6e 6f 75 73 3d 42 4f 4f 4c 45 41  nchronous=BOOLEA
e7f0: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
e800: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 74 75 72  first form retur
e810: 6e 73 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ns the persisten
e820: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22  t value of the "
e830: 73 79 6e 63 68 72 6f 6e 6f 75 73 22 20 73 65 74  synchronous" set
e840: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 61 74 20 69  ting.  ** that i
e850: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
e860: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
e870: 69 73 20 74 68 65 20 73 79 6e 63 68 72 6f 6e 6f  is the synchrono
e880: 75 73 20 73 65 74 74 69 6e 67 20 74 68 61 74 0a  us setting that.
e890: 20 20 2a 2a 20 69 73 20 75 73 65 64 20 77 68 65    ** is used whe
e8a0: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
e8b0: 73 65 20 69 73 20 6f 70 65 6e 65 64 20 75 6e 6c  se is opened unl
e8c0: 65 73 73 20 6f 76 65 72 72 69 64 64 65 6e 20 62  ess overridden b
e8d0: 79 20 61 20 73 65 70 61 72 61 74 65 0a 20 20 2a  y a separate.  *
e8e0: 2a 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 20  * "synchronous" 
e8f0: 70 72 61 67 6d 61 2e 20 20 54 68 65 20 73 65 63  pragma.  The sec
e900: 6f 6e 64 20 66 6f 72 6d 20 63 68 61 6e 67 65 73  ond form changes
e910: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
e920: 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63  and the.  ** loc
e930: 61 6c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73  al synchronous s
e940: 65 74 74 69 6e 67 20 74 6f 20 74 68 65 20 76 61  etting to the va
e950: 6c 75 65 20 67 69 76 65 6e 2e 0a 20 20 2a 2a 0a  lue given..  **.
e960: 20 20 2a 2a 20 49 66 20 73 79 6e 63 68 72 6f 6e    ** If synchron
e970: 6f 75 73 20 69 73 20 6f 6e 2c 20 53 51 4c 69 74  ous is on, SQLit
e980: 65 20 77 69 6c 6c 20 64 6f 20 61 6e 20 66 73 79  e will do an fsy
e990: 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  nc() system call
e9a0: 20 61 74 20 73 74 72 61 74 65 67 69 63 0a 20 20   at strategic.  
e9b0: 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 69 6e 73  ** points to ins
e9c0: 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 72 65  ure that all pre
e9d0: 76 69 6f 75 73 6c 79 20 77 72 69 74 74 65 6e 20  viously written 
e9e0: 64 61 74 61 20 68 61 73 20 61 63 74 75 61 6c 6c  data has actuall
e9f0: 79 20 62 65 65 6e 0a 20 20 2a 2a 20 77 72 69 74  y been.  ** writ
ea00: 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
ea10: 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
ea20: 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 68   continuing.  Th
ea30: 69 73 20 6d 6f 64 65 20 69 6e 73 75 72 65 73 20  is mode insures 
ea40: 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 64 61  that.  ** the da
ea50: 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 77 61  tabase will alwa
ea60: 79 73 20 62 65 20 69 6e 20 61 20 63 6f 6e 73 69  ys be in a consi
ea70: 73 74 65 6e 74 20 73 74 61 74 65 20 65 76 65 6e  stent state even
ea80: 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
ea90: 6e 67 0a 20 20 2a 2a 20 73 79 73 74 65 6d 20 63  ng.  ** system c
eaa0: 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20  rashes or power 
eab0: 74 6f 20 74 68 65 20 63 6f 6d 70 75 74 65 72 20  to the computer 
eac0: 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 20 75  is interrupted u
ead0: 6e 65 78 70 65 63 74 65 64 6c 79 2e 0a 20 20 2a  nexpectedly..  *
eae0: 2a 20 57 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  * When synchrono
eaf0: 75 73 20 69 73 20 6f 66 66 2c 20 53 51 4c 69 74  us is off, SQLit
eb00: 65 20 77 69 6c 6c 20 6e 6f 74 20 77 61 69 74 20  e will not wait 
eb10: 66 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 61  for changes to a
eb20: 63 74 75 61 6c 6c 79 0a 20 20 2a 2a 20 62 65 20  ctually.  ** be 
eb30: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
eb40: 69 73 6b 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  isk before conti
eb50: 6e 75 69 6e 67 2e 20 20 41 73 20 73 6f 6f 6e 20  nuing.  As soon 
eb60: 61 73 20 69 74 20 68 61 6e 64 73 20 63 68 61 6e  as it hands chan
eb70: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ges.  ** to the 
eb80: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
eb90: 2c 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  , it assumes tha
eba0: 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 61 72  t the changes ar
ebb0: 65 20 70 65 72 6d 61 6e 65 6e 74 20 61 6e 64 0a  e permanent and.
ebc0: 20 20 2a 2a 20 69 74 20 63 6f 6e 74 69 6e 75 65    ** it continue
ebd0: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 20 64 61  s going.  The da
ebe0: 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
ebf0: 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 61 20   corrupted by a 
ec00: 70 72 6f 67 72 61 6d 20 63 72 61 73 68 0a 20 20  program crash.  
ec10: 2a 2a 20 65 76 65 6e 20 77 69 74 68 20 73 79 6e  ** even with syn
ec20: 63 68 72 6f 6e 6f 75 73 20 6f 66 66 2c 20 62 75  chronous off, bu
ec30: 74 20 61 6e 20 6f 70 65 72 61 74 69 6e 67 20 73  t an operating s
ec40: 79 73 74 65 6d 20 63 72 61 73 68 20 6f 72 20 70  ystem crash or p
ec50: 6f 77 65 72 20 6c 6f 73 73 0a 20 20 2a 2a 20 63  ower loss.  ** c
ec60: 6f 75 6c 64 20 70 6f 74 65 6e 74 69 61 6c 6c 79  ould potentially
ec70: 20 63 6f 72 72 75 70 74 20 64 61 74 61 2e 20 20   corrupt data.  
ec80: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
ec90: 64 2c 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6f  d, synchronous o
eca0: 66 66 20 69 73 0a 20 20 2a 2a 20 66 61 73 74 65  ff is.  ** faste
ecb0: 72 20 74 68 61 6e 20 73 79 6e 63 68 72 6f 6e 6f  r than synchrono
ecc0: 75 73 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  us on..  */.  if
ecd0: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
ece0: 7a 4c 65 66 74 2c 22 64 65 66 61 75 6c 74 5f 73  zLeft,"default_s
ecf0: 79 6e 63 68 72 6f 6e 6f 75 73 22 29 3d 3d 30 20  ynchronous")==0 
ed00: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
ed10: 62 65 4f 70 20 67 65 74 53 79 6e 63 5b 5d 20 3d  beOp getSync[] =
ed20: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e   {.      { OP_In
ed30: 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c  teger,     0, 0,
ed40: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
ed50: 20 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69    { OP_ReadCooki
ed60: 65 2c 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20  e,  0, 2,       
ed70: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
ed80: 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c 20  Integer,     0, 
ed90: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
eda0: 20 20 20 20 7b 20 4f 50 5f 4c 74 2c 20 20 20 20      { OP_Lt,    
edb0: 20 20 20 20 20 20 30 2c 20 35 2c 20 20 20 20 20        0, 5,     
edc0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
edd0: 50 5f 41 64 64 49 6d 6d 2c 20 20 20 20 20 20 31  P_AddImm,      1
ede0: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
edf0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
ee00: 6e 43 6f 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20  nCount, 1, 0,   
ee10: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
ee20: 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20   OP_ColumnName, 
ee30: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 22 73   0, 0,        "s
ee40: 79 6e 63 68 72 6f 6e 6f 75 73 22 7d 2c 0a 20 20  ynchronous"},.  
ee50: 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63      { OP_Callbac
ee60: 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  k,    1, 0,     
ee70: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
ee80: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
ee90: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
eea0: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
eeb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
eec0: 28 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65  ( pRight->z==pLe
eed0: 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73  ft->z ){.      s
eee0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
eef0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
ef00: 67 65 74 53 79 6e 63 29 2c 20 67 65 74 53 79 6e  getSync), getSyn
ef10: 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  c);.    }else{. 
ef20: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
ef30: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
ef40: 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 0a  db->cache_size;.
ef50: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30        if( size<0
ef60: 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b   ) size = -size;
ef70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67  .      sqliteBeg
ef80: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
ef90: 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20  (pParse, 0);.   
efa0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
efb0: 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  Op(v, OP_ReadCoo
efc0: 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20 20 20  kie, 0, 2);.    
efd0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
efe0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
eff0: 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  0);.      addr =
f000: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
f010: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
f020: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
f030: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
f040: 4f 50 5f 4e 65 2c 20 30 2c 20 61 64 64 72 2b 33  OP_Ne, 0, addr+3
f050: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
f060: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
f070: 64 64 49 6d 6d 2c 20 4d 41 58 5f 50 41 47 45 53  ddImm, MAX_PAGES
f080: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
f090: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f0a0: 50 5f 41 62 73 56 61 6c 75 65 2c 20 30 2c 20 30  P_AbsValue, 0, 0
f0b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 67 65  );.      if( !ge
f0c0: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
f0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f0e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f0f0: 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c 20 30  P_Negative, 0, 0
f100: 29 3b 0a 20 20 20 20 20 20 20 20 73 69 7a 65 20  );.        size 
f110: 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 7d  = -size;.      }
f120: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
f130: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
f140: 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20  Cookie, 0, 2);. 
f150: 20 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72       sqliteEndWr
f160: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
f170: 72 73 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  rse);.      db->
f180: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a  cache_size = siz
f190: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  e;.      sqliteB
f1a0: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
f1b0: 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e 63 61  (db->pBe, db->ca
f1c0: 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d  che_size);.    }
f1d0: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20  .  }else..  /*. 
f1e0: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 79 6e   **   PRAGMA syn
f1f0: 63 68 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 20  chronous.  **   
f200: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
f210: 75 73 3d 42 4f 4f 4c 45 41 4e 0a 20 20 2a 2a 0a  us=BOOLEAN.  **.
f220: 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73    ** Return or s
f230: 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c  et the local val
f240: 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68 72  ue of the synchr
f250: 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68 61  onous flag.  Cha
f260: 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6c  nging.  ** the l
f270: 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73 20  ocal value does 
f280: 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65 73  not make changes
f290: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69 6c   to the disk fil
f2a0: 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 64  e and the.  ** d
f2b0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c  efault value wil
f2c0: 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 68  l be restored th
f2d0: 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
f2e0: 64 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a 2a  database is.  **
f2f0: 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
f300: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
f310: 70 28 7a 4c 65 66 74 2c 22 73 79 6e 63 68 72 6f  p(zLeft,"synchro
f320: 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  nous")==0 ){.   
f330: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 67   static VdbeOp g
f340: 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20  etSync[] = {.   
f350: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f     { OP_ColumnCo
f360: 75 6e 74 2c 20 31 2c 20 30 2c 20 20 20 20 20 20  unt, 1, 0,      
f370: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
f380: 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 30 2c  _ColumnName,  0,
f390: 20 30 2c 20 20 20 20 20 20 20 20 22 73 79 6e 63   0,        "sync
f3a0: 68 72 6f 6e 6f 75 73 22 7d 2c 0a 20 20 20 20 20  hronous"},.     
f3b0: 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20   { OP_Callback, 
f3c0: 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20     1, 0,        
f3d0: 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56  0},.    };.    V
f3e0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47  dbe *v = sqliteG
f3f0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f400: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
f410: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
f420: 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d  Right->z==pLeft-
f430: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
f440: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
f450: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 63  P_Integer, db->c
f460: 61 63 68 65 5f 73 69 7a 65 3e 3d 30 2c 20 30 29  ache_size>=0, 0)
f470: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
f480: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
f490: 72 72 61 79 53 69 7a 65 28 67 65 74 53 79 6e 63  rraySize(getSync
f4a0: 29 2c 20 67 65 74 53 79 6e 63 29 3b 0a 20 20 20  ), getSync);.   
f4b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
f4c0: 74 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63  t size = db->cac
f4d0: 68 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69  he_size;.      i
f4e0: 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65  f( size<0 ) size
f4f0: 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
f500: 69 66 28 20 21 67 65 74 42 6f 6f 6c 65 61 6e 28  if( !getBoolean(
f510: 7a 52 69 67 68 74 29 20 29 20 73 69 7a 65 20 3d  zRight) ) size =
f520: 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 64 62   -size;.      db
f530: 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73  ->cache_size = s
f540: 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ize;.      sqlit
f550: 65 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  eBtreeSetCacheSi
f560: 7a 65 28 64 62 2d 3e 70 42 65 2c 20 64 62 2d 3e  ze(db->pBe, db->
f570: 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 20  cache_size);.   
f580: 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
f590: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
f5a0: 7a 4c 65 66 74 2c 20 22 74 72 69 67 67 65 72 5f  zLeft, "trigger_
f5b0: 6f 76 65 72 68 65 61 64 5f 74 65 73 74 22 29 3d  overhead_test")=
f5c0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
f5d0: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
f5e0: 20 29 7b 0a 20 20 20 20 20 20 61 6c 77 61 79 73   ){.      always
f5f0: 5f 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65  _code_trigger_se
f600: 74 75 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  tup = 1;.    }el
f610: 73 65 7b 0a 20 20 20 20 20 20 61 6c 77 61 79 73  se{.      always
f620: 5f 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65  _code_trigger_se
f630: 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  tup = 0;.    }. 
f640: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
f650: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65 66  liteStrICmp(zLef
f660: 74 2c 20 22 76 64 62 65 5f 74 72 61 63 65 22 29  t, "vdbe_trace")
f670: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67  ==0 ){.    if( g
f680: 65 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74  etBoolean(zRight
f690: 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  ) ){.      db->f
f6a0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 56  lags |= SQLITE_V
f6b0: 64 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d 65  dbeTrace;.    }e
f6c0: 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66  lse{.      db->f
f6d0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
f6e0: 56 64 62 65 54 72 61 63 65 3b 0a 20 20 20 20 7d  VdbeTrace;.    }
f6f0: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
f700: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
f710: 65 66 74 2c 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d  eft, "full_colum
f720: 6e 5f 6e 61 6d 65 73 22 29 3d 3d 30 20 29 7b 0a  n_names")==0 ){.
f730: 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
f740: 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
f750: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
f760: 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
f770: 61 6d 65 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ames;.    }else{
f780: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
f790: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
f7a0: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 20 20 7d 0a  ColNames;.    }.
f7b0: 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73    }else..  if( s
f7c0: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c 65  qliteStrICmp(zLe
f7d0: 66 74 2c 20 22 72 65 73 75 6c 74 5f 73 65 74 5f  ft, "result_set_
f7e0: 64 65 74 61 69 6c 73 22 29 3d 3d 30 20 29 7b 0a  details")==0 ){.
f7f0: 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
f800: 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
f810: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
f820: 20 53 51 4c 49 54 45 5f 52 65 73 75 6c 74 44 65   SQLITE_ResultDe
f830: 74 61 69 6c 73 3b 0a 20 20 20 20 7d 65 6c 73 65  tails;.    }else
f840: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  {.      db->flag
f850: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 52 65 73  s &= ~SQLITE_Res
f860: 75 6c 74 44 65 74 61 69 6c 73 3b 0a 20 20 20 20  ultDetails;.    
f870: 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
f880: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a   sqliteStrICmp(z
f890: 4c 65 66 74 2c 20 22 63 6f 75 6e 74 5f 63 68 61  Left, "count_cha
f8a0: 6e 67 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  nges")==0 ){.   
f8b0: 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28   if( getBoolean(
f8c0: 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  zRight) ){.     
f8d0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
f8e0: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b 0a  LITE_CountRows;.
f8f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f900: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
f910: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 3b  QLITE_CountRows;
f920: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
f930: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
f940: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 65 6d 70 74  Cmp(zLeft, "empt
f950: 79 5f 72 65 73 75 6c 74 5f 63 61 6c 6c 62 61 63  y_result_callbac
f960: 6b 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ks")==0 ){.    i
f970: 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  f( getBoolean(zR
f980: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 64  ight) ){.      d
f990: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
f9a0: 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b 3b  TE_NullCallback;
f9b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f9c0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
f9d0: 53 51 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62  SQLITE_NullCallb
f9e0: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ack;.    }.  }el
f9f0: 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
fa00: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
fa10: 74 61 62 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30 20  table_info")==0 
fa20: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
fa30: 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b  ab;.    Vdbe *v;
fa40: 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
fa50: 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  teFindTable(db, 
fa60: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  zRight);.    if(
fa70: 20 70 54 61 62 20 29 20 76 20 3d 20 73 71 6c 69   pTab ) v = sqli
fa80: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
fa90: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
faa0: 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20 73 74  && v ){.      st
fab0: 61 74 69 63 20 56 64 62 65 4f 70 20 74 61 62 6c  atic VdbeOp tabl
fac0: 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d 20 3d  eInfoPreface[] =
fad0: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
fae0: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 35 2c 20  ColumnCount, 5, 
faf0: 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  0,       0},.   
fb00: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
fb10: 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
fb20: 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20 20 20     "cid"},.     
fb30: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
fb40: 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20  me,  1, 0,      
fb50: 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20   "name"},.      
fb60: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
fb70: 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20  e,  2, 0,       
fb80: 22 74 79 70 65 22 7d 2c 0a 20 20 20 20 20 20 20  "type"},.       
fb90: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65   { OP_ColumnName
fba0: 2c 20 20 33 2c 20 30 2c 20 20 20 20 20 20 20 22  ,  3, 0,       "
fbb0: 6e 6f 74 6e 75 6c 6c 22 7d 2c 0a 20 20 20 20 20  notnull"},.     
fbc0: 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
fbd0: 6d 65 2c 20 20 34 2c 20 30 2c 20 20 20 20 20 20  me,  4, 0,      
fbe0: 20 22 64 66 6c 74 5f 76 61 6c 75 65 22 7d 2c 0a   "dflt_value"},.
fbf0: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
fc00: 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt i;.      sqli
fc10: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
fc20: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 74 61 62  v, ArraySize(tab
fc30: 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 29 2c 20  leInfoPreface), 
fc40: 74 61 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65  tableInfoPreface
fc50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
fc60: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
fc70: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  s(pParse, pTab);
fc80: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
fc90: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
fca0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
fcb0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
fcc0: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29  P_Integer, i, 0)
fcd0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
fce0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fcf0: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
fd00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
fd10: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
fd20: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   pTab->aCol[i].z
fd30: 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29  Name, P3_STATIC)
fd40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
fd50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fd60: 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20  String, 0, 0);. 
fd70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
fd80: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
fd90: 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61   .           pTa
fda0: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  b->aCol[i].zType
fdb0: 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d   ? pTab->aCol[i]
fdc0: 2e 7a 54 79 70 65 20 3a 20 22 74 65 78 74 22 2c  .zType : "text",
fdd0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
fde0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
fdf0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
fe00: 65 72 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  er, pTab->aCol[i
fe10: 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20 30 29 3b 0a 20  ].notNull, 0);. 
fe20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
fe30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
fe40: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
fe50: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
fe60: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 54  angeP3(v, -1, pT
fe70: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  ab->aCol[i].zDfl
fe80: 74 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  t, P3_STATIC);. 
fe90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
fea0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
feb0: 6c 62 61 63 6b 2c 20 35 2c 20 30 29 3b 0a 20 20  lback, 5, 0);.  
fec0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
fed0: 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
fee0: 65 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  eStrICmp(zLeft, 
fef0: 22 69 6e 64 65 78 5f 69 6e 66 6f 22 29 3d 3d 30  "index_info")==0
ff00: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
ff10: 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Idx;.    Table *
ff20: 70 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a  pTab;.    Vdbe *
ff30: 76 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 73 71  v;.    pIdx = sq
ff40: 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62  liteFindIndex(db
ff50: 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 69  , zRight);.    i
ff60: 66 28 20 70 49 64 78 20 29 20 76 20 3d 20 73 71  f( pIdx ) v = sq
ff70: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
ff80: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  se);.    if( pId
ff90: 78 20 26 26 20 76 20 29 7b 0a 20 20 20 20 20 20  x && v ){.      
ffa0: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 74 61  static VdbeOp ta
ffb0: 62 6c 65 49 6e 66 6f 50 72 65 66 61 63 65 5b 5d  bleInfoPreface[]
ffc0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f   = {.        { O
ffd0: 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33  P_ColumnCount, 3
ffe0: 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 0,       0},. 
fff0: 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
10000 6d 6e 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20  mnName,  0, 0,  
10010 20 20 20 20 20 22 73 65 71 6e 6f 22 7d 2c 0a 20       "seqno"},. 
10020 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75         { OP_Colu
10030 6d 6e 4e 61 6d 65 2c 20 20 31 2c 20 30 2c 20 20  mnName,  1, 0,  
10040 20 20 20 20 20 22 63 69 64 22 7d 2c 0a 20 20 20       "cid"},.   
10050 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
10060 4e 61 6d 65 2c 20 20 32 2c 20 30 2c 20 20 20 20  Name,  2, 0,    
10070 20 20 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20     "name"},.    
10080 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69    };.      int i
10090 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
100a0 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  Idx->pTable;.   
100b0 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
100c0 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
100d0 69 7a 65 28 74 61 62 6c 65 49 6e 66 6f 50 72 65  ize(tableInfoPre
100e0 66 61 63 65 29 2c 20 74 61 62 6c 65 49 6e 66 6f  face), tableInfo
100f0 50 72 65 66 61 63 65 29 3b 0a 20 20 20 20 20 20  Preface);.      
10100 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
10110 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
10120 20 20 20 20 20 20 20 20 69 6e 74 20 63 6e 75 6d          int cnum
10130 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
10140 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  n[i];.        sq
10150 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
10160 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
10170 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
10180 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
10190 50 5f 49 6e 74 65 67 65 72 2c 20 63 6e 75 6d 2c  P_Integer, cnum,
101a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
101b0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
101c0 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29  OP_String, 0, 0)
101d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
101e0 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 63 6e 75  ( pTab->nCol>cnu
101f0 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  m );.        sql
10200 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
10210 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f  v, -1, pTab->aCo
10220 6c 5b 63 6e 75 6d 5d 2e 7a 4e 61 6d 65 2c 20 50  l[cnum].zName, P
10230 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
10240 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10250 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
10260 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20 20 20  k, 3, 0);.      
10270 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
10280 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72  .  if( sqliteStr
10290 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64  ICmp(zLeft, "ind
102a0 65 78 5f 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a  ex_list")==0 ){.
102b0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
102c0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
102d0 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
102e0 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
102f0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 52  FindTable(db, zR
10300 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ight);.    if( p
10310 54 61 62 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  Tab ){.      v =
10320 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
10330 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 49  Parse);.      pI
10340 64 78 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  dx = pTab->pInde
10350 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
10360 20 70 54 61 62 20 26 26 20 70 49 64 78 20 26 26   pTab && pIdx &&
10370 20 76 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20   v ){.      int 
10380 69 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 73 74  i = 0; .      st
10390 61 74 69 63 20 56 64 62 65 4f 70 20 69 6e 64 65  atic VdbeOp inde
103a0 78 4c 69 73 74 50 72 65 66 61 63 65 5b 5d 20 3d  xListPreface[] =
103b0 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 4f 50 5f   {.        { OP_
103c0 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 33 2c 20  ColumnCount, 3, 
103d0 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  0,       0},.   
103e0 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
103f0 4e 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  Name,  0, 0,    
10400 20 20 20 22 73 65 71 22 7d 2c 0a 20 20 20 20 20     "seq"},.     
10410 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61     { OP_ColumnNa
10420 6d 65 2c 20 20 31 2c 20 30 2c 20 20 20 20 20 20  me,  1, 0,      
10430 20 22 6e 61 6d 65 22 7d 2c 0a 20 20 20 20 20 20   "name"},.      
10440 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d    { OP_ColumnNam
10450 65 2c 20 20 32 2c 20 30 2c 20 20 20 20 20 20 20  e,  2, 0,       
10460 22 75 6e 69 71 75 65 22 7d 2c 0a 20 20 20 20 20  "unique"},.     
10470 20 7d 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74   };..      sqlit
10480 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
10490 2c 20 41 72 72 61 79 53 69 7a 65 28 69 6e 64 65  , ArraySize(inde
104a0 78 4c 69 73 74 50 72 65 66 61 63 65 29 2c 20 69  xListPreface), i
104b0 6e 64 65 78 4c 69 73 74 50 72 65 66 61 63 65 29  ndexListPreface)
104c0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 70 49  ;.      while(pI
104d0 64 78 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  dx){.        sql
104e0 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
104f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
10500 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10510 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
10520 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
10530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
10540 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
10550 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50  , pIdx->zName, P
10560 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
10570 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
10580 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
10590 2c 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  , pIdx->onError!
105a0 3d 4f 45 5f 4e 6f 6e 65 2c 20 30 29 3b 0a 20 20  =OE_None, 0);.  
105b0 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
105c0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
105d0 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20  back, 3, 0);.   
105e0 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20 20       ++i;.      
105f0 20 20 70 49 64 78 20 3d 20 70 49 64 78 2d 3e 70    pIdx = pIdx->p
10600 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
10610 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66    }.  }else..#if
10620 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66  ndef NDEBUG.  if
10630 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
10640 7a 4c 65 66 74 2c 20 22 70 61 72 73 65 72 5f 74  zLeft, "parser_t
10650 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  race")==0 ){.   
10660 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c   extern void sql
10670 69 74 65 50 61 72 73 65 72 54 72 61 63 65 28 46  iteParserTrace(F
10680 49 4c 45 2a 2c 20 63 68 61 72 20 2a 29 3b 0a 20  ILE*, char *);. 
10690 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65 61     if( getBoolea
106a0 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20 20  n(zRight) ){.   
106b0 20 20 20 73 71 6c 69 74 65 50 61 72 73 65 72 54     sqliteParserT
106c0 72 61 63 65 28 73 74 64 6f 75 74 2c 20 22 70 61  race(stdout, "pa
106d0 72 73 65 72 3a 20 22 29 3b 0a 20 20 20 20 7d 65  rser: ");.    }e
106e0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
106f0 65 50 61 72 73 65 72 54 72 61 63 65 28 30 2c 20  eParserTrace(0, 
10700 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
10710 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
10720 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 4c  sqliteStrICmp(zL
10730 65 66 74 2c 20 22 69 6e 74 65 67 72 69 74 79 5f  eft, "integrity_
10740 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20  check")==0 ){.  
10750 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
10760 63 68 65 63 6b 44 62 5b 5d 20 3d 20 7b 0a 20 20  checkDb[] = {.  
10770 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73 65      { OP_SetInse
10780 72 74 2c 20 20 20 30 2c 20 30 2c 20 20 20 20 20  rt,   0, 0,     
10790 20 20 20 22 32 22 7d 2c 0a 20 20 20 20 20 20 7b     "2"},.      {
107a0 20 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20   OP_Open,       
107b0 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d   0, 2,        0}
107c0 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77  ,.      { OP_Rew
107d0 69 6e 64 2c 20 20 20 20 20 20 30 2c 20 36 2c 20  ind,      0, 6, 
107e0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
107f0 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
10800 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20     0, 3,        
10810 30 7d 2c 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20  0},    /* 3 */. 
10820 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e 73       { OP_SetIns
10830 65 72 74 2c 20 20 20 30 2c 20 30 2c 20 20 20 20  ert,   0, 0,    
10840 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
10850 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 20  OP_Next,        
10860 30 2c 20 33 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 3,        0},
10870 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
10880 67 72 69 74 79 43 6b 2c 20 30 2c 20 30 2c 20 20  grityCk, 0, 0,  
10890 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
108a0 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  6 */.      { OP_
108b0 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20 31 2c 20  ColumnCount, 1, 
108c0 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
108d0 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 4e      { OP_ColumnN
108e0 61 6d 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ame,  0, 0,     
108f0 20 20 20 22 69 6e 74 65 67 72 69 74 79 5f 63 68     "integrity_ch
10900 65 63 6b 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  eck"},.      { O
10910 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31  P_Callback,    1
10920 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
10930 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74 49 6e        { OP_SetIn
10940 73 65 72 74 2c 20 20 20 31 2c 20 30 2c 20 20 20  sert,   1, 0,   
10950 20 20 20 20 20 22 32 22 7d 2c 0a 20 20 20 20 20       "2"},.     
10960 20 7b 20 4f 50 5f 4f 70 65 6e 41 75 78 2c 20 20   { OP_OpenAux,  
10970 20 20 20 31 2c 20 32 2c 20 20 20 20 20 20 20 20     1, 2,        
10980 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  0},.      { OP_R
10990 65 77 69 6e 64 2c 20 20 20 20 20 20 31 2c 20 31  ewind,      1, 1
109a0 36 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  6,       0},.   
109b0 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20     { OP_Column, 
109c0 20 20 20 20 20 31 2c 20 33 2c 20 20 20 20 20 20       1, 3,      
109d0 20 20 30 7d 2c 20 20 20 20 2f 2a 20 31 33 20 2a    0},    /* 13 *
109e0 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 65 74  /.      { OP_Set
109f0 49 6e 73 65 72 74 2c 20 20 20 31 2c 20 30 2c 20  Insert,   1, 0, 
10a00 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
10a10 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20   { OP_Next,     
10a20 20 20 20 31 2c 20 31 33 2c 20 20 20 20 20 20 20     1, 13,       
10a30 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49  0},.      { OP_I
10a40 6e 74 65 67 72 69 74 79 43 6b 2c 20 31 2c 20 31  ntegrityCk, 1, 1
10a50 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20 20 20  ,        0},    
10a60 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 7b  /* 16 */.      {
10a70 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20   OP_Callback,   
10a80 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
10a90 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62  ,.    };.    Vdb
10aa0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74  e *v = sqliteGet
10ab0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10ac0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
10ad0 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  urn;.    sqliteV
10ae0 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
10af0 41 72 72 61 79 53 69 7a 65 28 63 68 65 63 6b 44  ArraySize(checkD
10b00 62 29 2c 20 63 68 65 63 6b 44 62 29 3b 0a 20 20  b), checkDb);.  
10b10 7d 65 6c 73 65 0a 0a 20 20 7b 7d 0a 20 20 73 71  }else..  {}.  sq
10b20 6c 69 74 65 46 72 65 65 28 7a 4c 65 66 74 29 3b  liteFree(zLeft);
10b30 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 52  .  sqliteFree(zR
10b40 69 67 68 74 29 3b 0a 7d 0a                       ight);.}.