/ Hex Artifact Content
Login

Artifact 925a785da2758269cb8773691e157ea5269178ba:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 31 39 39 39 2c 20 32 30 30 30 20 44  (c) 1999, 2000 D
0020: 2e 20 52 69 63 68 61 72 64 20 48 69 70 70 0a 2a  . Richard Hipp.*
0030: 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61  *.** This progra
0040: 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61  m is free softwa
0050: 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69  re; you can redi
0060: 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f  stribute it and/
0070: 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20  or.** modify it 
0080: 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20  under the terms 
0090: 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72  of the GNU Gener
00a0: 61 6c 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63  al Public.** Lic
00b0: 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 65  ense as publishe
00c0: 64 20 62 79 20 74 68 65 20 46 72 65 65 20 53 6f  d by the Free So
00d0: 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f  ftware Foundatio
00e0: 6e 3b 20 65 69 74 68 65 72 0a 2a 2a 20 76 65 72  n; either.** ver
00f0: 73 69 6f 6e 20 32 20 6f 66 20 74 68 65 20 4c 69  sion 2 of the Li
0100: 63 65 6e 73 65 2c 20 6f 72 20 28 61 74 20 79 6f  cense, or (at yo
0110: 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c  ur option) any l
0120: 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 2a 2a  ater version..**
0130: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0140: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
0150: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
0160: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
0170: 75 6c 2c 0a 2a 2a 20 62 75 74 20 57 49 54 48 4f  ul,.** but WITHO
0180: 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b  UT ANY WARRANTY;
0190: 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68   without even th
01a0: 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e  e implied warran
01b0: 74 79 20 6f 66 0a 2a 2a 20 4d 45 52 43 48 41 4e  ty of.** MERCHAN
01c0: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
01d0: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
01e0: 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53  ULAR PURPOSE.  S
01f0: 65 65 20 74 68 65 20 47 4e 55 0a 2a 2a 20 47 65  ee the GNU.** Ge
0200: 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63  neral Public Lic
0210: 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65  ense for more de
0220: 74 61 69 6c 73 2e 0a 2a 2a 20 0a 2a 2a 20 59 6f  tails..** .** Yo
0230: 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65  u should have re
0240: 63 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66  ceived a copy of
0250: 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c   the GNU General
0260: 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e   Public.** Licen
0270: 73 65 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  se along with th
0280: 69 73 20 6c 69 62 72 61 72 79 3b 20 69 66 20 6e  is library; if n
0290: 6f 74 2c 20 77 72 69 74 65 20 74 6f 20 74 68 65  ot, write to the
02a0: 0a 2a 2a 20 46 72 65 65 20 53 6f 66 74 77 61 72  .** Free Softwar
02b0: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e  e Foundation, In
02c0: 63 2e 2c 20 35 39 20 54 65 6d 70 6c 65 20 50 6c  c., 59 Temple Pl
02d0: 61 63 65 20 2d 20 53 75 69 74 65 20 33 33 30 2c  ace - Suite 330,
02e0: 0a 2a 2a 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 20  .** Boston, MA  
02f0: 30 32 31 31 31 2d 31 33 30 37 2c 20 55 53 41 2e  02111-1307, USA.
0300: 0a 2a 2a 0a 2a 2a 20 41 75 74 68 6f 72 20 63 6f  .**.** Author co
0310: 6e 74 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntact informatio
0320: 6e 3a 0a 2a 2a 20 20 20 64 72 68 40 68 77 61 63  n:.**   drh@hwac
0330: 69 2e 63 6f 6d 0a 2a 2a 20 20 20 68 74 74 70 3a  i.com.**   http:
0340: 2f 2f 77 77 77 2e 68 77 61 63 69 2e 63 6f 6d 2f  //www.hwaci.com/
0350: 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  drh/.**.********
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
03b0: 6f 6e 74 61 69 6e 73 20 43 20 63 6f 64 65 20 72  ontains C code r
03c0: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 61 72 65  outines that are
03d0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
03e0: 61 72 73 65 72 0a 2a 2a 20 77 68 65 6e 20 73 79  arser.** when sy
03f0: 6e 74 61 78 20 72 75 6c 65 73 20 61 72 65 20 72  ntax rules are r
0400: 65 64 75 63 65 64 2e 20 20 54 68 65 20 72 6f 75  educed.  The rou
0410: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
0420: 6c 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 74 68 65  le handle.** the
0430: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6b 69 6e 64 73   following kinds
0440: 20 6f 66 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a   of rules:.**.**
0450: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
0460: 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54 41  E.**     DROP TA
0470: 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  BLE.**     CREAT
0480: 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20 44  E INDEX.**     D
0490: 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20  ROP INDEX.**    
04a0: 20 63 72 65 61 74 69 6e 67 20 65 78 70 72 65 73   creating expres
04b0: 73 69 6f 6e 73 20 61 6e 64 20 49 44 20 6c 69 73  sions and ID lis
04c0: 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a 2a  ts.**     COPY.*
04d0: 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a 0a  *     VACUUM.**.
04e0: 2a 2a 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c  ** $Id: build.c,
04f0: 76 20 31 2e 31 37 20 32 30 30 30 2f 30 36 2f 30  v 1.17 2000/06/0
0500: 38 20 31 33 3a 33 36 3a 34 30 20 64 72 68 20 45  8 13:36:40 drh E
0510: 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  xp $.*/.#include
0520: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0540: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0550: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0560: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0570: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0580: 20 77 65 20 77 61 6e 74 20 74 6f 20 65 78 65 63   we want to exec
0590: 75 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ute the code to 
05a0: 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 74 68  implement .** th
05b0: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 72  e statement.  Pr
05c0: 69 6f 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ior action routi
05d0: 6e 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20  nes should have 
05e0: 61 6c 72 65 61 64 79 0a 2a 2a 20 63 6f 6e 73 74  already.** const
05f0: 72 75 63 74 65 64 20 56 44 42 45 20 63 6f 64 65  ructed VDBE code
0600: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
0610: 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  of the SQL state
0620: 6d 65 6e 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  ment..** This ro
0630: 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20 74  utine just has t
0640: 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44  o execute the VD
0650: 42 45 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e  BE code..**.** N
0660: 6f 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65  ote that if an e
0670: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69  rror occurred, i
0680: 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
0690: 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56  ase that.** no V
06a0: 44 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e  DBE code was gen
06b0: 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  erated..*/.void 
06c0: 73 71 6c 69 74 65 45 78 65 63 28 50 61 72 73 65  sqliteExec(Parse
06d0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
06e0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
06f0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
0700: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
0710: 20 20 20 73 71 6c 69 74 65 56 64 62 65 4c 69 73     sqliteVdbeLis
0720: 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  t(pParse->pVdbe,
0730: 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61   pParse->xCallba
0740: 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41 72 67  ck, pParse->pArg
0750: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
0760: 20 20 20 20 20 20 20 20 26 70 50 61 72 73 65 2d          &pParse-
0770: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d  >zErrMsg);.    }
0780: 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 49 4c 45  else{.      FILE
0790: 20 2a 74 72 61 63 65 20 3d 20 28 70 50 61 72 73   *trace = (pPars
07a0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
07b0: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29  QLITE_VdbeTrace)
07c0: 21 3d 30 20 3f 20 73 74 64 65 72 72 20 3a 20 30  !=0 ? stderr : 0
07d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
07e0: 62 65 54 72 61 63 65 28 70 50 61 72 73 65 2d 3e  beTrace(pParse->
07f0: 70 56 64 62 65 2c 20 74 72 61 63 65 29 3b 0a 20  pVdbe, trace);. 
0800: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 45       sqliteVdbeE
0810: 78 65 63 28 70 50 61 72 73 65 2d 3e 70 56 64 62  xec(pParse->pVdb
0820: 65 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c  e, pParse->xCall
0830: 62 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41  back, pParse->pA
0840: 72 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rg, .           
0850: 20 20 20 20 20 20 20 20 20 20 26 70 50 61 72 73            &pPars
0860: 65 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  e->zErrMsg);.   
0870: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
0880: 65 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  eDelete(pParse->
0890: 70 56 64 62 65 29 3b 0a 20 20 20 20 70 50 61 72  pVdbe);.    pPar
08a0: 73 65 2d 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20  se->pVdbe = 0;. 
08b0: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
08c0: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 0a  mesSet = 0;.  }.
08d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
08e0: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
08f0: 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74  ion node and ret
0900: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0910: 20 69 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71   it..*/.Expr *sq
0920: 6c 69 74 65 45 78 70 72 28 69 6e 74 20 6f 70 2c  liteExpr(int op,
0930: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
0940: 70 72 20 2a 70 52 69 67 68 74 2c 20 54 6f 6b 65  pr *pRight, Toke
0950: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
0960: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  pr *pNew;.  pNew
0970: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
0980: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
0990: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
09a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
09b0: 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 4e  w->op = op;.  pN
09c0: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66  ew->pLeft = pLef
09d0: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68  t;.  pNew->pRigh
09e0: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 69 66  t = pRight;.  if
09f0: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
0a00: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70  pNew->token = *p
0a10: 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Token;.  }else{.
0a20: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
0a30: 7a 20 3d 20 22 22 3b 0a 20 20 20 20 70 4e 65 77  z = "";.    pNew
0a40: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20  ->token.n = 0;. 
0a50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
0a60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  ;.}../*.** Const
0a70: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
0a80: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
0a90: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
0aa0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
0ab0: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
0ac0: 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69 6f  qliteExprFunctio
0ad0: 6e 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  n(ExprList *pLis
0ae0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
0af0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
0b00: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0b10: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
0b20: 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  xpr) );.  if( pN
0b30: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
0b40: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54  ;.  pNew->op = T
0b50: 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e  K_FUNCTION;.  pN
0b60: 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ew->pList = pLis
0b70: 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  t;.  if( pToken 
0b80: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  ){.    pNew->tok
0b90: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
0ba0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
0bb0: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20  >token.z = "";. 
0bc0: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e     pNew->token.n
0bd0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
0be0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
0bf0: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
0c00: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
0c10: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  on tree..*/.void
0c20: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
0c30: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
0c40: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
0c50: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20  .  if( p->pLeft 
0c60: 29 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65  ) sqliteExprDele
0c70: 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  te(p->pLeft);.  
0c80: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 20  if( p->pRight ) 
0c90: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
0ca0: 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 69  (p->pRight);.  i
0cb0: 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 20 73 71  f( p->pList ) sq
0cc0: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
0cd0: 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  te(p->pList);.  
0ce0: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 20 29  if( p->pSelect )
0cf0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
0d00: 65 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b  ete(p->pSelect);
0d10: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
0d20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0d30: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0d40: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0d50: 65 73 63 72 69 62 65 73 20 74 68 65 0a 2a 2a 20  escribes the.** 
0d60: 66 6f 72 6d 61 74 20 6f 66 20 61 20 70 61 72 74  format of a part
0d70: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
0d80: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
0d90: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61 74 20  name.** of that 
0da0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
0db0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
0dc0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
0dd0: 74 65 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69  teFindTable(sqli
0de0: 74 65 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e  te *db, char *zN
0df0: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
0e00: 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 68 3b 0a  Table;.  int h;.
0e10: 0a 20 20 68 20 3d 20 73 71 6c 69 74 65 48 61 73  .  h = sqliteHas
0e20: 68 4e 6f 43 61 73 65 28 7a 4e 61 6d 65 2c 20 30  hNoCase(zName, 0
0e30: 29 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20 66 6f  ) % N_HASH;.  fo
0e40: 72 28 70 54 61 62 6c 65 3d 64 62 2d 3e 61 70 54  r(pTable=db->apT
0e50: 62 6c 48 61 73 68 5b 68 5d 3b 20 70 54 61 62 6c  blHash[h]; pTabl
0e60: 65 3b 20 70 54 61 62 6c 65 3d 70 54 61 62 6c 65  e; pTable=pTable
0e70: 2d 3e 70 48 61 73 68 29 7b 0a 20 20 20 20 69 66  ->pHash){.    if
0e80: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
0e90: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 7a  pTable->zName, z
0ea0: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
0eb0: 6e 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  n pTable;.  }.  
0ec0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
0ed0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
0ee0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
0ef0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
0f00: 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74 20 6f   the.** format o
0f10: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  f a particular i
0f20: 6e 64 65 78 20 74 61 62 6c 65 20 67 69 76 65 6e  ndex table given
0f30: 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
0f40: 74 68 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74  that table.  Ret
0f50: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
0f60: 66 6f 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  found..*/.Index 
0f70: 2a 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78  *sqliteFindIndex
0f80: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 68 61  (sqlite *db, cha
0f90: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  r *zName){.  Ind
0fa0: 65 78 20 2a 70 3b 0a 20 20 69 6e 74 20 68 3b 0a  ex *p;.  int h;.
0fb0: 0a 20 20 68 20 3d 20 73 71 6c 69 74 65 48 61 73  .  h = sqliteHas
0fc0: 68 4e 6f 43 61 73 65 28 7a 4e 61 6d 65 2c 20 30  hNoCase(zName, 0
0fd0: 29 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20 66 6f  ) % N_HASH;.  fo
0fe0: 72 28 70 3d 64 62 2d 3e 61 70 49 64 78 48 61 73  r(p=db->apIdxHas
0ff0: 68 5b 68 5d 3b 20 70 3b 20 70 3d 70 2d 3e 70 48  h[h]; p; p=p->pH
1000: 61 73 68 29 7b 0a 20 20 20 20 69 66 28 20 73 71  ash){.    if( sq
1010: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 2d 3e 7a  liteStrICmp(p->z
1020: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
1030: 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a  ) return p;.  }.
1040: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1050: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
1060: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
1070: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
1080: 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a  table, and free.
1090: 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74  ** its memory st
10a0: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
10b0: 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d  The index is rem
10c0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
10d0: 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c  tabase hash tabl
10e0: 65 2c 20 62 75 74 20 69 74 20 69 73 0a 2a 2a 20  e, but it is.** 
10f0: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
1100: 6d 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  m the table that
1110: 20 69 73 20 62 65 69 6e 67 20 69 6e 64 65 78 65   is being indexe
1120: 64 2e 20 20 55 6e 6c 69 6e 6b 69 6e 67 0a 2a 2a  d.  Unlinking.**
1130: 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
1140: 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20  must be done by 
1150: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
1160: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1170: 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74  void sqliteDelet
1180: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64  eIndex(sqlite *d
1190: 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  b, Index *pIndex
11a0: 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 66  ){.  int h;.  if
11b0: 28 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20  ( pIndex->zName 
11c0: 29 7b 0a 20 20 20 20 68 20 3d 20 73 71 6c 69 74  ){.    h = sqlit
11d0: 65 48 61 73 68 4e 6f 43 61 73 65 28 70 49 6e 64  eHashNoCase(pInd
11e0: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 25 20  ex->zName, 0) % 
11f0: 4e 5f 48 41 53 48 3b 0a 20 20 20 20 69 66 28 20  N_HASH;.    if( 
1200: 64 62 2d 3e 61 70 49 64 78 48 61 73 68 5b 68 5d  db->apIdxHash[h]
1210: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
1220: 20 20 64 62 2d 3e 61 70 49 64 78 48 61 73 68 5b    db->apIdxHash[
1230: 68 5d 20 3d 20 70 49 6e 64 65 78 2d 3e 70 48 61  h] = pIndex->pHa
1240: 73 68 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sh;.    }else{. 
1250: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
1260: 20 20 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61       for(p=db->a
1270: 70 49 64 78 48 61 73 68 5b 68 5d 3b 20 70 20 26  pIdxHash[h]; p &
1280: 26 20 70 2d 3e 70 48 61 73 68 21 3d 70 49 6e 64  & p->pHash!=pInd
1290: 65 78 3b 20 70 3d 70 2d 3e 70 48 61 73 68 29 7b  ex; p=p->pHash){
12a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26  }.      if( p &&
12b0: 20 70 2d 3e 70 48 61 73 68 3d 3d 70 49 6e 64 65   p->pHash==pInde
12c0: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  x ){.        p->
12d0: 70 48 61 73 68 20 3d 20 70 49 6e 64 65 78 2d 3e  pHash = pIndex->
12e0: 70 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20  pHash;.      }. 
12f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1300: 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 7d  eFree(pIndex);.}
1310: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
1320: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
1330: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
1340: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
1350: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4e  ven.** table.  N
1360: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
1370: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
1380: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
1390: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
13a0: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
13b0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
13c0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
13d0: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
13e0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
13f0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
1400: 62 6c 65 2e 20 20 42 75 74 20 64 6f 65 73 20 69  ble.  But does i
1410: 74 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  t destroy.** mem
1420: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
1430: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 73  f the indices as
1440: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1450: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  e table..*/.void
1460: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
1470: 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54  le(sqlite *db, T
1480: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
1490: 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20   int i;.  Index 
14a0: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
14b0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
14c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
14d0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
14e0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
14f0: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
1500: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  e->aCol[i].zName
1510: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
1520: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
1530: 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 7d 0a 20 20  ].zDflt);.  }.  
1540: 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61  for(pIndex = pTa
1550: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  ble->pIndex; pIn
1560: 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78  dex; pIndex=pNex
1570: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
1580: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
1590: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49     sqliteDeleteI
15a0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
15b0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
15c0: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ee(pTable->zName
15d0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
15e0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
15f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1600: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  le);.}../*.** Co
1610: 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d 65  nstruct the name
1620: 20 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c 65   of a user table
1630: 20 66 72 6f 6d 20 61 20 74 6f 6b 65 6e 2e 0a 2a   from a token..*
1640: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
1650: 6c 64 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6f  ld the name is o
1660: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1670: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
1680: 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72 65 65 64  must.** be freed
1690: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
16a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61  function..*/.cha
16b0: 72 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e 61  r *sqliteTableNa
16c0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65  meFromToken(Toke
16d0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
16e0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
16f0: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
1700: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
1710: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 7a 4e  sqliteDequote(zN
1720: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ame);.  return z
1730: 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  Name;.}../*.** B
1740: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
1750: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
1760: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
1770: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
1780: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
1790: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
17a0: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
17b0: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
17c0: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
17d0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
17e0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
17f0: 69 74 65 53 74 61 72 74 54 61 62 6c 65 28 50 61  iteStartTable(Pa
1800: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
1810: 65 6e 20 2a 70 53 74 61 72 74 2c 20 54 6f 6b 65  en *pStart, Toke
1820: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62  n *pName){.  Tab
1830: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68  le *pTable;.  ch
1840: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 70 50  ar *zName;..  pP
1850: 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65  arse->sFirstToke
1860: 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a 20 20 7a  n = *pStart;.  z
1870: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
1880: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
1890: 70 4e 61 6d 65 29 3b 0a 20 20 70 54 61 62 6c 65  pName);.  pTable
18a0: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
18b0: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
18c0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
18d0: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  ble!=0 ){.    sq
18e0: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
18f0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
1900: 20 22 74 61 62 6c 65 20 22 2c 20 30 2c 20 70 4e   "table ", 0, pN
1910: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
1920: 2c 0a 20 20 20 20 20 20 20 20 22 20 61 6c 72 65  ,.        " alre
1930: 61 64 79 20 65 78 69 73 74 73 22 2c 20 30 2c 20  ady exists", 0, 
1940: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  0);.    sqliteFr
1950: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  ee(zName);.    p
1960: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
1970: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1980: 20 69 66 28 20 73 71 6c 69 74 65 46 69 6e 64 49   if( sqliteFindI
1990: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
19a0: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 73   zName) ){.    s
19b0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
19c0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
19d0: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
19e0: 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65  dy an index name
19f0: 64 20 22 2c 20 0a 20 20 20 20 20 20 20 7a 4e 61  d ", .       zNa
1a00: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
1a10: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
1a20: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
1a30: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
1a40: 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71   }.  pTable = sq
1a50: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
1a60: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
1a70: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
1a80: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
1a90: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
1aa0: 72 4d 73 67 2c 20 22 6f 75 74 20 6f 66 20 6d 65  rMsg, "out of me
1ab0: 6d 6f 72 79 22 2c 20 30 29 3b 0a 20 20 20 20 70  mory", 0);.    p
1ac0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
1ad0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1ae0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
1af0: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
1b00: 2d 3e 70 48 61 73 68 20 3d 20 30 3b 0a 20 20 70  ->pHash = 0;.  p
1b10: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
1b20: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
1b30: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70  = 0;.  pTable->p
1b40: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 66 28  Index = 0;.  if(
1b50: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
1b60: 6c 65 20 29 20 73 71 6c 69 74 65 44 65 6c 65 74  le ) sqliteDelet
1b70: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  eTable(pParse->d
1b80: 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b, pParse->pNewT
1b90: 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d  able);.  pParse-
1ba0: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61  >pNewTable = pTa
1bb0: 62 6c 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ble;.}../*.** Ad
1bc0: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
1bd0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
1be0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
1bf0: 74 72 75 63 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  tructed..*/.void
1c00: 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e   sqliteAddColumn
1c10: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c20: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
1c30: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 63 68 61   Table *p;.  cha
1c40: 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70  r **pz;.  if( (p
1c50: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
1c60: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
1c70: 6e 3b 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f  n;.  if( (p->nCo
1c80: 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  l & 0x7)==0 ){. 
1c90: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c     p->aCol = sql
1ca0: 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61  iteRealloc( p->a
1cb0: 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29  Col, (p->nCol+8)
1cc0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
1cd0: 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0]));.  }.  if( 
1ce0: 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  p->aCol==0 ){.  
1cf0: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20    p->nCol = 0;. 
1d00: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1d10: 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 43 6f 6c   memset(&p->aCol
1d20: 5b 70 2d 3e 6e 43 6f 6c 5d 2c 20 30 2c 20 73 69  [p->nCol], 0, si
1d30: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
1d40: 29 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43  );.  pz = &p->aC
1d50: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d 2e 7a 4e  ol[p->nCol++].zN
1d60: 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 53 65 74  ame;.  sqliteSet
1d70: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 4e 61 6d  NString(pz, pNam
1d80: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
1d90: 30 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75  0);.  sqliteDequ
1da0: 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  ote(*pz);.}../*.
1db0: 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f 6b  ** The given tok
1dc0: 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  en is the defaul
1dd0: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
1de0: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
1df0: 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d to.** the tabl
1e00: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
1e10: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
1e20: 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22 20   If "minusFlag" 
1e30: 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d  is true, it.** m
1e40: 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20 74  eans the value t
1e50: 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64 65  oken was precede
1e60: 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67  d by a minus sig
1e70: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
1e80: 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  eAddDefaultValue
1e90: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ea0: 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74  Token *pVal, int
1eb0: 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54   minusFlag){.  T
1ec0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
1ed0: 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20  ;.  char **pz;. 
1ee0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
1ef0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
1f00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
1f10: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 70 7a 20  p->nCol-1;.  pz 
1f20: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44  = &p->aCol[i].zD
1f30: 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73  flt;.  if( minus
1f40: 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Flag ){.    sqli
1f50: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
1f60: 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a   "-", 1, pVal->z
1f70: 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20  , pVal->n, 0);. 
1f80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1f90: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c  teSetNString(pz,
1fa0: 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e   pVal->z, pVal->
1fb0: 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  n, 0);.  }.  sql
1fc0: 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  iteDequote(*pz);
1fd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1fe0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1ff0: 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66   to report the f
2000: 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65  inal ")" that te
2010: 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52  rminates.** a CR
2020: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
2030: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
2040: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
2050: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
2060: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
2070: 62 6c 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e  bles.  .**.** An
2080: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
2090: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
20a0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
20b0: 2c 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 69 6e 69  , unless .** ini
20c0: 74 46 6c 61 67 3d 3d 31 2e 20 20 57 68 65 6e 20  tFlag==1.  When 
20d0: 69 6e 69 74 46 6c 61 67 3d 3d 31 2c 20 69 74 20  initFlag==1, it 
20e0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
20f0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 6d 61 73 74  ding the.** mast
2100: 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  er table because
2110: 20 77 65 20 6a 75 73 74 20 63 6f 6e 6e 65 63 74   we just connect
2120: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
2130: 73 65 2c 20 73 6f 20 0a 2a 2a 20 74 68 65 20 65  se, so .** the e
2140: 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61  ntry for this ta
2150: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
2160: 74 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  ts in the master
2170: 20 74 61 62 6c 65 2e 0a 2a 2a 20 57 65 20 64 6f   table..** We do
2180: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
2190: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2f  ate it again..*/
21a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 54  .void sqliteEndT
21b0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
21c0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 29  se, Token *pEnd)
21d0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
21e0: 69 6e 74 20 68 3b 0a 0a 20 20 69 66 28 20 70 50  int h;..  if( pP
21f0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
2200: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74  urn;..  /* Add t
2210: 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
2220: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
2230: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2240: 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20  database.  */.  
2250: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
2260: 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d 30 20 26  >pNewTable)!=0 &
2270: 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  & pParse->explai
2280: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 68 20 3d 20  n==0 ){.    h = 
2290: 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61 73 65  sqliteHashNoCase
22a0: 28 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 25 20  (p->zName, 0) % 
22b0: 4e 5f 48 41 53 48 3b 0a 20 20 20 20 70 2d 3e 70  N_HASH;.    p->p
22c0: 48 61 73 68 20 3d 20 70 50 61 72 73 65 2d 3e 64  Hash = pParse->d
22d0: 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b 68 5d 3b  b->apTblHash[h];
22e0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d  .    pParse->db-
22f0: 3e 61 70 54 62 6c 48 61 73 68 5b 68 5d 20 3d 20  >apTblHash[h] = 
2300: 70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  p;.    pParse->p
2310: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
2320: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
2330: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
2340: 6e 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  n create the tab
2350: 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  le on disk..  */
2360: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
2370: 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  initFlag ){.    
2380: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 61 64  static VdbeOp ad
2390: 64 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20  dTable[] = {.   
23a0: 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20 20     { OP_Open,   
23b0: 20 20 20 20 20 30 2c 20 31 2c 20 4d 41 53 54 45       0, 1, MASTE
23c0: 52 5f 4e 41 4d 45 20 7d 2c 0a 20 20 20 20 20 20  R_NAME },.      
23d0: 7b 20 4f 50 5f 4e 65 77 2c 20 20 20 20 20 20 20  { OP_New,       
23e0: 20 20 30 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20    0, 0, 0},.    
23f0: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
2400: 20 20 20 20 30 2c 20 30 2c 20 22 74 61 62 6c 65      0, 0, "table
2410: 22 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b  "     },.      {
2420: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
2430: 20 30 2c 20 30 2c 20 30 7d 2c 20 20 20 20 20 20   0, 0, 0},      
2440: 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20        /* 3 */.  
2450: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
2460: 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 20        0, 0, 0}, 
2470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20             /* 4 
2480: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  */.      { OP_St
2490: 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c  ring,      0, 0,
24a0: 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20   0},            
24b0: 2f 2a 20 35 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 5 */.      { 
24c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 20  OP_MakeRecord,  
24d0: 34 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20  4, 0, 0},.      
24e0: 7b 20 4f 50 5f 50 75 74 2c 20 20 20 20 20 20 20  { OP_Put,       
24f0: 20 20 30 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20    0, 0, 0},.    
2500: 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20    { OP_Close,   
2510: 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 0a 20 20      0, 0, 0},.  
2520: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20    };.    int n, 
2530: 62 61 73 65 3b 0a 20 20 20 20 56 64 62 65 20 2a  base;.    Vdbe *
2540: 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  v;..    v = sqli
2550: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
2560: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
2570: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20  ) return;.    n 
2580: 3d 20 28 69 6e 74 29 70 45 6e 64 2d 3e 7a 20 2d  = (int)pEnd->z -
2590: 20 28 69 6e 74 29 70 50 61 72 73 65 2d 3e 73 46   (int)pParse->sF
25a0: 69 72 73 74 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b  irstToken.z + 1;
25b0: 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69  .    base = sqli
25c0: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
25d0: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 61 64 64  v, ArraySize(add
25e0: 54 61 62 6c 65 29 2c 20 61 64 64 54 61 62 6c 65  Table), addTable
25f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
2600: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
2610: 65 2b 33 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30  e+3, p->zName, 0
2620: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
2630: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
2640: 65 2b 34 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30  e+4, p->zName, 0
2650: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
2660: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
2670: 65 2b 35 2c 20 70 50 61 72 73 65 2d 3e 73 46 69  e+5, pParse->sFi
2680: 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a  rstToken.z, n);.
2690: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
26a0: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b  en a token, look
26b0: 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74 68   up a table with
26c0: 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20   that name.  If 
26d0: 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65  not found, leave
26e0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  .** an error for
26f0: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 66   the parser to f
2700: 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ind and return N
2710: 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ULL..*/.Table *s
2720: 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f  qliteTableFromTo
2730: 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ken(Parse *pPars
2740: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b  e, Token *pTok){
2750: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
2760: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
2770: 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b  FromToken(pTok);
2780: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
2790: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
27a0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
27b0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
27c0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  e(zName);.  if( 
27d0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
27e0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
27f0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
2800: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
2810: 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  : ", 0, .       
2820: 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e   pTok->z, pTok->
2830: 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  n, 0);.    pPars
2840: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20  e->nErr++;.  }. 
2850: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
2860: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2870: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
2880: 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
2890: 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
28a0: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
28b0: 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c 65 28  sqliteDropTable(
28c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
28d0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
28e0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
28f0: 20 69 6e 74 20 68 3b 0a 20 20 56 64 62 65 20 2a   int h;.  Vdbe *
2900: 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a  v;.  int base;..
2910: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
2920: 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28  eTableFromToken(
2930: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a  pParse, pName);.
2940: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
2950: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
2960: 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79  pTable->readOnly
2970: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
2980: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
2990: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
29a0: 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d   ", pTable->zNam
29b0: 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61 79  e, .       " may
29c0: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
29d0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
29e0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
29f0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
2a00: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
2a10: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
2a20: 65 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65  e and its refere
2a30: 6e 63 65 20 69 6e 20 73 79 73 5f 6d 61 73 74 65  nce in sys_maste
2a40: 72 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  r */.  v = sqlit
2a50: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
2a60: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
2a70: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
2a80: 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20  ropTable[] = {. 
2a90: 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20       { OP_Open, 
2aa0: 20 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20        0, 1,     
2ab0: 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45 20 7d     MASTER_NAME }
2ac0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4c 69 73  ,.      { OP_Lis
2ad0: 74 4f 70 65 6e 2c 20 20 20 30 2c 20 30 2c 20 20  tOpen,   0, 0,  
2ae0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
2af0: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
2b00: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
2b10: 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20  , /* 2 */.      
2b20: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
2b30: 20 30 2c 20 41 44 44 52 28 31 30 29 2c 20 30 7d   0, ADDR(10), 0}
2b40: 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20  , /* 3 */.      
2b50: 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20  { OP_Dup,       
2b60: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
2b70: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 46 69 65  ,.      { OP_Fie
2b80: 6c 64 2c 20 20 20 20 20 20 30 2c 20 32 2c 20 20  ld,      0, 2,  
2b90: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
2ba0: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
2bb0: 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d   0, ADDR(3),  0}
2bc0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4b 65 79  ,.      { OP_Key
2bd0: 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20  ,        0, 0,  
2be0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
2bf0: 7b 20 4f 50 5f 4c 69 73 74 57 72 69 74 65 2c 20  { OP_ListWrite, 
2c00: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
2c10: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74  ,.      { OP_Got
2c20: 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52  o,       0, ADDR
2c30: 28 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20  (3),  0},.      
2c40: 7b 20 4f 50 5f 4c 69 73 74 52 65 77 69 6e 64 2c  { OP_ListRewind,
2c50: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
2c60: 2c 20 2f 2a 20 31 30 20 2a 2f 0a 20 20 20 20 20  , /* 10 */.     
2c70: 20 7b 20 4f 50 5f 4c 69 73 74 52 65 61 64 2c 20   { OP_ListRead, 
2c80: 20 20 30 2c 20 41 44 44 52 28 31 34 29 2c 20 30    0, ADDR(14), 0
2c90: 7d 2c 20 2f 2a 20 31 31 20 2a 2f 0a 20 20 20 20  }, /* 11 */.    
2ca0: 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20    { OP_Delete,  
2cb0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
2cc0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47  0},.      { OP_G
2cd0: 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44  oto,       0, AD
2ce0: 44 52 28 31 31 29 2c 20 30 7d 2c 0a 20 20 20 20  DR(11), 0},.    
2cf0: 20 20 7b 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20    { OP_Destroy, 
2d00: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
2d10: 30 7d 2c 20 2f 2a 20 31 34 20 2a 2f 0a 20 20 20  0}, /* 14 */.   
2d20: 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20     { OP_Close,  
2d30: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
2d40: 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
2d50: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
2d60: 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64   base = sqliteVd
2d70: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
2d80: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62  rraySize(dropTab
2d90: 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b  le), dropTable);
2da0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
2db0: 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b  hangeP3(v, base+
2dc0: 32 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  2, pTable->zName
2dd0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2de0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
2df0: 62 61 73 65 2b 31 34 2c 20 70 54 61 62 6c 65 2d  base+14, pTable-
2e00: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
2e10: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d  for(pIdx=pTable-
2e20: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
2e30: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
2e40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
2e50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
2e60: 73 74 72 6f 79 2c 20 30 2c 20 30 2c 20 70 49 64  stroy, 0, 0, pId
2e70: 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
2e80: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
2e90: 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 73  move the table s
2ea0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 72 65  tructure and fre
2eb0: 65 20 69 74 73 20 6d 65 6d 6f 72 79 2e 0a 20 20  e its memory..  
2ec0: 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
2ed0: 6e 3a 20 69 66 20 74 68 65 20 53 51 4c 20 73 74  n: if the SQL st
2ee0: 61 74 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69  atement began wi
2ef0: 74 68 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  th the EXPLAIN k
2f00: 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65  eyword,.  ** the
2f10: 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  n no changes are
2f20: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   made..  */.  if
2f30: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
2f40: 69 6e 20 29 7b 0a 20 20 20 20 68 20 3d 20 73 71  in ){.    h = sq
2f50: 6c 69 74 65 48 61 73 68 4e 6f 43 61 73 65 28 70  liteHashNoCase(p
2f60: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Table->zName, 0)
2f70: 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20 20 20 69   % N_HASH;.    i
2f80: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  f( pParse->db->a
2f90: 70 54 62 6c 48 61 73 68 5b 68 5d 3d 3d 70 54 61  pTblHash[h]==pTa
2fa0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ble ){.      pPa
2fb0: 72 73 65 2d 3e 64 62 2d 3e 61 70 54 62 6c 48 61  rse->db->apTblHa
2fc0: 73 68 5b 68 5d 20 3d 20 70 54 61 62 6c 65 2d 3e  sh[h] = pTable->
2fd0: 70 48 61 73 68 3b 0a 20 20 20 20 7d 65 6c 73 65  pHash;.    }else
2fe0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
2ff0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 50  ;.      for(p=pP
3000: 61 72 73 65 2d 3e 64 62 2d 3e 61 70 54 62 6c 48  arse->db->apTblH
3010: 61 73 68 5b 68 5d 3b 20 70 20 26 26 20 70 2d 3e  ash[h]; p && p->
3020: 70 48 61 73 68 21 3d 70 54 61 62 6c 65 3b 20 70  pHash!=pTable; p
3030: 3d 70 2d 3e 70 48 61 73 68 29 7b 7d 0a 20 20 20  =p->pHash){}.   
3040: 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70     if( p && p->p
3050: 48 61 73 68 3d 3d 70 54 61 62 6c 65 20 29 7b 0a  Hash==pTable ){.
3060: 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61 73 68          p->pHash
3070: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 48 61 73 68   = pTable->pHash
3080: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3090: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
30a0: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
30b0: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 7d  , pTable);.  }.}
30c0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
30d0: 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61   new index for a
30e0: 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49  n SQL table.  pI
30f0: 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65  ndex is the name
3100: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
3110: 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20  * and pTable is 
3120: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
3130: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
3140: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
3150: 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
3160: 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
3170: 79 20 6b 65 79 2e 20 20 49 6e 20 74 68 61 74 20  y key.  In that 
3180: 63 61 73 65 2c 20 75 73 65 20 70 50 61 72 73 65  case, use pParse
3190: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 61 73 20 74  ->pNewTable as t
31a0: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 74 6f 20  he .** table to 
31b0: 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a  be indexed..**.*
31c0: 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
31d0: 74 20 6f 66 20 66 69 65 6c 64 73 20 74 6f 20 62  t of fields to b
31e0: 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
31f0: 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
3200: 66 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  f the.** most re
3210: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 66 69 65  cently added fie
3220: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
3230: 69 73 20 6c 61 62 65 6c 65 64 20 61 73 20 74 68  is labeled as th
3240: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a  e primary key..*
3250: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65  /.void sqliteCre
3260: 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
3270: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
3280: 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
3290: 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
32a0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
32b0: 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  me,    /* Name o
32c0: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
32d0: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
32e0: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
32f0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3300: 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 20  able to index.  
3310: 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
3320: 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
3330: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  IdList *pList,  
3340: 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 66 69   /* A list of fi
3350: 65 6c 64 73 20 74 6f 20 62 65 20 69 6e 64 65 78  elds to be index
3360: 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ed */.  Token *p
3370: 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20  Start,   /* The 
3380: 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
3390: 74 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54  t begins a CREAT
33a0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
33b0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  t */.  Token *pE
33c0: 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  nd      /* The "
33d0: 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74  )" that closes t
33e0: 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
33f0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  statement */.){.
3400: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
3410: 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
3420: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49  e indexed */.  I
3430: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
3440: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
3450: 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
3460: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
3470: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 68 3b 0a  .  int i, j, h;.
3480: 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20    Token nullId; 
3490: 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e     /* Fake token
34a0: 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44   for an empty ID
34b0: 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   list */..  /*. 
34c0: 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
34d0: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
34e0: 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
34f0: 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
3500: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
3510: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
3520: 20 20 70 54 61 62 20 3d 20 20 73 71 6c 69 74 65    pTab =  sqlite
3530: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  TableFromToken(p
3540: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a  Parse, pTable);.
3550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
3560: 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  b =  pParse->pNe
3570: 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  wTable;.  }.  if
3580: 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61  ( pTab==0 || pPa
3590: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
35a0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
35b0: 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  ex;.  if( pTab->
35c0: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
35d0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
35e0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
35f0: 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62  , "table ", pTab
3600: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
3610: 22 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 6e  " may not have n
3620: 65 77 20 69 6e 64 69 63 65 73 20 61 64 64 65 64  ew indices added
3630: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
3640: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
3650: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
3660: 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
3670: 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
3680: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
3690: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
36a0: 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
36b0: 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
36c0: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
36d0: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
36e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
36f0: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
3700: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d  = sqliteTableNam
3710: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
3720: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3730: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  zName = 0;.    s
3740: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
3750: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
3760: 6d 65 2c 20 22 5f 5f 70 72 69 6d 61 72 79 5f 6b  me, "__primary_k
3770: 65 79 22 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ey", 0);.  }.  i
3780: 66 28 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64  f( sqliteFindInd
3790: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ex(pParse->db, z
37a0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  Name) ){.    sql
37b0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
37c0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
37d0: 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20  index ", zName, 
37e0: 0a 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64  .       " alread
37f0: 79 20 65 78 69 73 74 73 22 2c 20 30 29 3b 0a 20  y exists", 0);. 
3800: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3810: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  +;.    goto exit
3820: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
3830: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 46   }.  if( sqliteF
3840: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
3850: 3e 64 62 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  >db, zName) ){. 
3860: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
3870: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
3880: 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61  Msg, "there is a
3890: 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
38a0: 61 6d 65 64 20 22 2c 0a 20 20 20 20 20 20 20 7a  amed ",.       z
38b0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  Name, 0);.    pP
38c0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
38d0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
38e0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
38f0: 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
3900: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
3910: 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
3920: 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
3930: 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
3940: 20 6f 66 20 74 68 65 20 6c 61 73 74 20 66 69 65   of the last fie
3950: 6c 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ld added to the 
3960: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
3970: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
3980: 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
3990: 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
39a0: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
39b0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
39c0: 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
39d0: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
39e0: 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
39f0: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
3a00: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
3a10: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
3a20: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  IdListAppend(0, 
3a30: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
3a40: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
3a50: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
3a60: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
3a70: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
3a80: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
3a90: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
3aa0: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
3ab0: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
3ac0: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
3ad0: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
3af0: 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d  zeof(int)*pList-
3b00: 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49  >nId );.  if( pI
3b10: 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ndex==0 ){.    s
3b20: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
3b30: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
3b40: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
3b50: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
3b60: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
3b70: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
3b80: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  ndex;.  }.  pInd
3b90: 65 78 2d 3e 61 69 46 69 65 6c 64 20 3d 20 28 69  ex->aiField = (i
3ba0: 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d 3b 0a  nt*)&pIndex[1];.
3bb0: 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
3bc0: 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  = (char*)&pIndex
3bd0: 2d 3e 61 69 46 69 65 6c 64 5b 70 4c 69 73 74 2d  ->aiField[pList-
3be0: 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70 79 28  >nId];.  strcpy(
3bf0: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
3c00: 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Name);.  pIndex-
3c10: 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
3c20: 20 20 70 49 6e 64 65 78 2d 3e 6e 46 69 65 6c 64    pIndex->nField
3c30: 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 0a   = pList->nId;..
3c40: 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61    /* Scan the na
3c50: 6d 65 73 20 6f 66 20 74 68 65 20 66 69 65 6c 64  mes of the field
3c60: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
3c70: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
3c80: 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 66  .  ** load the f
3c90: 69 65 6c 64 20 69 6e 64 69 63 65 73 20 69 6e 74  ield indices int
3ca0: 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
3cb0: 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
3cc0: 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
3cd0: 61 6e 79 20 66 69 65 6c 64 20 69 73 20 6e 6f 74  any field is not
3ce0: 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66   found..  */.  f
3cf0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
3d00: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
3d10: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
3d20: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
3d30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
3d40: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
3d50: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
3d60: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ol[j].zName)==0 
3d70: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
3d80: 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
3d90: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
3da0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
3db0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
3dc0: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e  "table ", pTab->
3dd0: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
3de0: 22 20 68 61 73 20 6e 6f 20 66 69 65 6c 64 20 6e  " has no field n
3df0: 61 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61  amed ", pList->a
3e00: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  [i].zName, 0);. 
3e10: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
3e20: 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r++;.      sqlit
3e30: 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20  eFree(pIndex);. 
3e40: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
3e50: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
3e60: 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
3e70: 69 46 69 65 6c 64 5b 69 5d 20 3d 20 6a 3b 0a 20  iField[i] = j;. 
3e80: 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
3e90: 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
3ea0: 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
3eb0: 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
3ec0: 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
3ed0: 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
3ee0: 63 74 75 72 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctures..  */.  i
3ef0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
3f00: 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 68 20 3d  in==0 ){.    h =
3f10: 20 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61 73   sqliteHashNoCas
3f20: 65 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  e(pIndex->zName,
3f30: 20 30 29 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20   0) % N_HASH;.  
3f40: 20 20 70 49 6e 64 65 78 2d 3e 70 48 61 73 68 20    pIndex->pHash 
3f50: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 70  = pParse->db->ap
3f60: 49 64 78 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20  IdxHash[h];.    
3f70: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 70 49 64  pParse->db->apId
3f80: 78 48 61 73 68 5b 68 5d 20 3d 20 70 49 6e 64 65  xHash[h] = pInde
3f90: 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  x;.    pIndex->p
3fa0: 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
3fb0: 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70  dex;.    pTab->p
3fc0: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
3fd0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
3fe0: 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30 20 74   initFlag is 0 t
3ff0: 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69  hen create the i
4000: 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54  ndex on disk.  T
4010: 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65  his.  ** involve
4020: 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e  s writing the in
4030: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73  dex into the mas
4040: 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69  ter table and fi
4050: 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a  lling in the.  *
4060: 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  * index with the
4070: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63   current table c
4080: 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20  ontents..  **.  
4090: 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20  ** The initFlag 
40a0: 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73  is 0 when the us
40b0: 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20  er first enters 
40c0: 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a  a CREATE INDEX .
40d0: 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 54    ** command.  T
40e0: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 31  he initFlag is 1
40f0: 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
4100: 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a   is opened and .
4110: 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45    ** CREATE INDE
4120: 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  X statements are
4130: 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65   read out of the
4140: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20   master table.  
4150: 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74  In.  ** the latt
4160: 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65  er case the inde
4170: 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
4180: 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20   on disk, which 
4190: 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64  is why.  ** we d
41a0: 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63  on't want to rec
41b0: 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  reate it..  */. 
41c0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69   if( pParse->ini
41d0: 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20  tFlag==0 ){.    
41e0: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 61 64  static VdbeOp ad
41f0: 64 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20  dTable[] = {.   
4200: 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20 20     { OP_Open,   
4210: 20 20 20 20 20 32 2c 20 31 2c 20 4d 41 53 54 45       2, 1, MASTE
4220: 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b  R_NAME},.      {
4230: 20 4f 50 5f 4e 65 77 2c 20 20 20 20 20 20 20 20   OP_New,        
4240: 20 32 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20   2, 0, 0},.     
4250: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
4260: 20 20 20 30 2c 20 30 2c 20 22 69 6e 64 65 78 22     0, 0, "index"
4270: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  },.      { OP_St
4280: 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c  ring,      0, 0,
4290: 20 30 7d 2c 20 20 2f 2a 20 33 20 2a 2f 0a 20 20   0},  /* 3 */.  
42a0: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
42b0: 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 20        0, 0, 0}, 
42c0: 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 4 */.      {
42d0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
42e0: 20 30 2c 20 30 2c 20 30 7d 2c 20 20 2f 2a 20 35   0, 0, 0},  /* 5
42f0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d   */.      { OP_M
4300: 61 6b 65 52 65 63 6f 72 64 2c 20 20 34 2c 20 30  akeRecord,  4, 0
4310: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
4320: 5f 50 75 74 2c 20 20 20 20 20 20 20 20 20 32 2c  _Put,         2,
4330: 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20   0, 0},.      { 
4340: 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  OP_Close,       
4350: 32 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 7d 3b  2, 0, 0},.    };
4360: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
4370: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
4380: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 69 6e 74  ->pVdbe;.    int
4390: 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20 20   lbl1, lbl2;.   
43a0: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 76 20 3d   int i;..    v =
43b0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
43c0: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
43d0: 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
43e0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
43f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4400: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 30  Op(v, OP_Open, 0
4410: 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
4420: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4430: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4440: 4f 70 65 6e 2c 20 31 2c 20 31 2c 20 70 49 6e 64  Open, 1, 1, pInd
4450: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
4460: 20 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26     if( pStart &&
4470: 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69   pEnd ){.      i
4480: 6e 74 20 62 61 73 65 3b 0a 20 20 20 20 20 20 6e  nt base;.      n
4490: 20 3d 20 28 69 6e 74 29 70 45 6e 64 2d 3e 7a 20   = (int)pEnd->z 
44a0: 2d 20 28 69 6e 74 29 70 53 74 61 72 74 2d 3e 7a  - (int)pStart->z
44b0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 62 61 73 65   + 1;.      base
44c0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
44d0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
44e0: 69 7a 65 28 61 64 64 54 61 62 6c 65 29 2c 20 61  ize(addTable), a
44f0: 64 64 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  ddTable);.      
4500: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
4510: 50 33 28 76 2c 20 62 61 73 65 2b 33 2c 20 70 49  P3(v, base+3, pI
4520: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
4530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4540: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
4550: 65 2b 34 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  e+4, pTab->zName
4560: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
4570: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
4580: 2c 20 62 61 73 65 2b 35 2c 20 70 53 74 61 72 74  , base+5, pStart
4590: 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  ->z, n);.    }. 
45a0: 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65     lbl1 = sqlite
45b0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
45c0: 3b 0a 20 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c  ;.    lbl2 = sql
45d0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
45e0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  (v);.    sqliteV
45f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
4600: 65 78 74 2c 20 30 2c 20 6c 62 6c 32 2c 20 30 2c  ext, 0, lbl2, 0,
4610: 20 6c 62 6c 31 29 3b 0a 20 20 20 20 73 71 6c 69   lbl1);.    sqli
4620: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4630: 50 5f 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20  P_Key, 0, 0, 0, 
4640: 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0);.    for(i=0;
4650: 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 46 69 65 6c   i<pIndex->nFiel
4660: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  d; i++){.      s
4670: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4680: 2c 20 4f 50 5f 46 69 65 6c 64 2c 20 30 2c 20 70  , OP_Field, 0, p
4690: 49 6e 64 65 78 2d 3e 61 69 46 69 65 6c 64 5b 69  Index->aiField[i
46a0: 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ], 0, 0);.    }.
46b0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
46c0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65  dOp(v, OP_MakeKe
46d0: 79 2c 20 70 49 6e 64 65 78 2d 3e 6e 46 69 65 6c  y, pIndex->nFiel
46e0: 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d, 0, 0, 0);.   
46f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4700: 28 76 2c 20 4f 50 5f 50 75 74 49 64 78 2c 20 31  (v, OP_PutIdx, 1
4710: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
4720: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4730: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
4740: 62 6c 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  bl1, 0, 0);.    
4750: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4760: 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30  v, OP_Noop, 0, 0
4770: 2c 20 30 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20  , 0, lbl2);.    
4780: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4790: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20  v, OP_Close, 1, 
47a0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
47b0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
47c0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 2c   OP_Close, 0, 0,
47d0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   0, 0);.  }..  /
47e0: 2a 20 52 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79  * Reclaim memory
47f0: 20 6f 6e 20 61 6e 20 45 58 50 4c 41 49 4e 20 63   on an EXPLAIN c
4800: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  all..  */.  if( 
4810: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
4820: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
4830: 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  e(pIndex);.  }..
4840: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
4850: 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
4860: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
4870: 78 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73  x:.  sqliteIdLis
4880: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
4890: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
48a0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
48b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
48c0: 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
48d0: 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
48e0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
48f0: 73 71 6c 69 74 65 44 72 6f 70 49 6e 64 65 78 28  sqliteDropIndex(
4900: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
4910: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
4920: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
4930: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
4940: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 7a 4e 61 6d  Vdbe *v;..  zNam
4950: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  e = sqliteTableN
4960: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
4970: 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  me);.  pIndex = 
4980: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
4990: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
49a0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
49b0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  (zName);.  if( p
49c0: 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
49d0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
49e0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
49f0: 67 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  g, "no such inde
4a00: 78 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20  x: ", 0, .      
4a10: 20 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d    pName->z, pNam
4a20: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50  e->n, 0);.    pP
4a30: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
4a40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
4a50: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
4a60: 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
4a70: 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
4a80: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
4a90: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
4aa0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
4ab0: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
4ac0: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f  tatic VdbeOp dro
4ad0: 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20  pIndex[] = {.   
4ae0: 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20 20     { OP_Open,   
4af0: 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20      0, 1,       
4b00: 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20  MASTER_NAME},.  
4b10: 20 20 20 20 7b 20 4f 50 5f 4c 69 73 74 4f 70 65      { OP_ListOpe
4b20: 6e 2c 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  n,   0, 0,      
4b30: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
4b40: 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30  String,     0, 0
4b50: 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32  ,       0}, /* 2
4b60: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e   */.      { OP_N
4b70: 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44  ext,       0, AD
4b80: 44 52 28 39 29 2c 20 30 7d 2c 20 2f 2a 20 33 20  DR(9), 0}, /* 3 
4b90: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 75  */.      { OP_Du
4ba0: 70 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20  p,        0, 0, 
4bb0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
4bc0: 7b 20 4f 50 5f 46 69 65 6c 64 2c 20 20 20 20 20  { OP_Field,     
4bd0: 20 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c   0, 1,       0},
4be0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20  .      { OP_Ne, 
4bf0: 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28          0, ADDR(
4c00: 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  3), 0},.      { 
4c10: 4f 50 5f 4b 65 79 2c 20 20 20 20 20 20 20 20 30  OP_Key,        0
4c20: 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 0,       0},. 
4c30: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
4c40: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
4c50: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
4c60: 5f 44 65 73 74 72 6f 79 2c 20 20 20 20 30 2c 20  _Destroy,    0, 
4c70: 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
4c80: 39 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  9 */.      { OP_
4c90: 43 6c 6f 73 65 2c 20 20 20 20 20 20 30 2c 20 30  Close,      0, 0
4ca0: 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
4cb0: 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b  };.    int base;
4cc0: 0a 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c  ..    base = sql
4cd0: 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
4ce0: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72  (v, ArraySize(dr
4cf0: 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e  opIndex), dropIn
4d00: 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dex);.    sqlite
4d10: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
4d20: 62 61 73 65 2b 32 2c 20 70 49 6e 64 65 78 2d 3e  base+2, pIndex->
4d30: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
4d40: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
4d50: 33 28 76 2c 20 62 61 73 65 2b 39 2c 20 70 49 6e  3(v, base+9, pIn
4d60: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
4d70: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
4d80: 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
4d90: 74 75 72 65 20 61 6e 64 20 66 72 65 65 20 69 74  ture and free it
4da0: 73 20 6d 65 6d 6f 72 79 2e 20 20 45 78 63 65 70  s memory.  Excep
4db0: 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 45 58  t if the.  ** EX
4dc0: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 20 69 73  PLAIN keyword is
4dd0: 20 70 72 65 73 65 6e 74 2c 20 6e 6f 20 63 68 61   present, no cha
4de0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 2e 0a 20  nges are made.. 
4df0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
4e00: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
4e10: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
4e20: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
4e30: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
4e40: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
4e50: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
4e60: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
4e70: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
4e80: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 49 6e  .      for(p=pIn
4e90: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
4ea0: 64 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65  dex; p && p->pNe
4eb0: 78 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d  xt!=pIndex; p=p-
4ec0: 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20  >pNext){}.      
4ed0: 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78  if( p && p->pNex
4ee0: 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  t==pIndex ){.   
4ef0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
4f00: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
4f10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4f20: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
4f30: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
4f40: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Index);.  }.}../
4f50: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
4f60: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
4f70: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
4f80: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
4f90: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
4fa0: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
4fb0: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
4fc0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45  ssion list..*/.E
4fd0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 45  xprList *sqliteE
4fe0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45 78  xprListAppend(Ex
4ff0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 45  prList *pList, E
5000: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
5010: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
5020: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
5030: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
5040: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
5050: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
5060: 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   );.  }.  if( pL
5070: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
5080: 30 3b 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d  0;.  if( (pList-
5090: 3e 6e 45 78 70 72 20 26 20 37 29 3d 3d 30 20 29  >nExpr & 7)==0 )
50a0: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c  {.    int n = pL
50b0: 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 38 3b 0a  ist->nExpr + 8;.
50c0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73      pList->a = s
50d0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
50e0: 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28  st->a, n*sizeof(
50f0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
5100: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d     if( pList->a=
5110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73  =0 ){.      pLis
5120: 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20  t->nExpr = 0;.  
5130: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74      return pList
5140: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 20  ;.    }.  }.  i 
5150: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  = pList->nExpr++
5160: 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ;.  pList->a[i].
5170: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
5180: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
5190: 6d 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e  me = 0;.  if( pN
51a0: 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ame ){.    sqlit
51b0: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69  eSetNString(&pLi
51c0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
51d0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
51e0: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  >n, 0);.    sqli
51f0: 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d  teDequote(pList-
5200: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
5210: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
5220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
5230: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
5240: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
5250: 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72 4c  void sqliteExprL
5260: 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69  istDelete(ExprLi
5270: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
5280: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
5290: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
52a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
52b0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
52c0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
52d0: 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ete(pList->a[i].
52e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
52f0: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
5300: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
5310: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
5320: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  t->a);.  sqliteF
5330: 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
5340: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
5350: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
5360: 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
5370: 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
5380: 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
5390: 65 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  e..*/.IdList *sq
53a0: 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64  liteIdListAppend
53b0: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
53c0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
53d0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
53e0: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
53f0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
5400: 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
5410: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
5420: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
5430: 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 49 64   if( (pList->nId
5440: 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   & 7)==0 ){.    
5450: 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74  pList->a = sqlit
5460: 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
5470: 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 49 64 2b 38  a, (pList->nId+8
5480: 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
5490: 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
54a0: 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 7b 0a   pList->a==0 ){.
54b0: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e 49 64        pList->nId
54c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
54d0: 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a  rn pList;.    }.
54e0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c    }.  memset(&pL
54f0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49  ist->a[pList->nI
5500: 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  d], 0, sizeof(pL
5510: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69  ist->a[0]));.  i
5520: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
5530: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
5540: 67 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  g(&pList->a[pLis
5550: 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 2c 20 70  t->nId].zName, p
5560: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
5570: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ->n, 0);.    sql
5580: 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74  iteDequote(pList
5590: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e  ->a[pList->nId].
55a0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 4c  zName);.  }.  pL
55b0: 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65  ist->nId++;.  re
55c0: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
55d0: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61  *.** Add an alia
55e0: 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64  s to the last id
55f0: 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20  entifier on the 
5600: 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72  given identifier
5610: 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
5620: 71 6c 69 74 65 49 64 4c 69 73 74 41 64 64 41 6c  qliteIdListAddAl
5630: 69 61 73 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ias(IdList *pLis
5640: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
5650: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26  ){.  if( pList &
5660: 26 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 30 20 29  & pList->nId>0 )
5670: 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 4c  {.    int i = pL
5680: 69 73 74 2d 3e 6e 49 64 20 2d 20 31 3b 0a 20 20  ist->nId - 1;.  
5690: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
56a0: 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ng(&pList->a[i].
56b0: 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e  zAlias, pToken->
56c0: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29  z, pToken->n, 0)
56d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75  ;.    sqliteDequ
56e0: 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ote(pList->a[i].
56f0: 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  zAlias);.  }.}..
5700: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
5710: 65 6e 74 69 72 65 20 49 64 4c 69 73 74 0a 2a 2f  entire IdList.*/
5720: 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69  .void sqliteIdLi
5730: 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20  stDelete(IdList 
5740: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
5750: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
5760: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
5770: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
5780: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
5790: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
57a0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
57b0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
57c0: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b  t->a[i].zAlias);
57d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
57e0: 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  e(pList->a);.  s
57f0: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29  qliteFree(pList)
5800: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
5810: 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 69 73 20  COPY command is 
5820: 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  for compatibilit
5830: 79 20 77 69 74 68 20 50 6f 73 74 67 72 65 53 51  y with PostgreSQ
5840: 4c 20 61 6e 64 20 73 70 65 63 69 66 69 63 69 61  L and specificia
5850: 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68 65 20 61  lly.** for the a
5860: 62 69 6c 69 74 79 20 74 6f 20 72 65 61 64 20 74  bility to read t
5870: 68 65 20 6f 75 74 70 75 74 20 6f 66 20 70 67 5f  he output of pg_
5880: 64 75 6d 70 2e 20 20 54 68 65 20 66 6f 72 6d 61  dump.  The forma
5890: 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f  t is as.** follo
58a0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50  ws:.**.**    COP
58b0: 59 20 74 61 62 6c 65 20 46 52 4f 4d 20 66 69 6c  Y table FROM fil
58c0: 65 20 5b 55 53 49 4e 47 20 44 45 4c 49 4d 49 54  e [USING DELIMIT
58d0: 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a  ERS string].**.*
58e0: 2a 20 22 74 61 62 6c 65 22 20 69 73 20 61 6e 20  * "table" is an 
58f0: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6e  existing table n
5900: 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c 20 72 65  ame.  We will re
5910: 61 64 20 6c 69 6e 65 73 20 6f 66 20 63 6f 64 65  ad lines of code
5920: 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f   from.** file to
5930: 20 66 69 6c 6c 20 74 68 69 73 20 74 61 62 6c 65   fill this table
5940: 20 77 69 74 68 20 64 61 74 61 2e 20 20 46 69 6c   with data.  Fil
5950: 65 20 6d 69 67 68 74 20 62 65 20 22 73 74 64 69  e might be "stdi
5960: 6e 22 2e 20 20 54 68 65 20 6f 70 74 69 6f 6e 61  n".  The optiona
5970: 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65 72 20 73  l.** delimiter s
5980: 74 72 69 6e 67 20 69 64 65 6e 74 69 66 69 65 73  tring identifies
5990: 20 74 68 65 20 66 69 65 6c 64 20 73 65 70 61 72   the field separ
59a0: 61 74 6f 72 73 2e 20 20 54 68 65 20 64 65 66 61  ators.  The defa
59b0: 75 6c 74 20 69 73 20 61 20 74 61 62 2e 0a 2a 2f  ult is a tab..*/
59c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 70 79  .void sqliteCopy
59d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
59e0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
59f0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
5a00: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
5a10: 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 54 68 65 20  eName,   /* The 
5a20: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
5a30: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
5a40: 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a 2f 0a 20  will insert */. 
5a50: 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e 61 6d   Token *pFilenam
5a60: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c  e,    /* The fil
5a70: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
5a80: 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69  obtain informati
5a90: 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
5aa0: 44 65 6c 69 6d 69 74 65 72 20 20 20 20 2f 2a 20  Delimiter    /* 
5ab0: 55 73 65 20 74 68 69 73 20 61 73 20 74 68 65 20  Use this as the 
5ac0: 66 69 65 6c 64 20 64 65 6c 69 6d 69 74 65 72 20  field delimiter 
5ad0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
5ae0: 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61  Tab;.  char *zTa
5af0: 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  b;.  int i, j;. 
5b00: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
5b10: 61 64 64 72 2c 20 65 6e 64 3b 0a 20 20 49 6e 64  addr, end;.  Ind
5b20: 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20 7a 54 61  ex *pIdx;..  zTa
5b30: 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  b = sqliteTableN
5b40: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61  ameFromToken(pTa
5b50: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 70 54 61 62  bleName);.  pTab
5b60: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
5b70: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
5b80: 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  Tab);.  sqliteFr
5b90: 65 65 28 7a 54 61 62 29 3b 0a 20 20 69 66 28 20  ee(zTab);.  if( 
5ba0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
5bb0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
5bc0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
5bd0: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
5be0: 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  : ", 0, .       
5bf0: 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 7a 2c 20   pTableName->z, 
5c00: 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e 2c 20 30  pTableName->n, 0
5c10: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
5c20: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
5c30: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  copy_cleanup;.  
5c40: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  }.  if( pTab->re
5c50: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
5c60: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
5c70: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
5c80: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e  "table ", pTab->
5c90: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 22  zName,.        "
5ca0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6d 6f 64 69   may not be modi
5cb0: 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70  fied", 0);.    p
5cc0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
5cd0: 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65     goto copy_cle
5ce0: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  anup;.  }.  v = 
5cf0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
5d00: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
5d10: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  {.    addr = sql
5d20: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5d30: 4f 50 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c 20  OP_FileOpen, 0, 
5d40: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
5d50: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
5d60: 28 76 2c 20 61 64 64 72 2c 20 70 46 69 6c 65 6e  (v, addr, pFilen
5d70: 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d  ame->z, pFilenam
5d80: 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e->n);.    sqlit
5d90: 65 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76  eVdbeDequoteP3(v
5da0: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c  , addr);.    sql
5db0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5dc0: 4f 50 5f 4f 70 65 6e 2c 20 30 2c 20 31 2c 20 70  OP_Open, 0, 1, p
5dd0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
5de0: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64      for(i=1, pId
5df0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
5e00: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
5e10: 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  >pNext, i++){.  
5e20: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5e30: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20  dOp(v, OP_Open, 
5e40: 69 2c 20 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  i, 1, pIdx->zNam
5e50: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
5e60: 20 65 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62   end = sqliteVdb
5e70: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
5e80: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
5e90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5ea0: 46 69 6c 65 52 65 61 64 2c 20 70 54 61 62 2d 3e  FileRead, pTab->
5eb0: 6e 43 6f 6c 2c 20 65 6e 64 2c 20 30 2c 20 30 29  nCol, end, 0, 0)
5ec0: 3b 0a 20 20 20 20 69 66 28 20 70 44 65 6c 69 6d  ;.    if( pDelim
5ed0: 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  iter ){.      sq
5ee0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
5ef0: 28 76 2c 20 61 64 64 72 2c 20 70 44 65 6c 69 6d  (v, addr, pDelim
5f00: 69 74 65 72 2d 3e 7a 2c 20 70 44 65 6c 69 6d 69  iter->z, pDelimi
5f10: 74 65 72 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 73  ter->n);.      s
5f20: 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74 65  qliteVdbeDequote
5f30: 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  P3(v, addr);.   
5f40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
5f50: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
5f60: 28 76 2c 20 61 64 64 72 2c 20 22 5c 74 22 2c 20  (v, addr, "\t", 
5f70: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
5f80: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5f90: 20 4f 50 5f 4e 65 77 2c 20 30 2c 20 30 2c 20 30   OP_New, 0, 0, 0
5fa0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
5fb0: 61 62 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20  ab->pIndex ){.  
5fc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5fd0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
5fe0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
5ff0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
6000: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
6010: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
6020: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
6030: 69 6c 65 46 69 65 6c 64 2c 20 69 2c 20 30 2c 20  ileField, i, 0, 
6040: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
6050: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6060: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6070: 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 30  d, pTab->nCol, 0
6080: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6090: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
60a0: 4f 50 5f 50 75 74 2c 20 30 2c 20 30 2c 20 30 2c  OP_Put, 0, 0, 0,
60b0: 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31   0);.    for(i=1
60c0: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
60d0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
60e0: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b  pIdx->pNext, i++
60f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ){.      if( pId
6100: 78 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  x->pNext ){.    
6110: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6120: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
6130: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
6140: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
6150: 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 46 69 65 6c  0; j<pIdx->nFiel
6160: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
6170: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6180: 28 76 2c 20 4f 50 5f 46 69 6c 65 46 69 65 6c 64  (v, OP_FileField
6190: 2c 20 70 49 64 78 2d 3e 61 69 46 69 65 6c 64 5b  , pIdx->aiField[
61a0: 6a 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  j], 0, 0, 0);.  
61b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
61c0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
61d0: 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 49 64 78 2d  P_MakeKey, pIdx-
61e0: 3e 6e 46 69 65 6c 64 2c 20 30 2c 20 30 2c 20 30  >nField, 0, 0, 0
61f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6200: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
6210: 75 74 49 64 78 2c 20 69 2c 20 30 2c 20 30 2c 20  utIdx, i, 0, 0, 
6220: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
6230: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6240: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
6250: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  r, 0, 0);.    sq
6260: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6270: 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20   OP_Noop, 0, 0, 
6280: 30 2c 20 65 6e 64 29 3b 0a 20 20 7d 0a 20 20 0a  0, end);.  }.  .
6290: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  copy_cleanup:.  
62a0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
62b0: 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72   The non-standar
62c0: 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64  d VACUUM command
62d0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c 65 61   is used to clea
62e0: 6e 20 75 70 20 74 68 65 20 64 61 74 61 62 61 73  n up the databas
62f0: 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66  e,.** collapse f
6300: 72 65 65 20 73 70 61 63 65 2c 20 65 74 63 2e 20  ree space, etc. 
6310: 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20   It is modelled 
6320: 61 66 74 65 72 20 74 68 65 20 56 41 43 55 55 4d  after the VACUUM
6330: 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50   command.** in P
6340: 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2f 0a 76 6f  ostgreSQL..*/.vo
6350: 69 64 20 73 71 6c 69 74 65 56 61 63 75 75 6d 28  id sqliteVacuum(
6360: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
6370: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65  oken *pTableName
6380: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
6390: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
63a0: 69 66 28 20 70 54 61 62 6c 65 4e 61 6d 65 20 29  if( pTableName )
63b0: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
63c0: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f  liteTableNameFro
63d0: 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d  mToken(pTableNam
63e0: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
63f0: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a   zName = 0;.  }.
6400: 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73    if( zName && s
6410: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 70  qliteFindIndex(p
6420: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
6430: 29 3d 3d 30 0a 20 20 20 20 26 26 20 73 71 6c 69  )==0.    && sqli
6440: 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  teFindTable(pPar
6450: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3d 3d  se->db, zName)==
6460: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
6470: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
6480: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
6490: 75 63 68 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  uch table or ind
64a0: 65 78 3a 20 22 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex: ", zName, 0)
64b0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
64c0: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 76  rr++;.    goto v
64d0: 61 63 75 75 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20  acuum_cleanup;. 
64e0: 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47   }.  v = sqliteG
64f0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
6500: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
6510: 6f 20 76 61 63 75 75 6d 5f 63 6c 65 61 6e 75 70  o vacuum_cleanup
6520: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
6530: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6540: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 6f 72 67  ddOp(v, OP_Reorg
6550: 61 6e 69 7a 65 2c 20 30 2c 20 30 2c 20 7a 4e 61  anize, 0, 0, zNa
6560: 6d 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  me, 0);.  }else{
6570: 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20  .    int h;.    
6580: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
6590: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
65a0: 20 20 66 6f 72 28 68 3d 30 3b 20 68 3c 4e 5f 48    for(h=0; h<N_H
65b0: 41 53 48 3b 20 68 2b 2b 29 7b 0a 20 20 20 20 20  ASH; h++){.     
65c0: 20 66 6f 72 28 70 54 61 62 3d 70 50 61 72 73 65   for(pTab=pParse
65d0: 2d 3e 64 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b  ->db->apTblHash[
65e0: 68 5d 3b 20 70 54 61 62 3b 20 70 54 61 62 3d 70  h]; pTab; pTab=p
65f0: 54 61 62 2d 3e 70 48 61 73 68 29 7b 0a 20 20 20  Tab->pHash){.   
6600: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6610: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 6f 72 67  ddOp(v, OP_Reorg
6620: 61 6e 69 7a 65 2c 20 30 2c 20 30 2c 20 70 54 61  anize, 0, 0, pTa
6630: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
6640: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
6650: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
6660: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
6670: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
6680: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6690: 76 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65  v, OP_Reorganize
66a0: 2c 20 30 2c 20 30 2c 20 70 49 64 78 2d 3e 7a 4e  , 0, 0, pIdx->zN
66b0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
66c0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
66d0: 0a 20 20 7d 0a 0a 76 61 63 75 75 6d 5f 63 6c 65  .  }..vacuum_cle
66e0: 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 46 72  anup:.  sqliteFr
66f0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  ee(zName);.  ret
6700: 75 72 6e 3b 0a 7d 0a                             urn;.}.