/ Hex Artifact Content
Login

Artifact 4d90e9e94750ca80249fc7958c617021d8bb7a50:


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 33 20 32 30 30 30 2f 30 38 2f  ,v 1.23 2000/08/
0500: 30 33 20 31 35 3a 30 39 3a 32 30 20 64 72 68 20  03 15:09:20 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 20 20 69 6e 74 20 61 64 64 4d 65 74 61 3b 20  .  int addMeta; 
23d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
23e0: 20 69 6e 73 65 72 74 20 61 20 6d 65 74 61 20 72   insert a meta r
23f0: 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20  ecords into the 
2400: 66 69 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  file */..  if( p
2410: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
2420: 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72  turn;.  p = pPar
2430: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
2440: 20 61 64 64 4d 65 74 61 20 3d 20 20 70 21 3d 30   addMeta =  p!=0
2450: 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   && pParse->db->
2460: 6e 54 61 62 6c 65 3d 3d 31 3b 0a 0a 20 20 2f 2a  nTable==1;..  /*
2470: 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
2480: 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
2490: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
24a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
24b0: 20 2a 2f 0a 20 20 69 66 28 20 70 21 3d 30 20 26   */.  if( p!=0 &
24c0: 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  & pParse->explai
24d0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 68 20 3d 20  n==0 ){.    h = 
24e0: 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61 73 65  sqliteHashNoCase
24f0: 28 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 25 20  (p->zName, 0) % 
2500: 4e 5f 48 41 53 48 3b 0a 20 20 20 20 70 2d 3e 70  N_HASH;.    p->p
2510: 48 61 73 68 20 3d 20 70 50 61 72 73 65 2d 3e 64  Hash = pParse->d
2520: 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b 68 5d 3b  b->apTblHash[h];
2530: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d  .    pParse->db-
2540: 3e 61 70 54 62 6c 48 61 73 68 5b 68 5d 20 3d 20  >apTblHash[h] = 
2550: 70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  p;.    pParse->p
2560: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
2570: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 54    pParse->db->nT
2580: 61 62 6c 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  able++;.  }..  /
2590: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
25a0: 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
25b0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  te the table on 
25c0: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
25d0: 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c   !pParse->initFl
25e0: 61 67 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  ag ){.    static
25f0: 20 56 64 62 65 4f 70 20 61 64 64 54 61 62 6c 65   VdbeOp addTable
2600: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
2610: 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 30  P_Open,        0
2620: 2c 20 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  , 1, MASTER_NAME
2630: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e   },.      { OP_N
2640: 65 77 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30  ew,         0, 0
2650: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
2660: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c  _String,      0,
2670: 20 30 2c 20 22 74 61 62 6c 65 22 20 20 20 20 20   0, "table"     
2680: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  },.      { OP_St
2690: 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c  ring,      0, 0,
26a0: 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20   0},            
26b0: 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
26c0: 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20  OP_String,      
26d0: 30 2c 20 30 2c 20 30 7d 2c 20 20 20 20 20 20 20  0, 0, 0},       
26e0: 20 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20       /* 4 */.   
26f0: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20     { OP_String, 
2700: 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 20 20       0, 0, 0},  
2710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35 20 2a            /* 5 *
2720: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 61 6b  /.      { OP_Mak
2730: 65 52 65 63 6f 72 64 2c 20 20 34 2c 20 30 2c 20  eRecord,  4, 0, 
2740: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 50  0},.      { OP_P
2750: 75 74 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30  ut,         0, 0
2760: 2c 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20  , 0},.    };.   
2770: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 61   static VdbeOp a
2780: 64 64 56 65 72 73 69 6f 6e 5b 5d 20 3d 20 7b 0a  ddVersion[] = {.
2790: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 77 2c 20        { OP_New, 
27a0: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d          0, 0, 0}
27b0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72  ,.      { OP_Str
27c0: 69 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c 20  ing,      0, 0, 
27d0: 22 6d 65 74 61 22 20 20 20 20 20 20 20 20 20 20  "meta"          
27e0: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f    },.      { OP_
27f0: 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20  String,      0, 
2800: 30 2c 20 22 22 20 20 20 20 20 20 20 20 20 20 20  0, ""           
2810: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2820: 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20  OP_String,      
2830: 30 2c 20 30 2c 20 22 22 20 20 20 20 20 20 20 20  0, 0, ""        
2840: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2850: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
2860: 20 20 20 30 2c 20 30 2c 20 22 66 69 6c 65 20 66     0, 0, "file f
2870: 6f 72 6d 61 74 20 32 22 20 20 20 7d 2c 0a 20 20  ormat 2"   },.  
2880: 20 20 20 20 7b 20 4f 50 5f 4d 61 6b 65 52 65 63      { OP_MakeRec
2890: 6f 72 64 2c 20 20 34 2c 20 30 2c 20 30 7d 2c 0a  ord,  4, 0, 0},.
28a0: 20 20 20 20 20 20 7b 20 4f 50 5f 50 75 74 2c 20        { OP_Put, 
28b0: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d          0, 0, 0}
28c0: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ,.    };.    int
28d0: 20 6e 2c 20 62 61 73 65 3b 0a 20 20 20 20 56 64   n, base;.    Vd
28e0: 62 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20  be *v;..    v = 
28f0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
2900: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
2910: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2920: 20 20 6e 20 3d 20 28 69 6e 74 29 70 45 6e 64 2d    n = (int)pEnd-
2930: 3e 7a 20 2d 20 28 69 6e 74 29 70 50 61 72 73 65  >z - (int)pParse
2940: 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 20  ->sFirstToken.z 
2950: 2b 20 31 3b 0a 20 20 20 20 62 61 73 65 20 3d 20  + 1;.    base = 
2960: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
2970: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
2980: 28 61 64 64 54 61 62 6c 65 29 2c 20 61 64 64 54  (addTable), addT
2990: 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  able);.    sqlit
29a0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
29b0: 20 62 61 73 65 2b 33 2c 20 70 2d 3e 7a 4e 61 6d   base+3, p->zNam
29c0: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
29d0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
29e0: 20 62 61 73 65 2b 34 2c 20 70 2d 3e 7a 4e 61 6d   base+4, p->zNam
29f0: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
2a00: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
2a10: 20 62 61 73 65 2b 35 2c 20 70 50 61 72 73 65 2d   base+5, pParse-
2a20: 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20  >sFirstToken.z, 
2a30: 6e 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 4d  n);.    if( addM
2a40: 65 74 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eta ){.      sql
2a50: 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
2a60: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 61 64  (v, ArraySize(ad
2a70: 64 56 65 72 73 69 6f 6e 29 2c 20 61 64 64 56 65  dVersion), addVe
2a80: 72 73 69 6f 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  rsion);.    }.  
2a90: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
2aa0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
2ab0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
2ac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
2ad0: 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20   token, look up 
2ae0: 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 61  a table with tha
2af0: 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74 20  t name.  If not 
2b00: 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a 20  found, leave.** 
2b10: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68 65  an error for the
2b20: 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64 20   parser to find 
2b30: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
2b40: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
2b50: 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28  eTableFromToken(
2b60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
2b70: 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63  oken *pTok){.  c
2b80: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c  har *zName = sql
2b90: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
2ba0: 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 54  Token(pTok);.  T
2bb0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
2bc0: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61  iteFindTable(pPa
2bd0: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b  rse->db, zName);
2be0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
2bf0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
2c00: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2c10: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
2c20: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e  rse->zErrMsg, "n
2c30: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c  o such table: ",
2c40: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70 54 6f   0, .        pTo
2c50: 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20 30  k->z, pTok->n, 0
2c60: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
2c70: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Err++;.  }.  ret
2c80: 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
2c90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ca0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
2cb0: 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
2cc0: 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
2cd0: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
2ce0: 74 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  teDropTable(Pars
2cf0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
2d00: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
2d10: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 69 6e 74  e *pTable;.  int
2d20: 20 68 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20   h;.  Vdbe *v;. 
2d30: 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20 70 54   int base;..  pT
2d40: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 54 61 62  able = sqliteTab
2d50: 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  leFromToken(pPar
2d60: 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  se, pName);.  if
2d70: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
2d80: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62  turn;.  if( pTab
2d90: 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  le->readOnly ){.
2da0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
2db0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
2dc0: 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20  rMsg, "table ", 
2dd0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 0a  pTable->zName, .
2de0: 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74         " may not
2df0: 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
2e00: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
2e10: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
2e20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
2e30: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
2e40: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72  ove the table fr
2e50: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
2e60: 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b  ble.  ** on disk
2e70: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
2e80: 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73  iteGetVdbe(pPars
2e90: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
2ea0: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
2eb0: 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b   dropTable[] = {
2ec0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e  .      { OP_Open
2ed0: 2c 20 20 20 20 20 20 20 30 2c 20 31 2c 20 20 20  ,       0, 1,   
2ee0: 20 20 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45       MASTER_NAME
2ef0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4c   },.      { OP_L
2f00: 69 73 74 4f 70 65 6e 2c 20 20 20 30 2c 20 30 2c  istOpen,   0, 0,
2f10: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
2f20: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
2f30: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
2f40: 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20  0}, /* 2 */.    
2f50: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
2f60: 20 20 20 30 2c 20 41 44 44 52 28 31 30 29 2c 20     0, ADDR(10), 
2f70: 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20  0}, /* 3 */.    
2f80: 20 20 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20    { OP_Dup,     
2f90: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
2fa0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 46  0},.      { OP_F
2fb0: 69 65 6c 64 2c 20 20 20 20 20 20 30 2c 20 32 2c  ield,      0, 2,
2fc0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
2fd0: 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20    { OP_Ne,      
2fe0: 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20     0, ADDR(3),  
2ff0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4b  0},.      { OP_K
3000: 65 79 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c  ey,        0, 0,
3010: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
3020: 20 20 7b 20 4f 50 5f 4c 69 73 74 57 72 69 74 65    { OP_ListWrite
3030: 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  ,  0, 0,        
3040: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47  0},.      { OP_G
3050: 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44  oto,       0, AD
3060: 44 52 28 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20  DR(3),  0},.    
3070: 20 20 7b 20 4f 50 5f 4c 69 73 74 52 65 77 69 6e    { OP_ListRewin
3080: 64 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  d, 0, 0,        
3090: 30 7d 2c 20 2f 2a 20 31 30 20 2a 2f 0a 20 20 20  0}, /* 10 */.   
30a0: 20 20 20 7b 20 4f 50 5f 4c 69 73 74 52 65 61 64     { OP_ListRead
30b0: 2c 20 20 20 30 2c 20 41 44 44 52 28 31 34 29 2c  ,   0, ADDR(14),
30c0: 20 30 7d 2c 20 2f 2a 20 31 31 20 2a 2f 0a 20 20   0}, /* 11 */.  
30d0: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
30e0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
30f0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
3100: 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20  _Goto,       0, 
3110: 41 44 44 52 28 31 31 29 2c 20 30 7d 2c 0a 20 20  ADDR(11), 0},.  
3120: 20 20 20 20 7b 20 4f 50 5f 44 65 73 74 72 6f 79      { OP_Destroy
3130: 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ,    0, 0,      
3140: 20 20 30 7d 2c 20 2f 2a 20 31 34 20 2a 2f 0a 20    0}, /* 14 */. 
3150: 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c       { OP_Close,
3160: 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20        0, 0,     
3170: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
3180: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
3190: 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
31a0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
31b0: 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54   ArraySize(dropT
31c0: 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65  able), dropTable
31d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
31e0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
31f0: 65 2b 32 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  e+2, pTable->zNa
3200: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
3210: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
3220: 2c 20 62 61 73 65 2b 31 34 2c 20 70 54 61 62 6c  , base+14, pTabl
3230: 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  e->zName, 0);.  
3240: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c    for(pIdx=pTabl
3250: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  e->pIndex; pIdx;
3260: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
3270: 74 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t){.      sqlite
3280: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3290: 44 65 73 74 72 6f 79 2c 20 30 2c 20 30 2c 20 70  Destroy, 0, 0, p
32a0: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Idx->zName, 0);.
32b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
32c0: 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 2d 6d 65  Remove the in-me
32d0: 6d 6f 72 79 20 74 61 62 6c 65 20 73 74 72 75 63  mory table struc
32e0: 74 75 72 65 20 61 6e 64 20 66 72 65 65 20 69 74  ture and free it
32f0: 73 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a 2a 0a 20  s memory..  **. 
3300: 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 69   ** Exception: i
3310: 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
3320: 65 6e 74 20 62 65 67 61 6e 20 77 69 74 68 20 74  ent began with t
3330: 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f  he EXPLAIN keywo
3340: 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6e 6f  rd,.  ** then no
3350: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
3360: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
3370: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
3380: 7b 0a 20 20 20 20 68 20 3d 20 73 71 6c 69 74 65  {.    h = sqlite
3390: 48 61 73 68 4e 6f 43 61 73 65 28 70 54 61 62 6c  HashNoCase(pTabl
33a0: 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e  e->zName, 0) % N
33b0: 5f 48 41 53 48 3b 0a 20 20 20 20 69 66 28 20 70  _HASH;.    if( p
33c0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 70 54 62 6c  Parse->db->apTbl
33d0: 48 61 73 68 5b 68 5d 3d 3d 70 54 61 62 6c 65 20  Hash[h]==pTable 
33e0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
33f0: 3e 64 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b 68  >db->apTblHash[h
3400: 5d 20 3d 20 70 54 61 62 6c 65 2d 3e 70 48 61 73  ] = pTable->pHas
3410: 68 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  h;.    }else{.  
3420: 20 20 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20      Table *p;.  
3430: 20 20 20 20 66 6f 72 28 70 3d 70 50 61 72 73 65      for(p=pParse
3440: 2d 3e 64 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b  ->db->apTblHash[
3450: 68 5d 3b 20 70 20 26 26 20 70 2d 3e 70 48 61 73  h]; p && p->pHas
3460: 68 21 3d 70 54 61 62 6c 65 3b 20 70 3d 70 2d 3e  h!=pTable; p=p->
3470: 70 48 61 73 68 29 7b 7d 0a 20 20 20 20 20 20 69  pHash){}.      i
3480: 66 28 20 70 20 26 26 20 70 2d 3e 70 48 61 73 68  f( p && p->pHash
3490: 3d 3d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ==pTable ){.    
34a0: 20 20 20 20 70 2d 3e 70 48 61 73 68 20 3d 20 70      p->pHash = p
34b0: 54 61 62 6c 65 2d 3e 70 48 61 73 68 3b 0a 20 20  Table->pHash;.  
34c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
34d0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 54 61 62  pParse->db->nTab
34e0: 6c 65 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  le--;.    sqlite
34f0: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 50 61 72  DeleteTable(pPar
3500: 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 29 3b  se->db, pTable);
3510: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
3520: 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
3530: 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
3540: 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74 68  e.  pIndex is th
3550: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
3560: 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62  dex .** and pTab
3570: 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  le is the name o
3580: 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
3590: 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
35a0: 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
35b0: 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
35c0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 6e  primary key.  In
35d0: 20 74 68 61 74 20 63 61 73 65 2c 20 75 73 65 20   that case, use 
35e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
35f0: 65 20 61 73 20 74 68 65 20 0a 2a 2a 20 74 61 62  e as the .** tab
3600: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
3610: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
3620: 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
3630: 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
3640: 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
3650: 20 4e 55 4c 4c 20 69 66 20 74 68 65 0a 2a 2a 20   NULL if the.** 
3660: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
3670: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
3680: 65 20 74 61 62 6c 65 20 69 73 20 6c 61 62 65 6c  e table is label
3690: 65 64 20 61 73 20 74 68 65 20 70 72 69 6d 61 72  ed as the primar
36a0: 79 20 6b 65 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  y key..*/.void s
36b0: 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78  qliteCreateIndex
36c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
36d0: 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f  e,   /* All info
36e0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
36f0: 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
3700: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f  ken *pName,    /
3710: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
3720: 64 65 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  dex.  May be NUL
3730: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  L */.  Token *pT
3740: 61 62 6c 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  able,   /* Name 
3750: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
3760: 69 6e 64 65 78 2e 20 20 55 73 65 20 70 50 61 72  index.  Use pPar
3770: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
3780: 20 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a   0 */.  IdList *
3790: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
37a0: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
37b0: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
37c0: 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
37d0: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
37e0: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
37f0: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
3800: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
3810: 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20  Token *pEnd     
3820: 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
3830: 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
3840: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
3850: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  nt */.){.  Table
3860: 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54   *pTab;     /* T
3870: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
3880: 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
3890: 49 6e 64 65 78 3b 20 20 20 2f 2a 20 54 68 65 20  Index;   /* The 
38a0: 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
38b0: 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
38c0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
38d0: 69 2c 20 6a 2c 20 68 3b 0a 20 20 54 6f 6b 65 6e  i, j, h;.  Token
38e0: 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46   nullId;    /* F
38f0: 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
3900: 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
3910: 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  /..  /*.  ** Fin
3920: 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
3930: 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
3940: 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
3950: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
3960: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
3970: 21 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62 20  !=0 ){.    pTab 
3980: 3d 20 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72  =  sqliteTableFr
3990: 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20  omToken(pParse, 
39a0: 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  pTable);.  }else
39b0: 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70 50  {.    pTab =  pP
39c0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
39d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 3d  .  }.  if( pTab=
39e0: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
39f0: 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  rr ) goto exit_c
3a00: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69  reate_index;.  i
3a10: 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
3a20: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
3a30: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
3a40: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
3a50: 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  e ", pTab->zName
3a60: 2c 20 0a 20 20 20 20 20 20 22 20 6d 61 79 20 6e  , .      " may n
3a70: 6f 74 20 68 61 76 65 20 6e 65 77 20 69 6e 64 69  ot have new indi
3a80: 63 65 73 20 61 64 64 65 64 22 2c 20 30 29 3b 0a  ces added", 0);.
3a90: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
3aa0: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ++;.    goto exi
3ab0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
3ac0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
3ad0: 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
3ae0: 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
3af0: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
3b00: 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
3b10: 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
3b20: 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
3b30: 73 61 6d 65 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  same name..  */.
3b40: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
3b50: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
3b60: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
3b70: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 7d 65  ken(pName);.  }e
3b80: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
3b90: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   0;.    sqliteSe
3ba0: 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
3bb0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f  pTab->zName, "__
3bc0: 70 72 69 6d 61 72 79 5f 6b 65 79 22 2c 20 30 29  primary_key", 0)
3bd0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
3be0: 74 65 46 69 6e 64 49 6e 64 65 78 28 70 50 61 72  teFindIndex(pPar
3bf0: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 20 29  se->db, zName) )
3c00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
3c10: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
3c20: 45 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 22  ErrMsg, "index "
3c30: 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  , zName, .      
3c40: 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74   " already exist
3c50: 73 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  s", 0);.    pPar
3c60: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
3c70: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
3c80: 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
3c90: 28 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c  ( sqliteFindTabl
3ca0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
3cb0: 61 6d 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ame) ){.    sqli
3cc0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
3cd0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
3ce0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
3cf0: 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 2c  a table named ",
3d00: 0a 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30  .       zName, 0
3d10: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
3d20: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
3d30: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
3d40: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  x;.  }..  /* If 
3d50: 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
3d60: 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
3d70: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
3d80: 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
3d90: 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
3da0: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
3db0: 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
3dc0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
3dd0: 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
3de0: 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
3df0: 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
3e00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
3e10: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c  t==0 ){.    null
3e20: 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Id.z = pTab->aCo
3e30: 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e  l[pTab->nCol-1].
3e40: 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49  zName;.    nullI
3e50: 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c  d.n = strlen(nul
3e60: 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73  lId.z);.    pLis
3e70: 74 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74  t = sqliteIdList
3e80: 41 70 70 65 6e 64 28 30 2c 20 26 6e 75 6c 6c 49  Append(0, &nullI
3e90: 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  d);.    if( pLis
3ea0: 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
3eb0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
3ec0: 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
3ed0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
3ee0: 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
3ef0: 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  */.  pIndex = sq
3f00: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
3f10: 6f 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c  of(Index) + strl
3f20: 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a  en(zName) + 1 +.
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f40: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69          sizeof(i
3f50: 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e 49 64 20 29  nt)*pList->nId )
3f60: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
3f70: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
3f80: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
3f90: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6f 75 74 20  ->zErrMsg, "out 
3fa0: 6f 66 20 6d 65 6d 6f 72 79 22 2c 20 30 29 3b 0a  of memory", 0);.
3fb0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
3fc0: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ++;.    goto exi
3fd0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
3fe0: 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69    }.  pIndex->ai
3ff0: 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26  Column = (int*)&
4000: 70 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e  pIndex[1];.  pIn
4010: 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  dex->zName = (ch
4020: 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43  ar*)&pIndex->aiC
4030: 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64  olumn[pList->nId
4040: 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64  ];.  strcpy(pInd
4050: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
4060: 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
4070: 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
4080: 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  ndex->nColumn = 
4090: 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 0a 20 20 2f  pList->nId;..  /
40a0: 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73  * Scan the names
40b0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
40c0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
40d0: 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20  be indexed and. 
40e0: 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c   ** load the col
40f0: 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f  umn indices into
4100: 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
4110: 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  ture.  Report an
4120: 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61   error.  ** if a
4130: 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  ny column is not
4140: 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66   found..  */.  f
4150: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
4160: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
4170: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
4180: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
4190: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
41a0: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
41b0: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
41c0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ol[j].zName)==0 
41d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
41e0: 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
41f0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
4200: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
4210: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
4220: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e  "table ", pTab->
4230: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
4240: 22 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20  " has no column 
4250: 6e 61 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e  named ", pList->
4260: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  a[i].zName, 0);.
4270: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
4280: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  rr++;.      sqli
4290: 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a  teFree(pIndex);.
42a0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
42b0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
42c0: 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
42d0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
42e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
42f0: 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
4300: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
4310: 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
4320: 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
4330: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
4340: 72 75 63 74 75 72 65 73 2e 0a 20 20 2a 2f 0a 20  ructures..  */. 
4350: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
4360: 6c 61 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 68  lain==0 ){.    h
4370: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 6f 43   = sqliteHashNoC
4380: 61 73 65 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ase(pIndex->zNam
4390: 65 2c 20 30 29 20 25 20 4e 5f 48 41 53 48 3b 0a  e, 0) % N_HASH;.
43a0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 48 61 73      pIndex->pHas
43b0: 68 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  h = pParse->db->
43c0: 61 70 49 64 78 48 61 73 68 5b 68 5d 3b 0a 20 20  apIdxHash[h];.  
43d0: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 70    pParse->db->ap
43e0: 49 64 78 48 61 73 68 5b 68 5d 20 3d 20 70 49 6e  IdxHash[h] = pIn
43f0: 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  dex;.    pIndex-
4400: 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
4410: 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d  Index;.    pTab-
4420: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
4430: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
4440: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30  he initFlag is 0
4450: 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
4460: 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
4470: 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
4480: 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
4490: 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
44a0: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
44b0: 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
44c0: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
44d0: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
44e0: 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
44f0: 20 20 2a 2a 20 54 68 65 20 69 6e 69 74 46 6c 61    ** The initFla
4500: 67 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  g is 0 when the 
4510: 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
4520: 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
4530: 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
4540: 20 54 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73   The initFlag is
4550: 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
4560: 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
4570: 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
4580: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
4590: 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
45a0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
45b0: 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
45c0: 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
45d0: 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
45e0: 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
45f0: 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
4600: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
4610: 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2f  ecreate it..  */
4620: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69  .  if( pParse->i
4630: 6e 69 74 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20  nitFlag==0 ){.  
4640: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
4650: 61 64 64 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20  addTable[] = {. 
4660: 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20       { OP_Open, 
4670: 20 20 20 20 20 20 20 32 2c 20 31 2c 20 4d 41 53         2, 1, MAS
4680: 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20  TER_NAME},.     
4690: 20 7b 20 4f 50 5f 4e 65 77 2c 20 20 20 20 20 20   { OP_New,      
46a0: 20 20 20 32 2c 20 30 2c 20 30 7d 2c 0a 20 20 20     2, 0, 0},.   
46b0: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20     { OP_String, 
46c0: 20 20 20 20 20 30 2c 20 30 2c 20 22 69 6e 64 65       0, 0, "inde
46d0: 78 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  x"},.      { OP_
46e0: 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20  String,      0, 
46f0: 30 2c 20 30 7d 2c 20 20 2f 2a 20 33 20 2a 2f 0a  0, 0},  /* 3 */.
4700: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
4710: 67 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d  g,      0, 0, 0}
4720: 2c 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20  ,  /* 4 */.     
4730: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
4740: 20 20 20 30 2c 20 30 2c 20 30 7d 2c 20 20 2f 2a     0, 0, 0},  /*
4750: 20 35 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   5 */.      { OP
4760: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 20 34 2c  _MakeRecord,  4,
4770: 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20   0, 0},.      { 
4780: 4f 50 5f 50 75 74 2c 20 20 20 20 20 20 20 20 20  OP_Put,         
4790: 32 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20  2, 0, 0},.      
47a0: 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20 20  { OP_Close,     
47b0: 20 20 32 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20    2, 0, 0},.    
47c0: 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  };.    int n;.  
47d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
47e0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 69  se->pVdbe;.    i
47f0: 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20  nt lbl1, lbl2;. 
4800: 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 76     int i;..    v
4810: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
4820: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
4830: 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
4840: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
4850: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4860: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c  ddOp(v, OP_Open,
4870: 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
4880: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
4890: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
48a0: 50 5f 4f 70 65 6e 2c 20 31 2c 20 31 2c 20 70 49  P_Open, 1, 1, pI
48b0: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
48c0: 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
48d0: 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  && pEnd ){.     
48e0: 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 20 20 20   int base;.     
48f0: 20 6e 20 3d 20 28 69 6e 74 29 70 45 6e 64 2d 3e   n = (int)pEnd->
4900: 7a 20 2d 20 28 69 6e 74 29 70 53 74 61 72 74 2d  z - (int)pStart-
4910: 3e 7a 20 2b 20 31 3b 0a 20 20 20 20 20 20 62 61  >z + 1;.      ba
4920: 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  se = sqliteVdbeA
4930: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
4940: 79 53 69 7a 65 28 61 64 64 54 61 62 6c 65 29 2c  ySize(addTable),
4950: 20 61 64 64 54 61 62 6c 65 29 3b 0a 20 20 20 20   addTable);.    
4960: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
4970: 67 65 50 33 28 76 2c 20 62 61 73 65 2b 33 2c 20  geP3(v, base+3, 
4980: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
4990: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
49a0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
49b0: 61 73 65 2b 34 2c 20 70 54 61 62 2d 3e 7a 4e 61  ase+4, pTab->zNa
49c0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  me, 0);.      sq
49d0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
49e0: 28 76 2c 20 62 61 73 65 2b 35 2c 20 70 53 74 61  (v, base+5, pSta
49f0: 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d  rt->z, n);.    }
4a00: 0a 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69  .    lbl1 = sqli
4a10: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
4a20: 76 29 3b 0a 20 20 20 20 6c 62 6c 32 20 3d 20 73  v);.    lbl2 = s
4a30: 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62  qliteVdbeMakeLab
4a40: 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  el(v);.    sqlit
4a50: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4a60: 5f 4e 65 78 74 2c 20 30 2c 20 6c 62 6c 32 2c 20  _Next, 0, lbl2, 
4a70: 30 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 73 71  0, lbl1);.    sq
4a80: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4a90: 20 4f 50 5f 4b 65 79 2c 20 30 2c 20 30 2c 20 30   OP_Key, 0, 0, 0
4aa0: 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  , 0);.    for(i=
4ab0: 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
4ac0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
4ad0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4ae0: 70 28 76 2c 20 4f 50 5f 46 69 65 6c 64 2c 20 30  p(v, OP_Field, 0
4af0: 2c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  , pIndex->aiColu
4b00: 6d 6e 5b 69 5d 2c 20 30 2c 20 30 29 3b 0a 20 20  mn[i], 0, 0);.  
4b10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
4b20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
4b30: 6b 65 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e  keKey, pIndex->n
4b40: 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30 2c 20 30 29  Column, 0, 0, 0)
4b50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
4b60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
4b70: 64 78 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b  dx, 1, 0, 0, 0);
4b80: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4b90: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4ba0: 20 30 2c 20 6c 62 6c 31 2c 20 30 2c 20 30 29 3b   0, lbl1, 0, 0);
4bb0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4bc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c  ddOp(v, OP_Noop,
4bd0: 20 30 2c 20 30 2c 20 30 2c 20 6c 62 6c 32 29 3b   0, 0, 0, lbl2);
4be0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4bf0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
4c00: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 1, 0, 0, 0);. 
4c10: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4c20: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
4c30: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  0, 0, 0, 0);.  }
4c40: 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 6d  ..  /* Reclaim m
4c50: 65 6d 6f 72 79 20 6f 6e 20 61 6e 20 45 58 50 4c  emory on an EXPL
4c60: 41 49 4e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  AIN call..  */. 
4c70: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
4c80: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  lain ){.    sqli
4c90: 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a  teFree(pIndex);.
4ca0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
4cb0: 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
4cc0: 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
4cd0: 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
4ce0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
4cf0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  st);.  sqliteFre
4d00: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
4d10: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
4d20: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
4d30: 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
4d40: 6e 61 6d 65 64 20 69 6e 64 65 78 2e 0a 2a 2f 0a  named index..*/.
4d50: 76 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 49  void sqliteDropI
4d60: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
4d70: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
4d80: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
4d90: 65 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ex;.  char *zNam
4da0: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  e;.  Vdbe *v;.. 
4db0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54   zName = sqliteT
4dc0: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
4dd0: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  n(pName);.  pInd
4de0: 65 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 49  ex = sqliteFindI
4df0: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
4e00: 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74   zName);.  sqlit
4e10: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
4e20: 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
4e30: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
4e40: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
4e50: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
4e60: 20 69 6e 64 65 78 3a 20 22 2c 20 30 2c 20 0a 20   index: ", 0, . 
4e70: 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 2c         pName->z,
4e80: 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20   pName->n, 0);. 
4e90: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
4ea0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
4eb0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
4ec0: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
4ed0: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
4ee0: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
4ef0: 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
4f00: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
4f10: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
4f20: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
4f30: 70 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20  p dropIndex[] = 
4f40: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65  {.      { OP_Ope
4f50: 6e 2c 20 20 20 20 20 20 20 30 2c 20 31 2c 20 20  n,       0, 1,  
4f60: 20 20 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45       MASTER_NAME
4f70: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4c 69  },.      { OP_Li
4f80: 73 74 4f 70 65 6e 2c 20 20 20 30 2c 20 30 2c 20  stOpen,   0, 0, 
4f90: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
4fa0: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
4fb0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
4fc0: 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 2 */.      {
4fd0: 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
4fe0: 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 20  0, ADDR(9), 0}, 
4ff0: 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
5000: 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20 20 30  OP_Dup,        0
5010: 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 0,       0},. 
5020: 20 20 20 20 20 7b 20 4f 50 5f 46 69 65 6c 64 2c       { OP_Field,
5030: 20 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20        0, 1,     
5040: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
5050: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Ne,         0, 
5060: 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(3), 0},.   
5070: 20 20 20 7b 20 4f 50 5f 4b 65 79 2c 20 20 20 20     { OP_Key,    
5080: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
5090: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
50a0: 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
50b0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
50c0: 20 7b 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 20   { OP_Destroy,  
50d0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
50e0: 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20 20 20  , /* 9 */.      
50f0: 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20 20  { OP_Close,     
5100: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
5110: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
5120: 62 61 73 65 3b 0a 0a 20 20 20 20 62 61 73 65 20  base;..    base 
5130: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
5140: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
5150: 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c 20 64  ze(dropIndex), d
5160: 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  ropIndex);.    s
5170: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
5180: 33 28 76 2c 20 62 61 73 65 2b 32 2c 20 70 49 6e  3(v, base+2, pIn
5190: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
51a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
51b0: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 39  angeP3(v, base+9
51c0: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
51d0: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   0);.  }..  /* R
51e0: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
51f0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 72  structure and fr
5200: 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 2e 20 20  ee its memory.  
5210: 45 78 63 65 70 74 20 69 66 20 74 68 65 0a 20 20  Except if the.  
5220: 2a 2a 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f  ** EXPLAIN keywo
5230: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 6e  rd is present, n
5240: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
5250: 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  de..  */.  if( !
5260: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
5270: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  ){.    if( pInde
5280: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
5290: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
52a0: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
52b0: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
52c0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ex->pNext;.    }
52d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
52e0: 78 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  x *p;.      for(
52f0: 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  p=pIndex->pTable
5300: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70  ->pIndex; p && p
5310: 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b  ->pNext!=pIndex;
5320: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20   p=p->pNext){}. 
5330: 20 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d       if( p && p-
5340: 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29  >pNext==pIndex )
5350: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65  {.        p->pNe
5360: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
5370: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
5380: 7d 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  }.    sqliteDele
5390: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  teIndex(pParse->
53a0: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
53b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
53c0: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
53d0: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70  he end of an exp
53e0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
53f0: 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e  f pList is.** in
5400: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
5410: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
5420: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
5430: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
5440: 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65  liteExprListAppe
5450: 6e 64 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  nd(ExprList *pLi
5460: 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  st, Expr *pExpr,
5470: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
5480: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
5490: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
54a0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
54b0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72  loc( sizeof(Expr
54c0: 4c 69 73 74 29 20 29 3b 0a 20 20 7d 0a 20 20 69  List) );.  }.  i
54d0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
54e0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
54f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 37 29  List->nExpr & 7)
5500: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
5510: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   = pList->nExpr 
5520: 2b 20 38 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  + 8;.    pList->
5530: 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  a = sqliteReallo
5540: 63 28 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69  c(pList->a, n*si
5550: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
5560: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
5570: 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t->a==0 ){.     
5580: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20   pList->nExpr = 
5590: 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
55a0: 70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pList;.    }.  }
55b0: 0a 20 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  i = pList->nE
55c0: 78 70 72 2b 2b 3b 0a 20 20 70 4c 69 73 74 2d 3e  xpr++;.  pList->
55d0: 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78  a[i].pExpr = pEx
55e0: 70 72 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69  pr;.  pList->a[i
55f0: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69  ].zName = 0;.  i
5600: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
5610: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
5620: 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  (&pList->a[i].zN
5630: 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  ame, pName->z, p
5640: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  Name->n, 0);.   
5650: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 70   sqliteDequote(p
5660: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
5670: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5680: 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
5690: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
56a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
56b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
56c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45  ExprListDelete(E
56d0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
56e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
56f0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
5700: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
5710: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
5720: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78  +){.    sqliteEx
5730: 70 72 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e  prDelete(pList->
5740: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
5750: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
5760: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
5770: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
5780: 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71  (pList->a);.  sq
5790: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b  liteFree(pList);
57a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
57b0: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
57c0: 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
57d0: 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
57e0: 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
57f0: 65 65 64 20 62 65 2e 0a 2a 2f 0a 49 64 4c 69 73  eed be..*/.IdLis
5800: 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73 74 41  t *sqliteIdListA
5810: 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c  ppend(IdList *pL
5820: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
5830: 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  en){.  if( pList
5840: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
5850: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
5860: 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20   sizeof(IdList) 
5870: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
5880: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
5890: 20 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74    }.  if( (pList
58a0: 2d 3e 6e 49 64 20 26 20 37 29 3d 3d 30 20 29 7b  ->nId & 7)==0 ){
58b0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
58c0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
58d0: 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73 74 2d 3e  ist->a, (pList->
58e0: 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66 28 70 4c  nId+8)*sizeof(pL
58f0: 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
5900: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d    if( pList->a==
5910: 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
5920: 2d 3e 6e 49 64 20 3d 20 30 3b 0a 20 20 20 20 20  ->nId = 0;.     
5930: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 20   return pList;. 
5940: 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d 73 65     }.  }.  memse
5950: 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  t(&pList->a[pLis
5960: 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65  t->nId], 0, size
5970: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
5980: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ;.  if( pToken )
5990: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
59a0: 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61  String(&pList->a
59b0: 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61  [pList->nId].zNa
59c0: 6d 65 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  me, pToken->z, p
59d0: 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Token->n, 0);.  
59e0: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
59f0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
5a00: 6e 49 64 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  nId].zName);.  }
5a10: 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
5a20: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
5a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
5a40: 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61   alias to the la
5a50: 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  st identifier on
5a60: 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74   the given ident
5a70: 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ifier list..*/.v
5a80: 6f 69 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74  oid sqliteIdList
5a90: 41 64 64 41 6c 69 61 73 28 49 64 4c 69 73 74 20  AddAlias(IdList 
5aa0: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
5ab0: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
5ac0: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 49  ist && pList->nI
5ad0: 64 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  d>0 ){.    int i
5ae0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 20 2d 20   = pList->nId - 
5af0: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  1;.    sqliteSet
5b00: 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e  NString(&pList->
5b10: 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20 70 54 6f  a[i].zAlias, pTo
5b20: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
5b30: 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 0);.    sqlit
5b40: 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e  eDequote(pList->
5b50: 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20  a[i].zAlias);.  
5b60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
5b70: 65 20 61 6e 20 65 6e 74 69 72 65 20 49 64 4c 69  e an entire IdLi
5b80: 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
5b90: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  eIdListDelete(Id
5ba0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
5bb0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
5bc0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
5bd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
5be0: 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
5bf0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
5c00: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
5c10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
5c20: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
5c30: 69 61 73 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ias);.  }.  sqli
5c40: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29  teFree(pList->a)
5c50: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
5c60: 4c 69 73 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  List);.}.../*.**
5c70: 20 54 68 65 20 43 4f 50 59 20 63 6f 6d 6d 61 6e   The COPY comman
5c80: 64 20 69 73 20 66 6f 72 20 63 6f 6d 70 61 74 69  d is for compati
5c90: 62 69 6c 69 74 79 20 77 69 74 68 20 50 6f 73 74  bility with Post
5ca0: 67 72 65 53 51 4c 20 61 6e 64 20 73 70 65 63 69  greSQL and speci
5cb0: 66 69 63 69 61 6c 6c 79 0a 2a 2a 20 66 6f 72 20  ficially.** for 
5cc0: 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 72  the ability to r
5cd0: 65 61 64 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ead the output o
5ce0: 66 20 70 67 5f 64 75 6d 70 2e 20 20 54 68 65 20  f pg_dump.  The 
5cf0: 66 6f 72 6d 61 74 20 69 73 20 61 73 0a 2a 2a 20  format is as.** 
5d00: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
5d10: 20 20 43 4f 50 59 20 74 61 62 6c 65 20 46 52 4f    COPY table FRO
5d20: 4d 20 66 69 6c 65 20 5b 55 53 49 4e 47 20 44 45  M file [USING DE
5d30: 4c 49 4d 49 54 45 52 53 20 73 74 72 69 6e 67 5d  LIMITERS string]
5d40: 0a 2a 2a 0a 2a 2a 20 22 74 61 62 6c 65 22 20 69  .**.** "table" i
5d50: 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  s an existing ta
5d60: 62 6c 65 20 6e 61 6d 65 2e 20 20 57 65 20 77 69  ble name.  We wi
5d70: 6c 6c 20 72 65 61 64 20 6c 69 6e 65 73 20 6f 66  ll read lines of
5d80: 20 63 6f 64 65 20 66 72 6f 6d 0a 2a 2a 20 66 69   code from.** fi
5d90: 6c 65 20 74 6f 20 66 69 6c 6c 20 74 68 69 73 20  le to fill this 
5da0: 74 61 62 6c 65 20 77 69 74 68 20 64 61 74 61 2e  table with data.
5db0: 20 20 46 69 6c 65 20 6d 69 67 68 74 20 62 65 20    File might be 
5dc0: 22 73 74 64 69 6e 22 2e 20 20 54 68 65 20 6f 70  "stdin".  The op
5dd0: 74 69 6f 6e 61 6c 0a 2a 2a 20 64 65 6c 69 6d 69  tional.** delimi
5de0: 74 65 72 20 73 74 72 69 6e 67 20 69 64 65 6e 74  ter string ident
5df0: 69 66 69 65 73 20 74 68 65 20 66 69 65 6c 64 20  ifies the field 
5e00: 73 65 70 61 72 61 74 6f 72 73 2e 20 20 54 68 65  separators.  The
5e10: 20 64 65 66 61 75 6c 74 20 69 73 20 61 20 74 61   default is a ta
5e20: 62 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  b..*/.void sqlit
5e30: 65 43 6f 70 79 28 0a 20 20 50 61 72 73 65 20 2a  eCopy(.  Parse *
5e40: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
5e50: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
5e60: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
5e70: 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a  pTableName,   /*
5e80: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
5e90: 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63   table into whic
5ea0: 68 20 77 65 20 77 69 6c 6c 20 69 6e 73 65 72 74  h we will insert
5eb0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 46 69   */.  Token *pFi
5ec0: 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 54 68  lename,    /* Th
5ed0: 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63  e file from whic
5ee0: 68 20 74 6f 20 6f 62 74 61 69 6e 20 69 6e 66 6f  h to obtain info
5ef0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b  rmation */.  Tok
5f00: 65 6e 20 2a 70 44 65 6c 69 6d 69 74 65 72 20 20  en *pDelimiter  
5f10: 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 61 73    /* Use this as
5f20: 20 74 68 65 20 66 69 65 6c 64 20 64 65 6c 69 6d   the field delim
5f30: 69 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  iter */.){.  Tab
5f40: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 63 68 61 72  le *pTab;.  char
5f50: 20 2a 7a 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c   *zTab;.  int i,
5f60: 20 6a 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20   j;.  Vdbe *v;. 
5f70: 20 69 6e 74 20 61 64 64 72 2c 20 65 6e 64 3b 0a   int addr, end;.
5f80: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 0a    Index *pIdx;..
5f90: 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 54    zTab = sqliteT
5fa0: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
5fb0: 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  n(pTableName);. 
5fc0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69   pTab = sqliteFi
5fd0: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
5fe0: 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71 6c  db, zTab);.  sql
5ff0: 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20  iteFree(zTab);. 
6000: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
6010: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
6020: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
6030: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
6040: 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20  table: ", 0, .  
6050: 20 20 20 20 20 20 70 54 61 62 6c 65 4e 61 6d 65        pTableName
6060: 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d  ->z, pTableName-
6070: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  >n, 0);.    pPar
6080: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
6090: 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75  goto copy_cleanu
60a0: 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  p;.  }.  if( pTa
60b0: 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
60c0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
60d0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
60e0: 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70  Msg, "table ", p
60f0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
6100: 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 62 65      " may not be
6110: 20 6d 6f 64 69 66 69 65 64 22 2c 20 30 29 3b 0a   modified", 0);.
6120: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
6130: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70  ++;.    goto cop
6140: 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  y_cleanup;.  }. 
6150: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
6160: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
6170: 28 20 76 20 29 7b 0a 20 20 20 20 61 64 64 72 20  ( v ){.    addr 
6180: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
6190: 70 28 76 2c 20 4f 50 5f 46 69 6c 65 4f 70 65 6e  p(v, OP_FileOpen
61a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
61b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
61c0: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
61d0: 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70 46 69  Filename->z, pFi
61e0: 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20  lename->n);.    
61f0: 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f 74  sqliteVdbeDequot
6200: 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  eP3(v, addr);.  
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 4f 70 65 6e 2c 20 30 2c  p(v, OP_Open, 0,
6230: 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   1, pTab->zName,
6240: 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31   0);.    for(i=1
6250: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
6260: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
6270: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b  pIdx->pNext, i++
6280: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
6290: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
62a0: 70 65 6e 2c 20 69 2c 20 31 2c 20 70 49 64 78 2d  pen, i, 1, pIdx-
62b0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
62c0: 7d 0a 20 20 20 20 65 6e 64 20 3d 20 73 71 6c 69  }.    end = sqli
62d0: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
62e0: 76 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  v);.    addr = s
62f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6300: 2c 20 4f 50 5f 46 69 6c 65 52 65 61 64 2c 20 70  , OP_FileRead, p
6310: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65 6e 64 2c 20  Tab->nCol, end, 
6320: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
6330: 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a 20 20 20  Delimiter ){.   
6340: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
6350: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70  ngeP3(v, addr, p
6360: 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20 70 44  Delimiter->z, pD
6370: 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a 20 20  elimiter->n);.  
6380: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
6390: 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29  quoteP3(v, addr)
63a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
63b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
63c0: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 22  ngeP3(v, addr, "
63d0: 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  \t", 1);.    }. 
63e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
63f0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 2c 20 30 2c  Op(v, OP_New, 0,
6400: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
6410: 66 28 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20  f( pTab->pIndex 
6420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
6430: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
6440: 75 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  up, 0, 0, 0, 0);
6450: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
6460: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
6470: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
6480: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6490: 20 4f 50 5f 46 69 6c 65 46 69 65 6c 64 2c 20 69   OP_FileField, i
64a0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
64b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
64c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
64d0: 52 65 63 6f 72 64 2c 20 70 54 61 62 2d 3e 6e 43  Record, pTab->nC
64e0: 6f 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ol, 0, 0, 0);.  
64f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6500: 70 28 76 2c 20 4f 50 5f 50 75 74 2c 20 30 2c 20  p(v, OP_Put, 0, 
6510: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 66 6f  0, 0, 0);.    fo
6520: 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62  r(i=1, pIdx=pTab
6530: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
6540: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
6550: 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , i++){.      if
6560: 28 20 70 49 64 78 2d 3e 70 4e 65 78 74 20 29 7b  ( pIdx->pNext ){
6570: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
6580: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
6590: 75 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  up, 0, 0, 0, 0);
65a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
65b0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
65c0: 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
65d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
65e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c  eAddOp(v, OP_Fil
65f0: 65 46 69 65 6c 64 2c 20 70 49 64 78 2d 3e 61 69  eField, pIdx->ai
6600: 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20 30 2c  Column[j], 0, 0,
6610: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
6620: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
6630: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79  Op(v, OP_MakeKey
6640: 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c  , pIdx->nColumn,
6650: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
6660: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6670: 28 76 2c 20 4f 50 5f 50 75 74 49 64 78 2c 20 69  (v, OP_PutIdx, i
6680: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
6690: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
66a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
66b0: 2c 20 30 2c 20 61 64 64 72 2c 20 30 2c 20 30 29  , 0, addr, 0, 0)
66c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
66d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70  AddOp(v, OP_Noop
66e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 65 6e 64 29 3b  , 0, 0, 0, end);
66f0: 0a 20 20 7d 0a 20 20 0a 63 6f 70 79 5f 63 6c 65  .  }.  .copy_cle
6700: 61 6e 75 70 3a 0a 20 20 72 65 74 75 72 6e 3b 0a  anup:.  return;.
6710: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6e  }../*.** The non
6720: 2d 73 74 61 6e 64 61 72 64 20 56 41 43 55 55 4d  -standard VACUUM
6730: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
6740: 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65   to clean up the
6750: 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 63 6f   database,.** co
6760: 6c 6c 61 70 73 65 20 66 72 65 65 20 73 70 61 63  llapse free spac
6770: 65 2c 20 65 74 63 2e 20 20 49 74 20 69 73 20 6d  e, etc.  It is m
6780: 6f 64 65 6c 6c 65 64 20 61 66 74 65 72 20 74 68  odelled after th
6790: 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64  e VACUUM command
67a0: 0a 2a 2a 20 69 6e 20 50 6f 73 74 67 72 65 53 51  .** in PostgreSQ
67b0: 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  L..*/.void sqlit
67c0: 65 56 61 63 75 75 6d 28 50 61 72 73 65 20 2a 70  eVacuum(Parse *p
67d0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
67e0: 61 62 6c 65 4e 61 6d 65 29 7b 0a 20 20 63 68 61  ableName){.  cha
67f0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65  r *zName;.  Vdbe
6800: 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 54 61 62   *v;..  if( pTab
6810: 6c 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e  leName ){.    zN
6820: 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ame = sqliteTabl
6830: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
6840: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 7d 65  TableName);.  }e
6850: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
6860: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e   0;.  }.  if( zN
6870: 61 6d 65 20 26 26 20 73 71 6c 69 74 65 46 69 6e  ame && sqliteFin
6880: 64 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  dIndex(pParse->d
6890: 62 2c 20 7a 4e 61 6d 65 29 3d 3d 30 0a 20 20 20  b, zName)==0.   
68a0: 20 26 26 20 73 71 6c 69 74 65 46 69 6e 64 54 61   && sqliteFindTa
68b0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
68c0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
68d0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
68e0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
68f0: 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  g, "no such tabl
6900: 65 20 6f 72 20 69 6e 64 65 78 3a 20 22 2c 20 7a  e or index: ", z
6910: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  Name, 0);.    pP
6920: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
6930: 20 20 67 6f 74 6f 20 76 61 63 75 75 6d 5f 63 6c    goto vacuum_cl
6940: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76 20 3d  eanup;.  }.  v =
6950: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
6960: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
6970: 3d 30 20 29 20 67 6f 74 6f 20 76 61 63 75 75 6d  =0 ) goto vacuum
6980: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 66 28 20  _cleanup;.  if( 
6990: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  zName ){.    sql
69a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
69b0: 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65 2c 20 30  OP_Reorganize, 0
69c0: 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  , 0, zName, 0);.
69d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
69e0: 20 68 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   h;.    Table *p
69f0: 54 61 62 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  Tab;.    Index *
6a00: 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 68 3d  pIdx;.    for(h=
6a10: 30 3b 20 68 3c 4e 5f 48 41 53 48 3b 20 68 2b 2b  0; h<N_HASH; h++
6a20: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 61  ){.      for(pTa
6a30: 62 3d 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 70  b=pParse->db->ap
6a40: 54 62 6c 48 61 73 68 5b 68 5d 3b 20 70 54 61 62  TblHash[h]; pTab
6a50: 3b 20 70 54 61 62 3d 70 54 61 62 2d 3e 70 48 61  ; pTab=pTab->pHa
6a60: 73 68 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  sh){.        sql
6a70: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6a80: 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65 2c 20 30  OP_Reorganize, 0
6a90: 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
6aa0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  , 0);.        fo
6ab0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
6ac0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
6ad0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
6ae0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
6af0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
6b00: 6f 72 67 61 6e 69 7a 65 2c 20 30 2c 20 30 2c 20  organize, 0, 0, 
6b10: 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pIdx->zName, 0);
6b20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6b30: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 76 61   }.    }.  }..va
6b40: 63 75 75 6d 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  cuum_cleanup:.  
6b50: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
6b60: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.