/ Hex Artifact Content
Login

Artifact afdbf21315526902577ebeb690737a27ab73c2a1:


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 32 20 32 30 30 30 2f 30 38 2f  ,v 1.22 2000/08/
0500: 30 32 20 31 33 3a 34 37 3a 34 32 20 64 72 68 20  02 13:47:42 drh 
0510: 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64  Exp $.*/.#includ
0520: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0530: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0540: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0550: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0560: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0570: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0580: 64 20 77 65 20 77 61 6e 74 20 74 6f 20 65 78 65  d we want to exe
0590: 63 75 74 65 20 74 68 65 20 56 44 42 45 20 63 6f  cute the VDBE co
05a0: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
05b0: 0a 2a 2a 20 74 68 61 74 20 73 74 61 74 65 6d 65  .** that stateme
05c0: 6e 74 2e 20 20 50 72 69 6f 72 20 61 63 74 69 6f  nt.  Prior actio
05d0: 6e 20 72 6f 75 74 69 6e 65 73 20 73 68 6f 75 6c  n routines shoul
05e0: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  d have already.*
05f0: 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20 56 44  * constructed VD
0600: 42 45 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  BE code to do th
0610: 65 20 77 6f 72 6b 20 6f 66 20 74 68 65 20 53 51  e work of the SQ
0620: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
0630: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0640: 74 20 68 61 73 20 74 6f 20 65 78 65 63 75 74 65  t has to execute
0650: 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 2e 0a   the VDBE code..
0660: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0670: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0680: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0690: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
06a0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
06b0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
06c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 65  /.void sqliteExe
06d0: 63 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  c(Parse *pParse)
06e0: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
06f0: 70 56 64 62 65 20 29 7b 0a 20 20 20 20 69 66 28  pVdbe ){.    if(
0700: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
0710: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
0720: 56 64 62 65 4c 69 73 74 28 70 50 61 72 73 65 2d  VdbeList(pParse-
0730: 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e  >pVdbe, pParse->
0740: 78 43 61 6c 6c 62 61 63 6b 2c 20 70 50 61 72 73  xCallback, pPars
0750: 65 2d 3e 70 41 72 67 2c 20 0a 20 20 20 20 20 20  e->pArg, .      
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
0770: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29  pParse->zErrMsg)
0780: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0790: 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d     FILE *trace =
07a0: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
07b0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
07c0: 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64  eTrace)!=0 ? std
07d0: 65 72 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 73  err : 0;.      s
07e0: 71 6c 69 74 65 56 64 62 65 54 72 61 63 65 28 70  qliteVdbeTrace(p
07f0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 74 72  Parse->pVdbe, tr
0800: 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ace);.      sqli
0810: 74 65 56 64 62 65 45 78 65 63 28 70 50 61 72 73  teVdbeExec(pPars
0820: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65  e->pVdbe, pParse
0830: 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c 20 70 50 61  ->xCallback, pPa
0840: 72 73 65 2d 3e 70 41 72 67 2c 20 0a 20 20 20 20  rse->pArg, .    
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73   &pParse->zErrMs
0870: 67 2c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70  g, pParse->db->p
0880: 42 75 73 79 41 72 67 2c 0a 20 20 20 20 20 20 20  BusyArg,.       
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
08a0: 61 72 73 65 2d 3e 64 62 2d 3e 78 42 75 73 79 43  arse->db->xBusyC
08b0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a  allback);.    }.
08c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65      sqliteVdbeDe
08d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 70 56 64  lete(pParse->pVd
08e0: 62 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  be);.    pParse-
08f0: 3e 70 56 64 62 65 20 3d 20 30 3b 0a 20 20 20 20  >pVdbe = 0;.    
0900: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
0910: 53 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  Set = 0;.  }.}..
0920: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
0930: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
0940: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
0950: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
0960: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0970: 65 45 78 70 72 28 69 6e 74 20 6f 70 2c 20 45 78  eExpr(int op, Ex
0980: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
0990: 2a 70 52 69 67 68 74 2c 20 54 6f 6b 65 6e 20 2a  *pRight, Token *
09a0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
09b0: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
09c0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
09d0: 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20  zeof(Expr) );.  
09e0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
09f0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
0a00: 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 4e 65 77 2d  op = op;.  pNew-
0a10: 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a  >pLeft = pLeft;.
0a20: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
0a30: 20 70 52 69 67 68 74 3b 0a 20 20 69 66 28 20 70   pRight;.  if( p
0a40: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 70 4e 65  Token ){.    pNe
0a50: 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b  w->token = *pTok
0a60: 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  en;.  }else{.   
0a70: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d   pNew->token.z =
0a80: 20 22 22 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74   "";.    pNew->t
0a90: 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 7d 0a  oken.n = 0;.  }.
0aa0: 20 20 69 66 28 20 70 4c 65 66 74 20 26 26 20 70    if( pLeft && p
0ab0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c  Right ){.    sql
0ac0: 69 74 65 45 78 70 72 53 70 61 6e 28 70 4e 65 77  iteExprSpan(pNew
0ad0: 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20  , &pLeft->span, 
0ae0: 26 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a  &pRight->span);.
0af0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
0b00: 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e  w->span = pNew->
0b10: 74 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  token;.  }.  ret
0b20: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
0b30: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
0b40: 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6f 66 20 74  token field of t
0b50: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
0b60: 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a  ion to span all.
0b70: 2a 2a 20 74 65 78 74 20 62 65 74 77 65 65 6e 20  ** text between 
0b80: 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f  the two given to
0b90: 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  kens..*/.void sq
0ba0: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 45 78 70  liteExprSpan(Exp
0bb0: 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20  r *pExpr, Token 
0bc0: 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pLeft, Token *p
0bd0: 52 69 67 68 74 29 7b 0a 20 20 70 45 78 70 72 2d  Right){.  pExpr-
0be0: 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d  >span.z = pLeft-
0bf0: 3e 7a 3b 0a 20 20 70 45 78 70 72 2d 3e 73 70 61  >z;.  pExpr->spa
0c00: 6e 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20  n.n = pRight->n 
0c10: 2b 20 28 69 6e 74 29 70 52 69 67 68 74 2d 3e 7a  + (int)pRight->z
0c20: 20 2d 20 28 69 6e 74 29 70 4c 65 66 74 2d 3e 7a   - (int)pLeft->z
0c30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  ;.}../*.** Const
0c40: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
0c50: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
0c60: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
0c70: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
0c80: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
0c90: 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69 6f  qliteExprFunctio
0ca0: 6e 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  n(ExprList *pLis
0cb0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
0cc0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
0cd0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0ce0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
0cf0: 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  xpr) );.  if( pN
0d00: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
0d10: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54  ;.  pNew->op = T
0d20: 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e  K_FUNCTION;.  pN
0d30: 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ew->pList = pLis
0d40: 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  t;.  if( pToken 
0d50: 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  ){.    pNew->tok
0d60: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
0d70: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
0d80: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20  >token.z = "";. 
0d90: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e     pNew->token.n
0da0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
0db0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
0dc0: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
0dd0: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
0de0: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  on tree..*/.void
0df0: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
0e00: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
0e10: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
0e20: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20  .  if( p->pLeft 
0e30: 29 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65  ) sqliteExprDele
0e40: 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  te(p->pLeft);.  
0e50: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 20  if( p->pRight ) 
0e60: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
0e70: 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 69  (p->pRight);.  i
0e80: 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 20 73 71  f( p->pList ) sq
0e90: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
0ea0: 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  te(p->pList);.  
0eb0: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 20 29  if( p->pSelect )
0ec0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
0ed0: 65 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b  ete(p->pSelect);
0ee0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29  .  sqliteFree(p)
0ef0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0f00: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0f10: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0f20: 65 73 63 72 69 62 65 73 20 74 68 65 0a 2a 2a 20  escribes the.** 
0f30: 66 6f 72 6d 61 74 20 6f 66 20 61 20 70 61 72 74  format of a part
0f40: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
0f50: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
0f60: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61 74 20  name.** of that 
0f70: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
0f80: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
0f90: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
0fa0: 74 65 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69  teFindTable(sqli
0fb0: 74 65 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e  te *db, char *zN
0fc0: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
0fd0: 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 68 3b 0a  Table;.  int h;.
0fe0: 0a 20 20 68 20 3d 20 73 71 6c 69 74 65 48 61 73  .  h = sqliteHas
0ff0: 68 4e 6f 43 61 73 65 28 7a 4e 61 6d 65 2c 20 30  hNoCase(zName, 0
1000: 29 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20 66 6f  ) % N_HASH;.  fo
1010: 72 28 70 54 61 62 6c 65 3d 64 62 2d 3e 61 70 54  r(pTable=db->apT
1020: 62 6c 48 61 73 68 5b 68 5d 3b 20 70 54 61 62 6c  blHash[h]; pTabl
1030: 65 3b 20 70 54 61 62 6c 65 3d 70 54 61 62 6c 65  e; pTable=pTable
1040: 2d 3e 70 48 61 73 68 29 7b 0a 20 20 20 20 69 66  ->pHash){.    if
1050: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
1060: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 7a  pTable->zName, z
1070: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
1080: 6e 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  n pTable;.  }.  
1090: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
10a0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
10b0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
10c0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
10d0: 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74 20 6f   the.** format o
10e0: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  f a particular i
10f0: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
1100: 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61 74 20 69  ame.** of that i
1110: 6e 64 65 78 2e 20 20 52 65 74 75 72 6e 20 4e 55  ndex.  Return NU
1120: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1130: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
1140: 65 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  eFindIndex(sqlit
1150: 65 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61  e *db, char *zNa
1160: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  me){.  Index *p;
1170: 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 68 20 3d  .  int h;..  h =
1180: 20 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61 73   sqliteHashNoCas
1190: 65 28 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e 5f  e(zName, 0) % N_
11a0: 48 41 53 48 3b 0a 20 20 66 6f 72 28 70 3d 64 62  HASH;.  for(p=db
11b0: 2d 3e 61 70 49 64 78 48 61 73 68 5b 68 5d 3b 20  ->apIdxHash[h]; 
11c0: 70 3b 20 70 3d 70 2d 3e 70 48 61 73 68 29 7b 0a  p; p=p->pHash){.
11d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
11e0: 72 49 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20  rICmp(p->zName, 
11f0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
1200: 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn p;.  }.  retu
1210: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
1220: 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20  emove the given 
1230: 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69  index from the i
1240: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c  ndex hash table,
1250: 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73   and free.** its
1260: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
1270: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  es..**.** The in
1280: 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66  dex is removed f
1290: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
12a0: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 62 75 74   hash table, but
12b0: 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 6e   it is.** not un
12c0: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
12d0: 54 61 62 6c 65 20 74 68 61 74 20 69 73 20 62 65  Table that is be
12e0: 69 6e 67 20 69 6e 64 65 78 65 64 2e 20 20 55 6e  ing indexed.  Un
12f0: 6c 69 6e 6b 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20  linking.** from 
1300: 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62  the Table must b
1310: 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61  e done by the ca
1320: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
1330: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1340: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
1350: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64  (sqlite *db, Ind
1360: 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
1370: 6e 74 20 68 3b 0a 20 20 69 66 28 20 70 49 6e 64  nt h;.  if( pInd
1380: 65 78 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  ex->zName ){.   
1390: 20 68 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e   h = sqliteHashN
13a0: 6f 43 61 73 65 28 70 49 6e 64 65 78 2d 3e 7a 4e  oCase(pIndex->zN
13b0: 61 6d 65 2c 20 30 29 20 25 20 4e 5f 48 41 53 48  ame, 0) % N_HASH
13c0: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 70  ;.    if( db->ap
13d0: 49 64 78 48 61 73 68 5b 68 5d 3d 3d 70 49 6e 64  IdxHash[h]==pInd
13e0: 65 78 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  ex ){.      db->
13f0: 61 70 49 64 78 48 61 73 68 5b 68 5d 20 3d 20 70  apIdxHash[h] = p
1400: 49 6e 64 65 78 2d 3e 70 48 61 73 68 3b 0a 20 20  Index->pHash;.  
1410: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
1420: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66  ndex *p;.      f
1430: 6f 72 28 70 3d 64 62 2d 3e 61 70 49 64 78 48 61  or(p=db->apIdxHa
1440: 73 68 5b 68 5d 3b 20 70 20 26 26 20 70 2d 3e 70  sh[h]; p && p->p
1450: 48 61 73 68 21 3d 70 49 6e 64 65 78 3b 20 70 3d  Hash!=pIndex; p=
1460: 70 2d 3e 70 48 61 73 68 29 7b 7d 0a 20 20 20 20  p->pHash){}.    
1470: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 48    if( p && p->pH
1480: 61 73 68 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  ash==pIndex ){. 
1490: 20 20 20 20 20 20 20 70 2d 3e 70 48 61 73 68 20         p->pHash 
14a0: 3d 20 70 49 6e 64 65 78 2d 3e 70 48 61 73 68 3b  = pIndex->pHash;
14b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14c0: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
14d0: 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
14e0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
14f0: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
1500: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
1510: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
1520: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
1530: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
1540: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
1550: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
1560: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
1570: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
1580: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
1590: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
15a0: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
15b0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
15c0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
15d0: 42 75 74 20 64 6f 65 73 20 69 74 20 64 65 73 74  But does it dest
15e0: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
15f0: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
1600: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
1610: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
1620: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1630: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  eDeleteTable(sql
1640: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
1650: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
1660: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ;.  Index *pInde
1670: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28  x, *pNext;.  if(
1680: 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74   pTable==0 ) ret
1690: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
16a0: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
16b0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
16c0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f  Free(pTable->aCo
16d0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[i].zName);.   
16e0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
16f0: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  le->aCol[i].zDfl
1700: 74 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 49  t);.  }.  for(pI
1710: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
1720: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
1730: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
1740: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
1750: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
1760: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64  iteDeleteIndex(d
1770: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
1780: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
1790: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
17a0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
17b0: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  ->aCol);.  sqlit
17c0: 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d  eFree(pTable);.}
17d0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
17e0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
17f0: 75 73 65 72 20 74 61 62 6c 65 20 6f 72 20 69 6e  user table or in
1800: 64 65 78 20 66 72 6f 6d 20 61 20 74 6f 6b 65 6e  dex from a token
1810: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
1820: 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 69   hold the name i
1830: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
1840: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
1850: 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72  nd must.** be fr
1860: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
1870: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
1880: 63 68 61 72 20 2a 73 71 6c 69 74 65 54 61 62 6c  char *sqliteTabl
1890: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54  eNameFromToken(T
18a0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
18b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
18c0: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d  liteStrNDup(pNam
18d0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
18e0: 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65  .  sqliteDequote
18f0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
1900: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
1910: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
1920: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
1930: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1940: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
1950: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
1960: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
1970: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
1980: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
1990: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
19a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
19b0: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
19c0: 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65  sqliteStartTable
19d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19e0: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 54  Token *pStart, T
19f0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
1a00: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
1a10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20   char *zName;.. 
1a20: 20 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54   pParse->sFirstT
1a30: 6f 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a  oken = *pStart;.
1a40: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
1a50: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
1a60: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 70 54 61  en(pName);.  pTa
1a70: 62 6c 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  ble = sqliteFind
1a80: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
1a90: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , zName);.  if( 
1aa0: 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20  pTable!=0 ){.   
1ab0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
1ac0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
1ad0: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 30 2c  sg, "table ", 0,
1ae0: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
1af0: 2d 3e 6e 2c 0a 20 20 20 20 20 20 20 20 22 20 61  ->n,.        " a
1b00: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
1b10: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1b20: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
1b30: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
1b40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1b50: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 46 69  }.  if( sqliteFi
1b60: 6e 64 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ndIndex(pParse->
1b70: 64 62 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  db, zName) ){.  
1b80: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
1b90: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
1ba0: 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  sg, "there is al
1bb0: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
1bc0: 61 6d 65 64 20 22 2c 20 0a 20 20 20 20 20 20 20  amed ", .       
1bd0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
1be0: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
1bf0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
1c00: 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
1c10: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d  ;.  }.  pTable =
1c20: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
1c30: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
1c40: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
1c50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
1c60: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
1c70: 7a 45 72 72 4d 73 67 2c 20 22 6f 75 74 20 6f 66  zErrMsg, "out of
1c80: 20 6d 65 6d 6f 72 79 22 2c 20 30 29 3b 0a 20 20   memory", 0);.  
1c90: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
1ca0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1cb0: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
1cc0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
1cd0: 62 6c 65 2d 3e 70 48 61 73 68 20 3d 20 30 3b 0a  ble->pHash = 0;.
1ce0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
1cf0: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43   0;.  pTable->aC
1d00: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
1d10: 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  ->pIndex = 0;.  
1d20: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
1d30: 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 44 65  Table ) sqliteDe
1d40: 6c 65 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  leteTable(pParse
1d50: 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e  ->db, pParse->pN
1d60: 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72  ewTable);.  pPar
1d70: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
1d80: 70 54 61 62 6c 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pTable;.}../*.**
1d90: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
1da0: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
1db0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
1dc0: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2f 0a 76  onstructed..*/.v
1dd0: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c  oid sqliteAddCol
1de0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
1df0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
1e00: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
1e10: 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28  char **pz;.  if(
1e20: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
1e30: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
1e40: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 2d 3e  turn;.  if( (p->
1e50: 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29  nCol & 0x7)==0 )
1e60: 7b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  {.    p->aCol = 
1e70: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70  sqliteRealloc( p
1e80: 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c  ->aCol, (p->nCol
1e90: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
1ea0: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69  ol[0]));.  }.  i
1eb0: 66 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 7b  f( p->aCol==0 ){
1ec0: 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30  .    p->nCol = 0
1ed0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1ee0: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61  }.  memset(&p->a
1ef0: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 2c 20 30 2c  Col[p->nCol], 0,
1f00: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
1f10: 30 5d 29 29 3b 0a 20 20 70 7a 20 3d 20 26 70 2d  0]));.  pz = &p-
1f20: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d  >aCol[p->nCol++]
1f30: 2e 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  .zName;.  sqlite
1f40: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
1f50: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
1f60: 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 44  n, 0);.  sqliteD
1f70: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a  equote(*pz);.}..
1f80: 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20  /*.** The given 
1f90: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66  token is the def
1fa0: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
1fb0: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
1fc0: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  dded to.** the t
1fd0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
1fe0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1ff0: 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61  n.  If "minusFla
2000: 67 22 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a  g" is true, it.*
2010: 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75  * means the valu
2020: 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63  e token was prec
2030: 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20  eded by a minus 
2040: 73 69 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sign..*/.void sq
2050: 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61  liteAddDefaultVa
2060: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
2070: 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20  e, Token *pVal, 
2080: 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a  int minusFlag){.
2090: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
20a0: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a  t i;.  char **pz
20b0: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
20c0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
20d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
20e0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
20f0: 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d  pz = &p->aCol[i]
2100: 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69  .zDflt;.  if( mi
2110: 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 73  nusFlag ){.    s
2120: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
2130: 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c  pz, "-", 1, pVal
2140: 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29  ->z, pVal->n, 0)
2150: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2160: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
2170: 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61  pz, pVal->z, pVa
2180: 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  l->n, 0);.  }.  
2190: 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70  sqliteDequote(*p
21a0: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  z);.}../*.** Thi
21b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
21c0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
21d0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
21e0: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
21f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
2200: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
2210: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
2220: 72 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  re is added to t
2230: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
2240: 20 74 61 62 6c 65 73 2e 20 20 0a 2a 2a 0a 2a 2a   tables.  .**.**
2250: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
2260: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
2270: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
2280: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 0a 2a 2a 20  ble on disk,.** 
2290: 75 6e 6c 65 73 73 20 69 6e 69 74 46 6c 61 67 3d  unless initFlag=
22a0: 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74 46 6c  =1.  When initFl
22b0: 61 67 3d 3d 31 2c 20 69 74 20 6d 65 61 6e 73 20  ag==1, it means 
22c0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 0a 2a  we are reading.*
22d0: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  * the master tab
22e0: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
22f0: 73 74 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  st connected to 
2300: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 73 6f  the database, so
2310: 20 0a 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66   .** the entry f
2320: 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c  or this table al
2330: 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 20  ready exists in 
2340: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
2350: 2e 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 77  ..** We do not w
2360: 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74  ant to create it
2370: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   again..*/.void 
2380: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 50  sqliteEndTable(P
2390: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
23a0: 6b 65 6e 20 2a 70 45 6e 64 29 7b 0a 20 20 54 61  ken *pEnd){.  Ta
23b0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 68 3b  ble *p;.  int h;
23c0: 0a 20 20 69 6e 74 20 61 64 64 56 65 72 73 69 6f  .  int addVersio
23d0: 6e 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  n;      /* True 
23e0: 74 6f 20 69 6e 73 65 72 74 20 61 20 22 66 69 6c  to insert a "fil
23f0: 65 20 66 6f 72 6d 61 74 22 20 6d 65 74 61 20 72  e format" meta r
2400: 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 69 66 28 20  ecord */..  if( 
2410: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
2420: 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61  eturn;.  p = pPa
2430: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
2440: 20 20 61 64 64 56 65 72 73 69 6f 6e 20 3d 20 20    addVersion =  
2450: 70 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  p!=0 && pParse->
2460: 64 62 2d 3e 6e 54 61 62 6c 65 3d 3d 31 3b 0a 0a  db->nTable==1;..
2470: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
2480: 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
2490: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
24a0: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
24b0: 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 21  se.  */.  if( p!
24c0: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78  =0 && pParse->ex
24d0: 70 6c 61 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  plain==0 ){.    
24e0: 68 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 6f  h = sqliteHashNo
24f0: 43 61 73 65 28 70 2d 3e 7a 4e 61 6d 65 2c 20 30  Case(p->zName, 0
2500: 29 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20 20 20  ) % N_HASH;.    
2510: 70 2d 3e 70 48 61 73 68 20 3d 20 70 50 61 72 73  p->pHash = pPars
2520: 65 2d 3e 64 62 2d 3e 61 70 54 62 6c 48 61 73 68  e->db->apTblHash
2530: 5b 68 5d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  [h];.    pParse-
2540: 3e 64 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b 68  >db->apTblHash[h
2550: 5d 20 3d 20 70 3b 0a 20 20 20 20 70 50 61 72 73  ] = p;.    pPars
2560: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
2570: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  ;.    pParse->db
2580: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 7d 0a  ->nTable++;.  }.
2590: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
25a0: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
25b0: 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
25c0: 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
25d0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e   if( !pParse->in
25e0: 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 74  itFlag ){.    st
25f0: 61 74 69 63 20 56 64 62 65 4f 70 20 61 64 64 54  atic VdbeOp addT
2600: 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  able[] = {.     
2610: 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20   { OP_Open,     
2620: 20 20 20 30 2c 20 31 2c 20 4d 41 53 54 45 52 5f     0, 1, MASTER_
2630: 4e 41 4d 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  NAME },.      { 
2640: 4f 50 5f 4e 65 77 2c 20 20 20 20 20 20 20 20 20  OP_New,         
2650: 30 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20  0, 0, 0},.      
2660: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
2670: 20 20 30 2c 20 30 2c 20 22 74 61 62 6c 65 22 20    0, 0, "table" 
2680: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f      },.      { O
2690: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30  P_String,      0
26a0: 2c 20 30 2c 20 30 7d 2c 20 20 20 20 20 20 20 20  , 0, 0},        
26b0: 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20      /* 3 */.    
26c0: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
26d0: 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 20 20 20      0, 0, 0},   
26e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 2a 2f           /* 4 */
26f0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
2700: 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30  ng,      0, 0, 0
2710: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  },            /*
2720: 20 35 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   5 */.      { OP
2730: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 20 34 2c  _MakeRecord,  4,
2740: 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20   0, 0},.      { 
2750: 4f 50 5f 50 75 74 2c 20 20 20 20 20 20 20 20 20  OP_Put,         
2760: 30 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 7d 3b  0, 0, 0},.    };
2770: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
2780: 4f 70 20 61 64 64 56 65 72 73 69 6f 6e 5b 5d 20  Op addVersion[] 
2790: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  = {.      { OP_N
27a0: 65 77 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30  ew,         0, 0
27b0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
27c0: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c  _String,      0,
27d0: 20 30 2c 20 22 6d 65 74 61 22 20 20 20 20 20 20   0, "meta"      
27e0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
27f0: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
2800: 20 30 2c 20 30 2c 20 22 22 20 20 20 20 20 20 20   0, 0, ""       
2810: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2820: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
2830: 20 20 20 20 30 2c 20 30 2c 20 22 22 20 20 20 20      0, 0, ""    
2840: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2850: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
2860: 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 22 66 69  ,      0, 0, "fi
2870: 6c 65 20 66 6f 72 6d 61 74 20 32 22 20 20 20 7d  le format 2"   }
2880: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 61 6b  ,.      { OP_Mak
2890: 65 52 65 63 6f 72 64 2c 20 20 34 2c 20 30 2c 20  eRecord,  4, 0, 
28a0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 50  0},.      { OP_P
28b0: 75 74 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30  ut,         0, 0
28c0: 2c 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20  , 0},.    };.   
28d0: 20 69 6e 74 20 6e 2c 20 62 61 73 65 3b 0a 20 20   int n, base;.  
28e0: 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20    Vdbe *v;..    
28f0: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
2900: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
2910: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
2920: 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 70  ;.    n = (int)p
2930: 45 6e 64 2d 3e 7a 20 2d 20 28 69 6e 74 29 70 50  End->z - (int)pP
2940: 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65  arse->sFirstToke
2950: 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 62 61 73  n.z + 1;.    bas
2960: 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  e = sqliteVdbeAd
2970: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
2980: 53 69 7a 65 28 61 64 64 54 61 62 6c 65 29 2c 20  Size(addTable), 
2990: 61 64 64 54 61 62 6c 65 29 3b 0a 20 20 20 20 73  addTable);.    s
29a0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
29b0: 33 28 76 2c 20 62 61 73 65 2b 33 2c 20 70 2d 3e  3(v, base+3, p->
29c0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
29d0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
29e0: 33 28 76 2c 20 62 61 73 65 2b 34 2c 20 70 2d 3e  3(v, base+4, p->
29f0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
2a00: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
2a10: 33 28 76 2c 20 62 61 73 65 2b 35 2c 20 70 50 61  3(v, base+5, pPa
2a20: 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e  rse->sFirstToken
2a30: 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20  .z, n);.    if( 
2a40: 61 64 64 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20  addVersion ){.  
2a50: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2a60: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
2a70: 53 69 7a 65 28 61 64 64 56 65 72 73 69 6f 6e 29  Size(addVersion)
2a80: 2c 20 61 64 64 56 65 72 73 69 6f 6e 29 3b 0a 20  , addVersion);. 
2a90: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56     }.    sqliteV
2aa0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
2ab0: 6c 6f 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 30  lose, 0, 0, 0, 0
2ac0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2ad0: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c  Given a token, l
2ae0: 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77  ook up a table w
2af0: 69 74 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20  ith that name.  
2b00: 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65  If not found, le
2b10: 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  ave.** an error 
2b20: 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 74  for the parser t
2b30: 6f 20 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72  o find and retur
2b40: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65  n NULL..*/.Table
2b50: 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f   *sqliteTableFro
2b60: 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50  mToken(Parse *pP
2b70: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
2b80: 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  k){.  char *zNam
2b90: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  e = sqliteTableN
2ba0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
2bb0: 6b 29 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  k);.  Table *pTa
2bc0: 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
2bd0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
2be0: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
2bf0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  Free(zName);.  i
2c00: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
2c10: 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69    sqliteSetNStri
2c20: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
2c30: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  Msg, "no such ta
2c40: 62 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20  ble: ", 0, .    
2c50: 20 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f      pTok->z, pTo
2c60: 6b 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50  k->n, 0);.    pP
2c70: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
2c80: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
2c90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2ca0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2cb0: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
2cc0: 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
2cd0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
2ce0: 69 64 20 73 71 6c 69 74 65 44 72 6f 70 54 61 62  id sqliteDropTab
2cf0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
2d00: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
2d10: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
2d20: 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 56 64 62  ;.  int h;.  Vdb
2d30: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65  e *v;.  int base
2d40: 3b 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  ;..  pTable = sq
2d50: 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b  liteTableFromTok
2d60: 65 6e 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  en(pParse, pName
2d70: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
2d80: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
2d90: 66 28 20 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f  f( pTable->readO
2da0: 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nly ){.    sqlit
2db0: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
2dc0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
2dd0: 62 6c 65 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ble ", pTable->z
2de0: 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 22 20  Name, .       " 
2df0: 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
2e00: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
2e10: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
2e20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
2e30: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2e40: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
2e50: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
2e60: 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
2e70: 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
2e80: 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62  v = sqliteGetVdb
2e90: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
2ea0: 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63   v ){.    static
2eb0: 20 56 64 62 65 4f 70 20 64 72 6f 70 54 61 62 6c   VdbeOp dropTabl
2ec0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  e[] = {.      { 
2ed0: 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20 30  OP_Open,       0
2ee0: 2c 20 31 2c 20 20 20 20 20 20 20 20 4d 41 53 54  , 1,        MAST
2ef0: 45 52 5f 4e 41 4d 45 20 7d 2c 0a 20 20 20 20 20  ER_NAME },.     
2f00: 20 7b 20 4f 50 5f 4c 69 73 74 4f 70 65 6e 2c 20   { OP_ListOpen, 
2f10: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
2f20: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  },.      { OP_St
2f30: 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20  ring,     0, 0, 
2f40: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20         0}, /* 2 
2f50: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  */.      { OP_Ne
2f60: 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  xt,       0, ADD
2f70: 52 28 31 30 29 2c 20 30 7d 2c 20 2f 2a 20 33 20  R(10), 0}, /* 3 
2f80: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 75  */.      { OP_Du
2f90: 70 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20  p,        0, 0, 
2fa0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
2fb0: 20 7b 20 4f 50 5f 46 69 65 6c 64 2c 20 20 20 20   { OP_Field,    
2fc0: 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30    0, 2,        0
2fd0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
2fe0: 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44  ,         0, ADD
2ff0: 52 28 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20  R(3),  0},.     
3000: 20 7b 20 4f 50 5f 4b 65 79 2c 20 20 20 20 20 20   { OP_Key,      
3010: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
3020: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4c 69  },.      { OP_Li
3030: 73 74 57 72 69 74 65 2c 20 20 30 2c 20 30 2c 20  stWrite,  0, 0, 
3040: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
3050: 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20   { OP_Goto,     
3060: 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30    0, ADDR(3),  0
3070: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4c 69  },.      { OP_Li
3080: 73 74 52 65 77 69 6e 64 2c 20 30 2c 20 30 2c 20  stRewind, 0, 0, 
3090: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 30         0}, /* 10
30a0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4c   */.      { OP_L
30b0: 69 73 74 52 65 61 64 2c 20 20 20 30 2c 20 41 44  istRead,   0, AD
30c0: 44 52 28 31 34 29 2c 20 30 7d 2c 20 2f 2a 20 31  DR(14), 0}, /* 1
30d0: 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  1 */.      { OP_
30e0: 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30  Delete,     0, 0
30f0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
3100: 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20     { OP_Goto,   
3110: 20 20 20 20 30 2c 20 41 44 44 52 28 31 31 29 2c      0, ADDR(11),
3120: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
3130: 44 65 73 74 72 6f 79 2c 20 20 20 20 30 2c 20 30  Destroy,    0, 0
3140: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  ,        0}, /* 
3150: 31 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50  14 */.      { OP
3160: 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20 30 2c 20  _Close,      0, 
3170: 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  0,        0},.  
3180: 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a    };.    Index *
3190: 70 49 64 78 3b 0a 20 20 20 20 62 61 73 65 20 3d  pIdx;.    base =
31a0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
31b0: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
31c0: 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72  e(dropTable), dr
31d0: 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71  opTable);.    sq
31e0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
31f0: 28 76 2c 20 62 61 73 65 2b 32 2c 20 70 54 61 62  (v, base+2, pTab
3200: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  le->zName, 0);. 
3210: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
3220: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 34  ngeP3(v, base+14
3230: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  , pTable->zName,
3240: 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 64   0);.    for(pId
3250: 78 3d 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  x=pTable->pIndex
3260: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
3270: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
3280: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
3290: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
32a0: 30 2c 20 30 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  0, 0, pIdx->zNam
32b0: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
32c0: 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
32d0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 61 62 6c  e in-memory tabl
32e0: 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
32f0: 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 2e  free its memory.
3300: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
3310: 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51 4c  tion: if the SQL
3320: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61 6e   statement began
3330: 20 77 69 74 68 20 74 68 65 20 45 58 50 4c 41 49   with the EXPLAI
3340: 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20  N keyword,.  ** 
3350: 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  then no changes 
3360: 61 72 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20  are made..  */. 
3370: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78   if( !pParse->ex
3380: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 68 20 3d  plain ){.    h =
3390: 20 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61 73   sqliteHashNoCas
33a0: 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c  e(pTable->zName,
33b0: 20 30 29 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20   0) % N_HASH;.  
33c0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
33d0: 2d 3e 61 70 54 62 6c 48 61 73 68 5b 68 5d 3d 3d  ->apTblHash[h]==
33e0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
33f0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 70 54 62  pParse->db->apTb
3400: 6c 48 61 73 68 5b 68 5d 20 3d 20 70 54 61 62 6c  lHash[h] = pTabl
3410: 65 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 7d 65  e->pHash;.    }e
3420: 6c 73 65 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  lse{.      Table
3430: 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
3440: 3d 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 70 54  =pParse->db->apT
3450: 62 6c 48 61 73 68 5b 68 5d 3b 20 70 20 26 26 20  blHash[h]; p && 
3460: 70 2d 3e 70 48 61 73 68 21 3d 70 54 61 62 6c 65  p->pHash!=pTable
3470: 3b 20 70 3d 70 2d 3e 70 48 61 73 68 29 7b 7d 0a  ; p=p->pHash){}.
3480: 20 20 20 20 20 20 69 66 28 20 70 20 26 26 20 70        if( p && p
3490: 2d 3e 70 48 61 73 68 3d 3d 70 54 61 62 6c 65 20  ->pHash==pTable 
34a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 48  ){.        p->pH
34b0: 61 73 68 20 3d 20 70 54 61 62 6c 65 2d 3e 70 48  ash = pTable->pH
34c0: 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ash;.      }.   
34d0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64   }.    pParse->d
34e0: 62 2d 3e 6e 54 61 62 6c 65 2d 2d 3b 0a 20 20 20  b->nTable--;.   
34f0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
3500: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  le(pParse->db, p
3510: 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Table);.  }.}../
3520: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
3530: 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
3540: 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65  QL table.  pInde
3550: 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  x is the name of
3560: 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
3570: 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74 68 65  nd pTable is the
3580: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
3590: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
35a0: 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
35b0: 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
35c0: 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
35d0: 65 79 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  ey.  In that cas
35e0: 65 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  e, use pParse->p
35f0: 4e 65 77 54 61 62 6c 65 20 61 73 20 74 68 65 20  NewTable as the 
3600: 0a 2a 2a 20 74 61 62 6c 65 20 74 6f 20 62 65 20  .** table to be 
3610: 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 70  indexed..**.** p
3620: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
3630: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
3640: 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
3650: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
3660: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
3670: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
3680: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  n of the table i
3690: 73 20 6c 61 62 65 6c 65 64 20 61 73 20 74 68 65  s labeled as the
36a0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2f   primary key..*/
36b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61  .void sqliteCrea
36c0: 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
36d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41   *pParse,   /* A
36e0: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
36f0: 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
3700: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
3710: 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e,    /* Name of
3720: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 79   the index.  May
3730: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
3740: 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 2f  ken *pTable,   /
3750: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
3760: 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 20 55  ble to index.  U
3770: 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
3780: 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 49  able if 0 */.  I
3790: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  dList *pList,   
37a0: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
37b0: 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
37c0: 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ed */.  Token *p
37d0: 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20  Start,   /* The 
37e0: 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
37f0: 74 20 62 65 67 69 6e 73 20 61 20 43 52 45 41 54  t begins a CREAT
3800: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
3810: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  t */.  Token *pE
3820: 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  nd      /* The "
3830: 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74  )" that closes t
3840: 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
3850: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  statement */.){.
3860: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
3870: 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
3880: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49  e indexed */.  I
3890: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
38a0: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
38b0: 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
38c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
38d0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 68 3b 0a  .  int i, j, h;.
38e0: 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20    Token nullId; 
38f0: 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e     /* Fake token
3900: 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44   for an empty ID
3910: 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   list */..  /*. 
3920: 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
3930: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
3940: 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
3950: 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
3960: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
3970: 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20   pTable!=0 ){.  
3980: 20 20 70 54 61 62 20 3d 20 20 73 71 6c 69 74 65    pTab =  sqlite
3990: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  TableFromToken(p
39a0: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a  Parse, pTable);.
39b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
39c0: 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  b =  pParse->pNe
39d0: 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  wTable;.  }.  if
39e0: 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61  ( pTab==0 || pPa
39f0: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
3a00: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
3a10: 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  ex;.  if( pTab->
3a20: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
3a30: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
3a40: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
3a50: 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62  , "table ", pTab
3a60: 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
3a70: 22 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 6e  " may not have n
3a80: 65 77 20 69 6e 64 69 63 65 73 20 61 64 64 65 64  ew indices added
3a90: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
3aa0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
3ab0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
3ac0: 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
3ad0: 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
3ae0: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
3af0: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
3b00: 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
3b10: 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
3b20: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
3b30: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
3b40: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
3b50: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
3b60: 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d  = sqliteTableNam
3b70: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
3b80: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3b90: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73  zName = 0;.    s
3ba0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
3bb0: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
3bc0: 6d 65 2c 20 22 5f 5f 70 72 69 6d 61 72 79 5f 6b  me, "__primary_k
3bd0: 65 79 22 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ey", 0);.  }.  i
3be0: 66 28 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64  f( sqliteFindInd
3bf0: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ex(pParse->db, z
3c00: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  Name) ){.    sql
3c10: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
3c20: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
3c30: 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65 2c 20  index ", zName, 
3c40: 0a 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64  .       " alread
3c50: 79 20 65 78 69 73 74 73 22 2c 20 30 29 3b 0a 20  y exists", 0);. 
3c60: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3c70: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  +;.    goto exit
3c80: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
3c90: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 46   }.  if( sqliteF
3ca0: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
3cb0: 3e 64 62 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  >db, zName) ){. 
3cc0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
3cd0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
3ce0: 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61  Msg, "there is a
3cf0: 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
3d00: 61 6d 65 64 20 22 2c 0a 20 20 20 20 20 20 20 7a  amed ",.       z
3d10: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  Name, 0);.    pP
3d20: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
3d30: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
3d40: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
3d50: 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
3d60: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
3d70: 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
3d80: 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
3d90: 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
3da0: 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
3db0: 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
3dc0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
3dd0: 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
3de0: 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
3df0: 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
3e00: 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
3e10: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
3e20: 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
3e30: 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
3e40: 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
3e50: 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
3e60: 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  len(nullId.z);. 
3e70: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
3e80: 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  eIdListAppend(0,
3e90: 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69   &nullId);.    i
3ea0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
3eb0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
3ec0: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
3ed0: 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  ** Allocate t
3ee0: 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
3ef0: 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64  re. .  */.  pInd
3f00: 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ex = sqliteMallo
3f10: 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  c( sizeof(Index)
3f20: 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   + strlen(zName)
3f30: 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20   + 1 +.         
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
3f50: 69 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74  izeof(int)*pList
3f60: 2d 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70  ->nId );.  if( p
3f70: 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
3f80: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
3f90: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
3fa0: 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
3fb0: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
3fc0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
3fd0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
3fe0: 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  index;.  }.  pIn
3ff0: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  dex->aiColumn = 
4000: 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d  (int*)&pIndex[1]
4010: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
4020: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64  e = (char*)&pInd
4030: 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69  ex->aiColumn[pLi
4040: 73 74 2d 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63  st->nId];.  strc
4050: 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
4060: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  , zName);.  pInd
4070: 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
4080: 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  b;.  pIndex->nCo
4090: 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 49  lumn = pList->nI
40a0: 64 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68  d;..  /* Scan th
40b0: 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
40c0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
40d0: 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
40e0: 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20  d and.  ** load 
40f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63  the column indic
4100: 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65  es into the Inde
4110: 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  x structure.  Re
4120: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20  port an error.  
4130: 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  ** if any column
4140: 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   is not found.. 
4150: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
4160: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
4170: 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
4180: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
4190: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
41a0: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 4c 69 73  liteStrICmp(pLis
41b0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
41c0: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
41d0: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
41e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
41f0: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
4200: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
4210: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
4220: 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c  rrMsg, "table ",
4230: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20   pTab->zName, . 
4240: 20 20 20 20 20 20 20 22 20 68 61 73 20 6e 6f 20         " has no 
4250: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 22 2c 20  column named ", 
4260: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
4270: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  e, 0);.      pPa
4280: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
4290: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
42a0: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74  ndex);.      got
42b0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
42c0: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
42d0: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
42e0: 69 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f  i] = j;.  }..  /
42f0: 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
4300: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
4310: 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
4320: 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
4330: 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
4340: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
4350: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
4360: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29  se->explain==0 )
4370: 7b 0a 20 20 20 20 68 20 3d 20 73 71 6c 69 74 65  {.    h = sqlite
4380: 48 61 73 68 4e 6f 43 61 73 65 28 70 49 6e 64 65  HashNoCase(pInde
4390: 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e  x->zName, 0) % N
43a0: 5f 48 41 53 48 3b 0a 20 20 20 20 70 49 6e 64 65  _HASH;.    pInde
43b0: 78 2d 3e 70 48 61 73 68 20 3d 20 70 50 61 72 73  x->pHash = pPars
43c0: 65 2d 3e 64 62 2d 3e 61 70 49 64 78 48 61 73 68  e->db->apIdxHash
43d0: 5b 68 5d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  [h];.    pParse-
43e0: 3e 64 62 2d 3e 61 70 49 64 78 48 61 73 68 5b 68  >db->apIdxHash[h
43f0: 5d 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  ] = pIndex;.    
4400: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
4410: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
4420: 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
4430: 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20   pIndex;.  }..  
4440: 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c  /* If the initFl
4450: 61 67 20 69 73 20 30 20 74 68 65 6e 20 63 72 65  ag is 0 then cre
4460: 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ate the index on
4470: 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a   disk.  This.  *
4480: 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69  * involves writi
4490: 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  ng the index int
44a0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  o the master tab
44b0: 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69  le and filling i
44c0: 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
44d0: 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
44e0: 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73  t table contents
44f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
4500: 69 6e 69 74 46 6c 61 67 20 69 73 20 30 20 77 68  initFlag is 0 wh
4510: 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73  en the user firs
4520: 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54  t enters a CREAT
4530: 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f  E INDEX .  ** co
4540: 6d 6d 61 6e 64 2e 20 20 54 68 65 20 69 6e 69 74  mmand.  The init
4550: 46 6c 61 67 20 69 73 20 31 20 77 68 65 6e 20 61  Flag is 1 when a
4560: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
4570: 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52  ned and .  ** CR
4580: 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
4590: 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f  ments are read o
45a0: 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ut of the master
45b0: 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a   table.  In.  **
45c0: 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65   the latter case
45d0: 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
45e0: 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  dy exists on dis
45f0: 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a  k, which is why.
4600: 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
4610: 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69  nt to recreate i
4620: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
4630: 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d  arse->initFlag==
4640: 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
4650: 56 64 62 65 4f 70 20 61 64 64 54 61 62 6c 65 5b  VdbeOp addTable[
4660: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
4670: 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 32 2c  _Open,        2,
4680: 20 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 7d   1, MASTER_NAME}
4690: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 77  ,.      { OP_New
46a0: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20  ,         2, 0, 
46b0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  0},.      { OP_S
46c0: 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20 30  tring,      0, 0
46d0: 2c 20 22 69 6e 64 65 78 22 7d 2c 0a 20 20 20 20  , "index"},.    
46e0: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
46f0: 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 20 20 2f      0, 0, 0},  /
4700: 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 3 */.      { O
4710: 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30  P_String,      0
4720: 2c 20 30 2c 20 30 7d 2c 20 20 2f 2a 20 34 20 2a  , 0, 0},  /* 4 *
4730: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72  /.      { OP_Str
4740: 69 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c 20  ing,      0, 0, 
4750: 30 7d 2c 20 20 2f 2a 20 35 20 2a 2f 0a 20 20 20  0},  /* 5 */.   
4760: 20 20 20 7b 20 4f 50 5f 4d 61 6b 65 52 65 63 6f     { OP_MakeReco
4770: 72 64 2c 20 20 34 2c 20 30 2c 20 30 7d 2c 0a 20  rd,  4, 0, 0},. 
4780: 20 20 20 20 20 7b 20 4f 50 5f 50 75 74 2c 20 20       { OP_Put,  
4790: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30 7d 2c         2, 0, 0},
47a0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73  .      { OP_Clos
47b0: 65 2c 20 20 20 20 20 20 20 32 2c 20 30 2c 20 30  e,       2, 0, 0
47c0: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  },.    };.    in
47d0: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
47e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
47f0: 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20  ;.    int lbl1, 
4800: 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b  lbl2;.    int i;
4810: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
4820: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
4830: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
4840: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
4850: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 73 71 6c 69  _index;.    sqli
4860: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4870: 50 5f 4f 70 65 6e 2c 20 30 2c 20 30 2c 20 70 54  P_Open, 0, 0, pT
4880: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
4890: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
48a0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 31  Op(v, OP_Open, 1
48b0: 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  , 1, pIndex->zNa
48c0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  me, 0);.    if( 
48d0: 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29  pStart && pEnd )
48e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 61 73 65  {.      int base
48f0: 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74  ;.      n = (int
4900: 29 70 45 6e 64 2d 3e 7a 20 2d 20 28 69 6e 74 29  )pEnd->z - (int)
4910: 70 53 74 61 72 74 2d 3e 7a 20 2b 20 31 3b 0a 20  pStart->z + 1;. 
4920: 20 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69       base = sqli
4930: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
4940: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 61 64 64  v, ArraySize(add
4950: 54 61 62 6c 65 29 2c 20 61 64 64 54 61 62 6c 65  Table), addTable
4960: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4970: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
4980: 61 73 65 2b 33 2c 20 70 49 6e 64 65 78 2d 3e 7a  ase+3, pIndex->z
4990: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
49a0: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
49b0: 50 33 28 76 2c 20 62 61 73 65 2b 34 2c 20 70 54  P3(v, base+4, pT
49c0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
49d0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
49e0: 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b  hangeP3(v, base+
49f0: 35 2c 20 70 53 74 61 72 74 2d 3e 7a 2c 20 6e 29  5, pStart->z, n)
4a00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 62 6c 31  ;.    }.    lbl1
4a10: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
4a20: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 6c  eLabel(v);.    l
4a30: 62 6c 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65  bl2 = sqliteVdbe
4a40: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4a50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4a60: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 30 2c  p(v, OP_Next, 0,
4a70: 20 6c 62 6c 32 2c 20 30 2c 20 6c 62 6c 31 29 3b   lbl2, 0, lbl1);
4a80: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4a90: 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 2c 20  ddOp(v, OP_Key, 
4aa0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
4ab0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
4ac0: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
4ad0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
4ae0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
4af0: 69 65 6c 64 2c 20 30 2c 20 70 49 6e 64 65 78 2d  ield, 0, pIndex-
4b00: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 2c 20 30 2c  >aiColumn[i], 0,
4b10: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
4b20: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4b30: 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 49  , OP_MakeKey, pI
4b40: 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30  ndex->nColumn, 0
4b50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
4b60: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4b70: 4f 50 5f 50 75 74 49 64 78 2c 20 31 2c 20 30 2c  OP_PutIdx, 1, 0,
4b80: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4b90: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4ba0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 31 2c  P_Goto, 0, lbl1,
4bb0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4bc0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4bd0: 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 30 2c  P_Noop, 0, 0, 0,
4be0: 20 6c 62 6c 32 29 3b 0a 20 20 20 20 73 71 6c 69   lbl2);.    sqli
4bf0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4c00: 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 2c 20 30  P_Close, 1, 0, 0
4c10: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4c20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4c30: 43 6c 6f 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Close, 0, 0, 0, 
4c40: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  0);.  }..  /* Re
4c50: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 20 6f 6e 20  claim memory on 
4c60: 61 6e 20 45 58 50 4c 41 49 4e 20 63 61 6c 6c 2e  an EXPLAIN call.
4c70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
4c80: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
4c90: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
4ca0: 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ndex);.  }..  /*
4cb0: 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
4cc0: 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
4cd0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
4ce0: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
4cf0: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71  ete(pList);.  sq
4d00: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
4d10: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
4d20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4d30: 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
4d40: 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
4d50: 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ex..*/.void sqli
4d60: 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  teDropIndex(Pars
4d70: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
4d80: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65   *pName){.  Inde
4d90: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 63 68 61  x *pIndex;.  cha
4da0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65  r *zName;.  Vdbe
4db0: 20 2a 76 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20   *v;..  zName = 
4dc0: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
4dd0: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
4de0: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
4df0: 74 65 46 69 6e 64 49 6e 64 65 78 28 70 50 61 72  teFindIndex(pPar
4e00: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  se->db, zName);.
4e10: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
4e20: 6d 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  me);.  if( pInde
4e30: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
4e40: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
4e50: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
4e60: 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 22  no such index: "
4e70: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70 4e  , 0, .        pN
4e80: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
4e90: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
4ea0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
4eb0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
4ec0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
4ed0: 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
4ee0: 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d  x and from the m
4ef0: 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
4f00: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
4f10: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
4f20: 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ( v ){.    stati
4f30: 63 20 56 64 62 65 4f 70 20 64 72 6f 70 49 6e 64  c VdbeOp dropInd
4f40: 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ex[] = {.      {
4f50: 20 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20   OP_Open,       
4f60: 30 2c 20 31 2c 20 20 20 20 20 20 20 4d 41 53 54  0, 1,       MAST
4f70: 45 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20  ER_NAME},.      
4f80: 7b 20 4f 50 5f 4c 69 73 74 4f 70 65 6e 2c 20 20  { OP_ListOpen,  
4f90: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
4fa0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
4fb0: 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  ng,     0, 0,   
4fc0: 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a      0}, /* 2 */.
4fd0: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c        { OP_Next,
4fe0: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39         0, ADDR(9
4ff0: 29 2c 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20  ), 0}, /* 3 */. 
5000: 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20 20       { OP_Dup,  
5010: 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20        0, 0,     
5020: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
5030: 5f 46 69 65 6c 64 2c 20 20 20 20 20 20 30 2c 20  _Field,      0, 
5040: 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  1,       0},.   
5050: 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20     { OP_Ne,     
5060: 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20      0, ADDR(3), 
5070: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4b  0},.      { OP_K
5080: 65 79 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c  ey,        0, 0,
5090: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
50a0: 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20   { OP_Delete,   
50b0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
50c0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 73  ,.      { OP_Des
50d0: 74 72 6f 79 2c 20 20 20 20 30 2c 20 30 2c 20 20  troy,    0, 0,  
50e0: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f       0}, /* 9 */
50f0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73  .      { OP_Clos
5100: 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20  e,      0, 0,   
5110: 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20      0},.    };. 
5120: 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20     int base;..  
5130: 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56    base = sqliteV
5140: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
5150: 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e  ArraySize(dropIn
5160: 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29  dex), dropIndex)
5170: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
5180: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
5190: 2b 32 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  +2, pIndex->zNam
51a0: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
51b0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
51c0: 20 62 61 73 65 2b 39 2c 20 70 49 6e 64 65 78 2d   base+9, pIndex-
51d0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
51e0: 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
51f0: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
5200: 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d 65   and free its me
5210: 6d 6f 72 79 2e 20 20 45 78 63 65 70 74 20 69 66  mory.  Except if
5220: 20 74 68 65 0a 20 20 2a 2a 20 45 58 50 4c 41 49   the.  ** EXPLAI
5230: 4e 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  N keyword is pre
5240: 73 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73  sent, no changes
5250: 20 61 72 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a   are made..  */.
5260: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65    if( !pParse->e
5270: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 66  xplain ){.    if
5280: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
5290: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
52a0: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
52b0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
52c0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
52d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
52e0: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
52f0: 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d     for(p=pIndex-
5300: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
5310: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d   p && p->pNext!=
5320: 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65  pIndex; p=p->pNe
5330: 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  xt){}.      if( 
5340: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
5350: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Index ){.       
5360: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64   p->pNext = pInd
5370: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ex->pNext;.     
5380: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
5390: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 70  iteDeleteIndex(p
53a0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65  Parse->db, pInde
53b0: 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  x);.  }.}../*.**
53c0: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
53d0: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
53e0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
53f0: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
5400: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
5410: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
5420: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
5430: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c  n list..*/.ExprL
5440: 69 73 74 20 2a 73 71 6c 69 74 65 45 78 70 72 4c  ist *sqliteExprL
5450: 69 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69  istAppend(ExprLi
5460: 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20  st *pList, Expr 
5470: 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70  *pExpr, Token *p
5480: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
5490: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
54a0: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
54b0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
54c0: 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a  of(ExprList) );.
54d0: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 3d    }.  if( pList=
54e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
54f0: 20 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78   if( (pList->nEx
5500: 70 72 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20  pr & 7)==0 ){.  
5510: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d    int n = pList-
5520: 3e 6e 45 78 70 72 20 2b 20 38 3b 0a 20 20 20 20  >nExpr + 8;.    
5530: 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74  pList->a = sqlit
5540: 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
5550: 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73  a, n*sizeof(pLis
5560: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
5570: 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29  f( pList->a==0 )
5580: 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e  {.      pList->n
5590: 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
55a0: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20  return pList;.  
55b0: 20 20 7d 0a 20 20 7d 0a 20 20 69 20 3d 20 70 4c    }.  }.  i = pL
55c0: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 3b 0a 20 20  ist->nExpr++;.  
55d0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
55e0: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 4c 69  r = pExpr;.  pLi
55f0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
5600: 20 30 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   0;.  if( pName 
5610: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
5620: 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e  NString(&pList->
5630: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[i].zName, pNam
5640: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
5650: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65  0);.    sqliteDe
5660: 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  quote(pList->a[i
5670: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
5680: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
5690: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
56a0: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
56b0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
56c0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
56d0: 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a  elete(ExprList *
56e0: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
56f0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
5700: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
5710: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
5720: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
5730: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
5740: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
5750: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  r);.    sqliteFr
5760: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
5770: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
5780: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
5790: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
57a0: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
57b0: 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
57c0: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
57d0: 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
57e0: 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
57f0: 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
5800: 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
5810: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c  IdListAppend(IdL
5820: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
5830: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
5840: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
5850: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
5860: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
5870: 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
5880: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
5890: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
58a0: 20 28 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37   (pList->nId & 7
58b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  )==0 ){.    pLis
58c0: 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65 61  t->a = sqliteRea
58d0: 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28  lloc(pList->a, (
58e0: 70 4c 69 73 74 2d 3e 6e 49 64 2b 38 29 2a 73 69  pList->nId+8)*si
58f0: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
5900: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
5910: 73 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  st->a==0 ){.    
5920: 20 20 70 4c 69 73 74 2d 3e 6e 49 64 20 3d 20 30    pList->nId = 0
5930: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
5940: 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  List;.    }.  }.
5950: 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
5960: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20  >a[pList->nId], 
5970: 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
5980: 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
5990: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  Token ){.    sql
59a0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
59b0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
59c0: 49 64 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65  Id].zName, pToke
59d0: 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c  n->z, pToken->n,
59e0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44   0);.    sqliteD
59f0: 65 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b  equote(pList->a[
5a00: 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d  pList->nId].zNam
5a10: 65 29 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d  e);.  }.  pList-
5a20: 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  >nId++;.  return
5a30: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
5a40: 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f   Add an alias to
5a50: 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69   the last identi
5a60: 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65  fier on the give
5a70: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73  n identifier lis
5a80: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
5a90: 65 49 64 4c 69 73 74 41 64 64 41 6c 69 61 73 28  eIdListAddAlias(
5aa0: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
5ab0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
5ac0: 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c   if( pList && pL
5ad0: 69 73 74 2d 3e 6e 49 64 3e 30 20 29 7b 0a 20 20  ist->nId>0 ){.  
5ae0: 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d    int i = pList-
5af0: 3e 6e 49 64 20 2d 20 31 3b 0a 20 20 20 20 73 71  >nId - 1;.    sq
5b00: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
5b10: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  pList->a[i].zAli
5b20: 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  as, pToken->z, p
5b30: 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Token->n, 0);.  
5b40: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
5b50: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  pList->a[i].zAli
5b60: 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  as);.  }.}../*.*
5b70: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
5b80: 72 65 20 49 64 4c 69 73 74 0a 2a 2f 0a 76 6f 69  re IdList.*/.voi
5b90: 64 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65  d sqliteIdListDe
5ba0: 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69  lete(IdList *pLi
5bb0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
5bc0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
5bd0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
5be0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
5bf0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
5c00: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Free(pList->a[i]
5c10: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  .zName);.    sql
5c20: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
5c30: 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d  [i].zAlias);.  }
5c40: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
5c50: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
5c60: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
5c70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59  ../*.** The COPY
5c80: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20   command is for 
5c90: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
5ca0: 74 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e  th PostgreSQL an
5cb0: 64 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a  d specificially.
5cc0: 2a 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69  ** for the abili
5cd0: 74 79 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f  ty to read the o
5ce0: 75 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70  utput of pg_dump
5cf0: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  .  The format is
5d00: 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a   as.** follows:.
5d10: 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61  **.**    COPY ta
5d20: 62 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55  ble FROM file [U
5d30: 53 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20  SING DELIMITERS 
5d40: 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74  string].**.** "t
5d50: 61 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73  able" is an exis
5d60: 74 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e  ting table name.
5d70: 20 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c    We will read l
5d80: 69 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f  ines of code fro
5d90: 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c  m.** file to fil
5da0: 6c 20 74 68 69 73 20 74 61 62 6c 65 20 77 69 74  l this table wit
5db0: 68 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69  h data.  File mi
5dc0: 67 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20  ght be "stdin". 
5dd0: 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a   The optional.**
5de0: 20 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e   delimiter strin
5df0: 67 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65  g identifies the
5e00: 20 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72   field separator
5e10: 73 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  s.  The default 
5e20: 69 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69  is a tab..*/.voi
5e30: 64 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20  d sqliteCopy(.  
5e40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5e50: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
5e60: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
5e70: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
5e80: 65 2c 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  e,   /* The name
5e90: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e   of the table in
5ea0: 74 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c  to which we will
5eb0: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b   insert */.  Tok
5ec0: 65 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20  en *pFilename,  
5ed0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72    /* The file fr
5ee0: 6f 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61  om which to obta
5ef0: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  in information *
5f00: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69  /.  Token *pDeli
5f10: 6d 69 74 65 72 20 20 20 20 2f 2a 20 55 73 65 20  miter    /* Use 
5f20: 74 68 69 73 20 61 73 20 74 68 65 20 66 69 65 6c  this as the fiel
5f30: 64 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 29  d delimiter */.)
5f40: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
5f50: 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20  .  char *zTab;. 
5f60: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 56 64 62   int i, j;.  Vdb
5f70: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64 72  e *v;.  int addr
5f80: 2c 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a  , end;.  Index *
5f90: 70 49 64 78 3b 0a 0a 20 20 7a 54 61 62 20 3d 20  pIdx;..  zTab = 
5fa0: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
5fb0: 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e  romToken(pTableN
5fc0: 61 6d 65 29 3b 0a 20 20 70 54 61 62 20 3d 20 73  ame);.  pTab = s
5fd0: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70  qliteFindTable(p
5fe0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 29  Parse->db, zTab)
5ff0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
6000: 54 61 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  Tab);.  if( pTab
6010: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6020: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
6030: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e  rse->zErrMsg, "n
6040: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c  o such table: ",
6050: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70 54 61   0, .        pTa
6060: 62 6c 65 4e 61 6d 65 2d 3e 7a 2c 20 70 54 61 62  bleName->z, pTab
6070: 6c 65 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20  leName->n, 0);. 
6080: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
6090: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70 79  +;.    goto copy
60a0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
60b0: 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
60c0: 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
60d0: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
60e0: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
60f0: 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  le ", pTab->zNam
6100: 65 2c 0a 20 20 20 20 20 20 20 20 22 20 6d 61 79  e,.        " may
6110: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
6120: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
6130: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
6140: 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70  oto copy_cleanup
6150: 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
6160: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
6170: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
6180: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
6190: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
61a0: 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 2c 20 30  ileOpen, 0, 0, 0
61b0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
61c0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
61d0: 61 64 64 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d  addr, pFilename-
61e0: 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e  >z, pFilename->n
61f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
6200: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64  eDequoteP3(v, ad
6210: 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  dr);.    sqliteV
6220: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
6230: 70 65 6e 2c 20 30 2c 20 31 2c 20 70 54 61 62 2d  pen, 0, 1, pTab-
6240: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
6250: 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54  for(i=1, pIdx=pT
6260: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
6270: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
6280: 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  xt, i++){.      
6290: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
62a0: 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 69 2c 20 31  v, OP_Open, i, 1
62b0: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30  , pIdx->zName, 0
62c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 64  );.    }.    end
62d0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
62e0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 61  eLabel(v);.    a
62f0: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
6300: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65  AddOp(v, OP_File
6310: 52 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  Read, pTab->nCol
6320: 2c 20 65 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20  , end, 0, 0);.  
6330: 20 20 69 66 28 20 70 44 65 6c 69 6d 69 74 65 72    if( pDelimiter
6340: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6350: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
6360: 61 64 64 72 2c 20 70 44 65 6c 69 6d 69 74 65 72  addr, pDelimiter
6370: 2d 3e 7a 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d  ->z, pDelimiter-
6380: 3e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >n);.      sqlit
6390: 65 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76  eVdbeDequoteP3(v
63a0: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c  , addr);.    }el
63b0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
63c0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
63d0: 61 64 64 72 2c 20 22 5c 74 22 2c 20 31 29 3b 0a  addr, "\t", 1);.
63e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
63f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6400: 4e 65 77 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  New, 0, 0, 0, 0)
6410: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
6420: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
6430: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6440: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c  v, OP_Dup, 0, 0,
6450: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
6460: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
6470: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
6480: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6490: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 46  ddOp(v, OP_FileF
64a0: 69 65 6c 64 2c 20 69 2c 20 30 2c 20 30 2c 20 30  ield, i, 0, 0, 0
64b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
64c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
64d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
64e0: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 30 2c 20 30 2c  Tab->nCol, 0, 0,
64f0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
6500: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
6510: 75 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  ut, 0, 0, 0, 0);
6520: 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49  .    for(i=1, pI
6530: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
6540: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
6550: 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20  ->pNext, i++){. 
6560: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70       if( pIdx->p
6570: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
6580: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6590: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c  v, OP_Dup, 0, 0,
65a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
65b0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
65c0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
65d0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  j++){.        sq
65e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
65f0: 20 4f 50 5f 46 69 6c 65 46 69 65 6c 64 2c 20 70   OP_FileField, p
6600: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
6610: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
6620: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
6630: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6640: 4d 61 6b 65 4b 65 79 2c 20 70 49 64 78 2d 3e 6e  MakeKey, pIdx->n
6650: 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30 2c 20 30 29  Column, 0, 0, 0)
6660: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
6670: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
6680: 74 49 64 78 2c 20 69 2c 20 30 2c 20 30 2c 20 30  tIdx, i, 0, 0, 0
6690: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
66a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
66b0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
66c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
66d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
66e0: 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 30  OP_Noop, 0, 0, 0
66f0: 2c 20 65 6e 64 29 3b 0a 20 20 7d 0a 20 20 0a 63  , end);.  }.  .c
6700: 6f 70 79 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 72  opy_cleanup:.  r
6710: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
6720: 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64  The non-standard
6730: 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20   VACUUM command 
6740: 69 73 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  is used to clean
6750: 20 75 70 20 74 68 65 20 64 61 74 61 62 61 73 65   up the database
6760: 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66 72  ,.** collapse fr
6770: 65 65 20 73 70 61 63 65 2c 20 65 74 63 2e 20 20  ee space, etc.  
6780: 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20 61  It is modelled a
6790: 66 74 65 72 20 74 68 65 20 56 41 43 55 55 4d 20  fter the VACUUM 
67a0: 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50 6f  command.** in Po
67b0: 73 74 67 72 65 53 51 4c 2e 0a 2a 2f 0a 76 6f 69  stgreSQL..*/.voi
67c0: 64 20 73 71 6c 69 74 65 56 61 63 75 75 6d 28 50  d sqliteVacuum(P
67d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
67e0: 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 29  ken *pTableName)
67f0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
6800: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
6810: 66 28 20 70 54 61 62 6c 65 4e 61 6d 65 20 29 7b  f( pTableName ){
6820: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
6830: 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d  iteTableNameFrom
6840: 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65  Token(pTableName
6850: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6860: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zName = 0;.  }. 
6870: 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71   if( zName && sq
6880: 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 70 50  liteFindIndex(pP
6890: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  arse->db, zName)
68a0: 3d 3d 30 0a 20 20 20 20 26 26 20 73 71 6c 69 74  ==0.    && sqlit
68b0: 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  eFindTable(pPars
68c0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3d 3d 30  e->db, zName)==0
68d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
68e0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
68f0: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
6900: 63 68 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ch table or inde
6910: 78 3a 20 22 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  x: ", zName, 0);
6920: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
6930: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 76 61  r++;.    goto va
6940: 63 75 75 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  cuum_cleanup;.  
6950: 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65  }.  v = sqliteGe
6960: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
6970: 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
6980: 20 76 61 63 75 75 6d 5f 63 6c 65 61 6e 75 70 3b   vacuum_cleanup;
6990: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
69a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
69b0: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 6f 72 67 61  dOp(v, OP_Reorga
69c0: 6e 69 7a 65 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d  nize, 0, 0, zNam
69d0: 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e, 0);.  }else{.
69e0: 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54      int h;.    T
69f0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
6a00: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
6a10: 20 66 6f 72 28 68 3d 30 3b 20 68 3c 4e 5f 48 41   for(h=0; h<N_HA
6a20: 53 48 3b 20 68 2b 2b 29 7b 0a 20 20 20 20 20 20  SH; h++){.      
6a30: 66 6f 72 28 70 54 61 62 3d 70 50 61 72 73 65 2d  for(pTab=pParse-
6a40: 3e 64 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b 68  >db->apTblHash[h
6a50: 5d 3b 20 70 54 61 62 3b 20 70 54 61 62 3d 70 54  ]; pTab; pTab=pT
6a60: 61 62 2d 3e 70 48 61 73 68 29 7b 0a 20 20 20 20  ab->pHash){.    
6a70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6a80: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 6f 72 67 61  dOp(v, OP_Reorga
6a90: 6e 69 7a 65 2c 20 30 2c 20 30 2c 20 70 54 61 62  nize, 0, 0, pTab
6aa0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
6ab0: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
6ac0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
6ad0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
6ae0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  xt){.          s
6af0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
6b00: 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65 2c  , OP_Reorganize,
6b10: 20 30 2c 20 30 2c 20 70 49 64 78 2d 3e 7a 4e 61   0, 0, pIdx->zNa
6b20: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
6b30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6b40: 20 20 7d 0a 0a 76 61 63 75 75 6d 5f 63 6c 65 61    }..vacuum_clea
6b50: 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  nup:.  sqliteFre
6b60: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
6b70: 72 6e 3b 0a 7d 0a                                rn;.}.