/ Hex Artifact Content
Login

Artifact ecb8ec724914780efed01d1739e6dd398d75af46:


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 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a   of syntax:.**.*
0450: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0460: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0470: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0480: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0490: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
04a0: 20 20 63 72 65 61 74 69 6e 67 20 65 78 70 72 65    creating expre
04b0: 73 73 69 6f 6e 73 20 61 6e 64 20 49 44 20 6c 69  ssions and ID li
04c0: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
04d0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
04e0: 0a 2a 2a 20 24 49 64 3a 20 62 75 69 6c 64 2e 63  .** $Id: build.c
04f0: 2c 76 20 31 2e 32 31 20 32 30 30 30 2f 30 37 2f  ,v 1.21 2000/07/
0500: 32 39 20 31 33 3a 30 36 3a 35 39 20 64 72 68 20  29 13:06:59 drh 
0510: 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64  Exp $.*/.#includ
0520: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0530: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0540: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0550: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0560: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0570: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0580: 64 20 77 65 20 77 61 6e 74 20 74 6f 20 65 78 65  d we want to exe
0590: 63 75 74 65 20 74 68 65 20 56 44 42 45 20 63 6f  cute the VDBE co
05a0: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
05b0: 0a 2a 2a 20 74 68 61 74 20 73 74 61 74 65 6d 65  .** that stateme
05c0: 6e 74 2e 20 20 50 72 69 6f 72 20 61 63 74 69 6f  nt.  Prior actio
05d0: 6e 20 72 6f 75 74 69 6e 65 73 20 73 68 6f 75 6c  n routines shoul
05e0: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  d have already.*
05f0: 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20 56 44  * constructed VD
0600: 42 45 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  BE code to do th
0610: 65 20 77 6f 72 6b 20 6f 66 20 74 68 65 20 53 51  e work of the SQ
0620: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
0630: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0640: 74 20 68 61 73 20 74 6f 20 65 78 65 63 75 74 65  t has to execute
0650: 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 2e 0a   the VDBE code..
0660: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0670: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0680: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0690: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
06a0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
06b0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
06c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 65  /.void sqliteExe
06d0: 63 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  c(Parse *pParse)
06e0: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
06f0: 70 56 64 62 65 20 29 7b 0a 20 20 20 20 69 66 28  pVdbe ){.    if(
0700: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
0710: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
0720: 56 64 62 65 4c 69 73 74 28 70 50 61 72 73 65 2d  VdbeList(pParse-
0730: 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e  >pVdbe, pParse->
0740: 78 43 61 6c 6c 62 61 63 6b 2c 20 70 50 61 72 73  xCallback, pPars
0750: 65 2d 3e 70 41 72 67 2c 20 0a 20 20 20 20 20 20  e->pArg, .      
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
0770: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29  pParse->zErrMsg)
0780: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0790: 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d     FILE *trace =
07a0: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
07b0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
07c0: 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64  eTrace)!=0 ? std
07d0: 65 72 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 73  err : 0;.      s
07e0: 71 6c 69 74 65 56 64 62 65 54 72 61 63 65 28 70  qliteVdbeTrace(p
07f0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 74 72  Parse->pVdbe, tr
0800: 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ace);.      sqli
0810: 74 65 56 64 62 65 45 78 65 63 28 70 50 61 72 73  teVdbeExec(pPars
0820: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65  e->pVdbe, pParse
0830: 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c 20 70 50 61  ->xCallback, pPa
0840: 72 73 65 2d 3e 70 41 72 67 2c 20 0a 20 20 20 20  rse->pArg, .    
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73   &pParse->zErrMs
0870: 67 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70  g, pParse->db->p
0880: 42 75 73 79 41 72 67 2c 0a 20 20 20 20 20 20 20  BusyArg,.       
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
08a0: 61 72 73 65 2d 3e 64 62 2d 3e 78 42 75 73 79 43  arse->db->xBusyC
08b0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a  allback);.    }.
08c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
08d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56 64  lete(pParse->pVd
08e0: 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  be);.    pParse-
08f0: 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20 20  >pVdbe = 0;.    
0900: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
0910: 53 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  Set = 0;.  }.}..
0920: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
0930: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
0940: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
0950: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
0960: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0970: 65 45 78 70 72 28 69 6e 74 20 6f 70 2c 20 45 78  eExpr(int op, Ex
0980: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
0990: 2a 70 52 69 67 68 74 2c 20 54 6f 6b 65 6e 20 2a  *pRight, Token *
09a0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
09b0: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
09c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
09d0: 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20  zeof(Expr) );.  
09e0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
09f0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
0a00: 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 4e 65 77 2d  op = op;.  pNew-
0a10: 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a  >pLeft = pLeft;.
0a20: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
0a30: 20 70 52 69 67 68 74 3b 0a 20 20 69 66 28 20 70   pRight;.  if( p
0a40: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 70 4e 65  Token ){.    pNe
0a50: 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b  w->token = *pTok
0a60: 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  en;.  }else{.   
0a70: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d   pNew->token.z =
0a80: 20 22 22 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74   "";.    pNew->t
0a90: 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 7d 0a  oken.n = 0;.  }.
0aa0: 20 20 69 66 28 20 70 4c 65 66 74 20 26 26 20 70    if( pLeft && p
0ab0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  Right ){.    sql
0ac0: 69 74 65 45 78 70 72 53 70 61 6e 28 70 4e 65 77  iteExprSpan(pNew
0ad0: 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20  , &pLeft->span, 
0ae0: 26 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a  &pRight->span);.
0af0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
0b00: 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e  w->span = pNew->
0b10: 74 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  token;.  }.  ret
0b20: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
0b30: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
0b40: 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6f 66 20 74  token field of t
0b50: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
0b60: 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a  ion to span all.
0b70: 2a 2a 20 74 65 78 74 20 62 65 74 77 65 65 6e 20  ** text between 
0b80: 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f  the two given to
0b90: 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  kens..*/.void sq
0ba0: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 45 78 70  liteExprSpan(Exp
0bb0: 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20  r *pExpr, Token 
0bc0: 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pLeft, Token *p
0bd0: 52 69 67 68 74 29 7b 0a 20 20 70 45 78 70 72 2d  Right){.  pExpr-
0be0: 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d  >span.z = pLeft-
0bf0: 3e 7a 3b 0a 20 20 70 45 78 70 72 2d 3e 73 70 61  >z;.  pExpr->spa
0c00: 6e 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20  n.n = pRight->n 
0c10: 2b 20 28 69 6e 74 29 70 52 69 67 68 74 2d 3e 7a  + (int)pRight->z
0c20: 20 2d 20 28 69 6e 74 29 70 4c 65 66 74 2d 3e 7a   - (int)pLeft->z
0c30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  ;.}../*.** Const
0c40: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
0c50: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
0c60: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
0c70: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
0c80: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
0c90: 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69 6f  qliteExprFunctio
0ca0: 6e 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  n(ExprList *pLis
0cb0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
0cc0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
0cd0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0ce0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
0cf0: 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  xpr) );.  if( pN
0d00: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
0d10: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54  ;.  pNew->op = T
0d20: 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e  K_FUNCTION;.  pN
0d30: 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ew->pList = pLis
0d40: 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  t;.  if( pToken 
0d50: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  ){.    pNew->tok
0d60: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
0d70: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
0d80: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20  >token.z = "";. 
0d90: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e     pNew->token.n
0da0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
0db0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
0dc0: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
0dd0: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
0de0: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  on tree..*/.void
0df0: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
0e00: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
0e10: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
0e20: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20  .  if( p->pLeft 
0e30: 29 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65  ) sqliteExprDele
0e40: 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  te(p->pLeft);.  
0e50: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 20  if( p->pRight ) 
0e60: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
0e70: 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 69  (p->pRight);.  i
0e80: 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 20 73 71  f( p->pList ) sq
0e90: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
0ea0: 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  te(p->pList);.  
0eb0: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 20 29  if( p->pSelect )
0ec0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
0ed0: 65 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b  ete(p->pSelect);
0ee0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
0ef0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0f00: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0f10: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0f20: 65 73 63 72 69 62 65 73 20 74 68 65 0a 2a 2a 20  escribes the.** 
0f30: 66 6f 72 6d 61 74 20 6f 66 20 61 20 70 61 72 74  format of a part
0f40: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
0f50: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
0f60: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61 74 20  name.** of that 
0f70: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
0f80: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
0f90: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
0fa0: 74 65 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69  teFindTable(sqli
0fb0: 74 65 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e  te *db, char *zN
0fc0: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
0fd0: 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 68 3b 0a  Table;.  int h;.
0fe0: 0a 20 20 68 20 3d 20 73 71 6c 69 74 65 48 61 73  .  h = sqliteHas
0ff0: 68 4e 6f 43 61 73 65 28 7a 4e 61 6d 65 2c 20 30  hNoCase(zName, 0
1000: 29 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20 66 6f  ) % N_HASH;.  fo
1010: 72 28 70 54 61 62 6c 65 3d 64 62 2d 3e 61 70 54  r(pTable=db->apT
1020: 62 6c 48 61 73 68 5b 68 5d 3b 20 70 54 61 62 6c  blHash[h]; pTabl
1030: 65 3b 20 70 54 61 62 6c 65 3d 70 54 61 62 6c 65  e; pTable=pTable
1040: 2d 3e 70 48 61 73 68 29 7b 0a 20 20 20 20 69 66  ->pHash){.    if
1050: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
1060: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 7a  pTable->zName, z
1070: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
1080: 6e 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  n pTable;.  }.  
1090: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
10a0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
10b0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
10c0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
10d0: 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74 20 6f   the.** format o
10e0: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  f a particular i
10f0: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
1100: 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61 74 20 69  ame.** of that i
1110: 6e 64 65 78 2e 20 20 52 65 74 75 72 6e 20 4e 55  ndex.  Return NU
1120: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1130: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
1140: 65 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  eFindIndex(sqlit
1150: 65 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61  e *db, char *zNa
1160: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  me){.  Index *p;
1170: 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 68 20 3d  .  int h;..  h =
1180: 20 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61 73   sqliteHashNoCas
1190: 65 28 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e 5f  e(zName, 0) % N_
11a0: 48 41 53 48 3b 0a 20 20 66 6f 72 28 70 3d 64 62  HASH;.  for(p=db
11b0: 2d 3e 61 70 49 64 78 48 61 73 68 5b 68 5d 3b 20  ->apIdxHash[h]; 
11c0: 70 3b 20 70 3d 70 2d 3e 70 48 61 73 68 29 7b 0a  p; p=p->pHash){.
11d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
11e0: 72 49 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20  rICmp(p->zName, 
11f0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
1200: 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn p;.  }.  retu
1210: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
1220: 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20  emove the given 
1230: 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69  index from the i
1240: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c  ndex hash table,
1250: 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73   and free.** its
1260: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
1270: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  es..**.** The in
1280: 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66  dex is removed f
1290: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
12a0: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 62 75 74   hash table, but
12b0: 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 6e   it is.** not un
12c0: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
12d0: 54 61 62 6c 65 20 74 68 61 74 20 69 73 20 62 65  Table that is be
12e0: 69 6e 67 20 69 6e 64 65 78 65 64 2e 20 20 55 6e  ing indexed.  Un
12f0: 6c 69 6e 6b 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20  linking.** from 
1300: 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62  the Table must b
1310: 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61  e done by the ca
1320: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
1330: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1340: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
1350: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64  (sqlite *db, Ind
1360: 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
1370: 6e 74 20 68 3b 0a 20 20 69 66 28 20 70 49 6e 64  nt h;.  if( pInd
1380: 65 78 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  ex->zName ){.   
1390: 20 68 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e   h = sqliteHashN
13a0: 6f 43 61 73 65 28 70 49 6e 64 65 78 2d 3e 7a 4e  oCase(pIndex->zN
13b0: 61 6d 65 2c 20 30 29 20 25 20 4e 5f 48 41 53 48  ame, 0) % N_HASH
13c0: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 70  ;.    if( db->ap
13d0: 49 64 78 48 61 73 68 5b 68 5d 3d 3d 70 49 6e 64  IdxHash[h]==pInd
13e0: 65 78 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  ex ){.      db->
13f0: 61 70 49 64 78 48 61 73 68 5b 68 5d 20 3d 20 70  apIdxHash[h] = p
1400: 49 6e 64 65 78 2d 3e 70 48 61 73 68 3b 0a 20 20  Index->pHash;.  
1410: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
1420: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66  ndex *p;.      f
1430: 6f 72 28 70 3d 64 62 2d 3e 61 70 49 64 78 48 61  or(p=db->apIdxHa
1440: 73 68 5b 68 5d 3b 20 70 20 26 26 20 70 2d 3e 70  sh[h]; p && p->p
1450: 48 61 73 68 21 3d 70 49 6e 64 65 78 3b 20 70 3d  Hash!=pIndex; p=
1460: 70 2d 3e 70 48 61 73 68 29 7b 7d 0a 20 20 20 20  p->pHash){}.    
1470: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 48    if( p && p->pH
1480: 61 73 68 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  ash==pIndex ){. 
1490: 20 20 20 20 20 20 20 70 2d 3e 70 48 61 73 68 20         p->pHash 
14a0: 3d 20 70 49 6e 64 65 78 2d 3e 70 48 61 73 68 3b  = pIndex->pHash;
14b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14c0: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
14d0: 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
14e0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
14f0: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
1500: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
1510: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
1520: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
1530: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
1540: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
1550: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
1560: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
1570: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
1580: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
1590: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
15a0: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
15b0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
15c0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
15d0: 42 75 74 20 64 6f 65 73 20 69 74 20 64 65 73 74  But does it dest
15e0: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
15f0: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
1600: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
1610: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
1620: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1630: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  eDeleteTable(sql
1640: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
1650: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
1660: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ;.  Index *pInde
1670: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28  x, *pNext;.  if(
1680: 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74   pTable==0 ) ret
1690: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
16a0: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
16b0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
16c0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
16d0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[i].zName);.   
16e0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
16f0: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  le->aCol[i].zDfl
1700: 74 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 49  t);.  }.  for(pI
1710: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
1720: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
1730: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
1740: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
1750: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
1760: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64  iteDeleteIndex(d
1770: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
1780: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1790: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
17a0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
17b0: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  ->aCol);.  sqlit
17c0: 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d  eFree(pTable);.}
17d0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
17e0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
17f0: 75 73 65 72 20 74 61 62 6c 65 20 6f 72 20 69 6e  user table or in
1800: 64 65 78 20 66 72 6f 6d 20 61 20 74 6f 6b 65 6e  dex from a token
1810: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
1820: 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 69   hold the name i
1830: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
1840: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
1850: 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72  nd must.** be fr
1860: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
1870: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
1880: 63 68 61 72 20 2a 73 71 6c 69 74 65 54 61 62 6c  char *sqliteTabl
1890: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54  eNameFromToken(T
18a0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
18b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
18c0: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d  liteStrNDup(pNam
18d0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
18e0: 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
18f0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
1900: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
1910: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
1920: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
1930: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1940: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
1950: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
1960: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
1970: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
1980: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
1990: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
19a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
19b0: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
19c0: 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65  sqliteStartTable
19d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19e0: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 54  Token *pStart, T
19f0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
1a00: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
1a10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20   char *zName;.. 
1a20: 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54   pParse->sFirstT
1a30: 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a  oken = *pStart;.
1a40: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
1a50: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
1a60: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 70 54 61  en(pName);.  pTa
1a70: 62 6c 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ble = sqliteFind
1a80: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
1a90: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , zName);.  if( 
1aa0: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
1ab0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
1ac0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
1ad0: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 30 2c  sg, "table ", 0,
1ae0: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
1af0: 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20 22 20 61  ->n,.        " a
1b00: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
1b10: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1b20: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
1b30: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
1b40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1b50: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 46 69  }.  if( sqliteFi
1b60: 6e 64 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ndIndex(pParse->
1b70: 64 62 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  db, zName) ){.  
1b80: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
1b90: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
1ba0: 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  sg, "there is al
1bb0: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
1bc0: 61 6d 65 64 20 22 2c 20 0a 20 20 20 20 20 20 20  amed ", .       
1bd0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
1be0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
1bf0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
1c00: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
1c10: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d  ;.  }.  pTable =
1c20: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
1c30: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
1c40: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
1c50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
1c60: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
1c70: 7a 45 72 72 4d 73 67 2c 20 22 6f 75 74 20 6f 66  zErrMsg, "out of
1c80: 20 6d 65 6d 6f 72 79 22 2c 20 30 29 3b 0a 20 20   memory", 0);.  
1c90: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
1ca0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1cb0: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
1cc0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
1cd0: 62 6c 65 2d 3e 70 48 61 73 68 20 3d 20 30 3b 0a  ble->pHash = 0;.
1ce0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
1cf0: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43   0;.  pTable->aC
1d00: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
1d10: 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  ->pIndex = 0;.  
1d20: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
1d30: 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 44 65  Table ) sqliteDe
1d40: 6c 65 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  leteTable(pParse
1d50: 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e  ->db, pParse->pN
1d60: 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72  ewTable);.  pPar
1d70: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
1d80: 70 54 61 62 6c 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pTable;.}../*.**
1d90: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
1da0: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
1db0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
1dc0: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2f 0a 76  onstructed..*/.v
1dd0: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c  oid sqliteAddCol
1de0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
1df0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
1e00: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
1e10: 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28  char **pz;.  if(
1e20: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
1e30: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
1e40: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 2d 3e  turn;.  if( (p->
1e50: 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29  nCol & 0x7)==0 )
1e60: 7b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  {.    p->aCol = 
1e70: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70  sqliteRealloc( p
1e80: 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c  ->aCol, (p->nCol
1e90: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
1ea0: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69  ol[0]));.  }.  i
1eb0: 66 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 7b  f( p->aCol==0 ){
1ec0: 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30  .    p->nCol = 0
1ed0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1ee0: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61  }.  memset(&p->a
1ef0: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 2c 20 30 2c  Col[p->nCol], 0,
1f00: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
1f10: 30 5d 29 29 3b 0a 20 20 70 7a 20 3d 20 26 70 2d  0]));.  pz = &p-
1f20: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d  >aCol[p->nCol++]
1f30: 2e 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  .zName;.  sqlite
1f40: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
1f50: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
1f60: 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 44  n, 0);.  sqliteD
1f70: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a  equote(*pz);.}..
1f80: 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20  /*.** The given 
1f90: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66  token is the def
1fa0: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
1fb0: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
1fc0: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  dded to.** the t
1fd0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
1fe0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1ff0: 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61  n.  If "minusFla
2000: 67 22 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a  g" is true, it.*
2010: 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75  * means the valu
2020: 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63  e token was prec
2030: 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20  eded by a minus 
2040: 73 69 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sign..*/.void sq
2050: 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61  liteAddDefaultVa
2060: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
2070: 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20  e, Token *pVal, 
2080: 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a  int minusFlag){.
2090: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
20a0: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a  t i;.  char **pz
20b0: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
20c0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
20d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
20e0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
20f0: 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d  pz = &p->aCol[i]
2100: 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69  .zDflt;.  if( mi
2110: 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  nusFlag ){.    s
2120: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
2130: 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c  pz, "-", 1, pVal
2140: 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29  ->z, pVal->n, 0)
2150: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2160: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
2170: 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61  pz, pVal->z, pVa
2180: 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  l->n, 0);.  }.  
2190: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70  sqliteDequote(*p
21a0: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  z);.}../*.** Thi
21b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
21c0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
21d0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
21e0: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
21f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
2200: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
2210: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
2220: 72 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  re is added to t
2230: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
2240: 20 74 61 62 6c 65 73 2e 20 20 0a 2a 2a 0a 2a 2a   tables.  .**.**
2250: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
2260: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
2270: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
2280: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 0a 2a 2a 20  ble on disk,.** 
2290: 75 6e 6c 65 73 73 20 69 6e 69 74 46 6c 61 67 3d  unless initFlag=
22a0: 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74 46 6c  =1.  When initFl
22b0: 61 67 3d 3d 31 2c 20 69 74 20 6d 65 61 6e 73 20  ag==1, it means 
22c0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 0a 2a  we are reading.*
22d0: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  * the master tab
22e0: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
22f0: 73 74 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  st connected to 
2300: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 73 6f  the database, so
2310: 20 0a 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66   .** the entry f
2320: 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c  or this table al
2330: 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 20  ready exists in 
2340: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
2350: 2e 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 77  ..** We do not w
2360: 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74  ant to create it
2370: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   again..*/.void 
2380: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 50  sqliteEndTable(P
2390: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
23a0: 6b 65 6e 20 2a 70 45 6e 64 29 7b 0a 20 20 54 61  ken *pEnd){.  Ta
23b0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 68 3b  ble *p;.  int h;
23c0: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
23d0: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 0a  nErr ) return;..
23e0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
23f0: 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
2400: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
2410: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
2420: 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  se.  */.  if( (p
2430: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
2440: 61 62 6c 65 29 21 3d 30 20 26 26 20 70 50 61 72  able)!=0 && pPar
2450: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29  se->explain==0 )
2460: 7b 0a 20 20 20 20 68 20 3d 20 73 71 6c 69 74 65  {.    h = sqlite
2470: 48 61 73 68 4e 6f 43 61 73 65 28 70 2d 3e 7a 4e  HashNoCase(p->zN
2480: 61 6d 65 2c 20 30 29 20 25 20 4e 5f 48 41 53 48  ame, 0) % N_HASH
2490: 3b 0a 20 20 20 20 70 2d 3e 70 48 61 73 68 20 3d  ;.    p->pHash =
24a0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 70 54   pParse->db->apT
24b0: 62 6c 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70  blHash[h];.    p
24c0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 70 54 62 6c  Parse->db->apTbl
24d0: 48 61 73 68 5b 68 5d 20 3d 20 70 3b 0a 20 20 20  Hash[h] = p;.   
24e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
24f0: 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  le = 0;.  }..  /
2500: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
2510: 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
2520: 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  te the table on 
2530: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
2540: 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c   !pParse->initFl
2550: 61 67 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  ag ){.    static
2560: 20 56 64 62 65 4f 70 20 61 64 64 54 61 62 6c 65   VdbeOp addTable
2570: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
2580: 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 30  P_Open,        0
2590: 2c 20 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  , 1, MASTER_NAME
25a0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e   },.      { OP_N
25b0: 65 77 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30  ew,         0, 0
25c0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
25d0: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c  _String,      0,
25e0: 20 30 2c 20 22 74 61 62 6c 65 22 20 20 20 20 20   0, "table"     
25f0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  },.      { OP_St
2600: 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c  ring,      0, 0,
2610: 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20   0},            
2620: 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
2630: 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20  OP_String,      
2640: 30 2c 20 30 2c 20 30 7d 2c 20 20 20 20 20 20 20  0, 0, 0},       
2650: 20 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20       /* 4 */.   
2660: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20     { OP_String, 
2670: 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 20 20       0, 0, 0},  
2680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 20 2a            /* 5 *
2690: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 61 6b  /.      { OP_Mak
26a0: 65 52 65 63 6f 72 64 2c 20 20 34 2c 20 30 2c 20  eRecord,  4, 0, 
26b0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 50  0},.      { OP_P
26c0: 75 74 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30  ut,         0, 0
26d0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
26e0: 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 30 2c  _Close,       0,
26f0: 20 30 2c 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20   0, 0},.    };. 
2700: 20 20 20 69 6e 74 20 6e 2c 20 62 61 73 65 3b 0a     int n, base;.
2710: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20      Vdbe *v;..  
2720: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
2730: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
2740: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
2750: 72 6e 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74  rn;.    n = (int
2760: 29 70 45 6e 64 2d 3e 7a 20 2d 20 28 69 6e 74 29  )pEnd->z - (int)
2770: 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f  pParse->sFirstTo
2780: 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 62  ken.z + 1;.    b
2790: 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ase = sqliteVdbe
27a0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
27b0: 61 79 53 69 7a 65 28 61 64 64 54 61 62 6c 65 29  aySize(addTable)
27c0: 2c 20 61 64 64 54 61 62 6c 65 29 3b 0a 20 20 20  , addTable);.   
27d0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
27e0: 65 50 33 28 76 2c 20 62 61 73 65 2b 33 2c 20 70  eP3(v, base+3, p
27f0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
2800: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
2810: 65 50 33 28 76 2c 20 62 61 73 65 2b 34 2c 20 70  eP3(v, base+4, p
2820: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
2830: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
2840: 65 50 33 28 76 2c 20 62 61 73 65 2b 35 2c 20 70  eP3(v, base+5, p
2850: 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b  Parse->sFirstTok
2860: 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a  en.z, n);.  }.}.
2870: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74  ./*.** Given a t
2880: 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20  oken, look up a 
2890: 74 61 62 6c 65 20 77 69 74 68 20 74 68 61 74 20  table with that 
28a0: 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f  name.  If not fo
28b0: 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e  und, leave.** an
28c0: 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65 20 70   error for the p
28d0: 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20 61 6e  arser to find an
28e0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
28f0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 54  /.Table *sqliteT
2900: 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61  ableFromToken(Pa
2910: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
2920: 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61  en *pTok){.  cha
2930: 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
2940: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
2950: 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 54 61 62  ken(pTok);.  Tab
2960: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
2970: 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  eFindTable(pPars
2980: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e->db, zName);. 
2990: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
29a0: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  e);.  if( pTab==
29b0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
29c0: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
29d0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
29e0: 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30  such table: ", 0
29f0: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 6f 6b 2d  , .        pTok-
2a00: 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30 29 3b  >z, pTok->n, 0);
2a10: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
2a20: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
2a30: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
2a40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2a50: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
2a60: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
2a70: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
2a80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a90: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
2aa0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
2ab0: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
2ac0: 2a 70 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 68  *pTable;.  int h
2ad0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
2ae0: 6e 74 20 62 61 73 65 3b 0a 0a 20 20 70 54 61 62  nt base;..  pTab
2af0: 6c 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  le = sqliteTable
2b00: 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
2b10: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
2b20: 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75  pTable==0 ) retu
2b30: 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  rn;.  if( pTable
2b40: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
2b50: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
2b60: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
2b70: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54  sg, "table ", pT
2b80: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  able->zName, .  
2b90: 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62       " may not b
2ba0: 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
2bb0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
2bc0: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
2bd0: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
2be0: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
2bf0: 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
2c00: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
2c10: 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
2c20: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
2c30: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
2c40: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
2c50: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
2c60: 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20  ropTable[] = {. 
2c70: 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20       { OP_Open, 
2c80: 20 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20        0, 1,     
2c90: 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45 20 7d     MASTER_NAME }
2ca0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4c 69 73  ,.      { OP_Lis
2cb0: 74 4f 70 65 6e 2c 20 20 20 30 2c 20 30 2c 20 20  tOpen,   0, 0,  
2cc0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
2cd0: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
2ce0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
2cf0: 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20  , /* 2 */.      
2d00: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
2d10: 20 30 2c 20 41 44 44 52 28 31 30 29 2c 20 30 7d   0, ADDR(10), 0}
2d20: 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20  , /* 3 */.      
2d30: 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20  { OP_Dup,       
2d40: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
2d50: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 46 69 65  ,.      { OP_Fie
2d60: 6c 64 2c 20 20 20 20 20 20 30 2c 20 32 2c 20 20  ld,      0, 2,  
2d70: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
2d80: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
2d90: 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d   0, ADDR(3),  0}
2da0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4b 65 79  ,.      { OP_Key
2db0: 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20  ,        0, 0,  
2dc0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
2dd0: 7b 20 4f 50 5f 4c 69 73 74 57 72 69 74 65 2c 20  { OP_ListWrite, 
2de0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
2df0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74  ,.      { OP_Got
2e00: 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52  o,       0, ADDR
2e10: 28 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20  (3),  0},.      
2e20: 7b 20 4f 50 5f 4c 69 73 74 52 65 77 69 6e 64 2c  { OP_ListRewind,
2e30: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
2e40: 2c 20 2f 2a 20 31 30 20 2a 2f 0a 20 20 20 20 20  , /* 10 */.     
2e50: 20 7b 20 4f 50 5f 4c 69 73 74 52 65 61 64 2c 20   { OP_ListRead, 
2e60: 20 20 30 2c 20 41 44 44 52 28 31 34 29 2c 20 30    0, ADDR(14), 0
2e70: 7d 2c 20 2f 2a 20 31 31 20 2a 2f 0a 20 20 20 20  }, /* 11 */.    
2e80: 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20    { OP_Delete,  
2e90: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
2ea0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47  0},.      { OP_G
2eb0: 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44  oto,       0, AD
2ec0: 44 52 28 31 31 29 2c 20 30 7d 2c 0a 20 20 20 20  DR(11), 0},.    
2ed0: 20 20 7b 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20    { OP_Destroy, 
2ee0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
2ef0: 30 7d 2c 20 2f 2a 20 31 34 20 2a 2f 0a 20 20 20  0}, /* 14 */.   
2f00: 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20     { OP_Close,  
2f10: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
2f20: 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
2f30: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
2f40: 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64   base = sqliteVd
2f50: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
2f60: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62  rraySize(dropTab
2f70: 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b  le), dropTable);
2f80: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
2f90: 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b  hangeP3(v, base+
2fa0: 32 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  2, pTable->zName
2fb0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2fc0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
2fd0: 62 61 73 65 2b 31 34 2c 20 70 54 61 62 6c 65 2d  base+14, pTable-
2fe0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
2ff0: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d  for(pIdx=pTable-
3000: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
3010: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
3020: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
3030: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
3040: 73 74 72 6f 79 2c 20 30 2c 20 30 2c 20 70 49 64  stroy, 0, 0, pId
3050: 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
3060: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
3070: 6d 6f 76 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  move the in-memo
3080: 72 79 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  ry table structu
3090: 72 65 20 61 6e 64 20 66 72 65 65 20 69 74 73 20  re and free its 
30a0: 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a  memory..  **.  *
30b0: 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20  * Exception: if 
30c0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
30d0: 74 20 62 65 67 61 6e 20 77 69 74 68 20 74 68 65  t began with the
30e0: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
30f0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63  ,.  ** then no c
3100: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 2e  hanges are made.
3110: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
3120: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
3130: 20 20 20 20 68 20 3d 20 73 71 6c 69 74 65 48 61      h = sqliteHa
3140: 73 68 4e 6f 43 61 73 65 28 70 54 61 62 6c 65 2d  shNoCase(pTable-
3150: 3e 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e 5f 48  >zName, 0) % N_H
3160: 41 53 48 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ASH;.    if( pPa
3170: 72 73 65 2d 3e 64 62 2d 3e 61 70 54 62 6c 48 61  rse->db->apTblHa
3180: 73 68 5b 68 5d 3d 3d 70 54 61 62 6c 65 20 29 7b  sh[h]==pTable ){
3190: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
31a0: 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b 68 5d 20  b->apTblHash[h] 
31b0: 3d 20 70 54 61 62 6c 65 2d 3e 70 48 61 73 68 3b  = pTable->pHash;
31c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31d0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 20 20    Table *p;.    
31e0: 20 20 66 6f 72 28 70 3d 70 50 61 72 73 65 2d 3e    for(p=pParse->
31f0: 64 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b 68 5d  db->apTblHash[h]
3200: 3b 20 70 20 26 26 20 70 2d 3e 70 48 61 73 68 21  ; p && p->pHash!
3210: 3d 70 54 61 62 6c 65 3b 20 70 3d 70 2d 3e 70 48  =pTable; p=p->pH
3220: 61 73 68 29 7b 7d 0a 20 20 20 20 20 20 69 66 28  ash){}.      if(
3230: 20 70 20 26 26 20 70 2d 3e 70 48 61 73 68 3d 3d   p && p->pHash==
3240: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
3250: 20 20 70 2d 3e 70 48 61 73 68 20 3d 20 70 54 61    p->pHash = pTa
3260: 62 6c 65 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20  ble->pHash;.    
3270: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
3280: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
3290: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
32a0: 6c 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  le);.  }.}../*.*
32b0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
32c0: 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
32d0: 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78 20 69  table.  pIndex i
32e0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
32f0: 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
3300: 70 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61  pTable is the na
3310: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
3320: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
3330: 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
3340: 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
3350: 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  r a primary key.
3360: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
3370: 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
3380: 54 61 62 6c 65 20 61 73 20 74 68 65 20 0a 2a 2a  Table as the .**
3390: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
33a0: 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  exed..**.** pLis
33b0: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
33c0: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
33d0: 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
33e0: 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65  l be NULL if the
33f0: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
3400: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
3410: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6c  f the table is l
3420: 61 62 65 6c 65 64 20 61 73 20 74 68 65 20 70 72  abeled as the pr
3430: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2f 0a 76 6f  imary key..*/.vo
3440: 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65 49  id sqliteCreateI
3450: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
3460: 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20  Parse,   /* All 
3470: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
3480: 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
3490: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
34a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
34b0: 65 20 69 6e 64 65 78 2e 20 20 4d 61 79 20 62 65  e index.  May be
34c0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
34d0: 20 2a 70 54 61 62 6c 65 2c 20 20 20 2f 2a 20 4e   *pTable,   /* N
34e0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
34f0: 20 74 6f 20 69 6e 64 65 78 2e 20 20 55 73 65 20   to index.  Use 
3500: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
3510: 65 20 69 66 20 30 20 2a 2f 0a 20 20 49 64 4c 69  e if 0 */.  IdLi
3520: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
3530: 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
3540: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
3550: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
3560: 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45  rt,   /* The CRE
3570: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
3580: 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54  egins a CREATE T
3590: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
35a0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20  /.  Token *pEnd 
35b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20       /* The ")" 
35c0: 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20  that closes the 
35d0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
35e0: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54  tement */.){.  T
35f0: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
3600: 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
3610: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
3620: 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20  x *pIndex;   /* 
3630: 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
3640: 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
3650: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
3660: 69 6e 74 20 69 2c 20 6a 2c 20 68 3b 0a 20 20 54  int i, j, h;.  T
3670: 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20  oken nullId;    
3680: 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f  /* Fake token fo
3690: 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69  r an empty ID li
36a0: 73 74 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  st */..  /*.  **
36b0: 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
36c0: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
36d0: 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
36e0: 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
36f0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
3700: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 70  able!=0 ){.    p
3710: 54 61 62 20 3d 20 20 73 71 6c 69 74 65 54 61 62  Tab =  sqliteTab
3720: 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  leFromToken(pPar
3730: 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d  se, pTable);.  }
3740: 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 20 3d  else{.    pTab =
3750: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
3760: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ble;.  }.  if( p
3770: 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  Tab==0 || pParse
3780: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
3790: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
37a0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61  .  if( pTab->rea
37b0: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
37c0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
37d0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
37e0: 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a  table ", pTab->z
37f0: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 22 20 6d  Name, .      " m
3800: 61 79 20 6e 6f 74 20 68 61 76 65 20 6e 65 77 20  ay not have new 
3810: 69 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c 20  indices added", 
3820: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
3830: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
3840: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
3850: 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
3860: 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
3870: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
3880: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
3890: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
38a0: 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
38b0: 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
38c0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 0a 20  the same name.. 
38d0: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
38e0: 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
38f0: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
3900: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
3910: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61    }else{.    zNa
3920: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  me = 0;.    sqli
3930: 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  teSetString(&zNa
3940: 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
3950: 20 22 5f 5f 70 72 69 6d 61 72 79 5f 6b 65 79 22   "__primary_key"
3960: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
3970: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
3980: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
3990: 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  e) ){.    sqlite
39a0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
39b0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64  e->zErrMsg, "ind
39c0: 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20  ex ", zName, .  
39d0: 20 20 20 20 20 22 20 61 6c 72 65 61 64 79 20 65       " already e
39e0: 78 69 73 74 73 22 2c 20 30 29 3b 0a 20 20 20 20  xists", 0);.    
39f0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
3a00: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
3a10: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
3a20: 20 20 69 66 28 20 73 71 6c 69 74 65 46 69 6e 64    if( sqliteFind
3a30: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
3a40: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
3a50: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
3a60: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
3a70: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
3a80: 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
3a90: 64 20 22 2c 0a 20 20 20 20 20 20 20 7a 4e 61 6d  d ",.       zNam
3aa0: 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  e, 0);.    pPars
3ab0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
3ac0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
3ad0: 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
3ae0: 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
3af0: 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
3b00: 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
3b10: 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
3b20: 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
3b30: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
3b40: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
3b50: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
3b60: 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
3b70: 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
3b80: 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
3b90: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
3ba0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
3bb0: 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d  nullId.z = pTab-
3bc0: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
3bd0: 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
3be0: 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e  ullId.n = strlen
3bf0: 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20  (nullId.z);.    
3c00: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49 64  pList = sqliteId
3c10: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e  ListAppend(0, &n
3c20: 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
3c30: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
3c40: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
3c50: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20  x;.  }..  /* .  
3c60: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
3c70: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
3c80: 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20   .  */.  pIndex 
3c90: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
3ca0: 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
3cb0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
3cc0: 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1 +.            
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
3ce0: 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e  of(int)*pList->n
3cf0: 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  Id );.  if( pInd
3d00: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex==0 ){.    sql
3d10: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
3d20: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
3d30: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20  out of memory", 
3d40: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
3d50: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
3d60: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
3d70: 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
3d80: 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e  ->aiColumn = (in
3d90: 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d 3b 0a 20  t*)&pIndex[1];. 
3da0: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d   pIndex->zName =
3db0: 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
3dc0: 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d  >aiColumn[pList-
3dd0: 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70 79 28  >nId];.  strcpy(
3de0: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
3df0: 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Name);.  pIndex-
3e00: 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
3e10: 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
3e20: 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a  n = pList->nId;.
3e30: 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e  .  /* Scan the n
3e40: 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
3e50: 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
3e60: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61   to be indexed a
3e70: 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65  nd.  ** load the
3e80: 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20   column indices 
3e90: 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73  into the Index s
3ea0: 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72  tructure.  Repor
3eb0: 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20  t an error.  ** 
3ec0: 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73  if any column is
3ed0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
3ee0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
3ef0: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
3f00: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3f10: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
3f20: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3f30: 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  eStrICmp(pList->
3f40: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
3f50: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
3f60: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
3f70: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
3f80: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
3f90: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
3fa0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3fb0: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54  sg, "table ", pT
3fc0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ab->zName, .    
3fd0: 20 20 20 20 22 20 68 61 73 20 6e 6f 20 63 6f 6c      " has no col
3fe0: 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20 70 4c 69  umn named ", pLi
3ff0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
4000: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
4010: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
4020: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
4030: 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  x);.      goto e
4040: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
4050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
4060: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
4070: 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  = j;.  }..  /* L
4080: 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
4090: 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
40a0: 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
40b0: 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
40c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
40d0: 65 20 73 74 72 75 63 74 75 72 65 73 2e 0a 20 20  e structures..  
40e0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
40f0: 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29 7b 0a 20  >explain==0 ){. 
4100: 20 20 20 68 20 3d 20 73 71 6c 69 74 65 48 61 73     h = sqliteHas
4110: 68 4e 6f 43 61 73 65 28 70 49 6e 64 65 78 2d 3e  hNoCase(pIndex->
4120: 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e 5f 48 41  zName, 0) % N_HA
4130: 53 48 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  SH;.    pIndex->
4140: 70 48 61 73 68 20 3d 20 70 50 61 72 73 65 2d 3e  pHash = pParse->
4150: 64 62 2d 3e 61 70 49 64 78 48 61 73 68 5b 68 5d  db->apIdxHash[h]
4160: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  ;.    pParse->db
4170: 2d 3e 61 70 49 64 78 48 61 73 68 5b 68 5d 20 3d  ->apIdxHash[h] =
4180: 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e   pIndex;.    pIn
4190: 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
41a0: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70  b->pIndex;.    p
41b0: 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
41c0: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
41d0: 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20  If the initFlag 
41e0: 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65  is 0 then create
41f0: 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69   the index on di
4200: 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69  sk.  This.  ** i
4210: 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20  nvolves writing 
4220: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  the index into t
4230: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
4240: 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  and filling in t
4250: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  he.  ** index wi
4260: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
4270: 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20  able contents.. 
4280: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69   **.  ** The ini
4290: 74 46 6c 61 67 20 69 73 20 30 20 77 68 65 6e 20  tFlag is 0 when 
42a0: 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65  the user first e
42b0: 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49  nters a CREATE I
42c0: 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61  NDEX .  ** comma
42d0: 6e 64 2e 20 20 54 68 65 20 69 6e 69 74 46 6c 61  nd.  The initFla
42e0: 67 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61  g is 1 when a da
42f0: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
4300: 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54   and .  ** CREAT
4310: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
4320: 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20  ts are read out 
4330: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  of the master ta
4340: 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68  ble.  In.  ** th
4350: 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68  e latter case th
4360: 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
4370: 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
4380: 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a  which is why.  *
4390: 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  * we don't want 
43a0: 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a  to recreate it..
43b0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
43c0: 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29  e->initFlag==0 )
43d0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
43e0: 65 4f 70 20 61 64 64 54 61 62 6c 65 5b 5d 20 3d  eOp addTable[] =
43f0: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70   {.      { OP_Op
4400: 65 6e 2c 20 20 20 20 20 20 20 20 32 2c 20 31 2c  en,        2, 1,
4410: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20   MASTER_NAME},. 
4420: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 77 2c 20 20       { OP_New,  
4430: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 7d 2c         2, 0, 0},
4440: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
4450: 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 22  ng,      0, 0, "
4460: 69 6e 64 65 78 22 7d 2c 0a 20 20 20 20 20 20 7b  index"},.      {
4470: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
4480: 20 30 2c 20 30 2c 20 30 7d 2c 20 20 2f 2a 20 33   0, 0, 0},  /* 3
4490: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   */.      { OP_S
44a0: 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20 30  tring,      0, 0
44b0: 2c 20 30 7d 2c 20 20 2f 2a 20 34 20 2a 2f 0a 20  , 0},  /* 4 */. 
44c0: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
44d0: 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c  ,      0, 0, 0},
44e0: 20 20 2f 2a 20 35 20 2a 2f 0a 20 20 20 20 20 20    /* 5 */.      
44f0: 7b 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  { OP_MakeRecord,
4500: 20 20 34 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20    4, 0, 0},.    
4510: 20 20 7b 20 4f 50 5f 50 75 74 2c 20 20 20 20 20    { OP_Put,     
4520: 20 20 20 20 32 2c 20 30 2c 20 30 7d 2c 0a 20 20      2, 0, 0},.  
4530: 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20      { OP_Close, 
4540: 20 20 20 20 20 20 32 2c 20 30 2c 20 30 7d 2c 0a        2, 0, 0},.
4550: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e      };.    int n
4560: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
4570: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
4580: 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c     int lbl1, lbl
4590: 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  2;.    int i;.. 
45a0: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74     v = sqliteGet
45b0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
45c0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
45d0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
45e0: 64 65 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  dex;.    sqliteV
45f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
4600: 70 65 6e 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  pen, 0, 0, pTab-
4610: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
4620: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4630: 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 31 2c 20 31  v, OP_Open, 1, 1
4640: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
4650: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74   0);.    if( pSt
4660: 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20  art && pEnd ){. 
4670: 20 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 20       int base;. 
4680: 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 70 45       n = (int)pE
4690: 6e 64 2d 3e 7a 20 2d 20 28 69 6e 74 29 70 53 74  nd->z - (int)pSt
46a0: 61 72 74 2d 3e 7a 20 2b 20 31 3b 0a 20 20 20 20  art->z + 1;.    
46b0: 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56    base = sqliteV
46c0: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
46d0: 41 72 72 61 79 53 69 7a 65 28 61 64 64 54 61 62  ArraySize(addTab
46e0: 6c 65 29 2c 20 61 64 64 54 61 62 6c 65 29 3b 0a  le), addTable);.
46f0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4700: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
4710: 2b 33 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  +3, pIndex->zNam
4720: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  e, 0);.      sql
4730: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
4740: 76 2c 20 62 61 73 65 2b 34 2c 20 70 54 61 62 2d  v, base+4, pTab-
4750: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
4760: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
4770: 67 65 50 33 28 76 2c 20 62 61 73 65 2b 35 2c 20  geP3(v, base+5, 
4780: 70 53 74 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20  pStart->z, n);. 
4790: 20 20 20 7d 0a 20 20 20 20 6c 62 6c 31 20 3d 20     }.    lbl1 = 
47a0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
47b0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 6c 62 6c 32  bel(v);.    lbl2
47c0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
47d0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73  eLabel(v);.    s
47e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
47f0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 30 2c 20 6c 62  , OP_Next, 0, lb
4800: 6c 32 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20  l2, 0, lbl1);.  
4810: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4820: 70 28 76 2c 20 4f 50 5f 4b 65 79 2c 20 30 2c 20  p(v, OP_Key, 0, 
4830: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 66 6f  0, 0, 0);.    fo
4840: 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d  r(i=0; i<pIndex-
4850: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
4860: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4870: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 65 6c  AddOp(v, OP_Fiel
4880: 64 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 61 69  d, 0, pIndex->ai
4890: 43 6f 6c 75 6d 6e 5b 69 5d 2c 20 30 2c 20 30 29  Column[i], 0, 0)
48a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
48b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
48c0: 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 49 6e 64 65  P_MakeKey, pInde
48d0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30  x->nColumn, 0, 0
48e0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
48f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4900: 50 75 74 49 64 78 2c 20 31 2c 20 30 2c 20 30 2c  PutIdx, 1, 0, 0,
4910: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
4920: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
4930: 6f 74 6f 2c 20 30 2c 20 6c 62 6c 31 2c 20 30 2c  oto, 0, lbl1, 0,
4940: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
4950: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
4960: 6f 6f 70 2c 20 30 2c 20 30 2c 20 30 2c 20 6c 62  oop, 0, 0, 0, lb
4970: 6c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  l2);.    sqliteV
4980: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
4990: 6c 6f 73 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30  lose, 1, 0, 0, 0
49a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
49b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
49c0: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  se, 0, 0, 0, 0);
49d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
49e0: 69 6d 20 6d 65 6d 6f 72 79 20 6f 6e 20 61 6e 20  im memory on an 
49f0: 45 58 50 4c 41 49 4e 20 63 61 6c 6c 2e 0a 20 20  EXPLAIN call..  
4a00: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
4a10: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
4a20: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
4a30: 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c  x);.  }..  /* Cl
4a40: 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
4a50: 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
4a60: 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71  eate_index:.  sq
4a70: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
4a80: 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  (pList);.  sqlit
4a90: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
4aa0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
4ab0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
4ac0: 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
4ad0: 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
4ae0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
4af0: 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
4b00: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
4b10: 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
4b20: 70 49 6e 64 65 78 3b 0a 20 20 63 68 61 72 20 2a  pIndex;.  char *
4b30: 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65 20 2a 76  zName;.  Vdbe *v
4b40: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  ;..  zName = sql
4b50: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
4b60: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
4b70: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 46  pIndex = sqliteF
4b80: 69 6e 64 49 6e 64 65 78 28 70 50 61 72 73 65 2d  indIndex(pParse-
4b90: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  >db, zName);.  s
4ba0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
4bb0: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
4bc0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
4bd0: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
4be0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
4bf0: 73 75 63 68 20 69 6e 64 65 78 3a 20 22 2c 20 30  such index: ", 0
4c00: 2c 20 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65  , .        pName
4c10: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30  ->z, pName->n, 0
4c20: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
4c30: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
4c40: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  n;.  }..  /* Gen
4c50: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
4c60: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
4c70: 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
4c80: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
4c90: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
4ca0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
4cb0: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
4cc0: 64 62 65 4f 70 20 64 72 6f 70 49 6e 64 65 78 5b  dbeOp dropIndex[
4cd0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
4ce0: 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20 30 2c 20  _Open,       0, 
4cf0: 31 2c 20 20 20 20 20 20 20 4d 41 53 54 45 52 5f  1,       MASTER_
4d00: 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  NAME},.      { O
4d10: 50 5f 4c 69 73 74 4f 70 65 6e 2c 20 20 20 30 2c  P_ListOpen,   0,
4d20: 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   0,       0},.  
4d30: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
4d40: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
4d50: 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20   0}, /* 2 */.   
4d60: 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20     { OP_Next,   
4d70: 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
4d80: 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20  0}, /* 3 */.    
4d90: 20 20 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20    { OP_Dup,     
4da0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
4db0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 46 69  },.      { OP_Fi
4dc0: 65 6c 64 2c 20 20 20 20 20 20 30 2c 20 31 2c 20  eld,      0, 1, 
4dd0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
4de0: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
4df0: 20 30 2c 20 41 44 44 52 28 33 29 2c 20 30 7d 2c   0, ADDR(3), 0},
4e00: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4b 65 79 2c  .      { OP_Key,
4e10: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20          0, 0,   
4e20: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
4e30: 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30  OP_Delete,     0
4e40: 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 0,       0},. 
4e50: 20 20 20 20 20 7b 20 4f 50 5f 44 65 73 74 72 6f       { OP_Destro
4e60: 79 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  y,    0, 0,     
4e70: 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20    0}, /* 9 */.  
4e80: 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20      { OP_Close, 
4e90: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
4ea0: 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
4eb0: 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20 20 62  int base;..    b
4ec0: 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ase = sqliteVdbe
4ed0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
4ee0: 61 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78  aySize(dropIndex
4ef0: 29 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20  ), dropIndex);. 
4f00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
4f10: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32 2c  ngeP3(v, base+2,
4f20: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
4f30: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
4f40: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61  beChangeP3(v, ba
4f50: 73 65 2b 39 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  se+9, pIndex->zN
4f60: 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  ame, 0);.  }..  
4f70: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e  /* Remove the in
4f80: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 61 6e  dex structure an
4f90: 64 20 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72  d free its memor
4fa0: 79 2e 20 20 45 78 63 65 70 74 20 69 66 20 74 68  y.  Except if th
4fb0: 65 0a 20 20 2a 2a 20 45 58 50 4c 41 49 4e 20 6b  e.  ** EXPLAIN k
4fc0: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
4fd0: 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  t, no changes ar
4fe0: 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69  e made..  */.  i
4ff0: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
5000: 61 69 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ain ){.    if( p
5010: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
5020: 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b  Index==pIndex ){
5030: 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
5040: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
5050: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
5060: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5070: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20  Index *p;.      
5080: 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54  for(p=pIndex->pT
5090: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20  able->pIndex; p 
50a0: 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e  && p->pNext!=pIn
50b0: 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  dex; p=p->pNext)
50c0: 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26  {}.      if( p &
50d0: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
50e0: 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ex ){.        p-
50f0: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
5100: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
5110: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
5120: 44 65 6c 65 74 65 49 6e 64 65 78 28 70 50 61 72  DeleteIndex(pPar
5130: 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 29 3b  se->db, pIndex);
5140: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
5150: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
5160: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
5170: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
5180: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
5190: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
51a0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
51b0: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
51c0: 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ist..*/.ExprList
51d0: 20 2a 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74   *sqliteExprList
51e0: 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20  Append(ExprList 
51f0: 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45  *pList, Expr *pE
5200: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  xpr, Token *pNam
5210: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
5220: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
5230: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
5240: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
5250: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 7d  ExprList) );.  }
5260: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
5270: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
5280: 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ( (pList->nExpr 
5290: 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  & 7)==0 ){.    i
52a0: 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nt n = pList->nE
52b0: 78 70 72 20 2b 20 38 3b 0a 20 20 20 20 70 4c 69  xpr + 8;.    pLi
52c0: 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65  st->a = sqliteRe
52d0: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
52e0: 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  n*sizeof(pList->
52f0: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
5300: 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20  pList->a==0 ){. 
5310: 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70       pList->nExp
5320: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  r = 0;.      ret
5330: 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d  urn pList;.    }
5340: 0a 20 20 7d 0a 20 20 69 20 3d 20 70 4c 69 73 74  .  }.  i = pList
5350: 2d 3e 6e 45 78 70 72 2b 2b 3b 0a 20 20 70 4c 69  ->nExpr++;.  pLi
5360: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
5370: 20 70 45 78 70 72 3b 0a 20 20 70 4c 69 73 74 2d   pExpr;.  pList-
5380: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b  >a[i].zName = 0;
5390: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
53a0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
53b0: 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69  ring(&pList->a[i
53c0: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
53d0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b  z, pName->n, 0);
53e0: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f  .    sqliteDequo
53f0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  te(pList->a[i].z
5400: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Name);.  }.  ret
5410: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
5420: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
5430: 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tire expression 
5440: 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
5450: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
5460: 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  te(ExprList *pLi
5470: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
5480: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
5490: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
54a0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
54b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
54c0: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69  teExprDelete(pLi
54d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
54e0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
54f0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
5500: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
5510: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
5520: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
5530: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  st);.}../*.** Ap
5540: 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
5550: 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
5560: 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
5570: 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
5580: 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2f 0a 49  ** need be..*/.I
5590: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 49 64 4c  dList *sqliteIdL
55a0: 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74  istAppend(IdList
55b0: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
55c0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70  pToken){.  if( p
55d0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
55e0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
55f0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69  loc( sizeof(IdLi
5600: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
5610: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
5620: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   0;.  }.  if( (p
5630: 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37 29 3d 3d  List->nId & 7)==
5640: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  0 ){.    pList->
5650: 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  a = sqliteReallo
5660: 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69  c(pList->a, (pLi
5670: 73 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65 6f  st->nId+8)*sizeo
5680: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
5690: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
56a0: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  >a==0 ){.      p
56b0: 4c 69 73 74 2d 3e 6e 49 64 20 3d 20 30 3b 0a 20  List->nId = 0;. 
56c0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 4c 69 73       return pLis
56d0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d  t;.    }.  }.  m
56e0: 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b  emset(&pList->a[
56f0: 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20  pList->nId], 0, 
5700: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
5710: 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  0]));.  if( pTok
5720: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
5730: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73  SetNString(&pLis
5740: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d  t->a[pList->nId]
5750: 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 2d 3e  .zName, pToken->
5760: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29  z, pToken->n, 0)
5770: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75  ;.    sqliteDequ
5780: 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  ote(pList->a[pLi
5790: 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 29 3b  st->nId].zName);
57a0: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49  .  }.  pList->nI
57b0: 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  d++;.  return pL
57c0: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ist;.}../*.** Ad
57d0: 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
57e0: 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
57f0: 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
5800: 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
5810: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64  */.void sqliteId
5820: 4c 69 73 74 41 64 64 41 6c 69 61 73 28 49 64 4c  ListAddAlias(IdL
5830: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
5840: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
5850: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
5860: 2d 3e 6e 49 64 3e 30 20 29 7b 0a 20 20 20 20 69  ->nId>0 ){.    i
5870: 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 49  nt i = pList->nI
5880: 64 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  d - 1;.    sqlit
5890: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69  eSetNString(&pLi
58a0: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c  st->a[i].zAlias,
58b0: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
58c0: 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73  en->n, 0);.    s
58d0: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69  qliteDequote(pLi
58e0: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29  st->a[i].zAlias)
58f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
5900: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
5910: 49 64 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  IdList.*/.void s
5920: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
5930: 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  e(IdList *pList)
5940: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
5950: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
5960: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
5970: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
5980: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
5990: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
59a0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
59b0: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
59c0: 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20  .zAlias);.  }.  
59d0: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
59e0: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ->a);.  sqliteFr
59f0: 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 0a 2f  ee(pList);.}.../
5a00: 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59 20 63 6f  *.** The COPY co
5a10: 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20 63 6f 6d  mmand is for com
5a20: 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
5a30: 50 6f 73 74 67 72 65 53 51 4c 20 61 6e 64 20 73  PostgreSQL and s
5a40: 70 65 63 69 66 69 63 69 61 6c 6c 79 0a 2a 2a 20  pecificially.** 
5a50: 66 6f 72 20 74 68 65 20 61 62 69 6c 69 74 79 20  for the ability 
5a60: 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74 70  to read the outp
5a70: 75 74 20 6f 66 20 70 67 5f 64 75 6d 70 2e 20 20  ut of pg_dump.  
5a80: 54 68 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  The format is as
5a90: 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  .** follows:.**.
5aa0: 2a 2a 20 20 20 20 43 4f 50 59 20 74 61 62 6c 65  **    COPY table
5ab0: 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55 53 49 4e   FROM file [USIN
5ac0: 47 20 44 45 4c 49 4d 49 54 45 52 53 20 73 74 72  G DELIMITERS str
5ad0: 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74 61 62 6c  ing].**.** "tabl
5ae0: 65 22 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e  e" is an existin
5af0: 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 57  g table name.  W
5b00: 65 20 77 69 6c 6c 20 72 65 61 64 20 6c 69 6e 65  e will read line
5b10: 73 20 6f 66 20 63 6f 64 65 20 66 72 6f 6d 0a 2a  s of code from.*
5b20: 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c 6c 20 74  * file to fill t
5b30: 68 69 73 20 74 61 62 6c 65 20 77 69 74 68 20 64  his table with d
5b40: 61 74 61 2e 20 20 46 69 6c 65 20 6d 69 67 68 74  ata.  File might
5b50: 20 62 65 20 22 73 74 64 69 6e 22 2e 20 20 54 68   be "stdin".  Th
5b60: 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 65  e optional.** de
5b70: 6c 69 6d 69 74 65 72 20 73 74 72 69 6e 67 20 69  limiter string i
5b80: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 66 69  dentifies the fi
5b90: 65 6c 64 20 73 65 70 61 72 61 74 6f 72 73 2e 20  eld separators. 
5ba0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
5bb0: 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69 64 20 73  a tab..*/.void s
5bc0: 71 6c 69 74 65 43 6f 70 79 28 0a 20 20 50 61 72  qliteCopy(.  Par
5bd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5be0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
5bf0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
5c00: 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20  en *pTableName, 
5c10: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66    /* The name of
5c20: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20   the table into 
5c30: 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20 69 6e  which we will in
5c40: 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  sert */.  Token 
5c50: 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f  *pFilename,    /
5c60: 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20  * The file from 
5c70: 77 68 69 63 68 20 74 6f 20 6f 62 74 61 69 6e 20  which to obtain 
5c80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
5c90: 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69 6d 69 74   Token *pDelimit
5ca0: 65 72 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69  er    /* Use thi
5cb0: 73 20 61 73 20 74 68 65 20 66 69 65 6c 64 20 64  s as the field d
5cc0: 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 29 7b 0a 20  elimiter */.){. 
5cd0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
5ce0: 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20 69 6e  char *zTab;.  in
5cf0: 74 20 69 2c 20 6a 3b 0a 20 20 56 64 62 65 20 2a  t i, j;.  Vdbe *
5d00: 76 3b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 65  v;.  int addr, e
5d10: 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  nd;.  Index *pId
5d20: 78 3b 0a 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c  x;..  zTab = sql
5d30: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
5d40: 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65  Token(pTableName
5d50: 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  );.  pTab = sqli
5d60: 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  teFindTable(pPar
5d70: 73 65 2d 3e 64 62 2c 20 7a 54 61 62 29 3b 0a 20  se->db, zTab);. 
5d80: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61 62   sqliteFree(zTab
5d90: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
5da0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
5db0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
5dc0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
5dd0: 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c  uch table: ", 0,
5de0: 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65   .        pTable
5df0: 4e 61 6d 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e  Name->z, pTableN
5e00: 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ame->n, 0);.    
5e10: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
5e20: 20 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c      goto copy_cl
5e30: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28  eanup;.  }.  if(
5e40: 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
5e50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
5e60: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
5e70: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
5e80: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
5e90: 20 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f          " may no
5ea0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 22 2c 20  t be modified", 
5eb0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
5ec0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
5ed0: 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20   copy_cleanup;. 
5ee0: 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47   }.  v = sqliteG
5ef0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
5f00: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 61    if( v ){.    a
5f10: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
5f20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65  AddOp(v, OP_File
5f30: 4f 70 65 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Open, 0, 0, 0, 0
5f40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
5f50: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
5f60: 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c  r, pFilename->z,
5f70: 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a   pFilename->n);.
5f80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
5f90: 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29  quoteP3(v, addr)
5fa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
5fb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
5fc0: 2c 20 30 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 1, pTab->zN
5fd0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  ame, 0);.    for
5fe0: 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d  (i=1, pIdx=pTab-
5ff0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
6000: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
6010: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
6020: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6030: 4f 50 5f 4f 70 65 6e 2c 20 69 2c 20 31 2c 20 70  OP_Open, i, 1, p
6040: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Idx->zName, 0);.
6050: 20 20 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20      }.    end = 
6060: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
6070: 62 65 6c 28 76 29 3b 0a 20 20 20 20 61 64 64 72  bel(v);.    addr
6080: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
6090: 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61  Op(v, OP_FileRea
60a0: 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65  d, pTab->nCol, e
60b0: 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  nd, 0, 0);.    i
60c0: 66 28 20 70 44 65 6c 69 6d 69 74 65 72 20 29 7b  f( pDelimiter ){
60d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
60e0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
60f0: 72 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a  r, pDelimiter->z
6100: 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29  , pDelimiter->n)
6110: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6120: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61  beDequoteP3(v, a
6130: 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
6140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6150: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
6160: 72 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20  r, "\t", 1);.   
6170: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
6180: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
6190: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
61a0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 49 6e     if( pTab->pIn
61b0: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  dex ){.      sql
61c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
61d0: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30 2c  OP_Dup, 0, 0, 0,
61e0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
61f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
6200: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
6210: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6220: 70 28 76 2c 20 4f 50 5f 46 69 6c 65 46 69 65 6c  p(v, OP_FileFiel
6230: 64 2c 20 69 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d, i, 0, 0, 0);.
6240: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6250: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6260: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 54 61 62  MakeRecord, pTab
6270: 2d 3e 6e 43 6f 6c 2c 20 30 2c 20 30 2c 20 30 29  ->nCol, 0, 0, 0)
6280: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
6290: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 2c  AddOp(v, OP_Put,
62a0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
62b0: 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d    for(i=1, pIdx=
62c0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
62d0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
62e0: 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Next, i++){.    
62f0: 20 20 69 66 28 20 70 49 64 78 2d 3e 70 4e 65 78    if( pIdx->pNex
6300: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
6310: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6320: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30 2c  OP_Dup, 0, 0, 0,
6330: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
6340: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
6350: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
6360: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6370: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6380: 5f 46 69 6c 65 46 69 65 6c 64 2c 20 70 49 64 78  _FileField, pIdx
6390: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30  ->aiColumn[j], 0
63a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
63b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
63c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
63d0: 65 4b 65 79 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  eKey, pIdx->nCol
63e0: 75 6d 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  umn, 0, 0, 0);. 
63f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6400: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 64  ddOp(v, OP_PutId
6410: 78 2c 20 69 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  x, i, 0, 0, 0);.
6420: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6430: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6440: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2c 20 30  Goto, 0, addr, 0
6450: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6460: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6470: 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 30 2c 20 65  Noop, 0, 0, 0, e
6480: 6e 64 29 3b 0a 20 20 7d 0a 20 20 0a 63 6f 70 79  nd);.  }.  .copy
6490: 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 72 65 74 75  _cleanup:.  retu
64a0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rn;.}../*.** The
64b0: 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 56 41   non-standard VA
64c0: 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 69 73 20  CUUM command is 
64d0: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
64e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
64f0: 2a 20 63 6f 6c 6c 61 70 73 65 20 66 72 65 65 20  * collapse free 
6500: 73 70 61 63 65 2c 20 65 74 63 2e 20 20 49 74 20  space, etc.  It 
6510: 69 73 20 6d 6f 64 65 6c 6c 65 64 20 61 66 74 65  is modelled afte
6520: 72 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f 6d  r the VACUUM com
6530: 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50 6f 73 74 67  mand.** in Postg
6540: 72 65 53 51 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reSQL..*/.void s
6550: 71 6c 69 74 65 56 61 63 75 75 6d 28 50 61 72 73  qliteVacuum(Pars
6560: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
6570: 20 2a 70 54 61 62 6c 65 4e 61 6d 65 29 7b 0a 20   *pTableName){. 
6580: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
6590: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
65a0: 70 54 61 62 6c 65 4e 61 6d 65 20 29 7b 0a 20 20  pTableName ){.  
65b0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
65c0: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
65d0: 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  en(pTableName);.
65e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61    }else{.    zNa
65f0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  me = 0;.  }.  if
6600: 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74  ( zName && sqlit
6610: 65 46 69 6e 64 49 6e 64 65 78 28 70 50 61 72 73  eFindIndex(pPars
6620: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3d 3d 30  e->db, zName)==0
6630: 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 46 69  .    && sqliteFi
6640: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
6650: 64 62 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  db, zName)==0 ){
6660: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
6670: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
6680: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
6690: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 3a 20  table or index: 
66a0: 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", zName, 0);.  
66b0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
66c0: 3b 0a 20 20 20 20 67 6f 74 6f 20 76 61 63 75 75  ;.    goto vacuu
66d0: 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  m_cleanup;.  }. 
66e0: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
66f0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
6700: 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 76 61  ( v==0 ) goto va
6710: 63 75 75 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  cuum_cleanup;.  
6720: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
6730: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6740: 28 76 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a  (v, OP_Reorganiz
6750: 65 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20  e, 0, 0, zName, 
6760: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
6770: 20 69 6e 74 20 68 3b 0a 20 20 20 20 54 61 62 6c   int h;.    Tabl
6780: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 49 6e 64  e *pTab;.    Ind
6790: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
67a0: 72 28 68 3d 30 3b 20 68 3c 4e 5f 48 41 53 48 3b  r(h=0; h<N_HASH;
67b0: 20 68 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   h++){.      for
67c0: 28 70 54 61 62 3d 70 50 61 72 73 65 2d 3e 64 62  (pTab=pParse->db
67d0: 2d 3e 61 70 54 62 6c 48 61 73 68 5b 68 5d 3b 20  ->apTblHash[h]; 
67e0: 70 54 61 62 3b 20 70 54 61 62 3d 70 54 61 62 2d  pTab; pTab=pTab-
67f0: 3e 70 48 61 73 68 29 7b 0a 20 20 20 20 20 20 20  >pHash){.       
6800: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6810: 28 76 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a  (v, OP_Reorganiz
6820: 65 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  e, 0, 0, pTab->z
6830: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
6840: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
6850: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
6860: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
6870: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
6880: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6890: 50 5f 52 65 6f 72 67 61 6e 69 7a 65 2c 20 30 2c  P_Reorganize, 0,
68a0: 20 30 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c   0, pIdx->zName,
68b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
68c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
68d0: 0a 0a 76 61 63 75 75 6d 5f 63 6c 65 61 6e 75 70  ..vacuum_cleanup
68e0: 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  :.  sqliteFree(z
68f0: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
6900: 0a 7d 0a                                         .}.