/ Hex Artifact Content
Login

Artifact 03f83e95d46e328a2ac08aace102b142ea38e6d7:


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 0a 2a 2a 0a 2a 2a 20 24 49  educed..**.** $I
0410: 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20 31 2e 31  d: build.c,v 1.1
0420: 31 20 32 30 30 30 2f 30 35 2f 33 31 20 31 35 3a  1 2000/05/31 15:
0430: 33 34 3a 35 32 20 64 72 68 20 45 78 70 20 24 0a  34:52 drh Exp $.
0440: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0450: 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a  iteInt.h"../*.**
0460: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
0470: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20   called after a 
0480: 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65  single SQL state
0490: 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a  ment has been.**
04a0: 20 70 61 72 73 65 64 20 61 6e 64 20 77 65 20 77   parsed and we w
04b0: 61 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20 74  ant to execute t
04c0: 68 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  he code to imple
04d0: 6d 65 6e 74 20 0a 2a 2a 20 74 68 65 20 73 74 61  ment .** the sta
04e0: 74 65 6d 65 6e 74 2e 20 20 50 72 69 6f 72 20 61  tement.  Prior a
04f0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 73  ction routines s
0500: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
0510: 64 79 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65  dy.** constructe
0520: 64 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 64  d VDBE code to d
0530: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  o the work of th
0540: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
0550: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0560: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 65 78 65   just has to exe
0570: 63 75 74 65 20 74 68 65 20 56 44 42 45 20 63 6f  cute the VDBE co
0580: 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  de..**.** Note t
0590: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
05a0: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
05b0: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
05c0: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
05d0: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
05e0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
05f0: 65 45 78 65 63 28 50 61 72 73 65 20 2a 70 50 61  eExec(Parse *pPa
0600: 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  rse){.  if( pPar
0610: 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
0620: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
0630: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 73 71  lain ){.      sq
0640: 6c 69 74 65 56 64 62 65 4c 69 73 74 28 70 50 61  liteVdbeList(pPa
0650: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
0660: 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c 20 70  se->xCallback, p
0670: 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a 20 20  Parse->pArg, .  
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0690: 20 20 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72     &pParse->zErr
06a0: 4d 73 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Msg);.    }else{
06b0: 0a 20 20 20 20 20 20 46 49 4c 45 20 2a 74 72 61  .      FILE *tra
06c0: 63 65 20 3d 20 28 70 50 61 72 73 65 2d 3e 64 62  ce = (pParse->db
06d0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
06e0: 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f  _VdbeTrace)!=0 ?
06f0: 20 73 74 64 65 72 72 20 3a 20 30 3b 0a 20 20 20   stderr : 0;.   
0700: 20 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61     sqliteVdbeTra
0710: 63 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  ce(pParse->pVdbe
0720: 2c 20 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20  , trace);.      
0730: 73 71 6c 69 74 65 56 64 62 65 45 78 65 63 28 70  sqliteVdbeExec(p
0740: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
0750: 61 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c  arse->xCallback,
0760: 20 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a   pParse->pArg, .
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0780: 20 20 20 20 20 26 70 50 61 72 73 65 2d 3e 7a 45       &pParse->zE
0790: 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
07a0: 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 6c 65    sqliteVdbeDele
07b0: 74 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  te(pParse->pVdbe
07c0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  );.    pParse->p
07d0: 56 64 62 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Vdbe = 0;.  }.}.
07e0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
07f0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
0800: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
0810: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
0820: 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  t..*/.Expr *sqli
0830: 74 65 45 78 70 72 28 69 6e 74 20 6f 70 2c 20 45  teExpr(int op, E
0840: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
0850: 20 2a 70 52 69 67 68 74 2c 20 54 6f 6b 65 6e 20   *pRight, Token 
0860: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
0870: 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d   *pNew;.  pNew =
0880: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
0890: 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20  izeof(Expr) );. 
08a0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
08b0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
08c0: 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 4e 65 77  >op = op;.  pNew
08d0: 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b  ->pLeft = pLeft;
08e0: 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20  .  pNew->pRight 
08f0: 3d 20 70 52 69 67 68 74 3b 0a 20 20 69 66 28 20  = pRight;.  if( 
0900: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 70 4e  pToken ){.    pN
0910: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
0920: 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ken;.  }else{.  
0930: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20    pNew->token.z 
0940: 3d 20 22 22 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = "";.    pNew->
0950: 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 7d  token.n = 0;.  }
0960: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
0970: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
0980: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
0990: 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66  ion node for a f
09a0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c  unction with mul
09b0: 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  tiple.** argumen
09c0: 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ts..*/.Expr *sql
09d0: 69 74 65 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  iteExprFunction(
09e0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
09f0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
0a00: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
0a10: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
0a20: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
0a30: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
0a40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
0a50: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
0a60: 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77  FUNCTION;.  pNew
0a70: 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  ->pList = pList;
0a80: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
0a90: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
0aa0: 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65   = *pToken;.  }e
0ab0: 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  lse{.    pNew->t
0ac0: 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20 20 20  oken.z = "";.   
0ad0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d   pNew->token.n =
0ae0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
0af0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
0b00: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
0b10: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
0b20: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
0b30: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
0b40: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
0b50: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
0b60: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 20   if( p->pLeft ) 
0b70: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
0b80: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  (p->pLeft);.  if
0b90: 28 20 70 2d 3e 70 52 69 67 68 74 20 29 20 73 71  ( p->pRight ) sq
0ba0: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
0bb0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c  ->pRight);.  sql
0bc0: 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  iteFree(p);.}../
0bd0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
0be0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
0bf0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
0c00: 65 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74  es the.** format
0c10: 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   of a particular
0c20: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
0c30: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a  given the name.*
0c40: 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e  * of that table.
0c50: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
0c60: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 54   not found..*/.T
0c70: 61 62 6c 65 20 2a 73 71 6c 69 74 65 46 69 6e 64  able *sqliteFind
0c80: 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62  Table(sqlite *db
0c90: 2c 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  , char *zName){.
0ca0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
0cb0: 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 68 20 3d  .  int h;..  h =
0cc0: 20 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61 73   sqliteHashNoCas
0cd0: 65 28 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e 5f  e(zName, 0) % N_
0ce0: 48 41 53 48 3b 0a 20 20 66 6f 72 28 70 54 61 62  HASH;.  for(pTab
0cf0: 6c 65 3d 64 62 2d 3e 61 70 54 62 6c 48 61 73 68  le=db->apTblHash
0d00: 5b 68 5d 3b 20 70 54 61 62 6c 65 3b 20 70 54 61  [h]; pTable; pTa
0d10: 62 6c 65 3d 70 54 61 62 6c 65 2d 3e 70 48 61 73  ble=pTable->pHas
0d20: 68 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  h){.    if( sqli
0d30: 74 65 53 74 72 49 43 6d 70 28 70 54 61 62 6c 65  teStrICmp(pTable
0d40: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ->zName, zName)=
0d50: 3d 30 20 29 20 72 65 74 75 72 6e 20 70 54 61 62  =0 ) return pTab
0d60: 6c 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  le;.  }.  return
0d70: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   0;.}../*.** Loc
0d80: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
0d90: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
0da0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 0a 2a   describes the.*
0db0: 2a 20 66 6f 72 6d 61 74 20 6f 66 20 61 20 70 61  * format of a pa
0dc0: 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74  rticular index t
0dd0: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
0de0: 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74  ame.** of that t
0df0: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
0e00: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
0e10: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
0e20: 65 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  eFindIndex(sqlit
0e30: 65 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61  e *db, char *zNa
0e40: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  me){.  Index *p;
0e50: 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 68 20 3d  .  int h;..  h =
0e60: 20 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61 73   sqliteHashNoCas
0e70: 65 28 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e 5f  e(zName, 0) % N_
0e80: 48 41 53 48 3b 0a 20 20 66 6f 72 28 70 3d 64 62  HASH;.  for(p=db
0e90: 2d 3e 61 70 49 64 78 48 61 73 68 5b 68 5d 3b 20  ->apIdxHash[h]; 
0ea0: 70 3b 20 70 3d 70 2d 3e 70 48 61 73 68 29 7b 0a  p; p=p->pHash){.
0eb0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
0ec0: 72 49 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20  rICmp(p->zName, 
0ed0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
0ee0: 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn p;.  }.  retu
0ef0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
0f00: 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20  emove the given 
0f10: 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69  index from the i
0f20: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c  ndex hash table,
0f30: 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73   and free.** its
0f40: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
0f50: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  es..**.** The in
0f60: 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66  dex is removed f
0f70: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
0f80: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 62 75 74   hash table, but
0f90: 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 6e   it is.** not un
0fa0: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
0fb0: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 62 65  table that is be
0fc0: 69 6e 67 20 69 6e 64 65 78 65 64 2e 20 20 55 6e  ing indexed.  Un
0fd0: 6c 69 6e 6b 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20  linking.** from 
0fe0: 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62  the table must b
0ff0: 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61  e done by the ca
1000: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
1010: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1020: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
1030: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64  (sqlite *db, Ind
1040: 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
1050: 6e 74 20 68 3b 0a 20 20 69 66 28 20 70 49 6e 64  nt h;.  if( pInd
1060: 65 78 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  ex->zName ){.   
1070: 20 68 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e   h = sqliteHashN
1080: 6f 43 61 73 65 28 70 49 6e 64 65 78 2d 3e 7a 4e  oCase(pIndex->zN
1090: 61 6d 65 2c 20 30 29 20 25 20 4e 5f 48 41 53 48  ame, 0) % N_HASH
10a0: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 70  ;.    if( db->ap
10b0: 49 64 78 48 61 73 68 5b 68 5d 3d 3d 70 49 6e 64  IdxHash[h]==pInd
10c0: 65 78 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  ex ){.      db->
10d0: 61 70 49 64 78 48 61 73 68 5b 68 5d 20 3d 20 70  apIdxHash[h] = p
10e0: 49 6e 64 65 78 2d 3e 70 48 61 73 68 3b 0a 20 20  Index->pHash;.  
10f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
1100: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66  ndex *p;.      f
1110: 6f 72 28 70 3d 64 62 2d 3e 61 70 49 64 78 48 61  or(p=db->apIdxHa
1120: 73 68 5b 68 5d 3b 20 70 20 26 26 20 70 2d 3e 70  sh[h]; p && p->p
1130: 48 61 73 68 21 3d 70 49 6e 64 65 78 3b 20 70 3d  Hash!=pIndex; p=
1140: 70 2d 3e 70 48 61 73 68 29 7b 7d 0a 20 20 20 20  p->pHash){}.    
1150: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 48    if( p && p->pH
1160: 61 73 68 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  ash==pIndex ){. 
1170: 20 20 20 20 20 20 20 70 2d 3e 70 48 61 73 68 20         p->pHash 
1180: 3d 20 70 49 6e 64 65 78 2d 3e 70 48 61 73 68 3b  = pIndex->pHash;
1190: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11a0: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
11b0: 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
11c0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
11d0: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
11e0: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
11f0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
1200: 20 74 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   table.  No chan
1210: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
1220: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
1230: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
1240: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
1250: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
1260: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
1270: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
1280: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
1290: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
12a0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
12b0: 42 75 74 20 64 6f 65 73 20 69 74 20 64 65 73 74  But does it dest
12c0: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
12d0: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
12e0: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
12f0: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
1300: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1310: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  eDeleteTable(sql
1320: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
1330: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
1340: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ;.  Index *pInde
1350: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28  x, *pNext;.  if(
1360: 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74   pTable==0 ) ret
1370: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
1380: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
1390: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  i++){.    if( pT
13a0: 61 62 6c 65 2d 3e 61 7a 43 6f 6c 5b 69 5d 20 29  able->azCol[i] )
13b0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
13c0: 6c 65 2d 3e 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  le->azCol[i]);. 
13d0: 20 7d 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20   }.  for(pIndex 
13e0: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
13f0: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
1400: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
1410: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
1420: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65  xt;.    sqliteDe
1430: 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49  leteIndex(db, pI
1440: 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ndex);.  }.  sql
1450: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
1460: 61 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  azCol);.  sqlite
1470: 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a  Free(pTable);.}.
1480: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
1490: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 75   the name of a u
14a0: 73 65 72 20 74 61 62 6c 65 20 66 72 6f 6d 20 61  ser table from a
14b0: 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70   token..**.** Sp
14c0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
14d0: 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64  name is obtained
14e0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
14f0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a  oc() and must.**
1500: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
1510: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1520: 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  n..*/.char *sqli
1530: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
1540: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d  oken(Token *pNam
1550: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
1560: 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 53  e = 0;.  sqliteS
1570: 65 74 4e 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65  etNString(&zName
1580: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
1590: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69  e->n, 0);.  sqli
15a0: 74 65 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  teDequote(zName)
15b0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
15c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
15d0: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
15e0: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
15f0: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
1600: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
1610: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
1620: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
1630: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
1640: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
1650: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
1660: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
1670: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53  .*/.void sqliteS
1680: 74 61 72 74 54 61 62 6c 65 28 50 61 72 73 65 20  tartTable(Parse 
1690: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
16a0: 70 53 74 61 72 74 2c 20 54 6f 6b 65 6e 20 2a 70  pStart, Token *p
16b0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
16c0: 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  pTable;.  char *
16d0: 7a 4e 61 6d 65 3b 0a 0a 20 20 70 50 61 72 73 65  zName;..  pParse
16e0: 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 20 3d 20  ->sFirstToken = 
16f0: 2a 70 53 74 61 72 74 3b 0a 20 20 7a 4e 61 6d 65  *pStart;.  zName
1700: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
1710: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
1720: 65 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 73  e);.  pTable = s
1730: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70  qliteFindTable(p
1740: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
1750: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21  );.  if( pTable!
1760: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1770: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
1780: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61  se->zErrMsg, "ta
1790: 62 6c 65 20 22 2c 20 30 2c 20 70 4e 61 6d 65 2d  ble ", 0, pName-
17a0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 0a 20 20  >z, pName->n,.  
17b0: 20 20 20 20 20 20 22 20 61 6c 72 65 61 64 79 20        " already 
17c0: 65 78 69 73 74 73 22 2c 20 30 2c 20 30 29 3b 0a  exists", 0, 0);.
17d0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
17e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73  Name);.    pPars
17f0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
1800: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
1810: 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78   sqliteFindIndex
1820: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
1830: 6d 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  me) ){.    sqlit
1840: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
1850: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68  se->zErrMsg, "th
1860: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
1870: 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 22 2c  n index named ",
1880: 20 0a 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20   .       zName, 
1890: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  0);.    sqliteFr
18a0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  ee(zName);.    p
18b0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
18c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
18d0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
18e0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  Malloc( sizeof(T
18f0: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
1900: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
1910: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
1920: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
1930: 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
1940: 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  ", 0);.    pPars
1950: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
1960: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61  eturn;.  }.  pTa
1970: 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  ble->zName = zNa
1980: 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 48  me;.  pTable->pH
1990: 61 73 68 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  ash = 0;.  pTabl
19a0: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->nCol = 0;.  p
19b0: 54 61 62 6c 65 2d 3e 61 7a 43 6f 6c 20 3d 20 30  Table->azCol = 0
19c0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ;.  pTable->pInd
19d0: 65 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ex = 0;.  if( pP
19e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
19f0: 29 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61  ) sqliteDeleteTa
1a00: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
1a10: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
1a20: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e  e);.  pParse->pN
1a30: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
1a40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1a50: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
1a60: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
1a70: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
1a80: 63 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  cted..*/.void sq
1a90: 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e 28 50 61  liteAddColumn(Pa
1aa0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
1ab0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61  en *pName){.  Ta
1ac0: 62 6c 65 20 2a 70 3b 0a 20 20 63 68 61 72 20 2a  ble *p;.  char *
1ad0: 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  *pz;.  if( (p = 
1ae0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
1af0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
1b00: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
1b10: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
1b20: 70 2d 3e 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74  p->azCol = sqlit
1b30: 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 7a 43  eRealloc( p->azC
1b40: 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a  ol, (p->nCol+8)*
1b50: 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 43 6f 6c 5b  sizeof(p->azCol[
1b60: 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0]));.  }.  if( 
1b70: 70 2d 3e 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  p->azCol==0 ){. 
1b80: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a     p->nCol = 0;.
1b90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1ba0: 20 20 70 7a 20 3d 20 26 70 2d 3e 61 7a 43 6f 6c    pz = &p->azCol
1bb0: 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d 3b 0a 20 20 2a  [p->nCol++];.  *
1bc0: 70 7a 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  pz = 0;.  sqlite
1bd0: 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70  SetNString(pz, p
1be0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
1bf0: 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 44  n, 0);.  sqliteD
1c00: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a  equote(*pz);.}..
1c10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1c20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
1c30: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
1c40: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
1c50: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
1c60: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1c70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
1c80: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  e structure is a
1c90: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
1ca0: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
1cb0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74  .  .**.** An ent
1cc0: 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ry for the table
1cd0: 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20   is made in the 
1ce0: 6d 61 73 74 65 72 20 74 61 62 6c 65 2c 20 75 6e  master table, un
1cf0: 6c 65 73 73 20 0a 2a 2a 20 69 6e 69 74 46 6c 61  less .** initFla
1d00: 67 3d 3d 31 2e 20 20 57 68 65 6e 20 69 6e 69 74  g==1.  When init
1d10: 46 6c 61 67 3d 3d 31 2c 20 69 74 20 6d 65 61 6e  Flag==1, it mean
1d20: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
1d30: 20 74 68 65 0a 2a 2a 20 6d 61 73 74 65 72 20 74   the.** master t
1d40: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
1d50: 6a 75 73 74 20 63 6f 6e 6e 65 63 74 65 64 20 74  just connected t
1d60: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
1d70: 73 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 74 72 79  so .** the entry
1d80: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
1d90: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
1da0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  n the master tab
1db0: 6c 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74  le..** We do not
1dc0: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
1dd0: 69 74 20 61 67 61 69 6e 2e 0a 2a 2f 0a 76 6f 69  it again..*/.voi
1de0: 64 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65  d sqliteEndTable
1df0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1e00: 54 6f 6b 65 6e 20 2a 70 45 6e 64 29 7b 0a 20 20  Token *pEnd){.  
1e10: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
1e20: 68 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  h;..  if( pParse
1e30: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
1e40: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
1e50: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
1e60: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
1e70: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
1e80: 62 61 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20  base.  */.  if( 
1e90: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
1ea0: 77 54 61 62 6c 65 29 21 3d 30 20 26 26 20 70 50  wTable)!=0 && pP
1eb0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30  arse->explain==0
1ec0: 20 29 7b 0a 20 20 20 20 68 20 3d 20 73 71 6c 69   ){.    h = sqli
1ed0: 74 65 48 61 73 68 4e 6f 43 61 73 65 28 70 2d 3e  teHashNoCase(p->
1ee0: 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e 5f 48 41  zName, 0) % N_HA
1ef0: 53 48 3b 0a 20 20 20 20 70 2d 3e 70 48 61 73 68  SH;.    p->pHash
1f00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
1f10: 70 54 62 6c 48 61 73 68 5b 68 5d 3b 0a 20 20 20  pTblHash[h];.   
1f20: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 70 54   pParse->db->apT
1f30: 62 6c 48 61 73 68 5b 68 5d 20 3d 20 70 3b 0a 20  blHash[h] = p;. 
1f40: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
1f50: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  able = 0;.  }.. 
1f60: 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69   /* If not initi
1f70: 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72  alizing, then cr
1f80: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f  eate the table o
1f90: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
1fa0: 66 28 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74  f( !pParse->init
1fb0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 74 61 74  Flag ){.    stat
1fc0: 69 63 20 56 64 62 65 4f 70 20 61 64 64 54 61 62  ic VdbeOp addTab
1fd0: 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  le[] = {.      {
1fe0: 20 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20   OP_Open,       
1ff0: 20 30 2c 20 30 2c 20 4d 41 53 54 45 52 5f 4e 41   0, 0, MASTER_NA
2000: 4d 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  ME },.      { OP
2010: 5f 4e 65 77 2c 20 20 20 20 20 20 20 20 20 30 2c  _New,         0,
2020: 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20   0, 0},.      { 
2030: 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20  OP_String,      
2040: 30 2c 20 30 2c 20 22 74 61 62 6c 65 22 20 20 20  0, 0, "table"   
2050: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f    },.      { OP_
2060: 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20  String,      0, 
2070: 30 2c 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20  0, 0},          
2080: 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20    /* 3 */.      
2090: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
20a0: 20 20 30 2c 20 30 2c 20 30 7d 2c 20 20 20 20 20    0, 0, 0},     
20b0: 20 20 20 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20         /* 4 */. 
20c0: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
20d0: 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c  ,      0, 0, 0},
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35              /* 5
20f0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d   */.      { OP_M
2100: 61 6b 65 52 65 63 6f 72 64 2c 20 20 34 2c 20 30  akeRecord,  4, 0
2110: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
2120: 5f 50 75 74 2c 20 20 20 20 20 20 20 20 20 30 2c  _Put,         0,
2130: 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20   0, 0},.      { 
2140: 4f 50 5f 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  OP_Close,       
2150: 30 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 7d 3b  0, 0, 0},.    };
2160: 0a 20 20 20 20 69 6e 74 20 6e 2c 20 62 61 73 65  .    int n, base
2170: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
2180: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a  pParse->pVdbe;..
2190: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a      if( v==0 ){.
21a0: 20 20 20 20 20 20 76 20 3d 20 70 50 61 72 73 65        v = pParse
21b0: 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65  ->pVdbe = sqlite
21c0: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
21d0: 65 2d 3e 64 62 2d 3e 70 42 65 29 3b 0a 20 20 20  e->db->pBe);.   
21e0: 20 7d 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20   }.    if( v==0 
21f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 6e 20  ) return;.    n 
2200: 3d 20 28 69 6e 74 29 70 45 6e 64 2d 3e 7a 20 2d  = (int)pEnd->z -
2210: 20 28 69 6e 74 29 70 50 61 72 73 65 2d 3e 73 46   (int)pParse->sF
2220: 69 72 73 74 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b  irstToken.z + 1;
2230: 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69  .    base = sqli
2240: 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  teVdbeAddOpList(
2250: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 61 64 64  v, ArraySize(add
2260: 54 61 62 6c 65 29 2c 20 61 64 64 54 61 62 6c 65  Table), addTable
2270: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
2280: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
2290: 65 2b 33 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30  e+3, p->zName, 0
22a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
22b0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
22c0: 65 2b 34 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30  e+4, p->zName, 0
22d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
22e0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
22f0: 65 2b 35 2c 20 70 50 61 72 73 65 2d 3e 73 46 69  e+5, pParse->sFi
2300: 72 73 74 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a  rstToken.z, n);.
2310: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
2320: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b  en a token, look
2330: 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74 68   up a table with
2340: 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66 20   that name.  If 
2350: 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65  not found, leave
2360: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  .** an error for
2370: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 66   the parser to f
2380: 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ind and return N
2390: 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ULL..*/.Table *s
23a0: 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f  qliteTableFromTo
23b0: 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ken(Parse *pPars
23c0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b  e, Token *pTok){
23d0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
23e0: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
23f0: 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b  FromToken(pTok);
2400: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
2410: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
2420: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
2430: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
2440: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  e(zName);.  if( 
2450: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
2460: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
2470: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
2480: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
2490: 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  : ", 0, .       
24a0: 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e   pTok->z, pTok->
24b0: 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73  n, 0);.    pPars
24c0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20  e->nErr++;.  }. 
24d0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
24e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
24f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
2500: 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
2510: 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
2520: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
2530: 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c 65 28  sqliteDropTable(
2540: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
2550: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
2560: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
2570: 20 69 6e 74 20 68 3b 0a 20 20 56 64 62 65 20 2a   int h;.  Vdbe *
2580: 76 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a  v;.  int base;..
2590: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
25a0: 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28  eTableFromToken(
25b0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a  pParse, pName);.
25c0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
25d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
25e0: 70 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79  pTable->readOnly
25f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
2600: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
2610: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65  >zErrMsg, "table
2620: 20 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d   ", pTable->zNam
2630: 65 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61 79  e, .       " may
2640: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
2650: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
2660: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
2670: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
2680: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
2690: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
26a0: 65 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65  e and its refere
26b0: 6e 63 65 20 69 6e 20 73 79 73 5f 6d 61 73 74 65  nce in sys_maste
26c0: 72 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73  r */.  v = pPars
26d0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
26e0: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
26f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
2700: 73 71 6c 69 74 65 56 64 62 65 43 72 65 61 74 65  sqliteVdbeCreate
2710: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 42 65  (pParse->db->pBe
2720: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76 20 29  );.  }.  if( v )
2730: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
2740: 65 4f 70 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20  eOp dropTable[] 
2750: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f  = {.      { OP_O
2760: 70 65 6e 2c 20 20 20 20 20 20 20 30 2c 20 30 2c  pen,       0, 0,
2770: 20 20 20 20 20 20 20 20 4d 41 53 54 45 52 5f 4e          MASTER_N
2780: 41 4d 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  AME },.      { O
2790: 50 5f 4c 69 73 74 4f 70 65 6e 2c 20 20 20 30 2c  P_ListOpen,   0,
27a0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
27b0: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
27c0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
27d0: 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20     0}, /* 2 */. 
27e0: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
27f0: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 31 30        0, ADDR(10
2800: 29 2c 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20  ), 0}, /* 3 */. 
2810: 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20 20       { OP_Dup,  
2820: 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20        0, 0,     
2830: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
2840: 50 5f 46 69 65 6c 64 2c 20 20 20 20 20 20 30 2c  P_Field,      0,
2850: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   2,        0},. 
2860: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20       { OP_Ne,   
2870: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29        0, ADDR(3)
2880: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
2890: 50 5f 4b 65 79 2c 20 20 20 20 20 20 20 20 30 2c  P_Key,        0,
28a0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
28b0: 20 20 20 20 20 7b 20 4f 50 5f 4c 69 73 74 57 72       { OP_ListWr
28c0: 69 74 65 2c 20 20 30 2c 20 30 2c 20 20 20 20 20  ite,  0, 0,     
28d0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
28e0: 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c  P_Goto,       0,
28f0: 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 0a 20   ADDR(3),  0},. 
2900: 20 20 20 20 20 7b 20 4f 50 5f 4c 69 73 74 52 65       { OP_ListRe
2910: 77 69 6e 64 2c 20 30 2c 20 30 2c 20 20 20 20 20  wind, 0, 0,     
2920: 20 20 20 30 7d 2c 20 2f 2a 20 31 30 20 2a 2f 0a     0}, /* 10 */.
2930: 20 20 20 20 20 20 7b 20 4f 50 5f 4c 69 73 74 52        { OP_ListR
2940: 65 61 64 2c 20 20 20 30 2c 20 41 44 44 52 28 31  ead,   0, ADDR(1
2950: 34 29 2c 20 30 7d 2c 20 2f 2a 20 31 31 20 2a 2f  4), 0}, /* 11 */
2960: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
2970: 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
2980: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
2990: 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20   OP_Goto,       
29a0: 30 2c 20 41 44 44 52 28 31 31 29 2c 20 30 7d 2c  0, ADDR(11), 0},
29b0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 73 74  .      { OP_Dest
29c0: 72 6f 79 2c 20 20 20 20 30 2c 20 30 2c 20 20 20  roy,    0, 0,   
29d0: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 34 20 2a       0}, /* 14 *
29e0: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f  /.      { OP_Clo
29f0: 73 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 20  se,      0, 0,  
2a00: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b        0},.    };
2a10: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
2a20: 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c  ;.    base = sql
2a30: 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
2a40: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72  (v, ArraySize(dr
2a50: 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61  opTable), dropTa
2a60: 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ble);.    sqlite
2a70: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
2a80: 62 61 73 65 2b 32 2c 20 70 54 61 62 6c 65 2d 3e  base+2, pTable->
2a90: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
2aa0: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
2ab0: 33 28 76 2c 20 62 61 73 65 2b 31 34 2c 20 70 54  3(v, base+14, pT
2ac0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  able->zName, 0);
2ad0: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
2ae0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
2af0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
2b00: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 73 71 6c  Next){.      sql
2b10: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2b20: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 30 2c 20 30  OP_Destroy, 0, 0
2b30: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30  , pIdx->zName, 0
2b40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2b50: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
2b60: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ble structure an
2b70: 64 20 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72  d free its memor
2b80: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63  y..  **.  ** Exc
2b90: 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53  eption: if the S
2ba0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67  QL statement beg
2bb0: 61 6e 20 77 69 74 68 20 74 68 65 20 45 58 50 4c  an with the EXPL
2bc0: 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a  AIN keyword,.  *
2bd0: 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65  * then no change
2be0: 73 20 61 72 65 20 6d 61 64 65 2e 0a 20 20 2a 2f  s are made..  */
2bf0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
2c00: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 68  explain ){.    h
2c10: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 6f 43   = sqliteHashNoC
2c20: 61 73 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  ase(pTable->zNam
2c30: 65 2c 20 30 29 20 25 20 4e 5f 48 41 53 48 3b 0a  e, 0) % N_HASH;.
2c40: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
2c50: 64 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b 68 5d  db->apTblHash[h]
2c60: 3d 3d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ==pTable ){.    
2c70: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 70    pParse->db->ap
2c80: 54 62 6c 48 61 73 68 5b 68 5d 20 3d 20 70 54 61  TblHash[h] = pTa
2c90: 62 6c 65 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20  ble->pHash;.    
2ca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 61 62  }else{.      Tab
2cb0: 6c 65 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72  le *p;.      for
2cc0: 28 70 3d 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  (p=pParse->db->a
2cd0: 70 54 62 6c 48 61 73 68 5b 68 5d 3b 20 70 20 26  pTblHash[h]; p &
2ce0: 26 20 70 2d 3e 70 48 61 73 68 21 3d 70 54 61 62  & p->pHash!=pTab
2cf0: 6c 65 3b 20 70 3d 70 2d 3e 70 48 61 73 68 29 7b  le; p=p->pHash){
2d00: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26  }.      if( p &&
2d10: 20 70 2d 3e 70 48 61 73 68 3d 3d 70 54 61 62 6c   p->pHash==pTabl
2d20: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  e ){.        p->
2d30: 70 48 61 73 68 20 3d 20 70 54 61 62 6c 65 2d 3e  pHash = pTable->
2d40: 70 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20  pHash;.      }. 
2d50: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 44     }.    sqliteD
2d60: 65 6c 65 74 65 54 61 62 6c 65 28 70 50 61 72 73  eleteTable(pPars
2d70: 65 2d 3e 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  e->db, pTable);.
2d80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65    }.}../*.** Cre
2d90: 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
2da0: 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  for an SQL table
2db0: 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74 68 65  .  pIndex is the
2dc0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
2dd0: 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c  ex .** and pTabl
2de0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
2df0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
2e00: 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
2e10: 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a  .  Both will .**
2e20: 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70   be NULL for a p
2e30: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 6e 20  rimary key.  In 
2e40: 74 68 61 74 20 63 61 73 65 2c 20 75 73 65 20 70  that case, use p
2e50: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
2e60: 20 61 73 20 74 68 65 20 0a 2a 2a 20 74 61 62 6c   as the .** tabl
2e70: 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
2e80: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20  .**.** pList is 
2e90: 61 20 6c 69 73 74 20 6f 66 20 66 69 65 6c 64 73  a list of fields
2ea0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
2eb0: 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
2ec0: 55 4c 4c 20 69 66 20 74 68 65 0a 2a 2a 20 6d 6f  ULL if the.** mo
2ed0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
2ee0: 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74  d field of the t
2ef0: 61 62 6c 65 20 69 73 20 6c 61 62 65 6c 65 64 20  able is labeled 
2f00: 61 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  as the primary k
2f10: 65 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ey..*/.void sqli
2f20: 74 65 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  teCreateIndex(. 
2f30: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2f40: 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
2f50: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
2f60: 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
2f70: 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e   *pName,    /* N
2f80: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
2f90: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2fa0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
2fb0: 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
2fc0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 64  the table to ind
2fd0: 65 78 2e 20 20 55 73 65 20 70 50 61 72 73 65 2d  ex.  Use pParse-
2fe0: 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
2ff0: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c 69  */.  IdList *pLi
3000: 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  st,   /* A list 
3010: 6f 66 20 66 69 65 6c 64 73 20 74 6f 20 62 65 20  of fields to be 
3020: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 54 6f 6b  indexed */.  Tok
3030: 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a  en *pStart,   /*
3040: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
3050: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20  n that begins a 
3060: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
3070: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
3080: 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20  n *pEnd      /* 
3090: 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
30a0: 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
30b0: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
30c0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
30d0: 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
30e0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
30f0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
3100: 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  x;   /* The inde
3110: 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
3120: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
3130: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
3140: 2c 20 68 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , h;.  Token nul
3150: 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20  lId;    /* Fake 
3160: 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
3170: 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 0a 20  ty ID list */.. 
3180: 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
3190: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
31a0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
31b0: 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
31c0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
31d0: 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20    if( pTable!=0 
31e0: 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 73  ){.    pTab =  s
31f0: 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f  qliteTableFromTo
3200: 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ken(pParse, pTab
3210: 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
3220: 20 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65    pTab =  pParse
3230: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d  ->pNewTable;.  }
3240: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c  .  if( pTab==0 |
3250: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
3260: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
3270: 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70  e_index;.  if( p
3280: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  Tab->readOnly ){
3290: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
32a0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
32b0: 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c  rrMsg, "table ",
32c0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20   pTab->zName, . 
32d0: 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20 68       " may not h
32e0: 61 76 65 20 6e 65 77 20 69 6e 64 69 63 65 73 20  ave new indices 
32f0: 61 64 64 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  added", 0);.    
3300: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
3310: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
3320: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
3330: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
3340: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
3350: 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
3360: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
3370: 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
3380: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
3390: 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
33a0: 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
33b0: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
33c0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62  Name = sqliteTab
33d0: 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  leNameFromToken(
33e0: 70 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  pName);.  }else{
33f0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
3400: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
3410: 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 70 54 61 62  ing(&zName, pTab
3420: 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 70 72 69 6d  ->zName, "__prim
3430: 61 72 79 5f 6b 65 79 22 2c 20 30 29 3b 0a 20 20  ary_key", 0);.  
3440: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 46 69  }.  if( sqliteFi
3450: 6e 64 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ndIndex(pParse->
3460: 64 62 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  db, zName) ){.  
3470: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
3480: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3490: 73 67 2c 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e  sg, "index ", zN
34a0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 22 20 61  ame, .       " a
34b0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
34c0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
34d0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
34e0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
34f0: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  ex;.  }.  if( sq
3500: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50  liteFindTable(pP
3510: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  arse->db, zName)
3520: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
3530: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
3540: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 68 65 72 65  >zErrMsg, "there
3550: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
3560: 62 6c 65 20 6e 61 6d 65 64 20 22 2c 0a 20 20 20  ble named ",.   
3570: 20 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20      zName, 0);. 
3580: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3590: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  +;.    goto exit
35a0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
35b0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73   }..  /* If pLis
35c0: 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
35d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
35e0: 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
35f0: 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
3600: 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
3610: 74 20 66 69 65 6c 64 20 61 64 64 65 64 20 74 6f  t field added to
3620: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
3630: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20   construction.. 
3640: 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20   ** So create a 
3650: 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d  fake list to sim
3660: 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f  ulate this..  */
3670: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
3680: 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20  ){.    nullId.z 
3690: 3d 20 70 54 61 62 2d 3e 61 7a 43 6f 6c 5b 70 54  = pTab->azCol[pT
36a0: 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20  ab->nCol-1];.   
36b0: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
36c0: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
36d0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
36e0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  IdListAppend(0, 
36f0: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
3700: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
3710: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
3720: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
3730: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
3740: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
3750: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
3760: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
3770: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
3780: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
3790: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
37b0: 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d  zeof(int)*pList-
37c0: 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49  >nId );.  if( pI
37d0: 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ndex==0 ){.    s
37e0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
37f0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
3800: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
3810: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
3820: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
3830: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
3840: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  ndex;.  }.  pInd
3850: 65 78 2d 3e 61 69 46 69 65 6c 64 20 3d 20 28 69  ex->aiField = (i
3860: 6e 74 2a 29 26 70 49 6e 64 65 78 5b 31 5d 3b 0a  nt*)&pIndex[1];.
3870: 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
3880: 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  = (char*)&pIndex
3890: 2d 3e 61 69 46 69 65 6c 64 5b 70 4c 69 73 74 2d  ->aiField[pList-
38a0: 3e 6e 49 64 5d 3b 0a 20 20 73 74 72 63 70 79 28  >nId];.  strcpy(
38b0: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
38c0: 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Name);.  pIndex-
38d0: 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
38e0: 20 20 70 49 6e 64 65 78 2d 3e 6e 46 69 65 6c 64    pIndex->nField
38f0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 0a   = pList->nId;..
3900: 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61    /* Scan the na
3910: 6d 65 73 20 6f 66 20 74 68 65 20 66 69 65 6c 64  mes of the field
3920: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
3930: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
3940: 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 66  .  ** load the f
3950: 69 65 6c 64 20 69 6e 64 69 63 65 73 20 69 6e 74  ield indices int
3960: 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
3970: 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
3980: 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
3990: 61 6e 79 20 66 69 65 6c 64 20 69 73 20 6e 6f 74  any field is not
39a0: 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66   found..  */.  f
39b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
39c0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
39d0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
39e0: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
39f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
3a00: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
3a10: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 7a  .zName, pTab->az
3a20: 43 6f 6c 5b 6a 5d 29 3d 3d 30 20 29 20 62 72 65  Col[j])==0 ) bre
3a30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
3a40: 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( j>=pTab->nCol 
3a50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
3a60: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
3a70: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
3a80: 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  e ", pTab->zName
3a90: 2c 20 0a 20 20 20 20 20 20 20 20 22 20 68 61 73  , .        " has
3aa0: 20 6e 6f 20 66 69 65 6c 64 20 6e 61 6d 65 64 20   no field named 
3ab0: 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ", pList->a[i].z
3ac0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
3ad0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
3ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
3af0: 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  (pIndex);.      
3b00: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
3b10: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
3b20: 20 20 70 49 6e 64 65 78 2d 3e 61 69 46 69 65 6c    pIndex->aiFiel
3b30: 64 5b 69 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20  d[i] = j;.  }.. 
3b40: 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
3b50: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
3b60: 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
3b70: 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
3b80: 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
3b90: 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
3ba0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  s..  */.  if( pP
3bb0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30  arse->explain==0
3bc0: 20 29 7b 0a 20 20 20 20 68 20 3d 20 73 71 6c 69   ){.    h = sqli
3bd0: 74 65 48 61 73 68 4e 6f 43 61 73 65 28 70 49 6e  teHashNoCase(pIn
3be0: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 25  dex->zName, 0) %
3bf0: 20 4e 5f 48 41 53 48 3b 0a 20 20 20 20 70 49 6e   N_HASH;.    pIn
3c00: 64 65 78 2d 3e 70 48 61 73 68 20 3d 20 70 50 61  dex->pHash = pPa
3c10: 72 73 65 2d 3e 64 62 2d 3e 61 70 49 64 78 48 61  rse->db->apIdxHa
3c20: 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 72 73  sh[h];.    pPars
3c30: 65 2d 3e 64 62 2d 3e 61 70 49 64 78 48 61 73 68  e->db->apIdxHash
3c40: 5b 68 5d 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  [h] = pIndex;.  
3c50: 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
3c60: 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
3c70: 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
3c80: 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a   = pIndex;.  }..
3c90: 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69 74    /* If the init
3ca0: 46 6c 61 67 20 69 73 20 30 20 74 68 65 6e 20 63  Flag is 0 then c
3cb0: 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  reate the index 
3cc0: 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20  on disk.  This. 
3cd0: 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69   ** involves wri
3ce0: 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69  ting the index i
3cf0: 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74  nto the master t
3d00: 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67  able and filling
3d10: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
3d20: 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ex with the curr
3d30: 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e  ent table conten
3d40: 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ts..  **.  ** Th
3d50: 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30 20  e initFlag is 0 
3d60: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69  when the user fi
3d70: 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45  rst enters a CRE
3d80: 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20  ATE INDEX .  ** 
3d90: 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20 69 6e  command.  The in
3da0: 69 74 46 6c 61 67 20 69 73 20 31 20 77 68 65 6e  itFlag is 1 when
3db0: 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f   a database is o
3dc0: 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20  pened and .  ** 
3dd0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
3de0: 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64  tements are read
3df0: 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74   out of the mast
3e00: 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20  er table.  In.  
3e10: 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61  ** the latter ca
3e20: 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  se the index alr
3e30: 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64  eady exists on d
3e40: 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68  isk, which is wh
3e50: 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  y.  ** we don't 
3e60: 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65  want to recreate
3e70: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
3e80: 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67  pParse->initFlag
3e90: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
3ea0: 63 20 56 64 62 65 4f 70 20 61 64 64 54 61 62 6c  c VdbeOp addTabl
3eb0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  e[] = {.      { 
3ec0: 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  OP_Open,        
3ed0: 30 2c 20 30 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  0, 0, MASTER_NAM
3ee0: 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  E},.      { OP_N
3ef0: 65 77 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30  ew,         0, 0
3f00: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
3f10: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c  _String,      0,
3f20: 20 30 2c 20 22 69 6e 64 65 78 22 7d 2c 0a 20 20   0, "index"},.  
3f30: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
3f40: 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 20        0, 0, 0}, 
3f50: 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 3 */.      {
3f60: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20   OP_String,     
3f70: 20 30 2c 20 30 2c 20 30 7d 2c 20 20 2f 2a 20 34   0, 0, 0},  /* 4
3f80: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53   */.      { OP_S
3f90: 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20 30  tring,      0, 0
3fa0: 2c 20 30 7d 2c 20 20 2f 2a 20 35 20 2a 2f 0a 20  , 0},  /* 5 */. 
3fb0: 20 20 20 20 20 7b 20 4f 50 5f 4d 61 6b 65 52 65       { OP_MakeRe
3fc0: 63 6f 72 64 2c 20 20 34 2c 20 30 2c 20 30 7d 2c  cord,  4, 0, 0},
3fd0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 50 75 74 2c  .      { OP_Put,
3fe0: 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30           0, 0, 0
3ff0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c  },.      { OP_Cl
4000: 6f 73 65 2c 20 20 20 20 20 20 20 30 2c 20 30 2c  ose,       0, 0,
4010: 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
4020: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
4030: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4040: 62 65 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31  be;.    int lbl1
4050: 2c 20 6c 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20  , lbl2;.    int 
4060: 69 3b 0a 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  i;..    if( v==0
4070: 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 50   ){.      v = pP
4080: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
4090: 6c 69 74 65 56 64 62 65 43 72 65 61 74 65 28 70  liteVdbeCreate(p
40a0: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 42 65 29 3b  Parse->db->pBe);
40b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 76  .    }.    if( v
40c0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
40d0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
40e0: 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20    if( pStart && 
40f0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  pEnd ){.      in
4100: 74 20 62 61 73 65 3b 0a 20 20 20 20 20 20 6e 20  t base;.      n 
4110: 3d 20 28 69 6e 74 29 70 45 6e 64 2d 3e 7a 20 2d  = (int)pEnd->z -
4120: 20 28 69 6e 74 29 70 53 74 61 72 74 2d 3e 7a 20   (int)pStart->z 
4130: 2b 20 31 3b 0a 20 20 20 20 20 20 62 61 73 65 20  + 1;.      base 
4140: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
4150: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
4160: 7a 65 28 61 64 64 54 61 62 6c 65 29 2c 20 61 64  ze(addTable), ad
4170: 64 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 73  dTable);.      s
4180: 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50  qliteVdbeChangeP
4190: 33 28 76 2c 20 62 61 73 65 2b 33 2c 20 70 49 6e  3(v, base+3, pIn
41a0: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
41b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
41c0: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
41d0: 2b 34 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  +4, pTab->zName,
41e0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
41f0: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
4200: 20 62 61 73 65 2b 35 2c 20 70 53 74 61 72 74 2d   base+5, pStart-
4210: 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >z, n);.    }.  
4220: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4230: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 30 2c  p(v, OP_Open, 0,
4240: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
4250: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
4260: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
4270: 70 65 6e 2c 20 31 2c 20 30 2c 20 70 49 6e 64 65  pen, 1, 0, pInde
4280: 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
4290: 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56    lbl1 = sqliteV
42a0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
42b0: 0a 20 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69  .    lbl2 = sqli
42c0: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
42d0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  v);.    sqliteVd
42e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
42f0: 78 74 2c 20 30 2c 20 6c 62 6c 32 2c 20 30 2c 20  xt, 0, lbl2, 0, 
4300: 6c 62 6c 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  lbl1);.    sqlit
4310: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4320: 5f 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 30  _Key, 0, 0, 0, 0
4330: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
4340: 69 3c 70 49 6e 64 65 78 2d 3e 6e 46 69 65 6c 64  i<pIndex->nField
4350: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
4360: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4370: 20 4f 50 5f 46 69 65 6c 64 2c 20 30 2c 20 70 49   OP_Field, 0, pI
4380: 6e 64 65 78 2d 3e 61 69 46 69 65 6c 64 5b 69 5d  ndex->aiField[i]
4390: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
43a0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
43b0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79  Op(v, OP_MakeKey
43c0: 2c 20 70 49 6e 64 65 78 2d 3e 6e 46 69 65 6c 64  , pIndex->nField
43d0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
43e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
43f0: 76 2c 20 4f 50 5f 50 75 74 49 64 78 2c 20 31 2c  v, OP_PutIdx, 1,
4400: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
4410: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4420: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62  , OP_Goto, 0, lb
4430: 6c 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  l1, 0, 0);.    s
4440: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4450: 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c  , OP_Noop, 0, 0,
4460: 20 30 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 73   0, lbl2);.    s
4470: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4480: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
4490: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
44a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
44b0: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 2c 20  OP_Close, 1, 0, 
44c0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  0, 0);.  }..  /*
44d0: 20 52 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 20   Reclaim memory 
44e0: 6f 6e 20 61 6e 20 45 58 50 4c 41 49 4e 20 63 61  on an EXPLAIN ca
44f0: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ll..  */.  if( p
4500: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
4510: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
4520: 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20  (pIndex);.  }.. 
4530: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
4540: 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
4550: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
4560: 3a 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74  :.  sqliteIdList
4570: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
4580: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
4590: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
45a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
45b0: 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
45c0: 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
45d0: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
45e0: 71 6c 69 74 65 44 72 6f 70 49 6e 64 65 78 28 50  qliteDropIndex(P
45f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
4600: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49  ken *pName){.  I
4610: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
4620: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56  char *zName;.  V
4630: 64 62 65 20 2a 76 3b 0a 0a 20 20 7a 4e 61 6d 65  dbe *v;..  zName
4640: 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61   = sqliteTableNa
4650: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
4660: 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  e);.  pIndex = s
4670: 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 70  qliteFindIndex(p
4680: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
4690: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
46a0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 49  zName);.  if( pI
46b0: 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ndex==0 ){.    s
46c0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
46d0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
46e0: 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
46f0: 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  : ", 0, .       
4700: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
4710: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ->n, 0);.    pPa
4720: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
4730: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
4740: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
4750: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
4760: 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
4770: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
4780: 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
4790: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64  pVdbe = sqliteVd
47a0: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
47b0: 3e 64 62 2d 3e 70 42 65 29 3b 0a 20 20 69 66 28  >db->pBe);.  if(
47c0: 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63   v ){.    static
47d0: 20 56 64 62 65 4f 70 20 64 72 6f 70 49 6e 64 65   VdbeOp dropInde
47e0: 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  x[] = {.      { 
47f0: 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20 30  OP_Open,       0
4800: 2c 20 30 2c 20 20 20 20 20 20 20 4d 41 53 54 45  , 0,       MASTE
4810: 52 5f 4e 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b  R_NAME},.      {
4820: 20 4f 50 5f 4c 69 73 74 4f 70 65 6e 2c 20 20 20   OP_ListOpen,   
4830: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  0, 0,       0},.
4840: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
4850: 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  g,     0, 0,    
4860: 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20     0}, /* 2 */. 
4870: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
4880: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29        0, ADDR(9)
4890: 2c 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20  , 0}, /* 3 */.  
48a0: 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20 20 20      { OP_Dup,   
48b0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
48c0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
48d0: 46 69 65 6c 64 2c 20 20 20 20 20 20 30 2c 20 31  Field,      0, 1
48e0: 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
48f0: 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20    { OP_Ne,      
4900: 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 30     0, ADDR(3), 0
4910: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4b 65  },.      { OP_Ke
4920: 79 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20  y,        0, 0, 
4930: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
4940: 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
4950: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
4960: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 73 74  .      { OP_Dest
4970: 72 6f 79 2c 20 20 20 20 30 2c 20 30 2c 20 20 20  roy,    0, 0,   
4980: 20 20 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a      0}, /* 9 */.
4990: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65        { OP_Close
49a0: 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  ,      0, 0,    
49b0: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
49c0: 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20    int base;..   
49d0: 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64   base = sqliteVd
49e0: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
49f0: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e 64  rraySize(dropInd
4a00: 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b  ex), dropIndex);
4a10: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
4a20: 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b  hangeP3(v, base+
4a30: 32 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  2, pIndex->zName
4a40: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4a50: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
4a60: 62 61 73 65 2b 39 2c 20 70 49 6e 64 65 78 2d 3e  base+9, pIndex->
4a70: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
4a80: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
4a90: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
4aa0: 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d 65 6d  and free its mem
4ab0: 6f 72 79 2e 20 20 45 78 63 65 70 74 20 69 66 20  ory.  Except if 
4ac0: 74 68 65 0a 20 20 2a 2a 20 45 58 50 4c 41 49 4e  the.  ** EXPLAIN
4ad0: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
4ae0: 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20  ent, no changes 
4af0: 61 72 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20  are made..  */. 
4b00: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78   if( !pParse->ex
4b10: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 66 28  plain ){.    if(
4b20: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
4b30: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
4b40: 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
4b50: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
4b60: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
4b70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4b80: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
4b90: 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e    for(p=pIndex->
4ba0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
4bb0: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  p && p->pNext!=p
4bc0: 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78  Index; p=p->pNex
4bd0: 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70  t){}.      if( p
4be0: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
4bf0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
4c00: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  p->pNext = pInde
4c10: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
4c20: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
4c30: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 70 50  teDeleteIndex(pP
4c40: 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78  arse->db, pIndex
4c50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4c60: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
4c70: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
4c80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
4c90: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
4ca0: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
4cb0: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
4cc0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
4cd0: 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69   list..*/.ExprLi
4ce0: 73 74 20 2a 73 71 6c 69 74 65 45 78 70 72 4c 69  st *sqliteExprLi
4cf0: 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73  stAppend(ExprLis
4d00: 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a  t *pList, Expr *
4d10: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e  pExpr, Token *pN
4d20: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
4d30: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
4d40: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
4d50: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
4d60: 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20  f(ExprList) );. 
4d70: 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d   }.  if( pList==
4d80: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4d90: 69 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70  if( (pList->nExp
4da0: 72 20 26 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  r & 7)==0 ){.   
4db0: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e   int n = pList->
4dc0: 6e 45 78 70 72 20 2b 20 38 3b 0a 20 20 20 20 70  nExpr + 8;.    p
4dd0: 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65  List->a = sqlite
4de0: 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61  Realloc(pList->a
4df0: 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  , n*sizeof(pList
4e00: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
4e10: 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 7b  ( pList->a==0 ){
4e20: 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45  .      pList->nE
4e30: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  xpr = 0;.      r
4e40: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20  eturn pList;.   
4e50: 20 7d 0a 20 20 7d 0a 20 20 69 20 3d 20 70 4c 69   }.  }.  i = pLi
4e60: 73 74 2d 3e 6e 45 78 70 72 2b 2b 3b 0a 20 20 70  st->nExpr++;.  p
4e70: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
4e80: 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 4c 69 73   = pExpr;.  pLis
4e90: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
4ea0: 30 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  0;.  if( pName )
4eb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
4ec0: 53 74 72 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61  String(&pList->a
4ed0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [i].zName, pName
4ee0: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30  ->z, pName->n, 0
4ef0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71  );.    sqliteDeq
4f00: 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  uote(pList->a[i]
4f10: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72  .zName);.  }.  r
4f20: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
4f30: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
4f40: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
4f50: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  n list..*/.void 
4f60: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
4f70: 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70  lete(ExprList *p
4f80: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
4f90: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
4fa0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4fb0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
4fc0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  pr; i++){.    sq
4fd0: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
4fe0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
4ff0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
5000: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
5010: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
5020: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29  teFree(pList->a)
5030: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
5040: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
5050: 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
5060: 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
5070: 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
5080: 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
5090: 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2f  f.** need be..*/
50a0: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 49  .IdList *sqliteI
50b0: 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69  dListAppend(IdLi
50c0: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
50d0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
50e0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
50f0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
5100: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64  alloc( sizeof(Id
5110: 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
5120: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
5130: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
5140: 28 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37 29  (pList->nId & 7)
5150: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
5160: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  ->a = sqliteReal
5170: 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70  loc(pList->a, (p
5180: 4c 69 73 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a  List->nId+8)*siz
5190: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
51a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
51b0: 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t->a==0 ){.     
51c0: 20 70 4c 69 73 74 2d 3e 6e 49 64 20 3d 20 30 3b   pList->nId = 0;
51d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4c  .      return pL
51e0: 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ist;.    }.  }. 
51f0: 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e   memset(&pList->
5200: 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30  a[pList->nId], 0
5210: 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
5220: 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 54  a[0]));.  if( pT
5230: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  oken ){.    sqli
5240: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c  teSetNString(&pL
5250: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49  ist->a[pList->nI
5260: 64 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e  d].zName, pToken
5270: 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20  ->z, pToken->n, 
5280: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65  0);.    sqliteDe
5290: 71 75 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 70  quote(pList->a[p
52a0: 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65  List->nId].zName
52b0: 29 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  );.  }.  pList->
52c0: 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  nId++;.  return 
52d0: 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
52e0: 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20  Add an alias to 
52f0: 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66  the last identif
5300: 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ier on the given
5310: 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74   identifier list
5320: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5330: 49 64 4c 69 73 74 41 64 64 41 6c 69 61 73 28 49  IdListAddAlias(I
5340: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  dList *pList, To
5350: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
5360: 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
5370: 73 74 2d 3e 6e 49 64 3e 30 20 29 7b 0a 20 20 20  st->nId>0 ){.   
5380: 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e   int i = pList->
5390: 6e 49 64 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c  nId - 1;.    sql
53a0: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
53b0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
53c0: 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  s, pToken->z, pT
53d0: 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  oken->n, 0);.   
53e0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 70   sqliteDequote(p
53f0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
5400: 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  s);.  }.}../*.**
5410: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
5420: 65 20 49 64 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64  e IdList.*/.void
5430: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
5440: 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ete(IdList *pLis
5450: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
5460: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
5470: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
5480: 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
5490: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
54a0: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
54b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
54c0: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
54d0: 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a  i].zAlias);.  }.
54e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
54f0: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
5500: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
5510: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 4f 50 59 20  ./*.** The COPY 
5520: 63 6f 6d 6d 61 6e 64 20 69 73 20 66 6f 72 20 63  command is for c
5530: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
5540: 68 20 50 6f 73 74 67 72 65 53 51 4c 20 61 6e 64  h PostgreSQL and
5550: 20 73 70 65 63 69 66 69 63 69 61 6c 6c 79 0a 2a   specificially.*
5560: 2a 20 66 6f 72 20 74 68 65 20 61 62 69 6c 69 74  * for the abilit
5570: 79 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75  y to read the ou
5580: 74 70 75 74 20 6f 66 20 70 67 5f 64 75 6d 70 2e  tput of pg_dump.
5590: 20 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 20    The format is 
55a0: 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  as.** follows:.*
55b0: 2a 0a 2a 2a 20 20 20 20 43 4f 50 59 20 74 61 62  *.**    COPY tab
55c0: 6c 65 20 46 52 4f 4d 20 66 69 6c 65 20 5b 55 53  le FROM file [US
55d0: 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20 73  ING DELIMITERS s
55e0: 74 72 69 6e 67 5d 0a 2a 2a 0a 2a 2a 20 22 74 61  tring].**.** "ta
55f0: 62 6c 65 22 20 69 73 20 61 6e 20 65 78 69 73 74  ble" is an exist
5600: 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ing table name. 
5610: 20 57 65 20 77 69 6c 6c 20 72 65 61 64 20 6c 69   We will read li
5620: 6e 65 73 20 6f 66 20 63 6f 64 65 20 66 72 6f 6d  nes of code from
5630: 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 66 69 6c 6c  .** file to fill
5640: 20 74 68 69 73 20 74 61 62 6c 65 20 77 69 74 68   this table with
5650: 20 64 61 74 61 2e 20 20 46 69 6c 65 20 6d 69 67   data.  File mig
5660: 68 74 20 62 65 20 22 73 74 64 69 6e 22 2e 20 20  ht be "stdin".  
5670: 54 68 65 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20  The optional.** 
5680: 64 65 6c 69 6d 69 74 65 72 20 73 74 72 69 6e 67  delimiter string
5690: 20 69 64 65 6e 74 69 66 69 65 73 20 74 68 65 20   identifies the 
56a0: 66 69 65 6c 64 20 73 65 70 61 72 61 74 6f 72 73  field separators
56b0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
56c0: 73 20 61 20 74 61 62 2e 0a 2a 2f 0a 76 6f 69 64  s a tab..*/.void
56d0: 20 73 71 6c 69 74 65 43 6f 70 79 28 0a 20 20 50   sqliteCopy(.  P
56e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
56f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
5700: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
5710: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65  oken *pTableName
5720: 2c 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20  ,   /* The name 
5730: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  of the table int
5740: 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20  o which we will 
5750: 69 6e 73 65 72 74 20 2a 2f 0a 20 20 54 6f 6b 65  insert */.  Toke
5760: 6e 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20 20  n *pFilename,   
5770: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 66 72 6f   /* The file fro
5780: 6d 20 77 68 69 63 68 20 74 6f 20 6f 62 74 61 69  m which to obtai
5790: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  n information */
57a0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 65 6c 69 6d  .  Token *pDelim
57b0: 69 74 65 72 20 20 20 20 2f 2a 20 55 73 65 20 74  iter    /* Use t
57c0: 68 69 73 20 61 73 20 74 68 65 20 66 69 65 6c 64  his as the field
57d0: 20 64 65 6c 69 6d 69 74 65 72 20 2a 2f 0a 29 7b   delimiter */.){
57e0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
57f0: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 20    char *zTab;.  
5800: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 56 64 62 65  int i, j;.  Vdbe
5810: 20 2a 76 3b 0a 20 20 69 6e 74 20 61 64 64 72 2c   *v;.  int addr,
5820: 20 65 6e 64 3b 0a 20 20 49 6e 64 65 78 20 2a 70   end;.  Index *p
5830: 49 64 78 3b 0a 0a 20 20 7a 54 61 62 20 3d 20 73  Idx;..  zTab = s
5840: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
5850: 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e 61  omToken(pTableNa
5860: 6d 65 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  me);.  pTab = sq
5870: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50  liteFindTable(pP
5880: 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 29 3b  arse->db, zTab);
5890: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54  .  sqliteFree(zT
58a0: 61 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ab);.  if( pTab=
58b0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
58c0: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
58d0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
58e0: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c 20   such table: ", 
58f0: 30 2c 20 0a 20 20 20 20 20 20 20 20 70 54 61 62  0, .        pTab
5900: 6c 65 4e 61 6d 65 2d 3e 7a 2c 20 70 54 61 62 6c  leName->z, pTabl
5910: 65 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  eName->n, 0);.  
5920: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
5930: 3b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f  ;.    goto copy_
5940: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69  cleanup;.  }.  i
5950: 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
5960: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  y ){.    sqliteS
5970: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
5980: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c  ->zErrMsg, "tabl
5990: 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  e ", pTab->zName
59a0: 2c 0a 20 20 20 20 20 20 20 20 22 20 6d 61 79 20  ,.        " may 
59b0: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 22  not be modified"
59c0: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
59d0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
59e0: 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b  to copy_cleanup;
59f0: 0a 20 20 7d 0a 20 20 76 20 3d 20 70 50 61 72 73  .  }.  v = pPars
5a00: 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74  e->pVdbe = sqlit
5a10: 65 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  eVdbeCreate(pPar
5a20: 73 65 2d 3e 64 62 2d 3e 70 42 65 29 3b 0a 20 20  se->db->pBe);.  
5a30: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 61 64 64  if( v ){.    add
5a40: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
5a50: 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 4f 70  dOp(v, OP_FileOp
5a60: 65 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  en, 0, 0, 0, 0);
5a70: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
5a80: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
5a90: 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70   pFilename->z, p
5aa0: 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  Filename->n);.  
5ab0: 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75    sqliteVdbeDequ
5ac0: 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a  oteP3(v, addr);.
5ad0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5ae0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20  dOp(v, OP_Open, 
5af0: 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
5b00: 65 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69  e, 0);.    for(i
5b10: 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =1, pIdx=pTab->p
5b20: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
5b30: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69  x=pIdx->pNext, i
5b40: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
5b50: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5b60: 5f 4f 70 65 6e 2c 20 69 2c 20 30 2c 20 70 49 64  _Open, i, 0, pId
5b70: 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
5b80: 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20 73 71    }.    end = sq
5b90: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
5ba0: 6c 28 76 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  l(v);.    addr =
5bb0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5bc0: 28 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61 64 2c  (v, OP_FileRead,
5bd0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65 6e 64   pTab->nCol, end
5be0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
5bf0: 20 70 44 65 6c 69 6d 69 74 65 72 20 29 7b 0a 20   pDelimiter ){. 
5c00: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
5c10: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
5c20: 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a 2c 20   pDelimiter->z, 
5c30: 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29 3b 0a  pDelimiter->n);.
5c40: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5c50: 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64  DequoteP3(v, add
5c60: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
5c70: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
5c80: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
5c90: 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20 20 7d   "\t", 1);.    }
5ca0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
5cb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 2c 20  ddOp(v, OP_New, 
5cc0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
5cd0: 20 69 66 28 20 70 54 61 62 2d 3e 70 49 6e 64 65   if( pTab->pInde
5ce0: 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
5cf0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5d00: 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30  _Dup, 0, 0, 0, 0
5d10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
5d20: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
5d30: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
5d40: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5d50: 76 2c 20 4f 50 5f 46 69 6c 65 46 69 65 6c 64 2c  v, OP_FileField,
5d60: 20 69 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   i, 0, 0, 0);.  
5d70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
5d80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
5d90: 6b 65 52 65 63 6f 72 64 2c 20 70 54 61 62 2d 3e  keRecord, pTab->
5da0: 6e 43 6f 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  nCol, 0, 0, 0);.
5db0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5dc0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 2c 20 30  dOp(v, OP_Put, 0
5dd0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
5de0: 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54  for(i=1, pIdx=pT
5df0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
5e00: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
5e10: 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  xt, i++){.      
5e20: 69 66 28 20 70 49 64 78 2d 3e 70 4e 65 78 74 20  if( pIdx->pNext 
5e30: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5e40: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5e50: 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30  _Dup, 0, 0, 0, 0
5e60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5e70: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
5e80: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
5e90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
5ea0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69  beAddOp(v, OP_Fi
5eb0: 6c 65 46 69 65 6c 64 2c 20 70 49 64 78 2d 3e 61  leField, pIdx->a
5ec0: 69 46 69 65 6c 64 5b 6a 5d 2c 20 30 2c 20 30 2c  iField[j], 0, 0,
5ed0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
5ee0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5ef0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79  Op(v, OP_MakeKey
5f00: 2c 20 70 49 64 78 2d 3e 6e 46 69 65 6c 64 2c 20  , pIdx->nField, 
5f10: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
5f20: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5f30: 76 2c 20 4f 50 5f 50 75 74 49 64 78 2c 20 69 2c  v, OP_PutIdx, i,
5f40: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
5f50: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
5f60: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
5f70: 20 30 2c 20 61 64 64 72 2c 20 30 2c 20 30 29 3b   0, addr, 0, 0);
5f80: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
5f90: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c  ddOp(v, OP_Noop,
5fa0: 20 30 2c 20 30 2c 20 30 2c 20 65 6e 64 29 3b 0a   0, 0, 0, end);.
5fb0: 20 20 7d 0a 20 20 0a 63 6f 70 79 5f 63 6c 65 61    }.  .copy_clea
5fc0: 6e 75 70 3a 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  nup:.  return;.}
5fd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6e 2d  ../*.** The non-
5fe0: 73 74 61 6e 64 61 72 64 20 56 41 43 55 55 4d 20  standard VACUUM 
5ff0: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
6000: 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  to clean up the 
6010: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 63 6f 6c  database,.** col
6020: 6c 61 70 73 65 20 66 72 65 65 20 73 70 61 63 65  lapse free space
6030: 2c 20 65 74 63 2e 20 20 49 74 20 69 73 20 6d 6f  , etc.  It is mo
6040: 64 65 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  delled after the
6050: 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 0a   VACUUM command.
6060: 2a 2a 20 69 6e 20 50 6f 73 74 67 72 65 53 51 4c  ** in PostgreSQL
6070: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6080: 56 61 63 75 75 6d 28 50 61 72 73 65 20 2a 70 50  Vacuum(Parse *pP
6090: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 61  arse, Token *pTa
60a0: 62 6c 65 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72  bleName){.  char
60b0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65 20   *zName;.  Vdbe 
60c0: 2a 76 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c  *v;..  if( pTabl
60d0: 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  eName ){.    zNa
60e0: 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65  me = sqliteTable
60f0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
6100: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  ableName);.  }el
6110: 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  se{.    zName = 
6120: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61  0;.  }.  if( zNa
6130: 6d 65 20 26 26 20 73 71 6c 69 74 65 46 69 6e 64  me && sqliteFind
6140: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
6150: 2c 20 7a 4e 61 6d 65 29 3d 3d 30 0a 20 20 20 20  , zName)==0.    
6160: 26 26 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62  && sqliteFindTab
6170: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
6180: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
6190: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
61a0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
61b0: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
61c0: 20 6f 72 20 69 6e 64 65 78 3a 20 22 2c 20 7a 4e   or index: ", zN
61d0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ame, 0);.    pPa
61e0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
61f0: 20 67 6f 74 6f 20 76 61 63 75 75 6d 5f 63 6c 65   goto vacuum_cle
6200: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  anup;.  }.  v = 
6210: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
6220: 73 71 6c 69 74 65 56 64 62 65 43 72 65 61 74 65  sqliteVdbeCreate
6230: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 42 65  (pParse->db->pBe
6240: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
6250: 67 6f 74 6f 20 76 61 63 75 75 6d 5f 63 6c 65 61  goto vacuum_clea
6260: 6e 75 70 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  nup;.  if( zName
6270: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
6280: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
6290: 6f 72 67 61 6e 69 7a 65 2c 20 30 2c 20 30 2c 20  organize, 0, 0, 
62a0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 65 6c  zName, 0);.  }el
62b0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20  se{.    int h;. 
62c0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
62d0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
62e0: 0a 20 20 20 20 66 6f 72 28 68 3d 30 3b 20 68 3c  .    for(h=0; h<
62f0: 4e 5f 48 41 53 48 3b 20 68 2b 2b 29 7b 0a 20 20  N_HASH; h++){.  
6300: 20 20 20 20 66 6f 72 28 70 54 61 62 3d 70 50 61      for(pTab=pPa
6310: 72 73 65 2d 3e 64 62 2d 3e 61 70 54 62 6c 48 61  rse->db->apTblHa
6320: 73 68 5b 68 5d 3b 20 70 54 61 62 3b 20 70 54 61  sh[h]; pTab; pTa
6330: 62 3d 70 54 61 62 2d 3e 70 48 61 73 68 29 7b 0a  b=pTab->pHash){.
6340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
6350: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
6360: 6f 72 67 61 6e 69 7a 65 2c 20 30 2c 20 30 2c 20  organize, 0, 0, 
6370: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
6380: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
6390: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
63a0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
63b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
63c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
63d0: 4f 70 28 76 2c 20 4f 50 5f 52 65 6f 72 67 61 6e  Op(v, OP_Reorgan
63e0: 69 7a 65 2c 20 30 2c 20 30 2c 20 70 49 64 78 2d  ize, 0, 0, pIdx-
63f0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
6400: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6410: 20 20 7d 0a 20 20 7d 0a 0a 76 61 63 75 75 6d 5f    }.  }..vacuum_
6420: 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
6430: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
6440: 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.