/ Hex Artifact Content
Login

Artifact e2ceba852dc45ca899e68a042b29c3daab011575:


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 34 20 32 30 30 30 2f 31 30 2f  ,v 1.24 2000/10/
0500: 31 36 20 32 32 3a 30 36 3a 34 32 20 64 72 68 20  16 22:06:42 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 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
06f0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
0700: 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
0710: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65     if( pParse->e
0720: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
0730: 72 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4c  rc = sqliteVdbeL
0740: 69 73 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ist(pParse->pVdb
0750: 65 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c  e, pParse->xCall
0760: 62 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41  back, pParse->pA
0770: 72 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rg, .           
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
0790: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29  pParse->zErrMsg)
07a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
07b0: 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d     FILE *trace =
07c0: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
07d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
07e0: 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64  eTrace)!=0 ? std
07f0: 65 72 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 73  err : 0;.      s
0800: 71 6c 69 74 65 56 64 62 65 54 72 61 63 65 28 70  qliteVdbeTrace(p
0810: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 74 72  Parse->pVdbe, tr
0820: 61 63 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ace);.      rc =
0830: 20 73 71 6c 69 74 65 56 64 62 65 45 78 65 63 28   sqliteVdbeExec(
0840: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
0850: 50 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b  Parse->xCallback
0860: 2c 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20  , pParse->pArg, 
0870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0880: 20 20 20 20 20 20 20 20 20 20 20 26 70 50 61 72             &pPar
0890: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 70 50 61  se->zErrMsg, pPa
08a0: 72 73 65 2d 3e 64 62 2d 3e 70 42 75 73 79 41 72  rse->db->pBusyAr
08b0: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
08d0: 72 73 65 2d 3e 64 62 2d 3e 78 42 75 73 79 43 61  rse->db->xBusyCa
08e0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 20  llback);.    }. 
08f0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 6c     sqliteVdbeDel
0900: 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ete(pParse->pVdb
0910: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
0920: 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20 20 70  pVdbe = 0;.    p
0930: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
0940: 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72  et = 0;.    pPar
0950: 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 7d  se->rc = rc;.  }
0960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
0970: 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73  uct a new expres
0980: 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65  sion node and re
0990: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
09a0: 6f 20 69 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  o it..*/.Expr *s
09b0: 71 6c 69 74 65 45 78 70 72 28 69 6e 74 20 6f 70  qliteExpr(int op
09c0: 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45  , Expr *pLeft, E
09d0: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 54 6f 6b  xpr *pRight, Tok
09e0: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45  en *pToken){.  E
09f0: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65  xpr *pNew;.  pNe
0a00: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
0a10: 28 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29  ( sizeof(Expr) )
0a20: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
0a30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
0a40: 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70  ew->op = op;.  p
0a50: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65  New->pLeft = pLe
0a60: 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  ft;.  pNew->pRig
0a70: 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 69  ht = pRight;.  i
0a80: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
0a90: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a   pNew->token = *
0aa0: 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b  pToken;.  }else{
0ab0: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
0ac0: 2e 7a 20 3d 20 22 22 3b 0a 20 20 20 20 70 4e 65  .z = "";.    pNe
0ad0: 77 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a  w->token.n = 0;.
0ae0: 20 20 7d 0a 20 20 69 66 28 20 70 4c 65 66 74 20    }.  if( pLeft 
0af0: 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  && pRight ){.   
0b00: 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28   sqliteExprSpan(
0b10: 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e 73 70  pNew, &pLeft->sp
0b20: 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73 70 61  an, &pRight->spa
0b30: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
0b40: 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e   pNew->span = pN
0b50: 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  ew->token;.  }. 
0b60: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
0b70: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
0b80: 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20  xpr.token field 
0b90: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
0ba0: 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e 20  ression to span 
0bb0: 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74 77  all.** text betw
0bc0: 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65  een the two give
0bd0: 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69  n tokens..*/.voi
0be0: 64 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e  d sqliteExprSpan
0bf0: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f  (Expr *pExpr, To
0c00: 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65  ken *pLeft, Toke
0c10: 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 70 45  n *pRight){.  pE
0c20: 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c  xpr->span.z = pL
0c30: 65 66 74 2d 3e 7a 3b 0a 20 20 70 45 78 70 72 2d  eft->z;.  pExpr-
0c40: 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74  >span.n = pRight
0c50: 2d 3e 6e 20 2b 20 28 69 6e 74 29 70 52 69 67 68  ->n + (int)pRigh
0c60: 74 2d 3e 7a 20 2d 20 28 69 6e 74 29 70 4c 65 66  t->z - (int)pLef
0c70: 74 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  t->z;.}../*.** C
0c80: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
0c90: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
0ca0: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69  or a function wi
0cb0: 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61  th multiple.** a
0cc0: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70  rguments..*/.Exp
0cd0: 72 20 2a 73 71 6c 69 74 65 45 78 70 72 46 75 6e  r *sqliteExprFun
0ce0: 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a  ction(ExprList *
0cf0: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
0d00: 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70  oken){.  Expr *p
0d10: 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  New;.  pNew = sq
0d20: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
0d30: 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66  of(Expr) );.  if
0d40: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
0d50: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  rn 0;.  pNew->op
0d60: 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a   = TK_FUNCTION;.
0d70: 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20    pNew->pList = 
0d80: 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 54 6f  pList;.  if( pTo
0d90: 6b 65 6e 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  ken ){.    pNew-
0da0: 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e  >token = *pToken
0db0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0dc0: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 22  New->token.z = "
0dd0: 22 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  ";.    pNew->tok
0de0: 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  en.n = 0;.  }.  
0df0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
0e00: 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c  /*.** Recursivel
0e10: 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72  y delete an expr
0e20: 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
0e30: 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72 44  void sqliteExprD
0e40: 65 6c 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a  elete(Expr *p){.
0e50: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0e60: 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  urn;.  if( p->pL
0e70: 65 66 74 20 29 20 73 71 6c 69 74 65 45 78 70 72  eft ) sqliteExpr
0e80: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29  Delete(p->pLeft)
0e90: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68  ;.  if( p->pRigh
0ea0: 74 20 29 20 73 71 6c 69 74 65 45 78 70 72 44 65  t ) sqliteExprDe
0eb0: 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b  lete(p->pRight);
0ec0: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20  .  if( p->pList 
0ed0: 29 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  ) sqliteExprList
0ee0: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74 29  Delete(p->pList)
0ef0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65  ;.  if( p->pSele
0f00: 63 74 20 29 20 73 71 6c 69 74 65 53 65 6c 65 63  ct ) sqliteSelec
0f10: 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65  tDelete(p->pSele
0f20: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ct);.  sqliteFre
0f30: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  e(p);.}../*.** L
0f40: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
0f50: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
0f60: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
0f70: 0a 2a 2a 20 66 6f 72 6d 61 74 20 6f 66 20 61 20  .** format of a 
0f80: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
0f90: 61 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ase table given 
0fa0: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74  the name.** of t
0fb0: 68 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75  hat table.  Retu
0fc0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
0fd0: 6f 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ound..*/.Table *
0fe0: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
0ff0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 68 61 72  sqlite *db, char
1000: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *zName){.  Tabl
1010: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 69 6e 74  e *pTable;.  int
1020: 20 68 3b 0a 0a 20 20 68 20 3d 20 73 71 6c 69 74   h;..  h = sqlit
1030: 65 48 61 73 68 4e 6f 43 61 73 65 28 7a 4e 61 6d  eHashNoCase(zNam
1040: 65 2c 20 30 29 20 25 20 4e 5f 48 41 53 48 3b 0a  e, 0) % N_HASH;.
1050: 20 20 66 6f 72 28 70 54 61 62 6c 65 3d 64 62 2d    for(pTable=db-
1060: 3e 61 70 54 62 6c 48 61 73 68 5b 68 5d 3b 20 70  >apTblHash[h]; p
1070: 54 61 62 6c 65 3b 20 70 54 61 62 6c 65 3d 70 54  Table; pTable=pT
1080: 61 62 6c 65 2d 3e 70 48 61 73 68 29 7b 0a 20 20  able->pHash){.  
1090: 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49    if( sqliteStrI
10a0: 43 6d 70 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  Cmp(pTable->zNam
10b0: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
10c0: 65 74 75 72 6e 20 70 54 61 62 6c 65 3b 0a 20 20  eturn pTable;.  
10d0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
10e0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
10f0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
1100: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1110: 69 62 65 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d  ibes the.** form
1120: 61 74 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c  at of a particul
1130: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
1140: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
1150: 61 74 20 69 6e 64 65 78 2e 20 20 52 65 74 75 72  at index.  Retur
1160: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
1170: 75 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  und..*/.Index *s
1180: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 73  qliteFindIndex(s
1190: 71 6c 69 74 65 20 2a 64 62 2c 20 63 68 61 72 20  qlite *db, char 
11a0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  *zName){.  Index
11b0: 20 2a 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20   *p;.  int h;.. 
11c0: 20 68 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e   h = sqliteHashN
11d0: 6f 43 61 73 65 28 7a 4e 61 6d 65 2c 20 30 29 20  oCase(zName, 0) 
11e0: 25 20 4e 5f 48 41 53 48 3b 0a 20 20 66 6f 72 28  % N_HASH;.  for(
11f0: 70 3d 64 62 2d 3e 61 70 49 64 78 48 61 73 68 5b  p=db->apIdxHash[
1200: 68 5d 3b 20 70 3b 20 70 3d 70 2d 3e 70 48 61 73  h]; p; p=p->pHas
1210: 68 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  h){.    if( sqli
1220: 74 65 53 74 72 49 43 6d 70 28 70 2d 3e 7a 4e 61  teStrICmp(p->zNa
1230: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
1240: 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20  return p;.  }.  
1250: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1260: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
1270: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
1280: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
1290: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
12a0: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
12b0: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
12c0: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
12d0: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
12e0: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 2c  base hash table,
12f0: 20 62 75 74 20 69 74 20 69 73 0a 2a 2a 20 6e 6f   but it is.** no
1300: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
1310: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
1320: 73 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 2e  s being indexed.
1330: 20 20 55 6e 6c 69 6e 6b 69 6e 67 0a 2a 2a 20 66    Unlinking.** f
1340: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75  rom the Table mu
1350: 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68  st be done by th
1360: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1370: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1380: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  id sqliteDeleteI
1390: 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62 2c  ndex(sqlite *db,
13a0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b   Index *pIndex){
13b0: 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 66 28 20  .  int h;.  if( 
13c0: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 29 7b  pIndex->zName ){
13d0: 0a 20 20 20 20 68 20 3d 20 73 71 6c 69 74 65 48  .    h = sqliteH
13e0: 61 73 68 4e 6f 43 61 73 65 28 70 49 6e 64 65 78  ashNoCase(pIndex
13f0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e 5f  ->zName, 0) % N_
1400: 48 41 53 48 3b 0a 20 20 20 20 69 66 28 20 64 62  HASH;.    if( db
1410: 2d 3e 61 70 49 64 78 48 61 73 68 5b 68 5d 3d 3d  ->apIdxHash[h]==
1420: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
1430: 64 62 2d 3e 61 70 49 64 78 48 61 73 68 5b 68 5d  db->apIdxHash[h]
1440: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 48 61 73 68   = pIndex->pHash
1450: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1460: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
1470: 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61 70 49     for(p=db->apI
1480: 64 78 48 61 73 68 5b 68 5d 3b 20 70 20 26 26 20  dxHash[h]; p && 
1490: 70 2d 3e 70 48 61 73 68 21 3d 70 49 6e 64 65 78  p->pHash!=pIndex
14a0: 3b 20 70 3d 70 2d 3e 70 48 61 73 68 29 7b 7d 0a  ; p=p->pHash){}.
14b0: 20 20 20 20 20 20 69 66 28 20 70 20 26 26 20 70        if( p && p
14c0: 2d 3e 70 48 61 73 68 3d 3d 70 49 6e 64 65 78 20  ->pHash==pIndex 
14d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 48  ){.        p->pH
14e0: 61 73 68 20 3d 20 70 49 6e 64 65 78 2d 3e 70 48  ash = pIndex->pH
14f0: 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ash;.      }.   
1500: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46   }.  }.  sqliteF
1510: 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  ree(pIndex);.}..
1520: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
1530: 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72   memory data str
1540: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
1550: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
1560: 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20  n.** Table.  No 
1570: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
1580: 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73   to disk by this
1590: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
15a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
15b0: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61  t deletes the da
15c0: 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  ta structure.  I
15d0: 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e  t does not unlin
15e0: 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64  k.** the table d
15f0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72  ata structure fr
1600: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
1610: 65 2e 20 20 42 75 74 20 64 6f 65 73 20 69 74 20  e.  But does it 
1620: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
1630: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
1640: 74 68 65 20 69 6e 64 69 63 65 73 20 61 73 73 6f  the indices asso
1650: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1660: 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
1670: 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65  qliteDeleteTable
1680: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62  (sqlite *db, Tab
1690: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
16a0: 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70  nt i;.  Index *p
16b0: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20  Index, *pNext;. 
16c0: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
16d0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
16e0: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
16f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ol; i++){.    sq
1700: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
1710: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
1720: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
1730: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
1740: 7a 44 66 6c 74 29 3b 0a 20 20 7d 0a 20 20 66 6f  zDflt);.  }.  fo
1750: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
1760: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
1770: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
1780: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
1790: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
17a0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
17b0: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
17c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
17d0: 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b  (pTable->zName);
17e0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
17f0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73  able->aCol);.  s
1800: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
1810: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  );.}../*.** Cons
1820: 74 72 75 63 74 20 74 68 65 20 6e 61 6d 65 20 6f  truct the name o
1830: 66 20 61 20 75 73 65 72 20 74 61 62 6c 65 20 6f  f a user table o
1840: 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 61 20 74  r index from a t
1850: 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  oken..**.** Spac
1860: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  e to hold the na
1870: 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  me is obtained f
1880: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
1890: 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62  () and must.** b
18a0: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
18b0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
18c0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
18d0: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
18e0: 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  en(Token *pName)
18f0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  {.  char *zName 
1900: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
1910: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
1920: 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71  >n);.  sqliteDeq
1930: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72  uote(zName);.  r
1940: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
1950: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73  /*.** Begin cons
1960: 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74  tructing a new t
1970: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
1980: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ion in memory.  
1990: 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  This is.** the f
19a0: 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20  irst of several 
19b0: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
19c0: 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20  that get called 
19d0: 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74  in response.** t
19e0: 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  o a CREATE TABLE
19f0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
1a00: 6f 69 64 20 73 71 6c 69 74 65 53 74 61 72 74 54  oid sqliteStartT
1a10: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
1a20: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  se, Token *pStar
1a30: 74 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  t, Token *pName)
1a40: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
1a50: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  e;.  char *zName
1a60: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 46 69  ;..  pParse->sFi
1a70: 72 73 74 54 6f 6b 65 6e 20 3d 20 2a 70 53 74 61  rstToken = *pSta
1a80: 72 74 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  rt;.  zName = sq
1a90: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f  liteTableNameFro
1aa0: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
1ab0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
1ac0: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
1ad0: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
1ae0: 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b  if( pTable!=0 ){
1af0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
1b00: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
1b10: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
1b20: 2c 20 30 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  , 0, pName->z, p
1b30: 4e 61 6d 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20  Name->n,.       
1b40: 20 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74   " already exist
1b50: 73 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  s", 0, 0);.    s
1b60: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
1b70: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
1b80: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
1b90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1ba0: 74 65 46 69 6e 64 49 6e 64 65 78 28 70 50 61 72  teFindIndex(pPar
1bb0: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 20 29  se->db, zName) )
1bc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
1bd0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
1be0: 45 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69  ErrMsg, "there i
1bf0: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
1c00: 65 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20 20 20  ex named ", .   
1c10: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20      zName, 0);. 
1c20: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
1c30: 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ame);.    pParse
1c40: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
1c50: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
1c60: 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  le = sqliteMallo
1c70: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
1c80: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65   );.  if( pTable
1c90: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1ca0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
1cb0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6f 75  se->zErrMsg, "ou
1cc0: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20 30 29  t of memory", 0)
1cd0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
1ce0: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
1cf0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
1d00: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
1d10: 20 70 54 61 62 6c 65 2d 3e 70 48 61 73 68 20 3d   pTable->pHash =
1d20: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43   0;.  pTable->nC
1d30: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
1d40: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54  ->aCol = 0;.  pT
1d50: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30  able->pIndex = 0
1d60: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1d70: 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69  pNewTable ) sqli
1d80: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 70 50  teDeleteTable(pP
1d90: 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 73 65  arse->db, pParse
1da0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20  ->pNewTable);.  
1db0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
1dc0: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 7d 0a 0a 2f  e = pTable;.}../
1dd0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
1de0: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
1df0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
1e00: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
1e10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 41 64  */.void sqliteAd
1e20: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
1e30: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
1e40: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
1e50: 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20  ;.  char **pz;. 
1e60: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
1e70: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
1e80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1e90: 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d  (p->nCol & 0x7)=
1ea0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 43 6f  =0 ){.    p->aCo
1eb0: 6c 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  l = sqliteReallo
1ec0: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
1ed0: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
1ee0: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 7d  ->aCol[0]));.  }
1ef0: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 3d 3d  .  if( p->aCol==
1f00: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  0 ){.    p->nCol
1f10: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1f20: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
1f30: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
1f40: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  , 0, sizeof(p->a
1f50: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 7a 20 3d  Col[0]));.  pz =
1f60: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
1f70: 6c 2b 2b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 73 71  l++].zName;.  sq
1f80: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 70  liteSetNString(p
1f90: 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  z, pName->z, pNa
1fa0: 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 73 71 6c  me->n, 0);.  sql
1fb0: 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b  iteDequote(*pz);
1fc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69  .}../*.** The gi
1fd0: 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  ven token is the
1fe0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
1ff0: 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  or the last colu
2000: 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  mn added to.** t
2010: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
2020: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
2030: 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75  ction.  If "minu
2040: 73 46 6c 61 67 22 20 69 73 20 74 72 75 65 2c 20  sFlag" is true, 
2050: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
2060: 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73 20  value token was 
2070: 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d 69  preceded by a mi
2080: 6e 75 73 20 73 69 67 6e 2e 0a 2a 2f 0a 76 6f 69  nus sign..*/.voi
2090: 64 20 73 71 6c 69 74 65 41 64 64 44 65 66 61 75  d sqliteAddDefau
20a0: 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70  ltValue(Parse *p
20b0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56  Parse, Token *pV
20c0: 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61  al, int minusFla
20d0: 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  g){.  Table *p;.
20e0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
20f0: 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d  **pz;.  if( (p =
2100: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
2110: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
2120: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
2130: 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f  ;.  pz = &p->aCo
2140: 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66  l[i].zDflt;.  if
2150: 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20  ( minusFlag ){. 
2160: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
2170: 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20  ing(pz, "-", 1, 
2180: 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e  pVal->z, pVal->n
2190: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
21a0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
21b0: 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c  ing(pz, pVal->z,
21c0: 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20   pVal->n, 0);.  
21d0: 7d 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74  }.  sqliteDequot
21e0: 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(*pz);.}../*.**
21f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2200: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72   called to repor
2210: 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20  t the final ")" 
2220: 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a  that terminates.
2230: 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ** a CREATE TABL
2240: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
2250: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72  ** The table str
2260: 75 63 74 75 72 65 20 69 73 20 61 64 64 65 64 20  ucture is added 
2270: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
2280: 68 61 73 68 20 74 61 62 6c 65 73 2e 20 20 0a 2a  hash tables.  .*
2290: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
22a0: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
22b0: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
22c0: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
22d0: 0a 2a 2a 20 75 6e 6c 65 73 73 20 69 6e 69 74 46  .** unless initF
22e0: 6c 61 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e  lag==1.  When in
22f0: 69 74 46 6c 61 67 3d 3d 31 2c 20 69 74 20 6d 65  itFlag==1, it me
2300: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
2310: 6e 67 0a 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  ng.** the master
2320: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
2330: 65 20 6a 75 73 74 20 63 6f 6e 6e 65 63 74 65 64  e just connected
2340: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2350: 2c 20 73 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 74  , so .** the ent
2360: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
2370: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
2380: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74   in the master t
2390: 61 62 6c 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 6e  able..** We do n
23a0: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
23b0: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2f 0a 76  e it again..*/.v
23c0: 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 54 61 62  oid sqliteEndTab
23d0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
23e0: 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 29 7b 0a  , Token *pEnd){.
23f0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
2400: 74 20 68 3b 0a 20 20 69 6e 74 20 61 64 64 4d 65  t h;.  int addMe
2410: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ta;       /* Tru
2420: 65 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6d 65  e to insert a me
2430: 74 61 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20  ta records into 
2440: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 69  the file */..  i
2450: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2460: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
2470: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
2480: 65 3b 0a 20 20 61 64 64 4d 65 74 61 20 3d 20 20  e;.  addMeta =  
2490: 70 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  p!=0 && pParse->
24a0: 64 62 2d 3e 6e 54 61 62 6c 65 3d 3d 31 3b 0a 0a  db->nTable==1;..
24b0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
24c0: 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
24d0: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
24e0: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
24f0: 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 21  se.  */.  if( p!
2500: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78  =0 && pParse->ex
2510: 70 6c 61 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  plain==0 ){.    
2520: 68 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 6f  h = sqliteHashNo
2530: 43 61 73 65 28 70 2d 3e 7a 4e 61 6d 65 2c 20 30  Case(p->zName, 0
2540: 29 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20 20 20  ) % N_HASH;.    
2550: 70 2d 3e 70 48 61 73 68 20 3d 20 70 50 61 72 73  p->pHash = pPars
2560: 65 2d 3e 64 62 2d 3e 61 70 54 62 6c 48 61 73 68  e->db->apTblHash
2570: 5b 68 5d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  [h];.    pParse-
2580: 3e 64 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b 68  >db->apTblHash[h
2590: 5d 20 3d 20 70 3b 0a 20 20 20 20 70 50 61 72 73  ] = p;.    pPars
25a0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
25b0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  ;.    pParse->db
25c0: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 7d 0a  ->nTable++;.  }.
25d0: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
25e0: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
25f0: 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
2600: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
2610: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e   if( !pParse->in
2620: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 74  itFlag ){.    st
2630: 61 74 69 63 20 56 64 62 65 4f 70 20 61 64 64 54  atic VdbeOp addT
2640: 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  able[] = {.     
2650: 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20   { OP_Open,     
2660: 20 20 20 30 2c 20 31 2c 20 4d 41 53 54 45 52 5f     0, 1, MASTER_
2670: 4e 41 4d 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  NAME },.      { 
2680: 4f 50 5f 4e 65 77 2c 20 20 20 20 20 20 20 20 20  OP_New,         
2690: 30 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20  0, 0, 0},.      
26a0: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
26b0: 20 20 30 2c 20 30 2c 20 22 74 61 62 6c 65 22 20    0, 0, "table" 
26c0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f      },.      { O
26d0: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30  P_String,      0
26e0: 2c 20 30 2c 20 30 7d 2c 20 20 20 20 20 20 20 20  , 0, 0},        
26f0: 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20      /* 3 */.    
2700: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
2710: 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 20 20 20      0, 0, 0},   
2720: 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 2a 2f           /* 4 */
2730: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
2740: 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30  ng,      0, 0, 0
2750: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  },            /*
2760: 20 35 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   5 */.      { OP
2770: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 20 34 2c  _MakeRecord,  4,
2780: 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20   0, 0},.      { 
2790: 4f 50 5f 50 75 74 2c 20 20 20 20 20 20 20 20 20  OP_Put,         
27a0: 30 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 7d 3b  0, 0, 0},.    };
27b0: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
27c0: 4f 70 20 61 64 64 56 65 72 73 69 6f 6e 5b 5d 20  Op addVersion[] 
27d0: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  = {.      { OP_N
27e0: 65 77 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30  ew,         0, 0
27f0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
2800: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c  _String,      0,
2810: 20 30 2c 20 22 6d 65 74 61 22 20 20 20 20 20 20   0, "meta"      
2820: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2830: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
2840: 20 30 2c 20 30 2c 20 22 22 20 20 20 20 20 20 20   0, 0, ""       
2850: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2860: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
2870: 20 20 20 20 30 2c 20 30 2c 20 22 22 20 20 20 20      0, 0, ""    
2880: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2890: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
28a0: 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 22 66 69  ,      0, 0, "fi
28b0: 6c 65 20 66 6f 72 6d 61 74 20 32 22 20 20 20 7d  le format 2"   }
28c0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 61 6b  ,.      { OP_Mak
28d0: 65 52 65 63 6f 72 64 2c 20 20 34 2c 20 30 2c 20  eRecord,  4, 0, 
28e0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 50  0},.      { OP_P
28f0: 75 74 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30  ut,         0, 0
2900: 2c 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20  , 0},.    };.   
2910: 20 69 6e 74 20 6e 2c 20 62 61 73 65 3b 0a 20 20   int n, base;.  
2920: 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20    Vdbe *v;..    
2930: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
2940: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
2950: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
2960: 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 70  ;.    n = (int)p
2970: 45 6e 64 2d 3e 7a 20 2d 20 28 69 6e 74 29 70 50  End->z - (int)pP
2980: 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65  arse->sFirstToke
2990: 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 62 61 73  n.z + 1;.    bas
29a0: 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  e = sqliteVdbeAd
29b0: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
29c0: 53 69 7a 65 28 61 64 64 54 61 62 6c 65 29 2c 20  Size(addTable), 
29d0: 61 64 64 54 61 62 6c 65 29 3b 0a 20 20 20 20 73  addTable);.    s
29e0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
29f0: 33 28 76 2c 20 62 61 73 65 2b 33 2c 20 70 2d 3e  3(v, base+3, p->
2a00: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
2a10: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
2a20: 33 28 76 2c 20 62 61 73 65 2b 34 2c 20 70 2d 3e  3(v, base+4, p->
2a30: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
2a40: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
2a50: 33 28 76 2c 20 62 61 73 65 2b 35 2c 20 70 50 61  3(v, base+5, pPa
2a60: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
2a70: 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20  .z, n);.    if( 
2a80: 61 64 64 4d 65 74 61 20 29 7b 0a 20 20 20 20 20  addMeta ){.     
2a90: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2aa0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
2ab0: 65 28 61 64 64 56 65 72 73 69 6f 6e 29 2c 20 61  e(addVersion), a
2ac0: 64 64 56 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20  ddVersion);.    
2ad0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  }.    sqliteVdbe
2ae0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
2af0: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  e, 0, 0, 0, 0);.
2b00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
2b10: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b  en a token, look
2b20: 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74 68   up a table with
2b30: 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20   that name.  If 
2b40: 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65  not found, leave
2b50: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  .** an error for
2b60: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 66   the parser to f
2b70: 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ind and return N
2b80: 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ULL..*/.Table *s
2b90: 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f  qliteTableFromTo
2ba0: 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ken(Parse *pPars
2bb0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b  e, Token *pTok){
2bc0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
2bd0: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
2be0: 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b  FromToken(pTok);
2bf0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
2c00: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
2c10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
2c20: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
2c30: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  e(zName);.  if( 
2c40: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
2c50: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
2c60: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
2c70: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
2c80: 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  : ", 0, .       
2c90: 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e   pTok->z, pTok->
2ca0: 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  n, 0);.    pPars
2cb0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20  e->nErr++;.  }. 
2cc0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
2cd0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2ce0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
2cf0: 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
2d00: 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
2d10: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
2d20: 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c 65 28  sqliteDropTable(
2d30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
2d40: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
2d50: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
2d60: 20 69 6e 74 20 68 3b 0a 20 20 56 64 62 65 20 2a   int h;.  Vdbe *
2d70: 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a  v;.  int base;..
2d80: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
2d90: 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28  eTableFromToken(
2da0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a  pParse, pName);.
2db0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
2dc0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
2dd0: 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79  pTable->readOnly
2de0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
2df0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
2e00: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
2e10: 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d   ", pTable->zNam
2e20: 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61 79  e, .       " may
2e30: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
2e40: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
2e50: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
2e60: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
2e70: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
2e80: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
2e90: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
2ea0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
2eb0: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
2ec0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
2ed0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
2ee0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
2ef0: 62 65 4f 70 20 64 72 6f 70 54 61 62 6c 65 5b 5d  beOp dropTable[]
2f00: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
2f10: 4f 70 65 6e 2c 20 20 20 20 20 20 20 30 2c 20 31  Open,       0, 1
2f20: 2c 20 20 20 20 20 20 20 20 4d 41 53 54 45 52 5f  ,        MASTER_
2f30: 4e 41 4d 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  NAME },.      { 
2f40: 4f 50 5f 4c 69 73 74 4f 70 65 6e 2c 20 20 20 30  OP_ListOpen,   0
2f50: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
2f60: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
2f70: 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  g,     0, 0,    
2f80: 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a      0}, /* 2 */.
2f90: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c        { OP_Next,
2fa0: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 31         0, ADDR(1
2fb0: 30 29 2c 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a  0), 0}, /* 3 */.
2fc0: 20 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20        { OP_Dup, 
2fd0: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20         0, 0,    
2fe0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
2ff0: 4f 50 5f 46 69 65 6c 64 2c 20 20 20 20 20 20 30  OP_Field,      0
3000: 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 2,        0},.
3010: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20        { OP_Ne,  
3020: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33         0, ADDR(3
3030: 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ),  0},.      { 
3040: 4f 50 5f 4b 65 79 2c 20 20 20 20 20 20 20 20 30  OP_Key,        0
3050: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
3060: 20 20 20 20 20 20 7b 20 4f 50 5f 4c 69 73 74 57        { OP_ListW
3070: 72 69 74 65 2c 20 20 30 2c 20 30 2c 20 20 20 20  rite,  0, 0,    
3080: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
3090: 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30  OP_Goto,       0
30a0: 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 0a  , ADDR(3),  0},.
30b0: 20 20 20 20 20 20 7b 20 4f 50 5f 4c 69 73 74 52        { OP_ListR
30c0: 65 77 69 6e 64 2c 20 30 2c 20 30 2c 20 20 20 20  ewind, 0, 0,    
30d0: 20 20 20 20 30 7d 2c 20 2f 2a 20 31 30 20 2a 2f      0}, /* 10 */
30e0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4c 69 73 74  .      { OP_List
30f0: 52 65 61 64 2c 20 20 20 30 2c 20 41 44 44 52 28  Read,   0, ADDR(
3100: 31 34 29 2c 20 30 7d 2c 20 2f 2a 20 31 31 20 2a  14), 0}, /* 11 *
3110: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c  /.      { OP_Del
3120: 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ete,     0, 0,  
3130: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
3140: 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20  { OP_Goto,      
3150: 20 30 2c 20 41 44 44 52 28 31 31 29 2c 20 30 7d   0, ADDR(11), 0}
3160: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 73  ,.      { OP_Des
3170: 74 72 6f 79 2c 20 20 20 20 30 2c 20 30 2c 20 20  troy,    0, 0,  
3180: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 34 20        0}, /* 14 
3190: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c  */.      { OP_Cl
31a0: 6f 73 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20  ose,      0, 0, 
31b0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
31c0: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
31d0: 78 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71  x;.    base = sq
31e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
31f0: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64  t(v, ArraySize(d
3200: 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54  ropTable), dropT
3210: 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  able);.    sqlit
3220: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
3230: 20 62 61 73 65 2b 32 2c 20 70 54 61 62 6c 65 2d   base+2, pTable-
3240: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
3250: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
3260: 50 33 28 76 2c 20 62 61 73 65 2b 31 34 2c 20 70  P3(v, base+14, p
3270: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Table->zName, 0)
3280: 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
3290: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
32a0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
32b0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 73 71  pNext){.      sq
32c0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
32d0: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 30 2c 20   OP_Destroy, 0, 
32e0: 30 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  0, pIdx->zName, 
32f0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
3300: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69   /* Remove the i
3310: 6e 2d 6d 65 6d 6f 72 79 20 74 61 62 6c 65 20 73  n-memory table s
3320: 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 72 65  tructure and fre
3330: 65 20 69 74 73 20 6d 65 6d 6f 72 79 2e 0a 20 20  e its memory..  
3340: 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
3350: 6e 3a 20 69 66 20 74 68 65 20 53 51 4c 20 73 74  n: if the SQL st
3360: 61 74 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69  atement began wi
3370: 74 68 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  th the EXPLAIN k
3380: 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65  eyword,.  ** the
3390: 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  n no changes are
33a0: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   made..  */.  if
33b0: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
33c0: 69 6e 20 29 7b 0a 20 20 20 20 68 20 3d 20 73 71  in ){.    h = sq
33d0: 6c 69 74 65 48 61 73 68 4e 6f 43 61 73 65 28 70  liteHashNoCase(p
33e0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Table->zName, 0)
33f0: 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20 20 20 69   % N_HASH;.    i
3400: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  f( pParse->db->a
3410: 70 54 62 6c 48 61 73 68 5b 68 5d 3d 3d 70 54 61  pTblHash[h]==pTa
3420: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ble ){.      pPa
3430: 72 73 65 2d 3e 64 62 2d 3e 61 70 54 62 6c 48 61  rse->db->apTblHa
3440: 73 68 5b 68 5d 20 3d 20 70 54 61 62 6c 65 2d 3e  sh[h] = pTable->
3450: 70 48 61 73 68 3b 0a 20 20 20 20 7d 65 6c 73 65  pHash;.    }else
3460: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
3470: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 50  ;.      for(p=pP
3480: 61 72 73 65 2d 3e 64 62 2d 3e 61 70 54 62 6c 48  arse->db->apTblH
3490: 61 73 68 5b 68 5d 3b 20 70 20 26 26 20 70 2d 3e  ash[h]; p && p->
34a0: 70 48 61 73 68 21 3d 70 54 61 62 6c 65 3b 20 70  pHash!=pTable; p
34b0: 3d 70 2d 3e 70 48 61 73 68 29 7b 7d 0a 20 20 20  =p->pHash){}.   
34c0: 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70     if( p && p->p
34d0: 48 61 73 68 3d 3d 70 54 61 62 6c 65 20 29 7b 0a  Hash==pTable ){.
34e0: 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61 73 68          p->pHash
34f0: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 48 61 73 68   = pTable->pHash
3500: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3510: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
3520: 6e 54 61 62 6c 65 2d 2d 3b 0a 20 20 20 20 73 71  nTable--;.    sq
3530: 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28  liteDeleteTable(
3540: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
3550: 6c 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  le);.  }.}../*.*
3560: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
3570: 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
3580: 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78 20 69  table.  pIndex i
3590: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
35a0: 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
35b0: 70 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61  pTable is the na
35c0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
35d0: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
35e0: 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
35f0: 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
3600: 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  r a primary key.
3610: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
3620: 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
3630: 54 61 62 6c 65 20 61 73 20 74 68 65 20 0a 2a 2a  Table as the .**
3640: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
3650: 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  exed..**.** pLis
3660: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
3670: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
3680: 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
3690: 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65  l be NULL if the
36a0: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
36b0: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
36c0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6c  f the table is l
36d0: 61 62 65 6c 65 64 20 61 73 20 74 68 65 20 70 72  abeled as the pr
36e0: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2f 0a 76 6f  imary key..*/.vo
36f0: 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65 49  id sqliteCreateI
3700: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
3710: 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20  Parse,   /* All 
3720: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
3730: 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
3740: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
3750: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3760: 65 20 69 6e 64 65 78 2e 20 20 4d 61 79 20 62 65  e index.  May be
3770: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
3780: 20 2a 70 54 61 62 6c 65 2c 20 20 20 2f 2a 20 4e   *pTable,   /* N
3790: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
37a0: 20 74 6f 20 69 6e 64 65 78 2e 20 20 55 73 65 20   to index.  Use 
37b0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
37c0: 65 20 69 66 20 30 20 2a 2f 0a 20 20 49 64 4c 69  e if 0 */.  IdLi
37d0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
37e0: 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
37f0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
3800: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
3810: 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45  rt,   /* The CRE
3820: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
3830: 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54  egins a CREATE T
3840: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
3850: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20  /.  Token *pEnd 
3860: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20       /* The ")" 
3870: 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20  that closes the 
3880: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
3890: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54  tement */.){.  T
38a0: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
38b0: 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
38c0: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
38d0: 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20  x *pIndex;   /* 
38e0: 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
38f0: 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
3900: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
3910: 69 6e 74 20 69 2c 20 6a 2c 20 68 3b 0a 20 20 54  int i, j, h;.  T
3920: 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20  oken nullId;    
3930: 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f  /* Fake token fo
3940: 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69  r an empty ID li
3950: 73 74 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  st */..  /*.  **
3960: 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
3970: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
3980: 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
3990: 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
39a0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
39b0: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 70  able!=0 ){.    p
39c0: 54 61 62 20 3d 20 20 73 71 6c 69 74 65 54 61 62  Tab =  sqliteTab
39d0: 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  leFromToken(pPar
39e0: 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d  se, pTable);.  }
39f0: 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 20 3d  else{.    pTab =
3a00: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
3a10: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ble;.  }.  if( p
3a20: 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  Tab==0 || pParse
3a30: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
3a40: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
3a50: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61  .  if( pTab->rea
3a60: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
3a70: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
3a80: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
3a90: 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a  table ", pTab->z
3aa0: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 22 20 6d  Name, .      " m
3ab0: 61 79 20 6e 6f 74 20 68 61 76 65 20 6e 65 77 20  ay not have new 
3ac0: 69 6e 64 69 63 65 73 20 61 64 64 65 64 22 2c 20  indices added", 
3ad0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
3ae0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
3af0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
3b00: 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
3b10: 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
3b20: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
3b30: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
3b40: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
3b50: 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
3b60: 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
3b70: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 0a 20  the same name.. 
3b80: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
3b90: 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
3ba0: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
3bb0: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
3bc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61    }else{.    zNa
3bd0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  me = 0;.    sqli
3be0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  teSetString(&zNa
3bf0: 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
3c00: 20 22 5f 5f 70 72 69 6d 61 72 79 5f 6b 65 79 22   "__primary_key"
3c10: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
3c20: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
3c30: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
3c40: 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  e) ){.    sqlite
3c50: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
3c60: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 69 6e 64  e->zErrMsg, "ind
3c70: 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20  ex ", zName, .  
3c80: 20 20 20 20 20 22 20 61 6c 72 65 61 64 79 20 65       " already e
3c90: 78 69 73 74 73 22 2c 20 30 29 3b 0a 20 20 20 20  xists", 0);.    
3ca0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
3cb0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
3cc0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
3cd0: 20 20 69 66 28 20 73 71 6c 69 74 65 46 69 6e 64    if( sqliteFind
3ce0: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
3cf0: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
3d00: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
3d10: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
3d20: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
3d30: 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
3d40: 64 20 22 2c 0a 20 20 20 20 20 20 20 7a 4e 61 6d  d ",.       zNam
3d50: 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  e, 0);.    pPars
3d60: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
3d70: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
3d80: 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
3d90: 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
3da0: 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
3db0: 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
3dc0: 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
3dd0: 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
3de0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
3df0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
3e00: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
3e10: 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
3e20: 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
3e30: 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
3e40: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
3e50: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
3e60: 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d  nullId.z = pTab-
3e70: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
3e80: 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
3e90: 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e  ullId.n = strlen
3ea0: 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20  (nullId.z);.    
3eb0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49 64  pList = sqliteId
3ec0: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e  ListAppend(0, &n
3ed0: 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
3ee0: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
3ef0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
3f00: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20  x;.  }..  /* .  
3f10: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
3f20: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
3f30: 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20   .  */.  pIndex 
3f40: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
3f50: 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
3f60: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
3f70: 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1 +.            
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
3f90: 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e  of(int)*pList->n
3fa0: 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  Id );.  if( pInd
3fb0: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex==0 ){.    sql
3fc0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
3fd0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
3fe0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20  out of memory", 
3ff0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
4000: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
4010: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
4020: 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
4030: 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e  ->aiColumn = (in
4040: 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d 3b 0a 20  t*)&pIndex[1];. 
4050: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d   pIndex->zName =
4060: 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
4070: 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d  >aiColumn[pList-
4080: 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70 79 28  >nId];.  strcpy(
4090: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
40a0: 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Name);.  pIndex-
40b0: 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
40c0: 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
40d0: 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a  n = pList->nId;.
40e0: 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e  .  /* Scan the n
40f0: 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
4100: 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
4110: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61   to be indexed a
4120: 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65  nd.  ** load the
4130: 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20   column indices 
4140: 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73  into the Index s
4150: 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72  tructure.  Repor
4160: 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20  t an error.  ** 
4170: 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73  if any column is
4180: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
4190: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
41a0: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
41b0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
41c0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
41d0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
41e0: 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  eStrICmp(pList->
41f0: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
4200: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
4210: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
4220: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
4230: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
4240: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
4250: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
4260: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54  sg, "table ", pT
4270: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ab->zName, .    
4280: 20 20 20 20 22 20 68 61 73 20 6e 6f 20 63 6f 6c      " has no col
4290: 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20 70 4c 69  umn named ", pLi
42a0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
42b0: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
42c0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
42d0: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
42e0: 78 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  x);.      goto e
42f0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
4300: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
4310: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
4320: 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  = j;.  }..  /* L
4330: 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
4340: 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
4350: 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
4360: 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
4370: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
4380: 65 20 73 74 72 75 63 74 75 72 65 73 2e 0a 20 20  e structures..  
4390: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
43a0: 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29 7b 0a 20  >explain==0 ){. 
43b0: 20 20 20 68 20 3d 20 73 71 6c 69 74 65 48 61 73     h = sqliteHas
43c0: 68 4e 6f 43 61 73 65 28 70 49 6e 64 65 78 2d 3e  hNoCase(pIndex->
43d0: 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e 5f 48 41  zName, 0) % N_HA
43e0: 53 48 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  SH;.    pIndex->
43f0: 70 48 61 73 68 20 3d 20 70 50 61 72 73 65 2d 3e  pHash = pParse->
4400: 64 62 2d 3e 61 70 49 64 78 48 61 73 68 5b 68 5d  db->apIdxHash[h]
4410: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  ;.    pParse->db
4420: 2d 3e 61 70 49 64 78 48 61 73 68 5b 68 5d 20 3d  ->apIdxHash[h] =
4430: 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e   pIndex;.    pIn
4440: 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
4450: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70  b->pIndex;.    p
4460: 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
4470: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
4480: 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20  If the initFlag 
4490: 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65  is 0 then create
44a0: 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69   the index on di
44b0: 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69  sk.  This.  ** i
44c0: 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20  nvolves writing 
44d0: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  the index into t
44e0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
44f0: 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  and filling in t
4500: 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  he.  ** index wi
4510: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
4520: 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20  able contents.. 
4530: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 6e 69   **.  ** The ini
4540: 74 46 6c 61 67 20 69 73 20 30 20 77 68 65 6e 20  tFlag is 0 when 
4550: 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65  the user first e
4560: 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49  nters a CREATE I
4570: 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61  NDEX .  ** comma
4580: 6e 64 2e 20 20 54 68 65 20 69 6e 69 74 46 6c 61  nd.  The initFla
4590: 67 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61  g is 1 when a da
45a0: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
45b0: 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54   and .  ** CREAT
45c0: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
45d0: 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20  ts are read out 
45e0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  of the master ta
45f0: 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68  ble.  In.  ** th
4600: 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68  e latter case th
4610: 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
4620: 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
4630: 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a  which is why.  *
4640: 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  * we don't want 
4650: 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a  to recreate it..
4660: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
4670: 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30 20 29  e->initFlag==0 )
4680: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
4690: 65 4f 70 20 61 64 64 54 61 62 6c 65 5b 5d 20 3d  eOp addTable[] =
46a0: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70   {.      { OP_Op
46b0: 65 6e 2c 20 20 20 20 20 20 20 20 32 2c 20 31 2c  en,        2, 1,
46c0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20   MASTER_NAME},. 
46d0: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 77 2c 20 20       { OP_New,  
46e0: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 7d 2c         2, 0, 0},
46f0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
4700: 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 22  ng,      0, 0, "
4710: 69 6e 64 65 78 22 7d 2c 0a 20 20 20 20 20 20 7b  index"},.      {
4720: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
4730: 20 30 2c 20 30 2c 20 30 7d 2c 20 20 2f 2a 20 33   0, 0, 0},  /* 3
4740: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   */.      { OP_S
4750: 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20 30  tring,      0, 0
4760: 2c 20 30 7d 2c 20 20 2f 2a 20 34 20 2a 2f 0a 20  , 0},  /* 4 */. 
4770: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
4780: 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c  ,      0, 0, 0},
4790: 20 20 2f 2a 20 35 20 2a 2f 0a 20 20 20 20 20 20    /* 5 */.      
47a0: 7b 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  { OP_MakeRecord,
47b0: 20 20 34 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20    4, 0, 0},.    
47c0: 20 20 7b 20 4f 50 5f 50 75 74 2c 20 20 20 20 20    { OP_Put,     
47d0: 20 20 20 20 32 2c 20 30 2c 20 30 7d 2c 0a 20 20      2, 0, 0},.  
47e0: 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20      { OP_Close, 
47f0: 20 20 20 20 20 20 32 2c 20 30 2c 20 30 7d 2c 0a        2, 0, 0},.
4800: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e      };.    int n
4810: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
4820: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
4830: 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c     int lbl1, lbl
4840: 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  2;.    int i;.. 
4850: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74     v = sqliteGet
4860: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
4870: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
4880: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
4890: 64 65 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  dex;.    sqliteV
48a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
48b0: 70 65 6e 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  pen, 0, 0, pTab-
48c0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
48d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
48e0: 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 31 2c 20 31  v, OP_Open, 1, 1
48f0: 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
4900: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74   0);.    if( pSt
4910: 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20  art && pEnd ){. 
4920: 20 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 20       int base;. 
4930: 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 70 45       n = (int)pE
4940: 6e 64 2d 3e 7a 20 2d 20 28 69 6e 74 29 70 53 74  nd->z - (int)pSt
4950: 61 72 74 2d 3e 7a 20 2b 20 31 3b 0a 20 20 20 20  art->z + 1;.    
4960: 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56    base = sqliteV
4970: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
4980: 41 72 72 61 79 53 69 7a 65 28 61 64 64 54 61 62  ArraySize(addTab
4990: 6c 65 29 2c 20 61 64 64 54 61 62 6c 65 29 3b 0a  le), addTable);.
49a0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
49b0: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
49c0: 2b 33 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  +3, pIndex->zNam
49d0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  e, 0);.      sql
49e0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
49f0: 76 2c 20 62 61 73 65 2b 34 2c 20 70 54 61 62 2d  v, base+4, pTab-
4a00: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
4a10: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
4a20: 67 65 50 33 28 76 2c 20 62 61 73 65 2b 35 2c 20  geP3(v, base+5, 
4a30: 70 53 74 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20  pStart->z, n);. 
4a40: 20 20 20 7d 0a 20 20 20 20 6c 62 6c 31 20 3d 20     }.    lbl1 = 
4a50: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
4a60: 62 65 6c 28 76 29 3b 0a 20 20 20 20 6c 62 6c 32  bel(v);.    lbl2
4a70: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
4a80: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73  eLabel(v);.    s
4a90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4aa0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 30 2c 20 6c 62  , OP_Next, 0, lb
4ab0: 6c 32 2c 20 30 2c 20 6c 62 6c 31 29 3b 0a 20 20  l2, 0, lbl1);.  
4ac0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4ad0: 70 28 76 2c 20 4f 50 5f 4b 65 79 2c 20 30 2c 20  p(v, OP_Key, 0, 
4ae0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 66 6f  0, 0, 0);.    fo
4af0: 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d  r(i=0; i<pIndex-
4b00: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
4b10: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4b20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 65 6c  AddOp(v, OP_Fiel
4b30: 64 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 61 69  d, 0, pIndex->ai
4b40: 43 6f 6c 75 6d 6e 5b 69 5d 2c 20 30 2c 20 30 29  Column[i], 0, 0)
4b50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4b60: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4b70: 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 49 6e 64 65  P_MakeKey, pInde
4b80: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30  x->nColumn, 0, 0
4b90: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4ba0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4bb0: 50 75 74 49 64 78 2c 20 31 2c 20 30 2c 20 30 2c  PutIdx, 1, 0, 0,
4bc0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
4bd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
4be0: 6f 74 6f 2c 20 30 2c 20 6c 62 6c 31 2c 20 30 2c  oto, 0, lbl1, 0,
4bf0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
4c00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
4c10: 6f 6f 70 2c 20 30 2c 20 30 2c 20 30 2c 20 6c 62  oop, 0, 0, 0, lb
4c20: 6c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  l2);.    sqliteV
4c30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
4c40: 6c 6f 73 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30  lose, 1, 0, 0, 0
4c50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
4c60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
4c70: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  se, 0, 0, 0, 0);
4c80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
4c90: 69 6d 20 6d 65 6d 6f 72 79 20 6f 6e 20 61 6e 20  im memory on an 
4ca0: 45 58 50 4c 41 49 4e 20 63 61 6c 6c 2e 0a 20 20  EXPLAIN call..  
4cb0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
4cc0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
4cd0: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65  sqliteFree(pInde
4ce0: 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c  x);.  }..  /* Cl
4cf0: 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
4d00: 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
4d10: 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71  eate_index:.  sq
4d20: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
4d30: 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  (pList);.  sqlit
4d40: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
4d50: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
4d60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
4d70: 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
4d80: 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
4d90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44  .*/.void sqliteD
4da0: 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
4db0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
4dc0: 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
4dd0: 70 49 6e 64 65 78 3b 0a 20 20 63 68 61 72 20 2a  pIndex;.  char *
4de0: 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65 20 2a 76  zName;.  Vdbe *v
4df0: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  ;..  zName = sql
4e00: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
4e10: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
4e20: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 46  pIndex = sqliteF
4e30: 69 6e 64 49 6e 64 65 78 28 70 50 61 72 73 65 2d  indIndex(pParse-
4e40: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  >db, zName);.  s
4e50: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
4e60: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
4e70: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  0 ){.    sqliteS
4e80: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
4e90: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
4ea0: 73 75 63 68 20 69 6e 64 65 78 3a 20 22 2c 20 30  such index: ", 0
4eb0: 2c 20 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65  , .        pName
4ec0: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30  ->z, pName->n, 0
4ed0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
4ee0: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
4ef0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  n;.  }..  /* Gen
4f00: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
4f10: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
4f20: 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
4f30: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
4f40: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
4f50: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
4f60: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
4f70: 64 62 65 4f 70 20 64 72 6f 70 49 6e 64 65 78 5b  dbeOp dropIndex[
4f80: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
4f90: 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20 30 2c 20  _Open,       0, 
4fa0: 31 2c 20 20 20 20 20 20 20 4d 41 53 54 45 52 5f  1,       MASTER_
4fb0: 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  NAME},.      { O
4fc0: 50 5f 4c 69 73 74 4f 70 65 6e 2c 20 20 20 30 2c  P_ListOpen,   0,
4fd0: 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   0,       0},.  
4fe0: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
4ff0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
5000: 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20   0}, /* 2 */.   
5010: 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20     { OP_Next,   
5020: 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
5030: 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20  0}, /* 3 */.    
5040: 20 20 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20    { OP_Dup,     
5050: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
5060: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 46 69  },.      { OP_Fi
5070: 65 6c 64 2c 20 20 20 20 20 20 30 2c 20 31 2c 20  eld,      0, 1, 
5080: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
5090: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
50a0: 20 30 2c 20 41 44 44 52 28 33 29 2c 20 30 7d 2c   0, ADDR(3), 0},
50b0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4b 65 79 2c  .      { OP_Key,
50c0: 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20          0, 0,   
50d0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
50e0: 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30  OP_Delete,     0
50f0: 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 0,       0},. 
5100: 20 20 20 20 20 7b 20 4f 50 5f 44 65 73 74 72 6f       { OP_Destro
5110: 79 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  y,    0, 0,     
5120: 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20    0}, /* 9 */.  
5130: 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20      { OP_Close, 
5140: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
5150: 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
5160: 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20 20 62  int base;..    b
5170: 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ase = sqliteVdbe
5180: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
5190: 61 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78  aySize(dropIndex
51a0: 29 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20  ), dropIndex);. 
51b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
51c0: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32 2c  ngeP3(v, base+2,
51d0: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
51e0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
51f0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61  beChangeP3(v, ba
5200: 73 65 2b 39 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  se+9, pIndex->zN
5210: 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  ame, 0);.  }..  
5220: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e  /* Remove the in
5230: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 61 6e  dex structure an
5240: 64 20 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72  d free its memor
5250: 79 2e 20 20 45 78 63 65 70 74 20 69 66 20 74 68  y.  Except if th
5260: 65 0a 20 20 2a 2a 20 45 58 50 4c 41 49 4e 20 6b  e.  ** EXPLAIN k
5270: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
5280: 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  t, no changes ar
5290: 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69  e made..  */.  i
52a0: 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  f( !pParse->expl
52b0: 61 69 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ain ){.    if( p
52c0: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
52d0: 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b  Index==pIndex ){
52e0: 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
52f0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
5300: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
5310: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5320: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20  Index *p;.      
5330: 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54  for(p=pIndex->pT
5340: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20  able->pIndex; p 
5350: 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e  && p->pNext!=pIn
5360: 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  dex; p=p->pNext)
5370: 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26  {}.      if( p &
5380: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
5390: 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ex ){.        p-
53a0: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
53b0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
53c0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
53d0: 44 65 6c 65 74 65 49 6e 64 65 78 28 70 50 61 72  DeleteIndex(pPar
53e0: 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 29 3b  se->db, pIndex);
53f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
5400: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
5410: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
5420: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
5430: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
5440: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
5450: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
5460: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
5470: 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ist..*/.ExprList
5480: 20 2a 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74   *sqliteExprList
5490: 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20  Append(ExprList 
54a0: 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45  *pList, Expr *pE
54b0: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  xpr, Token *pNam
54c0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
54d0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
54e0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
54f0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
5500: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 7d  ExprList) );.  }
5510: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
5520: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
5530: 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ( (pList->nExpr 
5540: 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  & 7)==0 ){.    i
5550: 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nt n = pList->nE
5560: 78 70 72 20 2b 20 38 3b 0a 20 20 20 20 70 4c 69  xpr + 8;.    pLi
5570: 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65  st->a = sqliteRe
5580: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
5590: 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  n*sizeof(pList->
55a0: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
55b0: 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20  pList->a==0 ){. 
55c0: 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70       pList->nExp
55d0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  r = 0;.      ret
55e0: 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d  urn pList;.    }
55f0: 0a 20 20 7d 0a 20 20 69 20 3d 20 70 4c 69 73 74  .  }.  i = pList
5600: 2d 3e 6e 45 78 70 72 2b 2b 3b 0a 20 20 70 4c 69  ->nExpr++;.  pLi
5610: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
5620: 20 70 45 78 70 72 3b 0a 20 20 70 4c 69 73 74 2d   pExpr;.  pList-
5630: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b  >a[i].zName = 0;
5640: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
5650: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
5660: 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69  ring(&pList->a[i
5670: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
5680: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b  z, pName->n, 0);
5690: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f  .    sqliteDequo
56a0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  te(pList->a[i].z
56b0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Name);.  }.  ret
56c0: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
56d0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
56e0: 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tire expression 
56f0: 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
5700: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
5710: 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  te(ExprList *pLi
5720: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
5730: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
5740: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
5750: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
5760: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
5770: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69  teExprDelete(pLi
5780: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
5790: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
57a0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
57b0: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
57c0: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
57d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
57e0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  st);.}../*.** Ap
57f0: 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
5800: 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
5810: 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
5820: 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
5830: 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2f 0a 49  ** need be..*/.I
5840: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 49 64 4c  dList *sqliteIdL
5850: 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74  istAppend(IdList
5860: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
5870: 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70  pToken){.  if( p
5880: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
5890: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
58a0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69  loc( sizeof(IdLi
58b0: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
58c0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
58d0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   0;.  }.  if( (p
58e0: 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37 29 3d 3d  List->nId & 7)==
58f0: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  0 ){.    pList->
5900: 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  a = sqliteReallo
5910: 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69  c(pList->a, (pLi
5920: 73 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65 6f  st->nId+8)*sizeo
5930: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
5940: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
5950: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  >a==0 ){.      p
5960: 4c 69 73 74 2d 3e 6e 49 64 20 3d 20 30 3b 0a 20  List->nId = 0;. 
5970: 20 20 20 20 20 72 65 74 75 72 6e 20 70 4c 69 73       return pLis
5980: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d  t;.    }.  }.  m
5990: 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b  emset(&pList->a[
59a0: 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20  pList->nId], 0, 
59b0: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
59c0: 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  0]));.  if( pTok
59d0: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
59e0: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73  SetNString(&pLis
59f0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d  t->a[pList->nId]
5a00: 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 2d 3e  .zName, pToken->
5a10: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29  z, pToken->n, 0)
5a20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75  ;.    sqliteDequ
5a30: 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  ote(pList->a[pLi
5a40: 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 29 3b  st->nId].zName);
5a50: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49  .  }.  pList->nI
5a60: 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  d++;.  return pL
5a70: 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ist;.}../*.** Ad
5a80: 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
5a90: 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
5aa0: 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
5ab0: 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
5ac0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64  */.void sqliteId
5ad0: 4c 69 73 74 41 64 64 41 6c 69 61 73 28 49 64 4c  ListAddAlias(IdL
5ae0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
5af0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
5b00: 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
5b10: 2d 3e 6e 49 64 3e 30 20 29 7b 0a 20 20 20 20 69  ->nId>0 ){.    i
5b20: 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 49  nt i = pList->nI
5b30: 64 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  d - 1;.    sqlit
5b40: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69  eSetNString(&pLi
5b50: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c  st->a[i].zAlias,
5b60: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
5b70: 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73  en->n, 0);.    s
5b80: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69  qliteDequote(pLi
5b90: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29  st->a[i].zAlias)
5ba0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
5bb0: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
5bc0: 49 64 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  IdList.*/.void s
5bd0: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
5be0: 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  e(IdList *pList)
5bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
5c00: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
5c10: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
5c20: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
5c30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
5c40: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
5c50: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
5c60: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
5c70: 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20  .zAlias);.  }.  
5c80: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
5c90: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ->a);.  sqliteFr
5ca0: 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 0a 2f  ee(pList);.}.../
5cb0: 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59 20 63 6f  *.** The COPY co
5cc0: 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20 63 6f 6d  mmand is for com
5cd0: 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
5ce0: 50 6f 73 74 67 72 65 53 51 4c 20 61 6e 64 20 73  PostgreSQL and s
5cf0: 70 65 63 69 66 69 63 69 61 6c 6c 79 0a 2a 2a 20  pecificially.** 
5d00: 66 6f 72 20 74 68 65 20 61 62 69 6c 69 74 79 20  for the ability 
5d10: 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74 70  to read the outp
5d20: 75 74 20 6f 66 20 70 67 5f 64 75 6d 70 2e 20 20  ut of pg_dump.  
5d30: 54 68 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  The format is as
5d40: 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  .** follows:.**.
5d50: 2a 2a 20 20 20 20 43 4f 50 59 20 74 61 62 6c 65  **    COPY table
5d60: 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55 53 49 4e   FROM file [USIN
5d70: 47 20 44 45 4c 49 4d 49 54 45 52 53 20 73 74 72  G DELIMITERS str
5d80: 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74 61 62 6c  ing].**.** "tabl
5d90: 65 22 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e  e" is an existin
5da0: 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 57  g table name.  W
5db0: 65 20 77 69 6c 6c 20 72 65 61 64 20 6c 69 6e 65  e will read line
5dc0: 73 20 6f 66 20 63 6f 64 65 20 66 72 6f 6d 0a 2a  s of code from.*
5dd0: 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c 6c 20 74  * file to fill t
5de0: 68 69 73 20 74 61 62 6c 65 20 77 69 74 68 20 64  his table with d
5df0: 61 74 61 2e 20 20 46 69 6c 65 20 6d 69 67 68 74  ata.  File might
5e00: 20 62 65 20 22 73 74 64 69 6e 22 2e 20 20 54 68   be "stdin".  Th
5e10: 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 65  e optional.** de
5e20: 6c 69 6d 69 74 65 72 20 73 74 72 69 6e 67 20 69  limiter string i
5e30: 64 65 6e 74 69 66 69 65 73 20 74 68 65 20 66 69  dentifies the fi
5e40: 65 6c 64 20 73 65 70 61 72 61 74 6f 72 73 2e 20  eld separators. 
5e50: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
5e60: 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69 64 20 73  a tab..*/.void s
5e70: 71 6c 69 74 65 43 6f 70 79 28 0a 20 20 50 61 72  qliteCopy(.  Par
5e80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5e90: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
5ea0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
5eb0: 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20  en *pTableName, 
5ec0: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66    /* The name of
5ed0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20   the table into 
5ee0: 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20 69 6e  which we will in
5ef0: 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  sert */.  Token 
5f00: 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f  *pFilename,    /
5f10: 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f 6d 20  * The file from 
5f20: 77 68 69 63 68 20 74 6f 20 6f 62 74 61 69 6e 20  which to obtain 
5f30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
5f40: 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69 6d 69 74   Token *pDelimit
5f50: 65 72 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69  er    /* Use thi
5f60: 73 20 61 73 20 74 68 65 20 66 69 65 6c 64 20 64  s as the field d
5f70: 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 29 7b 0a 20  elimiter */.){. 
5f80: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
5f90: 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20 69 6e  char *zTab;.  in
5fa0: 74 20 69 2c 20 6a 3b 0a 20 20 56 64 62 65 20 2a  t i, j;.  Vdbe *
5fb0: 76 3b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 65  v;.  int addr, e
5fc0: 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  nd;.  Index *pId
5fd0: 78 3b 0a 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c  x;..  zTab = sql
5fe0: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
5ff0: 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65  Token(pTableName
6000: 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  );.  pTab = sqli
6010: 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  teFindTable(pPar
6020: 73 65 2d 3e 64 62 2c 20 7a 54 61 62 29 3b 0a 20  se->db, zTab);. 
6030: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61 62   sqliteFree(zTab
6040: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
6050: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
6060: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
6070: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
6080: 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c  uch table: ", 0,
6090: 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65   .        pTable
60a0: 4e 61 6d 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e  Name->z, pTableN
60b0: 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ame->n, 0);.    
60c0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
60d0: 20 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c      goto copy_cl
60e0: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28  eanup;.  }.  if(
60f0: 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
6100: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
6110: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
6120: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
6130: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
6140: 20 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f          " may no
6150: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 22 2c 20  t be modified", 
6160: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
6170: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
6180: 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20   copy_cleanup;. 
6190: 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47   }.  v = sqliteG
61a0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
61b0: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 61    if( v ){.    a
61c0: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
61d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65  AddOp(v, OP_File
61e0: 4f 70 65 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Open, 0, 0, 0, 0
61f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
6200: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
6210: 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c  r, pFilename->z,
6220: 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a   pFilename->n);.
6230: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
6240: 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29  quoteP3(v, addr)
6250: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
6260: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
6270: 2c 20 30 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 1, pTab->zN
6280: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  ame, 0);.    for
6290: 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d  (i=1, pIdx=pTab-
62a0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
62b0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
62c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
62d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
62e0: 4f 50 5f 4f 70 65 6e 2c 20 69 2c 20 31 2c 20 70  OP_Open, i, 1, p
62f0: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Idx->zName, 0);.
6300: 20 20 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20      }.    end = 
6310: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
6320: 62 65 6c 28 76 29 3b 0a 20 20 20 20 61 64 64 72  bel(v);.    addr
6330: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
6340: 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61  Op(v, OP_FileRea
6350: 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65  d, pTab->nCol, e
6360: 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  nd, 0, 0);.    i
6370: 66 28 20 70 44 65 6c 69 6d 69 74 65 72 20 29 7b  f( pDelimiter ){
6380: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6390: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
63a0: 72 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a  r, pDelimiter->z
63b0: 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29  , pDelimiter->n)
63c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
63d0: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61  beDequoteP3(v, a
63e0: 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
63f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6400: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
6410: 72 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20  r, "\t", 1);.   
6420: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
6430: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
6440: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
6450: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 49 6e     if( pTab->pIn
6460: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  dex ){.      sql
6470: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6480: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30 2c  OP_Dup, 0, 0, 0,
6490: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
64a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
64b0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
64c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
64d0: 70 28 76 2c 20 4f 50 5f 46 69 6c 65 46 69 65 6c  p(v, OP_FileFiel
64e0: 64 2c 20 69 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d, i, 0, 0, 0);.
64f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6500: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6510: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 54 61 62  MakeRecord, pTab
6520: 2d 3e 6e 43 6f 6c 2c 20 30 2c 20 30 2c 20 30 29  ->nCol, 0, 0, 0)
6530: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
6540: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 2c  AddOp(v, OP_Put,
6550: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
6560: 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d    for(i=1, pIdx=
6570: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
6580: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
6590: 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  Next, i++){.    
65a0: 20 20 69 66 28 20 70 49 64 78 2d 3e 70 4e 65 78    if( pIdx->pNex
65b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
65c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
65d0: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30 2c  OP_Dup, 0, 0, 0,
65e0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
65f0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
6600: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
6610: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6620: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6630: 5f 46 69 6c 65 46 69 65 6c 64 2c 20 70 49 64 78  _FileField, pIdx
6640: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30  ->aiColumn[j], 0
6650: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
6660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6670: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
6680: 65 4b 65 79 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  eKey, pIdx->nCol
6690: 75 6d 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  umn, 0, 0, 0);. 
66a0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
66b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 64  ddOp(v, OP_PutId
66c0: 78 2c 20 69 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  x, i, 0, 0, 0);.
66d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
66e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
66f0: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2c 20 30  Goto, 0, addr, 0
6700: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6710: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6720: 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 30 2c 20 65  Noop, 0, 0, 0, e
6730: 6e 64 29 3b 0a 20 20 7d 0a 20 20 0a 63 6f 70 79  nd);.  }.  .copy
6740: 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 72 65 74 75  _cleanup:.  retu
6750: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rn;.}../*.** The
6760: 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 56 41   non-standard VA
6770: 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 69 73 20  CUUM command is 
6780: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
6790: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
67a0: 2a 20 63 6f 6c 6c 61 70 73 65 20 66 72 65 65 20  * collapse free 
67b0: 73 70 61 63 65 2c 20 65 74 63 2e 20 20 49 74 20  space, etc.  It 
67c0: 69 73 20 6d 6f 64 65 6c 6c 65 64 20 61 66 74 65  is modelled afte
67d0: 72 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f 6d  r the VACUUM com
67e0: 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50 6f 73 74 67  mand.** in Postg
67f0: 72 65 53 51 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reSQL..*/.void s
6800: 71 6c 69 74 65 56 61 63 75 75 6d 28 50 61 72 73  qliteVacuum(Pars
6810: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
6820: 20 2a 70 54 61 62 6c 65 4e 61 6d 65 29 7b 0a 20   *pTableName){. 
6830: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
6840: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
6850: 70 54 61 62 6c 65 4e 61 6d 65 20 29 7b 0a 20 20  pTableName ){.  
6860: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
6870: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
6880: 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  en(pTableName);.
6890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61    }else{.    zNa
68a0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  me = 0;.  }.  if
68b0: 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74  ( zName && sqlit
68c0: 65 46 69 6e 64 49 6e 64 65 78 28 70 50 61 72 73  eFindIndex(pPars
68d0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3d 3d 30  e->db, zName)==0
68e0: 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 46 69  .    && sqliteFi
68f0: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
6900: 64 62 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  db, zName)==0 ){
6910: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
6920: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
6930: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
6940: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 3a 20  table or index: 
6950: 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", zName, 0);.  
6960: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
6970: 3b 0a 20 20 20 20 67 6f 74 6f 20 76 61 63 75 75  ;.    goto vacuu
6980: 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  m_cleanup;.  }. 
6990: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
69a0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
69b0: 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 76 61  ( v==0 ) goto va
69c0: 63 75 75 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  cuum_cleanup;.  
69d0: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
69e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
69f0: 28 76 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a  (v, OP_Reorganiz
6a00: 65 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20  e, 0, 0, zName, 
6a10: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
6a20: 20 69 6e 74 20 68 3b 0a 20 20 20 20 54 61 62 6c   int h;.    Tabl
6a30: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 49 6e 64  e *pTab;.    Ind
6a40: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
6a50: 72 28 68 3d 30 3b 20 68 3c 4e 5f 48 41 53 48 3b  r(h=0; h<N_HASH;
6a60: 20 68 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   h++){.      for
6a70: 28 70 54 61 62 3d 70 50 61 72 73 65 2d 3e 64 62  (pTab=pParse->db
6a80: 2d 3e 61 70 54 62 6c 48 61 73 68 5b 68 5d 3b 20  ->apTblHash[h]; 
6a90: 70 54 61 62 3b 20 70 54 61 62 3d 70 54 61 62 2d  pTab; pTab=pTab-
6aa0: 3e 70 48 61 73 68 29 7b 0a 20 20 20 20 20 20 20  >pHash){.       
6ab0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6ac0: 28 76 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a  (v, OP_Reorganiz
6ad0: 65 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  e, 0, 0, pTab->z
6ae0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
6af0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
6b00: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
6b10: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
6b20: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
6b30: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
6b40: 50 5f 52 65 6f 72 67 61 6e 69 7a 65 2c 20 30 2c  P_Reorganize, 0,
6b50: 20 30 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c   0, pIdx->zName,
6b60: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
6b70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6b80: 0a 0a 76 61 63 75 75 6d 5f 63 6c 65 61 6e 75 70  ..vacuum_cleanup
6b90: 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  :.  sqliteFree(z
6ba0: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
6bb0: 0a 7d 0a                                         .}.