/ Hex Artifact Content
Login

Artifact 7aa5879bf58ea6bbff22c26c59d1130021fa6ca4:


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 35 20 32 30 30 31 2f 30 31 2f  ,v 1.25 2001/01/
0500: 31 35 20 32 32 3a 35 31 3a 30 39 20 64 72 68 20  15 22:51:09 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 54 62 6c 2c 20 20   { OP_OpenTbl,  
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 54 62 6c 2c 20 20 20 20 30 2c 20 31  OpenTbl,    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 54 62 6c 2c 20 20 20 20 20 32 2c 20 31 2c  enTbl,     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 54 62 6c 2c 20 30 2c 20 30 2c 20 70 54  penTbl, 0, 0, pT
48c0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
48d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
48e0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 49 64 78  Op(v, OP_OpenIdx
48f0: 2c 20 31 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e  , 1, 1, pIndex->
4900: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69  zName, 0);.    i
4910: 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
4920: 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  d ){.      int b
4930: 61 73 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28  ase;.      n = (
4940: 69 6e 74 29 70 45 6e 64 2d 3e 7a 20 2d 20 28 69  int)pEnd->z - (i
4950: 6e 74 29 70 53 74 61 72 74 2d 3e 7a 20 2b 20 31  nt)pStart->z + 1
4960: 3b 0a 20 20 20 20 20 20 62 61 73 65 20 3d 20 73  ;.      base = s
4970: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
4980: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
4990: 61 64 64 54 61 62 6c 65 29 2c 20 61 64 64 54 61  addTable), addTa
49a0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ble);.      sqli
49b0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
49c0: 2c 20 62 61 73 65 2b 33 2c 20 70 49 6e 64 65 78  , base+3, pIndex
49d0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
49e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
49f0: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 34 2c  ngeP3(v, base+4,
4a00: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
4a10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4a20: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61  beChangeP3(v, ba
4a30: 73 65 2b 35 2c 20 70 53 74 61 72 74 2d 3e 7a 2c  se+5, pStart->z,
4a40: 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c   n);.    }.    l
4a50: 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65  bl1 = sqliteVdbe
4a60: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4a70: 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 56    lbl2 = sqliteV
4a80: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
4a90: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4aa0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
4ab0: 20 30 2c 20 6c 62 6c 32 2c 20 30 2c 20 6c 62 6c   0, lbl2, 0, lbl
4ac0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  1);.    sqliteVd
4ad0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
4ae0: 79 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  y, 0, 0, 0, 0);.
4af0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4b00: 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
4b10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
4b20: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4b30: 50 5f 46 69 65 6c 64 2c 20 30 2c 20 70 49 6e 64  P_Field, 0, pInd
4b40: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 2c  ex->aiColumn[i],
4b50: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
4b60: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4b70: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c  p(v, OP_MakeKey,
4b80: 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
4b90: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
4ba0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4bb0: 76 2c 20 4f 50 5f 50 75 74 49 64 78 2c 20 31 2c  v, OP_PutIdx, 1,
4bc0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
4bd0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4be0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62  , OP_Goto, 0, lb
4bf0: 6c 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  l1, 0, 0);.    s
4c00: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4c10: 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c  , OP_Noop, 0, 0,
4c20: 20 30 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 73   0, lbl2);.    s
4c30: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4c40: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30  , OP_Close, 1, 0
4c50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
4c60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4c70: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 2c 20  OP_Close, 0, 0, 
4c80: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  0, 0);.  }..  /*
4c90: 20 52 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 20   Reclaim memory 
4ca0: 6f 6e 20 61 6e 20 45 58 50 4c 41 49 4e 20 63 61  on an EXPLAIN ca
4cb0: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ll..  */.  if( p
4cc0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
4cd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
4ce0: 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20  (pIndex);.  }.. 
4cf0: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
4d00: 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
4d10: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
4d20: 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74  :.  sqliteIdList
4d30: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
4d40: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
4d50: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
4d60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4d70: 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
4d80: 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
4d90: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
4da0: 71 6c 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50  qliteDropIndex(P
4db0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
4dc0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49  ken *pName){.  I
4dd0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
4de0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56  char *zName;.  V
4df0: 64 62 65 20 2a 76 3b 0a 0a 20 20 7a 4e 61 6d 65  dbe *v;..  zName
4e00: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
4e10: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
4e20: 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  e);.  pIndex = s
4e30: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 70  qliteFindIndex(p
4e40: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
4e50: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
4e60: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 49  zName);.  if( pI
4e70: 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ndex==0 ){.    s
4e80: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
4e90: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
4ea0: 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
4eb0: 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  : ", 0, .       
4ec0: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
4ed0: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ->n, 0);.    pPa
4ee0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
4ef0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
4f00: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
4f10: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
4f20: 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
4f30: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
4f40: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  /.  v = sqliteGe
4f50: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
4f60: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74   if( v ){.    st
4f70: 61 74 69 63 20 56 64 62 65 4f 70 20 64 72 6f 70  atic VdbeOp drop
4f80: 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  Index[] = {.    
4f90: 20 20 7b 20 4f 50 5f 4f 70 65 6e 54 62 6c 2c 20    { OP_OpenTbl, 
4fa0: 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20       0, 1,      
4fb0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c 0a 20   MASTER_NAME},. 
4fc0: 20 20 20 20 20 7b 20 4f 50 5f 4c 69 73 74 4f 70       { OP_ListOp
4fd0: 65 6e 2c 20 20 20 30 2c 20 30 2c 20 20 20 20 20  en,   0, 0,     
4fe0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
4ff0: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20  _String,     0, 
5000: 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
5010: 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  2 */.      { OP_
5020: 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41  Next,       0, A
5030: 44 44 52 28 39 29 2c 20 30 7d 2c 20 2f 2a 20 33  DDR(9), 0}, /* 3
5040: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44   */.      { OP_D
5050: 75 70 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c  up,        0, 0,
5060: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
5070: 20 7b 20 4f 50 5f 46 69 65 6c 64 2c 20 20 20 20   { OP_Field,    
5080: 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d    0, 1,       0}
5090: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c  ,.      { OP_Ne,
50a0: 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52           0, ADDR
50b0: 28 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  (3), 0},.      {
50c0: 20 4f 50 5f 4b 65 79 2c 20 20 20 20 20 20 20 20   OP_Key,        
50d0: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  0, 0,       0},.
50e0: 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74        { OP_Delet
50f0: 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  e,     0, 0,    
5100: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
5110: 50 5f 44 65 73 74 72 6f 79 2c 20 20 20 20 30 2c  P_Destroy,    0,
5120: 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a   0,       0}, /*
5130: 20 39 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   9 */.      { OP
5140: 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20 30 2c 20  _Close,      0, 
5150: 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  0,       0},.   
5160: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65   };.    int base
5170: 3b 0a 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71  ;..    base = sq
5180: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73  liteVdbeAddOpLis
5190: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64  t(v, ArraySize(d
51a0: 72 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49  ropIndex), dropI
51b0: 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  ndex);.    sqlit
51c0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
51d0: 20 62 61 73 65 2b 32 2c 20 70 49 6e 64 65 78 2d   base+2, pIndex-
51e0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
51f0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
5200: 50 33 28 76 2c 20 62 61 73 65 2b 39 2c 20 70 49  P3(v, base+9, pI
5210: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
5220: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
5230: 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
5240: 63 74 75 72 65 20 61 6e 64 20 66 72 65 65 20 69  cture and free i
5250: 74 73 20 6d 65 6d 6f 72 79 2e 20 20 45 78 63 65  ts memory.  Exce
5260: 70 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 45  pt if the.  ** E
5270: 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 20 69  XPLAIN keyword i
5280: 73 20 70 72 65 73 65 6e 74 2c 20 6e 6f 20 63 68  s present, no ch
5290: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 2e 0a  anges are made..
52a0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
52b0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
52c0: 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70     if( pIndex->p
52d0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70  Table->pIndex==p
52e0: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Index ){.      p
52f0: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
5300: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e  Index = pIndex->
5310: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
5320: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
5330: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 49  ;.      for(p=pI
5340: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
5350: 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e  ndex; p && p->pN
5360: 65 78 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70  ext!=pIndex; p=p
5370: 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20  ->pNext){}.     
5380: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65   if( p && p->pNe
5390: 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  xt==pIndex ){.  
53a0: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
53b0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
53c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
53d0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e    sqliteDeleteIn
53e0: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
53f0: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a  pIndex);.  }.}..
5400: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
5410: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
5420: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
5430: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
5440: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
5450: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
5460: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
5470: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
5480: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
5490: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45  ExprListAppend(E
54a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
54b0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
54c0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
54d0: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
54e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
54f0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
5500: 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74   sizeof(ExprList
5510: 29 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) );.  }.  if( p
5520: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
5530: 20 30 3b 0a 20 20 69 66 28 20 28 70 4c 69 73 74   0;.  if( (pList
5540: 2d 3e 6e 45 78 70 72 20 26 20 37 29 3d 3d 30 20  ->nExpr & 7)==0 
5550: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
5560: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 38 3b  List->nExpr + 8;
5570: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
5580: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
5590: 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66  ist->a, n*sizeof
55a0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
55b0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
55c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69  ==0 ){.      pLi
55d0: 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20  st->nExpr = 0;. 
55e0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 4c 69 73       return pLis
55f0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  t;.    }.  }.  i
5600: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b   = pList->nExpr+
5610: 2b 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  +;.  pList->a[i]
5620: 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
5630: 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
5640: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ame = 0;.  if( p
5650: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
5660: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c  teSetNString(&pL
5670: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
5680: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
5690: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ->n, 0);.    sql
56a0: 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74  iteDequote(pList
56b0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
56c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
56d0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  t;.}../*.** Dele
56e0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
56f0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
5700: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
5710: 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c  ListDelete(ExprL
5720: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
5730: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
5740: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
5750: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
5760: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
5770: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65      sqliteExprDe
5780: 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  lete(pList->a[i]
5790: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  .pExpr);.    sql
57a0: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
57b0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
57c0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
57d0: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
57e0: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
57f0: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
5800: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
5810: 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
5820: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
5830: 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
5840: 62 65 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  be..*/.IdList *s
5850: 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e  qliteIdListAppen
5860: 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  d(IdList *pList,
5870: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
5880: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
5890: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
58a0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
58b0: 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
58c0: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
58d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
58e0: 20 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 49    if( (pList->nI
58f0: 64 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  d & 7)==0 ){.   
5900: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
5910: 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d  teRealloc(pList-
5920: 3e 61 2c 20 28 70 4c 69 73 74 2d 3e 6e 49 64 2b  >a, (pList->nId+
5930: 38 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  8)*sizeof(pList-
5940: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
5950: 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 7b  ( pList->a==0 ){
5960: 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e 49  .      pList->nI
5970: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  d = 0;.      ret
5980: 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d  urn pList;.    }
5990: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70  .  }.  memset(&p
59a0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
59b0: 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Id], 0, sizeof(p
59c0: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
59d0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
59e0: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
59f0: 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  ng(&pList->a[pLi
5a00: 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 2c 20  st->nId].zName, 
5a10: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
5a20: 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71  n->n, 0);.    sq
5a30: 6c 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73  liteDequote(pLis
5a40: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d  t->a[pList->nId]
5a50: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  .zName);.  }.  p
5a60: 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72  List->nId++;.  r
5a70: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
5a80: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69  /*.** Add an ali
5a90: 61 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69  as to the last i
5aa0: 64 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65  dentifier on the
5ab0: 20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65   given identifie
5ac0: 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
5ad0: 73 71 6c 69 74 65 49 64 4c 69 73 74 41 64 64 41  sqliteIdListAddA
5ae0: 6c 69 61 73 28 49 64 4c 69 73 74 20 2a 70 4c 69  lias(IdList *pLi
5af0: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
5b00: 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20  n){.  if( pList 
5b10: 26 26 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 30 20  && pList->nId>0 
5b20: 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
5b30: 4c 69 73 74 2d 3e 6e 49 64 20 2d 20 31 3b 0a 20  List->nId - 1;. 
5b40: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
5b50: 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d  ing(&pList->a[i]
5b60: 2e 7a 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d  .zAlias, pToken-
5b70: 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30  >z, pToken->n, 0
5b80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71  );.    sqliteDeq
5b90: 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  uote(pList->a[i]
5ba0: 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a  .zAlias);.  }.}.
5bb0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
5bc0: 20 65 6e 74 69 72 65 20 49 64 4c 69 73 74 0a 2a   entire IdList.*
5bd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c  /.void sqliteIdL
5be0: 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74  istDelete(IdList
5bf0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
5c00: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
5c10: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
5c20: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
5c30: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
5c40: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
5c50: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
5c60: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
5c70: 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29  st->a[i].zAlias)
5c80: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
5c90: 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
5ca0: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
5cb0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
5cc0: 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 69 73   COPY command is
5cd0: 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c 69   for compatibili
5ce0: 74 79 20 77 69 74 68 20 50 6f 73 74 67 72 65 53  ty with PostgreS
5cf0: 51 4c 20 61 6e 64 20 73 70 65 63 69 66 69 63 69  QL and specifici
5d00: 61 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ally.** for the 
5d10: 61 62 69 6c 69 74 79 20 74 6f 20 72 65 61 64 20  ability to read 
5d20: 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 70 67  the output of pg
5d30: 5f 64 75 6d 70 2e 20 20 54 68 65 20 66 6f 72 6d  _dump.  The form
5d40: 61 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c 6c  at is as.** foll
5d50: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 4f  ows:.**.**    CO
5d60: 50 59 20 74 61 62 6c 65 20 46 52 4f 4d 20 66 69  PY table FROM fi
5d70: 6c 65 20 5b 55 53 49 4e 47 20 44 45 4c 49 4d 49  le [USING DELIMI
5d80: 54 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a 2a 0a  TERS string].**.
5d90: 2a 2a 20 22 74 61 62 6c 65 22 20 69 73 20 61 6e  ** "table" is an
5da0: 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
5db0: 6e 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c 20 72  name.  We will r
5dc0: 65 61 64 20 6c 69 6e 65 73 20 6f 66 20 63 6f 64  ead lines of cod
5dd0: 65 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20 74  e from.** file t
5de0: 6f 20 66 69 6c 6c 20 74 68 69 73 20 74 61 62 6c  o fill this tabl
5df0: 65 20 77 69 74 68 20 64 61 74 61 2e 20 20 46 69  e with data.  Fi
5e00: 6c 65 20 6d 69 67 68 74 20 62 65 20 22 73 74 64  le might be "std
5e10: 69 6e 22 2e 20 20 54 68 65 20 6f 70 74 69 6f 6e  in".  The option
5e20: 61 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65 72 20  al.** delimiter 
5e30: 73 74 72 69 6e 67 20 69 64 65 6e 74 69 66 69 65  string identifie
5e40: 73 20 74 68 65 20 66 69 65 6c 64 20 73 65 70 61  s the field sepa
5e50: 72 61 74 6f 72 73 2e 20 20 54 68 65 20 64 65 66  rators.  The def
5e60: 61 75 6c 74 20 69 73 20 61 20 74 61 62 2e 0a 2a  ault is a tab..*
5e70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 70  /.void sqliteCop
5e80: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
5e90: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se,       /* The
5ea0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
5eb0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
5ec0: 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 54 68 65  leName,   /* The
5ed0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
5ee0: 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  le into which we
5ef0: 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a 2f 0a   will insert */.
5f00: 20 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e 61    Token *pFilena
5f10: 6d 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 66 69  me,    /* The fi
5f20: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  le from which to
5f30: 20 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74   obtain informat
5f40: 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
5f50: 70 44 65 6c 69 6d 69 74 65 72 20 20 20 20 2f 2a  pDelimiter    /*
5f60: 20 55 73 65 20 74 68 69 73 20 61 73 20 74 68 65   Use this as the
5f70: 20 66 69 65 6c 64 20 64 65 6c 69 6d 69 74 65 72   field delimiter
5f80: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
5f90: 70 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 54  pTab;.  char *zT
5fa0: 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ab;.  int i, j;.
5fb0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
5fc0: 20 61 64 64 72 2c 20 65 6e 64 3b 0a 20 20 49 6e   addr, end;.  In
5fd0: 64 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20 7a 54  dex *pIdx;..  zT
5fe0: 61 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  ab = sqliteTable
5ff0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
6000: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 70 54 61  ableName);.  pTa
6010: 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
6020: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
6030: 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46  zTab);.  sqliteF
6040: 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 69 66 28  ree(zTab);.  if(
6050: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
6060: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
6070: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
6080: 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  g, "no such tabl
6090: 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20  e: ", 0, .      
60a0: 20 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 7a 2c    pTableName->z,
60b0: 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e 2c 20   pTableName->n, 
60c0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
60d0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
60e0: 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20   copy_cleanup;. 
60f0: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72   }.  if( pTab->r
6100: 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
6110: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
6120: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
6130: 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d   "table ", pTab-
6140: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
6150: 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 6d 6f 64  " may not be mod
6160: 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
6170: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
6180: 20 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c      goto copy_cl
6190: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76 20 3d  eanup;.  }.  v =
61a0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
61b0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
61c0: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  ){.    addr = sq
61d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
61e0: 20 4f 50 5f 46 69 6c 65 4f 70 65 6e 2c 20 30 2c   OP_FileOpen, 0,
61f0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
6200: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
6210: 33 28 76 2c 20 61 64 64 72 2c 20 70 46 69 6c 65  3(v, addr, pFile
6220: 6e 61 6d 65 2d 3e 7a 2c 20 70 46 69 6c 65 6e 61  name->z, pFilena
6230: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  me->n);.    sqli
6240: 74 65 56 64 62 65 44 65 71 75 6f 74 65 50 33 28  teVdbeDequoteP3(
6250: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71  v, addr);.    sq
6260: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6270: 20 4f 50 5f 4f 70 65 6e 54 62 6c 2c 20 30 2c 20   OP_OpenTbl, 0, 
6280: 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  1, pTab->zName, 
6290: 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c  0);.    for(i=1,
62a0: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
62b0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
62c0: 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29  Idx->pNext, i++)
62d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
62e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
62f0: 65 6e 49 64 78 2c 20 69 2c 20 31 2c 20 70 49 64  enIdx, i, 1, pId
6300: 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
6310: 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20 73 71    }.    end = sq
6320: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
6330: 6c 28 76 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  l(v);.    addr =
6340: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
6350: 28 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61 64 2c  (v, OP_FileRead,
6360: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65 6e 64   pTab->nCol, end
6370: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
6380: 20 70 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a 20   pDelimiter ){. 
6390: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
63a0: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
63b0: 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20   pDelimiter->z, 
63c0: 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a  pDelimiter->n);.
63d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
63e0: 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64  DequoteP3(v, add
63f0: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
6400: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
6410: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
6420: 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20 7d   "\t", 1);.    }
6430: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
6440: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 2c 20  ddOp(v, OP_New, 
6450: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
6460: 20 69 66 28 20 70 54 61 62 2d 3e 70 49 6e 64 65   if( pTab->pInde
6470: 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
6480: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6490: 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30  _Dup, 0, 0, 0, 0
64a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
64b0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
64c0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
64d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
64e0: 76 2c 20 4f 50 5f 46 69 6c 65 46 69 65 6c 64 2c  v, OP_FileField,
64f0: 20 69 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   i, 0, 0, 0);.  
6500: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
6510: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
6520: 6b 65 52 65 63 6f 72 64 2c 20 70 54 61 62 2d 3e  keRecord, pTab->
6530: 6e 43 6f 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  nCol, 0, 0, 0);.
6540: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6550: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 2c 20 30  dOp(v, OP_Put, 0
6560: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
6570: 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54  for(i=1, pIdx=pT
6580: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
6590: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
65a0: 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  xt, i++){.      
65b0: 69 66 28 20 70 49 64 78 2d 3e 70 4e 65 78 74 20  if( pIdx->pNext 
65c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
65d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
65e0: 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30  _Dup, 0, 0, 0, 0
65f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6600: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
6610: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
6620: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
6630: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
6640: 69 6c 65 46 69 65 6c 64 2c 20 70 49 64 78 2d 3e  ileField, pIdx->
6650: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 2c 20 30 2c 20  aiColumn[j], 0, 
6660: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
6670: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6680: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b  ddOp(v, OP_MakeK
6690: 65 79 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ey, pIdx->nColum
66a0: 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  n, 0, 0, 0);.   
66b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
66c0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 64 78 2c  Op(v, OP_PutIdx,
66d0: 20 69 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   i, 0, 0, 0);.  
66e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
66f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
6700: 74 6f 2c 20 30 2c 20 61 64 64 72 2c 20 30 2c 20  to, 0, addr, 0, 
6710: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
6720: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
6730: 6f 70 2c 20 30 2c 20 30 2c 20 30 2c 20 65 6e 64  op, 0, 0, 0, end
6740: 29 3b 0a 20 20 7d 0a 20 20 0a 63 6f 70 79 5f 63  );.  }.  .copy_c
6750: 6c 65 61 6e 75 70 3a 0a 20 20 72 65 74 75 72 6e  leanup:.  return
6760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e  ;.}../*.** The n
6770: 6f 6e 2d 73 74 61 6e 64 61 72 64 20 56 41 43 55  on-standard VACU
6780: 55 4d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  UM command is us
6790: 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74  ed to clean up t
67a0: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
67b0: 63 6f 6c 6c 61 70 73 65 20 66 72 65 65 20 73 70  collapse free sp
67c0: 61 63 65 2c 20 65 74 63 2e 20 20 49 74 20 69 73  ace, etc.  It is
67d0: 20 6d 6f 64 65 6c 6c 65 64 20 61 66 74 65 72 20   modelled after 
67e0: 74 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61  the VACUUM comma
67f0: 6e 64 0a 2a 2a 20 69 6e 20 50 6f 73 74 67 72 65  nd.** in Postgre
6800: 53 51 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  SQL..*/.void sql
6810: 69 74 65 56 61 63 75 75 6d 28 50 61 72 73 65 20  iteVacuum(Parse 
6820: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
6830: 70 54 61 62 6c 65 4e 61 6d 65 29 7b 0a 20 20 63  pTableName){.  c
6840: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64  har *zName;.  Vd
6850: 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 54  be *v;..  if( pT
6860: 61 62 6c 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ableName ){.    
6870: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61  zName = sqliteTa
6880: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
6890: 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20  (pTableName);.  
68a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
68b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
68c0: 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 46  zName && sqliteF
68d0: 69 6e 64 49 6e 64 65 78 28 70 50 61 72 73 65 2d  indIndex(pParse-
68e0: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3d 3d 30 0a 20  >db, zName)==0. 
68f0: 20 20 20 26 26 20 73 71 6c 69 74 65 46 69 6e 64     && sqliteFind
6900: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
6910: 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  , zName)==0 ){. 
6920: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
6930: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
6940: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  Msg, "no such ta
6950: 62 6c 65 20 6f 72 20 69 6e 64 65 78 3a 20 22 2c  ble or index: ",
6960: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
6970: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
6980: 20 20 20 20 67 6f 74 6f 20 76 61 63 75 75 6d 5f      goto vacuum_
6990: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76  cleanup;.  }.  v
69a0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
69b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
69c0: 76 3d 3d 30 20 29 20 67 6f 74 6f 20 76 61 63 75  v==0 ) goto vacu
69d0: 75 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 66  um_cleanup;.  if
69e0: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  ( zName ){.    s
69f0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6a00: 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65 2c  , OP_Reorganize,
6a10: 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 30 29   0, 0, zName, 0)
6a20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
6a30: 6e 74 20 68 3b 0a 20 20 20 20 54 61 62 6c 65 20  nt h;.    Table 
6a40: 2a 70 54 61 62 3b 0a 20 20 20 20 49 6e 64 65 78  *pTab;.    Index
6a50: 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
6a60: 68 3d 30 3b 20 68 3c 4e 5f 48 41 53 48 3b 20 68  h=0; h<N_HASH; h
6a70: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
6a80: 54 61 62 3d 70 50 61 72 73 65 2d 3e 64 62 2d 3e  Tab=pParse->db->
6a90: 61 70 54 62 6c 48 61 73 68 5b 68 5d 3b 20 70 54  apTblHash[h]; pT
6aa0: 61 62 3b 20 70 54 61 62 3d 70 54 61 62 2d 3e 70  ab; pTab=pTab->p
6ab0: 48 61 73 68 29 7b 0a 20 20 20 20 20 20 20 20 73  Hash){.        s
6ac0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6ad0: 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65 2c  , OP_Reorganize,
6ae0: 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
6af0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
6b00: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
6b10: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
6b20: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
6b30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6b40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6b50: 52 65 6f 72 67 61 6e 69 7a 65 2c 20 30 2c 20 30  Reorganize, 0, 0
6b60: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30  , pIdx->zName, 0
6b70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
6b80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
6b90: 76 61 63 75 75 6d 5f 63 6c 65 61 6e 75 70 3a 0a  vacuum_cleanup:.
6ba0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
6bb0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
6bc0: 0a                                               .