/ Hex Artifact Content
Login

Artifact 5839600c9fced909e9d336203b758aeaa541b3b1:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 31 39 39 39 2c 20 32 30 30 30 20 44  (c) 1999, 2000 D
0020: 2e 20 52 69 63 68 61 72 64 20 48 69 70 70 0a 2a  . Richard Hipp.*
0030: 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61  *.** This progra
0040: 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61  m is free softwa
0050: 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69  re; you can redi
0060: 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f  stribute it and/
0070: 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20  or.** modify it 
0080: 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20  under the terms 
0090: 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72  of the GNU Gener
00a0: 61 6c 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63  al Public.** Lic
00b0: 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 65  ense as publishe
00c0: 64 20 62 79 20 74 68 65 20 46 72 65 65 20 53 6f  d by the Free So
00d0: 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f  ftware Foundatio
00e0: 6e 3b 20 65 69 74 68 65 72 0a 2a 2a 20 76 65 72  n; either.** ver
00f0: 73 69 6f 6e 20 32 20 6f 66 20 74 68 65 20 4c 69  sion 2 of the Li
0100: 63 65 6e 73 65 2c 20 6f 72 20 28 61 74 20 79 6f  cense, or (at yo
0110: 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c  ur option) any l
0120: 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 2a 2a  ater version..**
0130: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0140: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
0150: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
0160: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
0170: 75 6c 2c 0a 2a 2a 20 62 75 74 20 57 49 54 48 4f  ul,.** but WITHO
0180: 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b  UT ANY WARRANTY;
0190: 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68   without even th
01a0: 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e  e implied warran
01b0: 74 79 20 6f 66 0a 2a 2a 20 4d 45 52 43 48 41 4e  ty of.** MERCHAN
01c0: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
01d0: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
01e0: 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53  ULAR PURPOSE.  S
01f0: 65 65 20 74 68 65 20 47 4e 55 0a 2a 2a 20 47 65  ee the GNU.** Ge
0200: 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63  neral Public Lic
0210: 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65  ense for more de
0220: 74 61 69 6c 73 2e 0a 2a 2a 20 0a 2a 2a 20 59 6f  tails..** .** Yo
0230: 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65  u should have re
0240: 63 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66  ceived a copy of
0250: 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c   the GNU General
0260: 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e   Public.** Licen
0270: 73 65 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  se along with th
0280: 69 73 20 6c 69 62 72 61 72 79 3b 20 69 66 20 6e  is library; if n
0290: 6f 74 2c 20 77 72 69 74 65 20 74 6f 20 74 68 65  ot, write to the
02a0: 0a 2a 2a 20 46 72 65 65 20 53 6f 66 74 77 61 72  .** Free Softwar
02b0: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e  e Foundation, In
02c0: 63 2e 2c 20 35 39 20 54 65 6d 70 6c 65 20 50 6c  c., 59 Temple Pl
02d0: 61 63 65 20 2d 20 53 75 69 74 65 20 33 33 30 2c  ace - Suite 330,
02e0: 0a 2a 2a 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 20  .** Boston, MA  
02f0: 30 32 31 31 31 2d 31 33 30 37 2c 20 55 53 41 2e  02111-1307, USA.
0300: 0a 2a 2a 0a 2a 2a 20 41 75 74 68 6f 72 20 63 6f  .**.** Author co
0310: 6e 74 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntact informatio
0320: 6e 3a 0a 2a 2a 20 20 20 64 72 68 40 68 77 61 63  n:.**   drh@hwac
0330: 69 2e 63 6f 6d 0a 2a 2a 20 20 20 68 74 74 70 3a  i.com.**   http:
0340: 2f 2f 77 77 77 2e 68 77 61 63 69 2e 63 6f 6d 2f  //www.hwaci.com/
0350: 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  drh/.**.********
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
03b0: 6f 6e 74 61 69 6e 73 20 43 20 63 6f 64 65 20 72  ontains C code r
03c0: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 61 72 65  outines that are
03d0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
03e0: 61 72 73 65 72 0a 2a 2a 20 77 68 65 6e 20 73 79  arser.** when sy
03f0: 6e 74 61 78 20 72 75 6c 65 73 20 61 72 65 20 72  ntax rules are r
0400: 65 64 75 63 65 64 2e 20 20 54 68 65 20 72 6f 75  educed.  The rou
0410: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
0420: 6c 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 74 68 65  le handle.** the
0430: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6b 69 6e 64 73   following kinds
0440: 20 6f 66 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a   of syntax:.**.*
0450: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0460: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0470: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0480: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0490: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
04a0: 20 20 63 72 65 61 74 69 6e 67 20 65 78 70 72 65    creating expre
04b0: 73 73 69 6f 6e 73 20 61 6e 64 20 49 44 20 6c 69  ssions and ID li
04c0: 73 74 73 0a 2a 2a 20 20 20 20 20 43 4f 50 59 0a  sts.**     COPY.
04d0: 2a 2a 20 20 20 20 20 56 41 43 55 55 4d 0a 2a 2a  **     VACUUM.**
04e0: 0a 2a 2a 20 24 49 64 3a 20 62 75 69 6c 64 2e 63  .** $Id: build.c
04f0: 2c 76 20 31 2e 33 31 20 32 30 30 31 2f 30 39 2f  ,v 1.31 2001/09/
0500: 31 33 20 31 36 3a 31 38 3a 35 34 20 64 72 68 20  13 16:18:54 drh 
0510: 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64  Exp $.*/.#includ
0520: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0530: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0540: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0550: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0560: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0570: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0580: 64 20 77 65 20 77 61 6e 74 20 74 6f 20 65 78 65  d we want to exe
0590: 63 75 74 65 20 74 68 65 20 56 44 42 45 20 63 6f  cute the VDBE co
05a0: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
05b0: 0a 2a 2a 20 74 68 61 74 20 73 74 61 74 65 6d 65  .** that stateme
05c0: 6e 74 2e 20 20 50 72 69 6f 72 20 61 63 74 69 6f  nt.  Prior actio
05d0: 6e 20 72 6f 75 74 69 6e 65 73 20 73 68 6f 75 6c  n routines shoul
05e0: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  d have already.*
05f0: 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20 56 44  * constructed VD
0600: 42 45 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  BE code to do th
0610: 65 20 77 6f 72 6b 20 6f 66 20 74 68 65 20 53 51  e work of the SQ
0620: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
0630: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0640: 74 20 68 61 73 20 74 6f 20 65 78 65 63 75 74 65  t has to execute
0650: 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 2e 0a   the VDBE code..
0660: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0670: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0680: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0690: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
06a0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
06b0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
06c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 65  /.void sqliteExe
06d0: 63 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  c(Parse *pParse)
06e0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
06f0: 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
0700: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
0710: 62 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f  b;.  if( sqlite_
0720: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
0730: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0740: 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
0750: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65     if( pParse->e
0760: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20  xplain ){.      
0770: 72 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4c  rc = sqliteVdbeL
0780: 69 73 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ist(pParse->pVdb
0790: 65 2c 20 70 50 61 72 73 65 2d 3e 78 43 61 6c 6c  e, pParse->xCall
07a0: 62 61 63 6b 2c 20 70 50 61 72 73 65 2d 3e 70 41  back, pParse->pA
07b0: 72 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rg, .           
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
07d0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29  pParse->zErrMsg)
07e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
07f0: 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d     FILE *trace =
0800: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
0810: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 21  LITE_VdbeTrace)!
0820: 3d 30 20 3f 20 73 74 64 65 72 72 20 3a 20 30 3b  =0 ? stderr : 0;
0830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
0840: 65 54 72 61 63 65 28 70 50 61 72 73 65 2d 3e 70  eTrace(pParse->p
0850: 56 64 62 65 2c 20 74 72 61 63 65 29 3b 0a 20 20  Vdbe, trace);.  
0860: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 56      rc = sqliteV
0870: 64 62 65 45 78 65 63 28 70 50 61 72 73 65 2d 3e  dbeExec(pParse->
0880: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 78  pVdbe, pParse->x
0890: 43 61 6c 6c 62 61 63 6b 2c 20 70 50 61 72 73 65  Callback, pParse
08a0: 2d 3e 70 41 72 67 2c 20 0a 20 20 20 20 20 20 20  ->pArg, .       
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72     &pParse->zErr
08d0: 4d 73 67 2c 20 64 62 2d 3e 70 42 75 73 79 41 72  Msg, db->pBusyAr
08e0: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
0900: 3e 78 42 75 73 79 43 61 6c 6c 62 61 63 6b 29 3b  >xBusyCallback);
0910: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
0920: 65 56 64 62 65 44 65 6c 65 74 65 28 70 50 61 72  eVdbeDelete(pPar
0930: 73 65 2d 3e 70 56 64 62 65 29 3b 0a 20 20 20 20  se->pVdbe);.    
0940: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
0950: 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63  0;.    pParse->c
0960: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a  olNamesSet = 0;.
0970: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
0980: 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   rc;.  }.}../*.*
0990: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
09a0: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  w expression nod
09b0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  e and return a p
09c0: 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 0a 2a 2f  ointer to it..*/
09d0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 45 78 70  .Expr *sqliteExp
09e0: 72 28 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a  r(int op, Expr *
09f0: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
0a00: 67 68 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ght, Token *pTok
0a10: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
0a20: 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  w;.  pNew = sqli
0a30: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
0a40: 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20  (Expr) );.  if( 
0a50: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
0a60: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d   0;.  pNew->op =
0a70: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
0a80: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
0a90: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
0aa0: 67 68 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  ght;.  if( pToke
0ab0: 6e 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  n ){.    pNew->t
0ac0: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
0ad0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
0ae0: 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 22 22 3b  w->token.z = "";
0af0: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
0b00: 2e 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  .n = 0;.  }.  if
0b10: 28 20 70 4c 65 66 74 20 26 26 20 70 52 69 67 68  ( pLeft && pRigh
0b20: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45  t ){.    sqliteE
0b30: 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26 70  xprSpan(pNew, &p
0b40: 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52 69  Left->span, &pRi
0b50: 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 7d 65  ght->span);.  }e
0b60: 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  lse{.    pNew->s
0b70: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
0b80: 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
0b90: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pNew;.}../*.** S
0ba0: 65 74 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  et the Expr.toke
0bb0: 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67  n field of the g
0bc0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
0bd0: 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74  to span all.** t
0be0: 65 78 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ext between the 
0bf0: 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73  two given tokens
0c00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0c10: 45 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70  ExprSpan(Expr *p
0c20: 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65  Expr, Token *pLe
0c30: 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68  ft, Token *pRigh
0c40: 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20  t){.  if( pExpr 
0c50: 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 73 70  ){.    pExpr->sp
0c60: 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b  an.z = pLeft->z;
0c70: 0a 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e  .    pExpr->span
0c80: 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b  .n = pRight->n +
0c90: 20 28 69 6e 74 29 70 52 69 67 68 74 2d 3e 7a 20   (int)pRight->z 
0ca0: 2d 20 28 69 6e 74 29 70 4c 65 66 74 2d 3e 7a 3b  - (int)pLeft->z;
0cb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
0cc0: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
0cd0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
0ce0: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  r a function wit
0cf0: 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72  h multiple.** ar
0d00: 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72  guments..*/.Expr
0d10: 20 2a 73 71 6c 69 74 65 45 78 70 72 46 75 6e 63   *sqliteExprFunc
0d20: 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a 70  tion(ExprList *p
0d30: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
0d40: 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  ken){.  Expr *pN
0d50: 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  ew;.  pNew = sql
0d60: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
0d70: 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28  f(Expr) );.  if(
0d80: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
0d90: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  n 0;.  pNew->op 
0da0: 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20  = TK_FUNCTION;. 
0db0: 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70   pNew->pList = p
0dc0: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b  List;.  if( pTok
0dd0: 65 6e 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  en ){.    pNew->
0de0: 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  token = *pToken;
0df0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
0e00: 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 22 22  ew->token.z = ""
0e10: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  ;.    pNew->toke
0e20: 6e 2e 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  n.n = 0;.  }.  r
0e30: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
0e40: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
0e50: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
0e60: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76  ssion tree..*/.v
0e70: 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72 44 65  oid sqliteExprDe
0e80: 6c 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  lete(Expr *p){. 
0e90: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0ea0: 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65  rn;.  if( p->pLe
0eb0: 66 74 20 29 20 73 71 6c 69 74 65 45 78 70 72 44  ft ) sqliteExprD
0ec0: 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b  elete(p->pLeft);
0ed0: 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74  .  if( p->pRight
0ee0: 20 29 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c   ) sqliteExprDel
0ef0: 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  ete(p->pRight);.
0f00: 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29    if( p->pList )
0f10: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
0f20: 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b  elete(p->pList);
0f30: 0a 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63  .  if( p->pSelec
0f40: 74 20 29 20 73 71 6c 69 74 65 53 65 6c 65 63 74  t ) sqliteSelect
0f50: 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63  Delete(p->pSelec
0f60: 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
0f70: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  (p);.}../*.** Lo
0f80: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
0f90: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
0fa0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 0a  t describes the.
0fb0: 2a 2a 20 66 6f 72 6d 61 74 20 6f 66 20 61 20 70  ** format of a p
0fc0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0fd0: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0fe0: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0ff0: 61 74 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  at table.  Retur
1000: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
1010: 75 6e 64 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  und..*/.Table *s
1020: 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 73  qliteFindTable(s
1030: 71 6c 69 74 65 20 2a 64 62 2c 20 63 68 61 72 20  qlite *db, char 
1040: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  *zName){.  Table
1050: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20   *pTable;.  int 
1060: 68 3b 0a 0a 20 20 68 20 3d 20 73 71 6c 69 74 65  h;..  h = sqlite
1070: 48 61 73 68 4e 6f 43 61 73 65 28 7a 4e 61 6d 65  HashNoCase(zName
1080: 2c 20 30 29 20 25 20 4e 5f 48 41 53 48 3b 0a 20  , 0) % N_HASH;. 
1090: 20 66 6f 72 28 70 54 61 62 6c 65 3d 64 62 2d 3e   for(pTable=db->
10a0: 61 70 54 62 6c 48 61 73 68 5b 68 5d 3b 20 70 54  apTblHash[h]; pT
10b0: 61 62 6c 65 3b 20 70 54 61 62 6c 65 3d 70 54 61  able; pTable=pTa
10c0: 62 6c 65 2d 3e 70 48 61 73 68 29 7b 0a 20 20 20  ble->pHash){.   
10d0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
10e0: 6d 70 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  mp(pTable->zName
10f0: 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  , zName)==0 ) re
1100: 74 75 72 6e 20 70 54 61 62 6c 65 3b 0a 20 20 7d  turn pTable;.  }
1110: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1120: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
1130: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
1140: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
1150: 62 65 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61  bes the.** forma
1160: 74 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61  t of a particula
1170: 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68  r index given th
1180: 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68 61  e name.** of tha
1190: 74 20 69 6e 64 65 78 2e 20 20 52 65 74 75 72 6e  t index.  Return
11a0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
11b0: 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  nd..*/.Index *sq
11c0: 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 73 71  liteFindIndex(sq
11d0: 6c 69 74 65 20 2a 64 62 2c 20 63 68 61 72 20 2a  lite *db, char *
11e0: 7a 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  zName){.  Index 
11f0: 2a 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20  *p;.  int h;..  
1200: 68 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 6f  h = sqliteHashNo
1210: 43 61 73 65 28 7a 4e 61 6d 65 2c 20 30 29 20 25  Case(zName, 0) %
1220: 20 4e 5f 48 41 53 48 3b 0a 20 20 66 6f 72 28 70   N_HASH;.  for(p
1230: 3d 64 62 2d 3e 61 70 49 64 78 48 61 73 68 5b 68  =db->apIdxHash[h
1240: 5d 3b 20 70 3b 20 70 3d 70 2d 3e 70 48 61 73 68  ]; p; p=p->pHash
1250: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1260: 65 53 74 72 49 43 6d 70 28 70 2d 3e 7a 4e 61 6d  eStrICmp(p->zNam
1270: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
1280: 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 72  eturn p;.  }.  r
1290: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
12a0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76  * Remove the giv
12b0: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  en index from th
12c0: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
12d0: 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20  le, and free.** 
12e0: 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  its memory struc
12f0: 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tures..**.** The
1300: 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65   index is remove
1310: 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1320: 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 20 69  ase hash table i
1330: 66 20 64 62 21 3d 4e 55 4c 4c 2e 0a 2a 2a 20 42  f db!=NULL..** B
1340: 75 74 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c  ut it is not unl
1350: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54  inked from the T
1360: 61 62 6c 65 20 74 68 61 74 20 69 73 20 62 65 69  able that is bei
1370: 6e 67 20 69 6e 64 65 78 65 64 2e 20 20 0a 2a 2a  ng indexed.  .**
1380: 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20   Unlinking from 
1390: 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62  the Table must b
13a0: 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61  e done by the ca
13b0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
13c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
13d0: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
13e0: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64  (sqlite *db, Ind
13f0: 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
1400: 6e 74 20 68 3b 0a 20 20 69 66 28 20 70 49 6e 64  nt h;.  if( pInd
1410: 65 78 2d 3e 7a 4e 61 6d 65 20 26 26 20 64 62 20  ex->zName && db 
1420: 29 7b 0a 20 20 20 20 68 20 3d 20 73 71 6c 69 74  ){.    h = sqlit
1430: 65 48 61 73 68 4e 6f 43 61 73 65 28 70 49 6e 64  eHashNoCase(pInd
1440: 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 25 20  ex->zName, 0) % 
1450: 4e 5f 48 41 53 48 3b 0a 20 20 20 20 69 66 28 20  N_HASH;.    if( 
1460: 64 62 2d 3e 61 70 49 64 78 48 61 73 68 5b 68 5d  db->apIdxHash[h]
1470: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
1480: 20 20 64 62 2d 3e 61 70 49 64 78 48 61 73 68 5b    db->apIdxHash[
1490: 68 5d 20 3d 20 70 49 6e 64 65 78 2d 3e 70 48 61  h] = pIndex->pHa
14a0: 73 68 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sh;.    }else{. 
14b0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
14c0: 20 20 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61       for(p=db->a
14d0: 70 49 64 78 48 61 73 68 5b 68 5d 3b 20 70 20 26  pIdxHash[h]; p &
14e0: 26 20 70 2d 3e 70 48 61 73 68 21 3d 70 49 6e 64  & p->pHash!=pInd
14f0: 65 78 3b 20 70 3d 70 2d 3e 70 48 61 73 68 29 7b  ex; p=p->pHash){
1500: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26  }.      if( p &&
1510: 20 70 2d 3e 70 48 61 73 68 3d 3d 70 49 6e 64 65   p->pHash==pInde
1520: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  x ){.        p->
1530: 70 48 61 73 68 20 3d 20 70 49 6e 64 65 78 2d 3e  pHash = pIndex->
1540: 70 48 61 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20  pHash;.      }. 
1550: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1560: 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 7d  eFree(pIndex);.}
1570: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
1580: 68 65 20 67 69 76 65 6e 20 20 69 6e 64 65 78 20  he given  index 
1590: 66 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20  from its table, 
15a0: 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74  then remove.** t
15b0: 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  he index from th
15c0: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
15d0: 6c 65 2c 20 61 6e 64 20 66 72 65 65 20 69 74 73  le, and free its
15e0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63   memory.** struc
15f0: 74 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tures..*/.static
1600: 20 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69   void sqliteUnli
1610: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
1620: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64  (sqlite *db, Ind
1630: 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
1640: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
1650: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
1660: 78 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  x ){.    pIndex-
1670: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
1680: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
1690: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
16a0: 64 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  dex *p;.    for(
16b0: 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  p=pIndex->pTable
16c0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70  ->pIndex; p && p
16d0: 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b  ->pNext!=pIndex;
16e0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20   p=p->pNext){}. 
16f0: 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70     if( p && p->p
1700: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  Next==pIndex ){.
1710: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
1720: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
1730: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1740: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
1750: 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  , pIndex);.}../*
1760: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d  .** Remove the m
1770: 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63  emory data struc
1780: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
1790: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a   with the given.
17a0: 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68  ** Table.  No ch
17b0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
17c0: 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72  o disk by this r
17d0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
17e0: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
17f0: 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61  deletes the data
1800: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
1810: 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a  does not unlink.
1820: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74  ** the table dat
1830: 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  a structure from
1840: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
1850: 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65    But it does de
1860: 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20  stroy.** memory 
1870: 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68  structures of th
1880: 65 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  e indices associ
1890: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
18a0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63  ble..**.** Indic
18b0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
18c0: 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  th the table are
18d0: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
18e0: 68 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20  he "db".** data 
18f0: 73 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21  structure if db!
1900: 3d 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e  =NULL.  If db==N
1910: 55 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74  ULL, indices att
1920: 61 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  ached to.** the 
1930: 74 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65  table are delete
1940: 64 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73  d, but it is ass
1950: 75 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61  umed they have a
1960: 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75  lready been.** u
1970: 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64  nlinked..*/.void
1980: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
1990: 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54  le(sqlite *db, T
19a0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
19b0: 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20   int i;.  Index 
19c0: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
19d0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
19e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
19f0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
1a00: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1a10: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
1a20: 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  e->aCol[i].zName
1a30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
1a40: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
1a50: 5d 2e 7a 44 66 6c 74 29 3b 0a 20 20 7d 0a 20 20  ].zDflt);.  }.  
1a60: 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61  for(pIndex = pTa
1a70: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  ble->pIndex; pIn
1a80: 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78  dex; pIndex=pNex
1a90: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
1aa0: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
1ab0: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49     sqliteDeleteI
1ac0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1ad0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
1ae0: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ee(pTable->zName
1af0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
1b00: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
1b10: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
1b20: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  le);.}../*.** Ch
1b30: 65 63 6b 20 61 6c 6c 20 54 61 62 6c 65 73 20 61  eck all Tables a
1b40: 6e 64 20 49 6e 64 65 78 65 73 20 69 6e 20 74 68  nd Indexes in th
1b50: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
1b60: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6d 6d 69 74  table and commit
1b70: 0a 2a 2a 20 61 6e 79 20 61 64 64 69 74 69 6f 6e  .** any addition
1b80: 73 20 6f 72 20 64 65 6c 65 74 69 6f 6e 73 20 74  s or deletions t
1b90: 6f 20 74 68 6f 73 65 20 68 61 73 68 20 74 61 62  o those hash tab
1ba0: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  les..**.** When 
1bb0: 65 78 65 63 75 74 69 6e 67 20 43 52 45 41 54 45  executing CREATE
1bc0: 20 54 41 42 4c 45 20 61 6e 64 20 43 52 45 41 54   TABLE and CREAT
1bd0: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
1be0: 74 73 2c 20 74 68 65 20 54 61 62 6c 65 0a 2a 2a  ts, the Table.**
1bf0: 20 61 6e 64 20 49 6e 64 65 78 20 73 74 72 75 63   and Index struc
1c00: 74 75 72 65 73 20 61 72 65 20 63 72 65 61 74 65  tures are create
1c10: 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  d and added to t
1c20: 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20  he hash tables, 
1c30: 62 75 74 0a 2a 2a 20 74 68 65 20 22 69 73 43 6f  but.** the "isCo
1c40: 6d 6d 69 74 22 20 66 69 65 6c 64 20 69 73 20 6e  mmit" field is n
1c50: 6f 74 20 73 65 74 2e 20 20 54 68 69 73 20 72 6f  ot set.  This ro
1c60: 75 74 69 6e 65 20 73 65 74 73 20 74 68 6f 73 65  utine sets those
1c70: 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 57 68 65 6e   fields..** When
1c80: 20 65 78 65 63 75 74 69 6e 67 20 44 52 4f 50 20   executing DROP 
1c90: 54 41 42 4c 45 20 61 6e 64 20 44 52 4f 50 20 49  TABLE and DROP I
1ca0: 4e 44 45 58 2c 20 74 68 65 20 22 69 73 44 65 6c  NDEX, the "isDel
1cb0: 65 74 65 22 20 66 69 65 6c 64 73 20 6f 66 0a 2a  ete" fields of.*
1cc0: 2a 20 54 61 62 6c 65 20 61 6e 64 20 49 6e 64 65  * Table and Inde
1cd0: 78 20 73 74 72 75 63 74 75 72 65 73 20 69 73 20  x structures is 
1ce0: 73 65 74 20 62 75 74 20 74 68 65 20 73 74 72 75  set but the stru
1cf0: 63 74 75 72 65 73 20 61 72 65 20 6e 6f 74 20 75  ctures are not u
1d00: 6e 6c 69 6e 6b 65 64 0a 2a 2a 20 66 72 6f 6d 20  nlinked.** from 
1d10: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  the hash tables 
1d20: 6e 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  nor deallocated.
1d30: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68    This routine h
1d40: 61 6e 64 6c 65 73 20 74 68 61 74 0a 2a 2a 20 64  andles that.** d
1d50: 65 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a  eallocation. .**
1d60: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
1d70: 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65  liteRollbackInte
1d80: 72 6e 61 6c 43 68 61 6e 67 65 73 28 29 0a 2a 2f  rnalChanges().*/
1d90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d  .void sqliteComm
1da0: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
1db0: 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  s(sqlite *db){. 
1dc0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 64   int i;.  if( (d
1dd0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1de0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
1df0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1e00: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 48 41 53  for(i=0; i<N_HAS
1e10: 48 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62  H; i++){.    Tab
1e20: 6c 65 20 2a 70 54 61 62 6c 65 2c 20 2a 70 4e 65  le *pTable, *pNe
1e30: 78 74 3b 0a 20 20 20 20 66 6f 72 28 70 54 61 62  xt;.    for(pTab
1e40: 6c 65 20 3d 20 64 62 2d 3e 61 70 54 62 6c 48 61  le = db->apTblHa
1e50: 73 68 5b 69 5d 3b 20 70 54 61 62 6c 65 3b 20 70  sh[i]; pTable; p
1e60: 54 61 62 6c 65 3d 70 4e 65 78 74 29 7b 0a 20 20  Table=pNext){.  
1e70: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 54 61 62      pNext = pTab
1e80: 6c 65 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20  le->pHash;.     
1e90: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 69 73 44   if( pTable->isD
1ea0: 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
1eb0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
1ec0: 6c 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  le(db, pTable);.
1ed0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1ee0: 70 54 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74  pTable->isCommit
1ef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1f00: 54 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74 20  Table->isCommit 
1f10: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1f20: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30   }.  }.  for(i=0
1f30: 3b 20 69 3c 4e 5f 48 41 53 48 3b 20 69 2b 2b 29  ; i<N_HASH; i++)
1f40: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e  {.    Index *pIn
1f50: 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  dex, *pNext;.   
1f60: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 64 62   for(pIndex = db
1f70: 2d 3e 61 70 49 64 78 48 61 73 68 5b 69 5d 3b 20  ->apIdxHash[i]; 
1f80: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
1f90: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65  Next){.      pNe
1fa0: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 48 61  xt = pIndex->pHa
1fb0: 73 68 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  sh;.      if( pI
1fc0: 6e 64 65 78 2d 3e 69 73 44 65 6c 65 74 65 20 29  ndex->isDelete )
1fd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1fe0: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49  UnlinkAndDeleteI
1ff0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
2000: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2010: 28 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 6d 6d  ( pIndex->isComm
2020: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
2030: 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 6d 6d 69   pIndex->isCommi
2040: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
2050: 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66     }.  }.  db->f
2060: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
2070: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
2080: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2090: 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e 20 6f  tine runs when o
20a0: 6e 65 20 6f 72 20 6d 6f 72 65 20 43 52 45 41 54  ne or more CREAT
20b0: 45 20 54 41 42 4c 45 2c 20 43 52 45 41 54 45 20  E TABLE, CREATE 
20c0: 49 4e 44 45 58 2c 0a 2a 2a 20 44 52 4f 50 20 54  INDEX,.** DROP T
20d0: 41 42 4c 45 2c 20 6f 72 20 44 52 4f 50 20 49 4e  ABLE, or DROP IN
20e0: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 67  DEX statements g
20f0: 65 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  et rolled back. 
2100: 20 54 68 65 0a 2a 2a 20 61 64 64 69 74 69 6f 6e   The.** addition
2110: 73 20 6f 72 20 64 65 6c 65 74 69 6f 6e 73 20 6f  s or deletions o
2120: 66 20 54 61 62 6c 65 20 61 6e 64 20 49 6e 64 65  f Table and Inde
2130: 78 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20  x structures in 
2140: 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20  the.** internal 
2150: 68 61 73 68 20 74 61 62 6c 65 73 20 61 72 65 20  hash tables are 
2160: 75 6e 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  undone..**.** Se
2170: 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 43 6f  e also: sqliteCo
2180: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
2190: 67 65 73 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71  ges().*/.void sq
21a0: 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65  liteRollbackInte
21b0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
21c0: 74 65 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  te *db){.  int i
21d0: 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ;.  if( (db->fla
21e0: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs & SQLITE_Inte
21f0: 72 6e 43 68 61 6e 67 65 73 29 3d 3d 30 20 29 20  rnChanges)==0 ) 
2200: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
2210: 30 3b 20 69 3c 4e 5f 48 41 53 48 3b 20 69 2b 2b  0; i<N_HASH; i++
2220: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
2230: 61 62 6c 65 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  able, *pNext;.  
2240: 20 20 66 6f 72 28 70 54 61 62 6c 65 20 3d 20 64    for(pTable = d
2250: 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b 69 5d 3b  b->apTblHash[i];
2260: 20 70 54 61 62 6c 65 3b 20 70 54 61 62 6c 65 3d   pTable; pTable=
2270: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e  pNext){.      pN
2280: 65 78 74 20 3d 20 70 54 61 62 6c 65 2d 3e 70 48  ext = pTable->pH
2290: 61 73 68 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ash;.      if( !
22a0: 70 54 61 62 6c 65 2d 3e 69 73 43 6f 6d 6d 69 74  pTable->isCommit
22b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22c0: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  teDeleteTable(db
22d0: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  , pTable);.     
22e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 6c   }else if( pTabl
22f0: 65 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a 20  e->isDelete ){. 
2300: 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 69         pTable->i
2310: 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20  sDelete = 0;.   
2320: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2330: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 48 41   for(i=0; i<N_HA
2340: 53 48 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 49 6e  SH; i++){.    In
2350: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
2360: 65 78 74 3b 0a 20 20 20 20 66 6f 72 28 70 49 6e  ext;.    for(pIn
2370: 64 65 78 20 3d 20 64 62 2d 3e 61 70 49 64 78 48  dex = db->apIdxH
2380: 61 73 68 5b 69 5d 3b 20 70 49 6e 64 65 78 3b 20  ash[i]; pIndex; 
2390: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
23a0: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e       pNext = pIn
23b0: 64 65 78 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20  dex->pHash;.    
23c0: 20 20 69 66 28 20 21 70 49 6e 64 65 78 2d 3e 69    if( !pIndex->i
23d0: 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  sCommit ){.     
23e0: 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41     sqliteUnlinkA
23f0: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  ndDeleteIndex(db
2400: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  , pIndex);.     
2410: 20 7d 65 6c 73 65 20 69 66 28 20 70 49 6e 64 65   }else if( pInde
2420: 78 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a 20  x->isDelete ){. 
2430: 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 69         pIndex->i
2440: 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20  sDelete = 0;.   
2450: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2460: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
2470: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2480: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ges;.}../*.** Co
2490: 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d 65  nstruct the name
24a0: 20 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c 65   of a user table
24b0: 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20 61   or index from a
24c0: 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70   token..**.** Sp
24d0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
24e0: 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64  name is obtained
24f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
2500: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a  oc() and must.**
2510: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
2520: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2530: 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  n..*/.char *sqli
2540: 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54  teTableNameFromT
2550: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d  oken(Token *pNam
2560: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
2570: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  e = sqliteStrNDu
2580: 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  p(pName->z, pNam
2590: 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 44  e->n);.  sqliteD
25a0: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
25b0: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
25c0: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f  ../*.** Begin co
25d0: 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77  nstructing a new
25e0: 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74   table represent
25f0: 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e  ation in memory.
2600: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65    This is.** the
2610: 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61   first of severa
2620: 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  l action routine
2630: 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65  s that get calle
2640: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a  d in response.**
2650: 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42   to a CREATE TAB
2660: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  LE statement.  I
2670: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68  n particular, th
2680: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2690: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65  lled.** after se
26a0: 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45  eing tokens "CRE
26b0: 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22  ATE" and "TABLE"
26c0: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e   and the table n
26d0: 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74  ame.  The.** pSt
26e0: 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  art token is the
26f0: 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d   CREATE and pNam
2700: 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  e is the table n
2710: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ame..**.** The n
2720: 65 77 20 74 61 62 6c 65 20 69 73 20 63 6f 6e 73  ew table is cons
2730: 74 72 75 63 74 65 64 20 69 6e 20 66 69 6c 65 73  tructed in files
2740: 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20 73   of the pParse s
2750: 74 72 75 63 74 75 72 65 2e 20 20 41 73 0a 2a 2a  tructure.  As.**
2760: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45   more of the CRE
2770: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
2780: 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61  ent is parsed, a
2790: 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e  dditional action
27a0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 61 72 65  .** routines are
27b0: 20 63 61 6c 6c 65 64 20 74 6f 20 62 75 69 6c 64   called to build
27c0: 20 75 70 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   up more of the 
27d0: 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
27e0: 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28  qliteStartTable(
27f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
2800: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 54 6f  oken *pStart, To
2810: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54  ken *pName){.  T
2820: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
2830: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73  char *zName;.  s
2840: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
2850: 73 65 2d 3e 64 62 3b 0a 0a 20 20 70 50 61 72 73  se->db;..  pPars
2860: 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 20 3d  e->sFirstToken =
2870: 20 2a 70 53 74 61 72 74 3b 0a 20 20 7a 4e 61 6d   *pStart;.  zNam
2880: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  e = sqliteTableN
2890: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
28a0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
28b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
28c0: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 46  pTable = sqliteF
28d0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
28e0: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  me);.  if( pTabl
28f0: 65 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e!=0 ){.    sqli
2900: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
2910: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
2920: 74 61 62 6c 65 20 22 2c 20 30 2c 20 70 4e 61 6d  table ", 0, pNam
2930: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 0a  e->z, pName->n,.
2940: 20 20 20 20 20 20 20 20 22 20 61 6c 72 65 61 64          " alread
2950: 79 20 65 78 69 73 74 73 22 2c 20 30 2c 20 30 29  y exists", 0, 0)
2960: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
2970: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61  (zName);.    pPa
2980: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
2990: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
29a0: 66 28 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64  f( sqliteFindInd
29b0: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 29 20 29 7b  ex(db, zName) ){
29c0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
29d0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
29e0: 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73  rrMsg, "there is
29f0: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
2a00: 78 20 6e 61 6d 65 64 20 22 2c 20 0a 20 20 20 20  x named ", .    
2a10: 20 20 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20     zName, 0);.  
2a20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
2a30: 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  me);.    pParse-
2a40: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
2a50: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  urn;.  }.  pTabl
2a60: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
2a70: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
2a80: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
2a90: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
2aa0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
2ab0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
2ac0: 70 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 54 61  pHash = 0;.  pTa
2ad0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
2ae0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
2af0: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e  0;.  pTable->pIn
2b00: 64 65 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  dex = 0;.  if( p
2b10: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
2b20: 20 29 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54   ) sqliteDeleteT
2b30: 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d  able(db, pParse-
2b40: 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70  >pNewTable);.  p
2b50: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
2b60: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 69 66 28   = pTable;.  if(
2b70: 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c   !pParse->initFl
2b80: 61 67 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73  ag && (db->flags
2b90: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
2ba0: 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62  s)==0 ){.    Vdb
2bb0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 47 65 74  e *v = sqliteGet
2bc0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
2bd0: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20    if( v ){.     
2be0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2bf0: 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
2c00: 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  on, 0, 0, 0, 0);
2c10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2c20: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f  .** Add a new co
2c30: 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c  lumn to the tabl
2c40: 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
2c50: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a  g constructed..*
2c60: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
2c70: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
2c80: 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ne once for each
2c90: 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   column declarat
2ca0: 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ion.** in a CREA
2cb0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
2cc0: 6e 74 2e 20 20 73 71 6c 69 74 65 53 74 61 72 74  nt.  sqliteStart
2cd0: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
2ce0: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
2cf0: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
2d00: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
2d10: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
2d20: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
2d30: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
2d40: 65 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65  eAddColumn(Parse
2d50: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
2d60: 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  *pName){.  Table
2d70: 20 2a 70 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a   *p;.  char **pz
2d80: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
2d90: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
2da0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
2db0: 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78  f( (p->nCol & 0x
2dc0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  7)==0 ){.    p->
2dd0: 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 52 65 61  aCol = sqliteRea
2de0: 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28  lloc( p->aCol, (
2df0: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
2e00: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
2e10: 20 20 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 3d      if( p->aCol=
2e20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
2e30: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Col = 0;.      r
2e40: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
2e50: 0a 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 43  .  memset(&p->aC
2e60: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 2c 20 30 2c 20  ol[p->nCol], 0, 
2e70: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
2e80: 5d 29 29 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e  ]));.  pz = &p->
2e90: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b 5d 2e  aCol[p->nCol++].
2ea0: 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 53  zName;.  sqliteS
2eb0: 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 4e  etNString(pz, pN
2ec0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
2ed0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 44 65  , 0);.  sqliteDe
2ee0: 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f  quote(*pz);.}../
2ef0: 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74  *.** The given t
2f00: 6f 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66 61  oken is the defa
2f10: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
2f20: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
2f30: 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61  ded to.** the ta
2f40: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
2f50: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
2f60: 2e 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67  .  If "minusFlag
2f70: 22 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a  " is true, it.**
2f80: 20 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65   means the value
2f90: 20 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65   token was prece
2fa0: 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73  ded by a minus s
2fb0: 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ign..**.** This 
2fc0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2fd0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
2fe0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
2ff0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
3000: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
3010: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
3020: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 44 65 66  oid sqliteAddDef
3030: 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20  aultValue(Parse 
3040: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
3050: 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46  pVal, int minusF
3060: 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  lag){.  Table *p
3070: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
3080: 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70  r **pz;.  if( (p
3090: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
30a0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
30b0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
30c0: 2d 31 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61  -1;.  pz = &p->a
30d0: 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20  Col[i].zDflt;.  
30e0: 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b  if( minusFlag ){
30f0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
3100: 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31  tring(pz, "-", 1
3110: 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d  , pVal->z, pVal-
3120: 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  >n, 0);.  }else{
3130: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
3140: 74 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e  tring(pz, pVal->
3150: 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a  z, pVal->n, 0);.
3160: 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 71 75    }.  sqliteDequ
3170: 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  ote(*pz);.}../*.
3180: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3190: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70  is called to rep
31a0: 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29  ort the final ")
31b0: 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  " that terminate
31c0: 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41  s.** a CREATE TA
31d0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
31e0: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73  *.** The table s
31f0: 74 72 75 63 74 75 72 65 20 69 73 20 61 64 64 65  tructure is adde
3200: 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
3210: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 20  l hash tables.  
3220: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
3230: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
3240: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
3250: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
3260: 6b 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 69 6e 69  k,.** unless ini
3270: 74 46 6c 61 67 3d 3d 31 2e 20 20 57 68 65 6e 20  tFlag==1.  When 
3280: 69 6e 69 74 46 6c 61 67 3d 3d 31 2c 20 69 74 20  initFlag==1, it 
3290: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
32a0: 64 69 6e 67 0a 2a 2a 20 74 68 65 20 6d 61 73 74  ding.** the mast
32b0: 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  er table because
32c0: 20 77 65 20 6a 75 73 74 20 63 6f 6e 6e 65 63 74   we just connect
32d0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
32e0: 73 65 2c 20 73 6f 20 0a 2a 2a 20 74 68 65 20 65  se, so .** the e
32f0: 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61  ntry for this ta
3300: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
3310: 74 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  ts in the master
3320: 20 74 61 62 6c 65 2e 0a 2a 2a 20 57 65 20 64 6f   table..** We do
3330: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
3340: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2f  ate it again..*/
3350: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 54  .void sqliteEndT
3360: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
3370: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 29  se, Token *pEnd)
3380: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
3390: 69 6e 74 20 68 3b 0a 20 20 73 71 6c 69 74 65 20  int h;.  sqlite 
33a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
33b0: 3b 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30  ;..  if( pEnd==0
33c0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
33d0: 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   || sqlite_mallo
33e0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
33f0: 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  n;.  p = pParse-
3400: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
3410: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
3420: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
3430: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
3440: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
3450: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
3460: 62 61 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20  base.  */.  if( 
3470: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
3480: 3d 30 20 29 7b 0a 20 20 20 20 68 20 3d 20 73 71  =0 ){.    h = sq
3490: 6c 69 74 65 48 61 73 68 4e 6f 43 61 73 65 28 70  liteHashNoCase(p
34a0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e 5f  ->zName, 0) % N_
34b0: 48 41 53 48 3b 0a 20 20 20 20 70 2d 3e 70 48 61  HASH;.    p->pHa
34c0: 73 68 20 3d 20 64 62 2d 3e 61 70 54 62 6c 48 61  sh = db->apTblHa
34d0: 73 68 5b 68 5d 3b 0a 20 20 20 20 64 62 2d 3e 61  sh[h];.    db->a
34e0: 70 54 62 6c 48 61 73 68 5b 68 5d 20 3d 20 70 3b  pTblHash[h] = p;
34f0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
3500: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
3510: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
3520: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
3530: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3540: 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ges;.  }..  /* I
3550: 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67 20 69  f the initFlag i
3560: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
3570: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
3580: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
3590: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
35a0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
35b0: 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77  sk.  So do not w
35c0: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
35d0: 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78  .  ** again.  Ex
35e0: 74 72 61 63 74 20 74 68 65 20 74 61 62 6c 65 20  tract the table 
35f0: 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
3600: 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75 6d 20  pParse->newTnum 
3610: 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  field..  */.  if
3620: 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c  ( pParse->initFl
3630: 61 67 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  ag ){.    p->tnu
3640: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 65 77 54  m = pParse->newT
3650: 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  num;.  }..  /* I
3660: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
3670: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
3680: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  the table on dis
3690: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  k..  */.  if( !p
36a0: 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 20  Parse->initFlag 
36b0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
36c0: 62 65 4f 70 20 61 64 64 54 61 62 6c 65 5b 5d 20  beOp addTable[] 
36d0: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f  = {.      { OP_O
36e0: 70 65 6e 2c 20 20 20 20 20 20 20 20 30 2c 20 32  pen,        0, 2
36f0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
3700: 5f 4e 65 77 52 65 63 6e 6f 2c 20 20 20 20 30 2c  _NewRecno,    0,
3710: 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20   0, 0},.      { 
3720: 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20  OP_String,      
3730: 30 2c 20 30 2c 20 22 74 61 62 6c 65 22 20 20 20  0, 0, "table"   
3740: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f    },.      { OP_
3750: 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20  String,      0, 
3760: 30 2c 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20  0, 0},          
3770: 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20    /* 3 */.      
3780: 7b 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  { OP_CreateTable
3790: 2c 20 30 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20  , 0, 0, 0},.    
37a0: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
37b0: 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 20 20 20      0, 0, 0},   
37c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 35 20 2a 2f           /* 5 */
37d0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
37e0: 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30  ng,      0, 0, 0
37f0: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  },            /*
3800: 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   6 */.      { OP
3810: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 20 35 2c  _MakeRecord,  5,
3820: 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20   0, 0},.      { 
3830: 4f 50 5f 50 75 74 2c 20 20 20 20 20 20 20 20 20  OP_Put,         
3840: 30 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 7d 3b  0, 0, 0},.    };
3850: 0a 20 20 20 20 69 6e 74 20 6e 2c 20 62 61 73 65  .    int n, base
3860: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a  ;.    Vdbe *v;..
3870: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65      v = sqliteGe
3880: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
3890: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
38a0: 74 75 72 6e 3b 0a 20 20 20 20 6e 20 3d 20 28 69  turn;.    n = (i
38b0: 6e 74 29 70 45 6e 64 2d 3e 7a 20 2d 20 28 69 6e  nt)pEnd->z - (in
38c0: 74 29 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74  t)pParse->sFirst
38d0: 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20  Token.z + 1;.   
38e0: 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64   base = sqliteVd
38f0: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
3900: 72 72 61 79 53 69 7a 65 28 61 64 64 54 61 62 6c  rraySize(addTabl
3910: 65 29 2c 20 61 64 64 54 61 62 6c 65 29 3b 0a 20  e), addTable);. 
3920: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
3930: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 33 2c  ngeP3(v, base+3,
3940: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20   p->zName, 0);. 
3950: 20 20 20 73 71 6c 69 74 65 56 64 62 65 54 61 62     sqliteVdbeTab
3960: 6c 65 52 6f 6f 74 41 64 64 72 28 76 2c 20 26 70  leRootAddr(v, &p
3970: 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c  ->tnum);.    sql
3980: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
3990: 76 2c 20 62 61 73 65 2b 35 2c 20 70 2d 3e 7a 4e  v, base+5, p->zN
39a0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
39b0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
39c0: 76 2c 20 62 61 73 65 2b 36 2c 20 70 50 61 72 73  v, base+6, pPars
39d0: 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a  e->sFirstToken.z
39e0: 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
39f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3a00: 43 6c 6f 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Close, 0, 0, 0, 
3a10: 30 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 2d  0);.    if( (db-
3a20: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
3a30: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20  InTrans)==0 ){. 
3a40: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
3a50: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69  ddOp(v, OP_Commi
3a60: 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  t, 0, 0, 0, 0);.
3a70: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
3a80: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
3a90: 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c  , look up a tabl
3aa0: 65 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d 65  e with that name
3ab0: 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c  .  If not found,
3ac0: 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72   leave.** an err
3ad0: 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  or for the parse
3ae0: 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20 72 65  r to find and re
3af0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61  turn NULL..*/.Ta
3b00: 62 6c 65 20 2a 73 71 6c 69 74 65 54 61 62 6c 65  ble *sqliteTable
3b10: 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73 65 20  FromToken(Parse 
3b20: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
3b30: 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20 2a 7a  pTok){.  char *z
3b40: 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70  Name;.  Table *p
3b50: 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  Tab;.  zName = s
3b60: 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72  qliteTableNameFr
3b70: 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20  omToken(pTok);. 
3b80: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
3b90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61 62  return 0;.  pTab
3ba0: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
3bb0: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
3bc0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
3bd0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ree(zName);.  if
3be0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
3bf0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
3c00: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
3c10: 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  sg, "no such tab
3c20: 6c 65 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20  le: ", 0, .     
3c30: 20 20 20 70 54 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b     pTok->z, pTok
3c40: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ->n, 0);.    pPa
3c50: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d  rse->nErr++;.  }
3c60: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
3c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3c80: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
3c90: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
3ca0: 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
3cb0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
3cc0: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
3cd0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
3ce0: 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
3cf0: 69 64 20 73 71 6c 69 74 65 44 72 6f 70 54 61 62  id sqliteDropTab
3d00: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
3d10: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
3d20: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
3d30: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
3d40: 6e 74 20 62 61 73 65 3b 0a 0a 20 20 69 66 28 20  nt base;..  if( 
3d50: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
3d60: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
3d70: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
3d80: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
3d90: 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  TableFromToken(p
3da0: 50 61 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20  Parse, pName);. 
3db0: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
3dc0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
3dd0: 54 61 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79 20  Table->readOnly 
3de0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
3df0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
3e00: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
3e10: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
3e20: 2c 20 0a 20 20 20 20 20 20 20 22 20 6d 61 79 20  , .       " may 
3e30: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
3e40: 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d   0);.    pParse-
3e50: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74  >nErr++;.    ret
3e60: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  urn;.  }..  /* G
3e70: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
3e80: 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
3e90: 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
3ea0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
3eb0: 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
3ec0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
3ed0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
3ee0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
3ef0: 65 4f 70 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20  eOp dropTable[] 
3f00: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f  = {.      { OP_O
3f10: 70 65 6e 2c 20 20 20 20 20 20 20 30 2c 20 32 2c  pen,       0, 2,
3f20: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
3f30: 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
3f40: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
3f50: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  0},.      { OP_S
3f60: 74 72 69 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c  tring,     0, 0,
3f70: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 32          0}, /* 2
3f80: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e   */.      { OP_N
3f90: 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44  ext,       0, AD
3fa0: 44 52 28 31 30 29 2c 20 30 7d 2c 20 2f 2a 20 33  DR(10), 0}, /* 3
3fb0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44   */.      { OP_D
3fc0: 75 70 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c  up,        0, 0,
3fd0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
3fe0: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
3ff0: 20 20 20 30 2c 20 33 2c 20 20 20 20 20 20 20 20     0, 3,        
4000: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
4010: 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44  e,         0, AD
4020: 44 52 28 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20  DR(3),  0},.    
4030: 20 20 7b 20 4f 50 5f 52 65 63 6e 6f 2c 20 20 20    { OP_Recno,   
4040: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
4050: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
4060: 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
4070: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
4080: 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20    { OP_Goto,    
4090: 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20     0, ADDR(3),  
40a0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
40b0: 65 73 74 72 6f 79 2c 20 20 20 20 30 2c 20 30 2c  estroy,    0, 0,
40c0: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31          0}, /* 1
40d0: 30 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  0 */.      { OP_
40e0: 43 6c 6f 73 65 2c 20 20 20 20 20 20 30 2c 20 30  Close,      0, 0
40f0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
4100: 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   };.    Index *p
4110: 49 64 78 3b 0a 20 20 20 20 69 66 28 20 28 70 50  Idx;.    if( (pP
4120: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
4130: 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73  & SQLITE_InTrans
4140: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
4150: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4160: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
4170: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
4180: 20 20 7d 0a 20 20 20 20 62 61 73 65 20 3d 20 73    }.    base = s
4190: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
41a0: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
41b0: 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70  dropTable), drop
41c0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69  Table);.    sqli
41d0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  teVdbeChangeP1(v
41e0: 2c 20 62 61 73 65 2b 31 30 2c 20 70 54 61 62 6c  , base+10, pTabl
41f0: 65 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 66 6f  e->tnum);.    fo
4200: 72 28 70 49 64 78 3d 70 54 61 62 6c 65 2d 3e 70  r(pIdx=pTable->p
4210: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
4220: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
4230: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4240: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
4250: 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  roy, pIdx->tnum,
4260: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
4270: 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65  .    if( (pParse
4280: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
4290: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30  LITE_InTrans)==0
42a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
42b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
42c0: 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30 2c  Commit, 0, 0, 0,
42d0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
42e0: 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 69 6e    /* Mark the in
42f0: 2d 6d 65 6d 6f 72 79 20 54 61 62 6c 65 20 73 74  -memory Table st
4300: 72 75 63 74 75 72 65 20 61 73 20 62 65 69 6e 67  ructure as being
4310: 20 64 65 6c 65 74 65 64 2e 20 20 54 68 65 20 61   deleted.  The a
4320: 63 74 75 61 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c  ctually.  ** del
4330: 65 74 69 6f 6e 20 6f 63 63 75 72 73 20 69 6e 73  etion occurs ins
4340: 69 64 65 20 6f 66 20 73 71 6c 69 74 65 43 6f 6d  ide of sqliteCom
4350: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
4360: 65 73 28 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  es()..  **.  ** 
4370: 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20 74 68  Exception: if th
4380: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
4390: 62 65 67 61 6e 20 77 69 74 68 20 74 68 65 20 45  began with the E
43a0: 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a  XPLAIN keyword,.
43b0: 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61    ** then no cha
43c0: 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 6d  nges should be m
43d0: 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ade..  */.  if( 
43e0: 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
43f0: 20 29 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e   ){.    pTable->
4400: 69 73 44 65 6c 65 74 65 20 3d 20 31 3b 0a 20 20  isDelete = 1;.  
4410: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c    pParse->db->fl
4420: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
4430: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
4440: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
4450: 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
4460: 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
4470: 70 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61  pIndex is the na
4480: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
4490: 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69  .** and pTable i
44a0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
44b0: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
44c0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
44d0: 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
44e0: 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
44f0: 61 72 79 20 6b 65 79 2e 20 20 49 6e 20 74 68 61  ary key.  In tha
4500: 74 20 63 61 73 65 2c 20 75 73 65 20 70 50 61 72  t case, use pPar
4510: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 61 73  se->pNewTable as
4520: 20 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 74   the .** table t
4530: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a  o be indexed..**
4540: 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
4550: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
4560: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
4570: 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
4580: 4c 20 69 66 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  L if the.** most
4590: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
45a0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
45b0: 62 6c 65 20 69 73 20 6c 61 62 65 6c 65 64 20 61  ble is labeled a
45c0: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
45d0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
45e0: 65 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  eCreateIndex(.  
45f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4600: 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
4610: 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
4620: 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
4630: 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61  *pName,    /* Na
4640: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
4650: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
4660: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
4670: 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
4680: 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 64 65  he table to inde
4690: 78 2e 20 20 55 73 65 20 70 50 61 72 73 65 2d 3e  x.  Use pParse->
46a0: 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
46b0: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  /.  IdList *pLis
46c0: 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
46d0: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
46e0: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 54 6f 6b  indexed */.  Tok
46f0: 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a  en *pStart,   /*
4700: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
4710: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20  n that begins a 
4720: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
4730: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
4740: 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20  n *pEnd      /* 
4750: 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
4760: 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
4770: 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
4780: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
4790: 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
47a0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
47b0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
47c0: 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  x;   /* The inde
47d0: 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
47e0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
47f0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
4800: 2c 20 68 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , h;.  Token nul
4810: 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20  lId;    /* Fake 
4820: 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
4830: 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
4840: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
4850: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
4860: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
4870: 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61  sqlite_malloc_fa
4880: 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
4890: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
48a0: 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
48b0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
48c0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
48d0: 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
48e0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
48f0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30  .  if( pTable!=0
4900: 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 20   ){.    pTab =  
4910: 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54  sqliteTableFromT
4920: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 54 61  oken(pParse, pTa
4930: 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
4940: 20 20 20 70 54 61 62 20 3d 20 20 70 50 61 72 73     pTab =  pPars
4950: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
4960: 7d 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  }.  if( pTab==0 
4970: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
4980: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
4990: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  te_index;.  if( 
49a0: 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  pTab->readOnly )
49b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
49c0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
49d0: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
49e0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a  , pTab->zName, .
49f0: 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20        " may not 
4a00: 68 61 76 65 20 6e 65 77 20 69 6e 64 69 63 65 73  have new indices
4a10: 20 61 64 64 65 64 22 2c 20 30 29 3b 0a 20 20 20   added", 0);.   
4a20: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
4a30: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
4a40: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
4a50: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
4a60: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4a70: 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
4a80: 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
4a90: 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
4aa0: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
4ab0: 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
4ac0: 65 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  e name..  */.  i
4ad0: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
4ae0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61  zName = sqliteTa
4af0: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
4b00: 28 70 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (pName);.  }else
4b10: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
4b20: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
4b30: 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 70 54 61  ring(&zName, pTa
4b40: 62 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 70 72 69  b->zName, "__pri
4b50: 6d 61 72 79 5f 6b 65 79 22 2c 20 30 29 3b 0a 20  mary_key", 0);. 
4b60: 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d   }.  if( zName==
4b70: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
4b80: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66  eate_index;.  if
4b90: 28 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  ( sqliteFindInde
4ba0: 78 28 64 62 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  x(db, zName) ){.
4bb0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
4bc0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
4bd0: 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 22 2c 20  rMsg, "index ", 
4be0: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 22  zName, .       "
4bf0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
4c00: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
4c10: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
4c20: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
4c30: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
4c40: 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28  sqliteFindTable(
4c50: 64 62 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  db, zName) ){.  
4c60: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
4c70: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
4c80: 73 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  sg, "there is al
4c90: 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
4ca0: 6d 65 64 20 22 2c 0a 20 20 20 20 20 20 20 7a 4e  med ",.       zN
4cb0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ame, 0);.    pPa
4cc0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
4cd0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
4ce0: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
4cf0: 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
4d00: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
4d10: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
4d20: 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
4d30: 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
4d40: 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
4d50: 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
4d60: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
4d70: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
4d80: 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
4d90: 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
4da0: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
4db0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
4dc0: 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
4dd0: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
4de0: 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
4df0: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
4e00: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
4e10: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
4e20: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  IdListAppend(0, 
4e30: 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66  &nullId);.    if
4e40: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
4e50: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
4e60: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a  dex;.  }..  /* .
4e70: 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
4e80: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
4e90: 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65  e. .  */.  pInde
4ea0: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
4eb0: 28 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20  ( sizeof(Index) 
4ec0: 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20  + strlen(zName) 
4ed0: 2b 20 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20  + 1 +.          
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
4ef0: 7a 65 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d  zeof(int)*pList-
4f00: 3e 6e 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49  >nId );.  if( pI
4f10: 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  ndex==0 ) goto e
4f20: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
4f30: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
4f40: 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
4f50: 6e 64 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65  ndex[1];.  pInde
4f60: 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
4f70: 2a 29 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  *)&pIndex->aiCol
4f80: 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b  umn[pList->nId];
4f90: 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
4fa0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
4fb0: 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
4fc0: 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
4fd0: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
4fe0: 69 73 74 2d 3e 6e 49 64 3b 0a 0a 20 20 2f 2a 20  ist->nId;..  /* 
4ff0: 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
5000: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
5010: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
5020: 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
5030: 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
5040: 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
5050: 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
5060: 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
5070: 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
5080: 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
5090: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ound..  */.  for
50a0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
50b0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  Id; i++){.    fo
50c0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
50d0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
50e0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
50f0: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
5100: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
5110: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
5120: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5130: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
5140: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
5150: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
5160: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
5170: 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e  able ", pTab->zN
5180: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 22 20  ame, .        " 
5190: 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
51a0: 6d 65 64 20 22 2c 20 70 4c 69 73 74 2d 3e 61 5b  med ", pList->a[
51b0: 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  i].zName, 0);.  
51c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
51d0: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
51e0: 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20  Free(pIndex);.  
51f0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
5200: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
5210: 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  }.    pIndex->ai
5220: 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20  Column[i] = j;. 
5230: 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
5240: 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
5250: 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
5260: 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
5270: 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
5280: 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
5290: 63 74 75 72 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctures..  */.  i
52a0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
52b0: 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 68 20 3d  in==0 ){.    h =
52c0: 20 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61 73   sqliteHashNoCas
52d0: 65 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  e(pIndex->zName,
52e0: 20 30 29 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20   0) % N_HASH;.  
52f0: 20 20 70 49 6e 64 65 78 2d 3e 70 48 61 73 68 20    pIndex->pHash 
5300: 3d 20 64 62 2d 3e 61 70 49 64 78 48 61 73 68 5b  = db->apIdxHash[
5310: 68 5d 3b 0a 20 20 20 20 64 62 2d 3e 61 70 49 64  h];.    db->apId
5320: 78 48 61 73 68 5b 68 5d 20 3d 20 70 49 6e 64 65  xHash[h] = pInde
5330: 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  x;.    pIndex->p
5340: 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
5350: 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70  dex;.    pTab->p
5360: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
5370: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
5380: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
5390: 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  anges;.  }..  /*
53a0: 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61 67   If the initFlag
53b0: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
53c0: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
53d0: 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
53e0: 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
53f0: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
5400: 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  disk.  So do not
5410: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
5420: 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 20  sk.  ** again.  
5430: 45 78 74 72 61 63 74 20 74 68 65 20 74 61 62 6c  Extract the tabl
5440: 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68  e number from th
5450: 65 20 70 50 61 72 73 65 2d 3e 6e 65 77 54 6e 75  e pParse->newTnu
5460: 6d 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  m field..  */.  
5470: 69 66 28 20 70 50 61 72 73 65 2d 3e 69 6e 69 74  if( pParse->init
5480: 46 6c 61 67 20 29 7b 0a 20 20 20 20 70 49 6e 64  Flag ){.    pInd
5490: 65 78 2d 3e 74 6e 75 6d 20 3d 20 70 50 61 72 73  ex->tnum = pPars
54a0: 65 2d 3e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  e->newTnum;.  }.
54b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69  .  /* If the ini
54c0: 74 46 6c 61 67 20 69 73 20 30 20 74 68 65 6e 20  tFlag is 0 then 
54d0: 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
54e0: 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
54f0: 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
5500: 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
5510: 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
5520: 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
5530: 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
5540: 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
5550: 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
5560: 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
5570: 68 65 20 69 6e 69 74 46 6c 61 67 20 69 73 20 30  he initFlag is 0
5580: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66   when the user f
5590: 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52  irst enters a CR
55a0: 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a  EATE INDEX .  **
55b0: 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 65 20 69   command.  The i
55c0: 6e 69 74 46 6c 61 67 20 69 73 20 31 20 77 68 65  nitFlag is 1 whe
55d0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
55e0: 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
55f0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
5600: 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
5610: 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
5620: 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
5630: 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
5640: 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
5650: 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
5660: 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
5670: 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
5680: 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
5690: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
56a0: 20 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c 61   pParse->initFla
56b0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  g==0 ){.    stat
56c0: 69 63 20 56 64 62 65 4f 70 20 61 64 64 54 61 62  ic VdbeOp addTab
56d0: 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  le[] = {.      {
56e0: 20 4f 50 5f 4f 70 65 6e 2c 20 20 20 20 20 20 20   OP_Open,       
56f0: 20 32 2c 20 32 2c 20 30 7d 2c 0a 20 20 20 20 20   2, 2, 0},.     
5700: 20 7b 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20   { OP_NewRecno, 
5710: 20 20 20 32 2c 20 30 2c 20 30 7d 2c 0a 20 20 20     2, 0, 0},.   
5720: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20     { OP_String, 
5730: 20 20 20 20 20 30 2c 20 30 2c 20 22 69 6e 64 65       0, 0, "inde
5740: 78 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  x"},.      { OP_
5750: 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20  String,      0, 
5760: 30 2c 20 30 7d 2c 20 20 2f 2a 20 33 20 2a 2f 0a  0, 0},  /* 3 */.
5770: 20 20 20 20 20 20 7b 20 4f 50 5f 43 72 65 61 74        { OP_Creat
5780: 65 49 6e 64 65 78 2c 20 30 2c 20 30 2c 20 30 7d  eIndex, 0, 0, 0}
5790: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72  ,.      { OP_Str
57a0: 69 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c 20  ing,      0, 0, 
57b0: 30 7d 2c 20 20 2f 2a 20 35 20 2a 2f 0a 20 20 20  0},  /* 5 */.   
57c0: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20     { OP_String, 
57d0: 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 20 20       0, 0, 0},  
57e0: 2f 2a 20 36 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 6 */.      { 
57f0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 20  OP_MakeRecord,  
5800: 35 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20  5, 0, 0},.      
5810: 7b 20 4f 50 5f 50 75 74 2c 20 20 20 20 20 20 20  { OP_Put,       
5820: 20 20 32 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20    2, 0, 0},.    
5830: 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20 20    { OP_Close,   
5840: 20 20 20 20 32 2c 20 30 2c 20 30 7d 2c 0a 20 20      2, 0, 0},.  
5850: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a    };.    int n;.
5860: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
5870: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
5880: 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b   int lbl1, lbl2;
5890: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20  .    int i;..   
58a0: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
58b0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
58c0: 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
58d0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
58e0: 78 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  x;.    if( pTabl
58f0: 65 21 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c 61  e!=0 && (db->fla
5900: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
5910: 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ans)==0 ){.     
5920: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5930: 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
5940: 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  on, 0, 0, 0, 0);
5950: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5960: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5970: 5f 4f 70 65 6e 2c 20 30 2c 20 70 54 61 62 2d 3e  _Open, 0, pTab->
5980: 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  tnum, pTab->zNam
5990: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
59a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
59b0: 5f 4f 70 65 6e 2c 20 31 2c 20 70 49 6e 64 65 78  _Open, 1, pIndex
59c0: 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e  ->tnum, pIndex->
59d0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69  zName, 0);.    i
59e0: 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
59f0: 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  d ){.      int b
5a00: 61 73 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28  ase;.      n = (
5a10: 69 6e 74 29 70 45 6e 64 2d 3e 7a 20 2d 20 28 69  int)pEnd->z - (i
5a20: 6e 74 29 70 53 74 61 72 74 2d 3e 7a 20 2b 20 31  nt)pStart->z + 1
5a30: 3b 0a 20 20 20 20 20 20 62 61 73 65 20 3d 20 73  ;.      base = s
5a40: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
5a50: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
5a60: 61 64 64 54 61 62 6c 65 29 2c 20 61 64 64 54 61  addTable), addTa
5a70: 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ble);.      sqli
5a80: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
5a90: 2c 20 62 61 73 65 2b 33 2c 20 70 49 6e 64 65 78  , base+3, pIndex
5aa0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
5ab0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 49 6e 64     sqliteVdbeInd
5ac0: 65 78 52 6f 6f 74 41 64 64 72 28 76 2c 20 26 70  exRootAddr(v, &p
5ad0: 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20  Index->tnum);.  
5ae0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68      sqliteVdbeCh
5af0: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 35  angeP3(v, base+5
5b00: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
5b10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5b20: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
5b30: 61 73 65 2b 36 2c 20 70 53 74 61 72 74 2d 3e 7a  ase+6, pStart->z
5b40: 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
5b50: 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62  lbl1 = sqliteVdb
5b60: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
5b70: 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65     lbl2 = sqlite
5b80: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
5b90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
5ba0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
5bb0: 6e 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  nd, 0, 0, 0, 0);
5bc0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
5bd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
5be0: 20 30 2c 20 6c 62 6c 32 2c 20 30 2c 20 6c 62 6c   0, lbl2, 0, lbl
5bf0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  1);.    sqliteVd
5c00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
5c10: 63 6e 6f 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  cno, 0, 0, 0, 0)
5c20: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5c30: 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
5c40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
5c50: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5c60: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 30 2c 20 70   OP_Column, 0, p
5c70: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
5c80: 69 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  i], 0, 0);.    }
5c90: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
5ca0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49  ddOp(v, OP_MakeI
5cb0: 64 78 4b 65 79 2c 20 70 49 6e 64 65 78 2d 3e 6e  dxKey, pIndex->n
5cc0: 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30 2c 20 30 29  Column, 0, 0, 0)
5cd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
5ce0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
5cf0: 64 78 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b  dx, 1, 0, 0, 0);
5d00: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
5d10: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
5d20: 20 30 2c 20 6c 62 6c 31 2c 20 30 2c 20 30 29 3b   0, lbl1, 0, 0);
5d30: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
5d40: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c  ddOp(v, OP_Noop,
5d50: 20 30 2c 20 30 2c 20 30 2c 20 6c 62 6c 32 29 3b   0, 0, 0, lbl2);
5d60: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
5d70: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
5d80: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 1, 0, 0, 0);. 
5d90: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5da0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
5db0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
5dc0: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 26   if( pTable!=0 &
5dd0: 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
5de0: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
5df0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
5e00: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5e10: 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30  _Commit, 0, 0, 0
5e20: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
5e30: 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 6d 65  .  /* Reclaim me
5e40: 6d 6f 72 79 20 6f 6e 20 61 6e 20 45 58 50 4c 41  mory on an EXPLA
5e50: 49 4e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  IN call..  */.  
5e60: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
5e70: 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ain ){.    sqlit
5e80: 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20  eFree(pIndex);. 
5e90: 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
5ea0: 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
5eb0: 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
5ec0: 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 49  index:.  sqliteI
5ed0: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
5ee0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
5ef0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
5f00: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
5f10: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72   routine will dr
5f20: 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e  op an existing n
5f30: 61 6d 65 64 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76  amed index..*/.v
5f40: 6f 69 64 20 73 71 6c 69 74 65 44 72 6f 70 49 6e  oid sqliteDropIn
5f50: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
5f60: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
5f70: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
5f80: 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  x;.  char *zName
5f90: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
5fa0: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
5fb0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
5fc0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
5fd0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
5fe0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
5ff0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61  zName = sqliteTa
6000: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
6010: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
6020: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
6030: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
6040: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  iteFindIndex(db,
6050: 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74   zName);.  sqlit
6060: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
6070: 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
6080: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53  .    sqliteSetNS
6090: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
60a0: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
60b0: 20 69 6e 64 65 78 3a 20 22 2c 20 30 2c 20 0a 20   index: ", 0, . 
60c0: 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 2c         pName->z,
60d0: 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20   pName->n, 0);. 
60e0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
60f0: 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
6100: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
6110: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
6120: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
6130: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
6140: 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
6150: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
6160: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
6170: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
6180: 70 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20  p dropIndex[] = 
6190: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65  {.      { OP_Ope
61a0: 6e 2c 20 20 20 20 20 20 20 30 2c 20 32 2c 20 20  n,       0, 2,  
61b0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
61c0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
61d0: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
61e0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
61f0: 6e 67 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  ng,     0, 0,   
6200: 20 20 20 20 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a      0}, /* 2 */.
6210: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c        { OP_Next,
6220: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39         0, ADDR(9
6230: 29 2c 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20  ), 0}, /* 3 */. 
6240: 20 20 20 20 20 7b 20 4f 50 5f 44 75 70 2c 20 20       { OP_Dup,  
6250: 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20        0, 0,     
6260: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
6270: 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20  _Column,     0, 
6280: 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  1,       0},.   
6290: 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20     { OP_Ne,     
62a0: 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20      0, ADDR(3), 
62b0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  0},.      { OP_R
62c0: 65 63 6e 6f 2c 20 20 20 20 20 20 30 2c 20 30 2c  ecno,      0, 0,
62d0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
62e0: 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20   { OP_Delete,   
62f0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
6300: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 73  ,.      { OP_Des
6310: 74 72 6f 79 2c 20 20 20 20 30 2c 20 30 2c 20 20  troy,    0, 0,  
6320: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f       0}, /* 9 */
6330: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73  .      { OP_Clos
6340: 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20  e,      0, 0,   
6350: 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20      0},.    };. 
6360: 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20     int base;..  
6370: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
6380: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
6390: 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  s)==0 ){.      s
63a0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
63b0: 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
63c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
63d0: 20 20 20 7d 0a 20 20 20 20 62 61 73 65 20 3d 20     }.    base = 
63e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c  sqliteVdbeAddOpL
63f0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
6400: 28 64 72 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f  (dropIndex), dro
6410: 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c  pIndex);.    sql
6420: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 31 28  iteVdbeChangeP1(
6430: 76 2c 20 62 61 73 65 2b 39 2c 20 70 49 6e 64 65  v, base+9, pInde
6440: 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 69 66  x->tnum);.    if
6450: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
6460: 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d  QLITE_InTrans)==
6470: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6480: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6490: 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20 30  _Commit, 0, 0, 0
64a0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
64b0: 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 69  .  /* Mark the i
64c0: 6e 74 65 72 6e 61 6c 20 49 6e 64 65 78 20 73 74  nternal Index st
64d0: 72 75 63 74 75 72 65 20 66 6f 72 20 64 65 6c 65  ructure for dele
64e0: 74 69 6f 6e 20 62 79 20 74 68 65 0a 20 20 2a 2a  tion by the.  **
64f0: 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74   sqliteCommitInt
6500: 65 72 6e 61 6c 43 68 61 6e 67 65 73 20 72 6f 75  ernalChanges rou
6510: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tine..  */.  if(
6520: 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
6530: 6e 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  n ){.    pIndex-
6540: 3e 69 73 44 65 6c 65 74 65 20 3d 20 31 3b 0a 20  >isDelete = 1;. 
6550: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
6560: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
6570: 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nges;.  }.}../*.
6580: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
6590: 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20  ment to the end 
65a0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
65b0: 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74   list.  If pList
65c0: 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79   is.** initially
65d0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61   NULL, then crea
65e0: 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  te a new express
65f0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70  ion list..*/.Exp
6600: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 45 78 70  rList *sqliteExp
6610: 72 4c 69 73 74 41 70 70 65 6e 64 28 45 78 70 72  rListAppend(Expr
6620: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70  List *pList, Exp
6630: 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20  r *pExpr, Token 
6640: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
6650: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
6660: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
6670: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
6680: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
6690: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
66a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
66b0: 20 7d 0a 20 20 69 66 28 20 28 70 4c 69 73 74 2d   }.  if( (pList-
66c0: 3e 6e 45 78 70 72 20 26 20 37 29 3d 3d 30 20 29  >nExpr & 7)==0 )
66d0: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c  {.    int n = pL
66e0: 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 38 3b 0a  ist->nExpr + 8;.
66f0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73      pList->a = s
6700: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
6710: 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28  st->a, n*sizeof(
6720: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
6730: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d     if( pList->a=
6740: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73  =0 ){.      pLis
6750: 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20  t->nExpr = 0;.  
6760: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74      return pList
6770: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 20  ;.    }.  }.  i 
6780: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  = pList->nExpr++
6790: 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ;.  pList->a[i].
67a0: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
67b0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
67c0: 6d 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e  me = 0;.  if( pN
67d0: 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ame ){.    sqlit
67e0: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69  eSetNString(&pLi
67f0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
6800: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
6810: 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  >n, 0);.    sqli
6820: 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73 74 2d  teDequote(pList-
6830: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
6840: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
6850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
6860: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
6870: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
6880: 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72 4c  void sqliteExprL
6890: 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69  istDelete(ExprLi
68a0: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
68b0: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
68c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
68d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
68e0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
68f0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
6900: 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ete(pList->a[i].
6910: 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
6920: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
6930: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
6940: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
6950: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46  t->a);.  sqliteF
6960: 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
6970: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
6980: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
6990: 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
69a0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
69b0: 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
69c0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
69d0: 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
69e0: 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
69f0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
6a00: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 49  .IdList *sqliteI
6a10: 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69  dListAppend(IdLi
6a20: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
6a30: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
6a40: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
6a50: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
6a60: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64  alloc( sizeof(Id
6a70: 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
6a80: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
6a90: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
6aa0: 28 70 4c 69 73 74 2d 3e 6e 49 64 20 26 20 37 29  (pList->nId & 7)
6ab0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
6ac0: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  ->a = sqliteReal
6ad0: 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70  loc(pList->a, (p
6ae0: 4c 69 73 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a  List->nId+8)*siz
6af0: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
6b00: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
6b10: 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t->a==0 ){.     
6b20: 20 70 4c 69 73 74 2d 3e 6e 49 64 20 3d 20 30 3b   pList->nId = 0;
6b30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c  .      sqliteIdL
6b40: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
6b50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
6b60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65  ;.    }.  }.  me
6b70: 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70  mset(&pList->a[p
6b80: 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73  List->nId], 0, s
6b90: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
6ba0: 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  ]));.  if( pToke
6bb0: 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  n ){.    char **
6bc0: 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  pz = &pList->a[p
6bd0: 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65  List->nId].zName
6be0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  ;.    sqliteSetN
6bf0: 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 6f 6b 65  String(pz, pToke
6c00: 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c  n->z, pToken->n,
6c10: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a   0);.    if( *pz
6c20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
6c30: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
6c40: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
6c50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
6c60: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44  e{.      sqliteD
6c70: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20  equote(*pz);.   
6c80: 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e   }.  }.  pList->
6c90: 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  nId++;.  return 
6ca0: 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
6cb0: 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20  Add an alias to 
6cc0: 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66  the last identif
6cd0: 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ier on the given
6ce0: 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74   identifier list
6cf0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6d00: 49 64 4c 69 73 74 41 64 64 41 6c 69 61 73 28 49  IdListAddAlias(I
6d10: 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  dList *pList, To
6d20: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
6d30: 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69  if( pList && pLi
6d40: 73 74 2d 3e 6e 49 64 3e 30 20 29 7b 0a 20 20 20  st->nId>0 ){.   
6d50: 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e   int i = pList->
6d60: 6e 49 64 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c  nId - 1;.    sql
6d70: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
6d80: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
6d90: 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  s, pToken->z, pT
6da0: 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20  oken->n, 0);.   
6db0: 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28 70   sqliteDequote(p
6dc0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61  List->a[i].zAlia
6dd0: 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  s);.  }.}../*.**
6de0: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
6df0: 65 20 49 64 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64  e IdList.*/.void
6e00: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
6e10: 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ete(IdList *pLis
6e20: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
6e30: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
6e40: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
6e50: 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
6e60: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
6e70: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
6e80: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
6e90: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
6ea0: 69 5d 2e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  i].zAlias);.    
6eb0: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
6ec0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
6ed0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
6ee0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
6ef0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65        sqliteSele
6f00: 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e  ctDelete(pList->
6f10: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
6f20: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
6f30: 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d  eTable(0, pList-
6f40: 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20  >a[i].pTab);.   
6f50: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46   }.  }.  sqliteF
6f60: 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  ree(pList->a);. 
6f70: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
6f80: 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  t);.}.../*.** Th
6f90: 65 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 69  e COPY command i
6fa0: 73 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c  s for compatibil
6fb0: 69 74 79 20 77 69 74 68 20 50 6f 73 74 67 72 65  ity with Postgre
6fc0: 53 51 4c 20 61 6e 64 20 73 70 65 63 69 66 69 63  SQL and specific
6fd0: 69 61 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68 65  ially.** for the
6fe0: 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65 61 64   ability to read
6ff0: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 70   the output of p
7000: 67 5f 64 75 6d 70 2e 20 20 54 68 65 20 66 6f 72  g_dump.  The for
7010: 6d 61 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c  mat is as.** fol
7020: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43  lows:.**.**    C
7030: 4f 50 59 20 74 61 62 6c 65 20 46 52 4f 4d 20 66  OPY table FROM f
7040: 69 6c 65 20 5b 55 53 49 4e 47 20 44 45 4c 49 4d  ile [USING DELIM
7050: 49 54 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a 2a  ITERS string].**
7060: 0a 2a 2a 20 22 74 61 62 6c 65 22 20 69 73 20 61  .** "table" is a
7070: 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
7080: 20 6e 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c 20   name.  We will 
7090: 72 65 61 64 20 6c 69 6e 65 73 20 6f 66 20 63 6f  read lines of co
70a0: 64 65 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20  de from.** file 
70b0: 74 6f 20 66 69 6c 6c 20 74 68 69 73 20 74 61 62  to fill this tab
70c0: 6c 65 20 77 69 74 68 20 64 61 74 61 2e 20 20 46  le with data.  F
70d0: 69 6c 65 20 6d 69 67 68 74 20 62 65 20 22 73 74  ile might be "st
70e0: 64 69 6e 22 2e 20 20 54 68 65 20 6f 70 74 69 6f  din".  The optio
70f0: 6e 61 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65 72  nal.** delimiter
7100: 20 73 74 72 69 6e 67 20 69 64 65 6e 74 69 66 69   string identifi
7110: 65 73 20 74 68 65 20 66 69 65 6c 64 20 73 65 70  es the field sep
7120: 61 72 61 74 6f 72 73 2e 20 20 54 68 65 20 64 65  arators.  The de
7130: 66 61 75 6c 74 20 69 73 20 61 20 74 61 62 2e 0a  fault is a tab..
7140: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f  */.void sqliteCo
7150: 70 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  py(.  Parse *pPa
7160: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
7170: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
7180: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
7190: 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 54 68  bleName,   /* Th
71a0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
71b0: 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  ble into which w
71c0: 65 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a 2f  e will insert */
71d0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e  .  Token *pFilen
71e0: 61 6d 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 66  ame,    /* The f
71f0: 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ile from which t
7200: 6f 20 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61  o obtain informa
7210: 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
7220: 2a 70 44 65 6c 69 6d 69 74 65 72 20 20 20 20 2f  *pDelimiter    /
7230: 2a 20 55 73 65 20 74 68 69 73 20 61 73 20 74 68  * Use this as th
7240: 65 20 66 69 65 6c 64 20 64 65 6c 69 6d 69 74 65  e field delimite
7250: 72 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  r */.){.  Table 
7260: 2a 70 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a  *pTab;.  char *z
7270: 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Tab;.  int i, j;
7280: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
7290: 74 20 61 64 64 72 2c 20 65 6e 64 3b 0a 20 20 49  t addr, end;.  I
72a0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 73 71  ndex *pIdx;.  sq
72b0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
72c0: 65 2d 3e 64 62 3b 0a 0a 20 20 7a 54 61 62 20 3d  e->db;..  zTab =
72d0: 20 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65   sqliteTableName
72e0: 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65  FromToken(pTable
72f0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  Name);.  if( sql
7300: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
7310: 64 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 67  d || zTab==0 ) g
7320: 6f 74 6f 20 63 6f 70 79 5f 63 6c 65 61 6e 75 70  oto copy_cleanup
7330: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
7340: 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  eFindTable(db, z
7350: 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  Tab);.  sqliteFr
7360: 65 65 28 7a 54 61 62 29 3b 0a 20 20 69 66 28 20  ee(zTab);.  if( 
7370: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
7380: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
7390: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
73a0: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
73b0: 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  : ", 0, .       
73c0: 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 7a 2c 20   pTableName->z, 
73d0: 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e 2c 20 30  pTableName->n, 0
73e0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
73f0: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
7400: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  copy_cleanup;.  
7410: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  }.  if( pTab->re
7420: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
7430: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
7440: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
7450: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e  "table ", pTab->
7460: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 22  zName,.        "
7470: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6d 6f 64 69   may not be modi
7480: 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70  fied", 0);.    p
7490: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
74a0: 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65     goto copy_cle
74b0: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  anup;.  }.  v = 
74c0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
74d0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
74e0: 7b 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e 66  {.    if( (db->f
74f0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
7500: 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20  Trans)==0 ){.   
7510: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7520: 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
7530: 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30  tion, 0, 0, 0, 0
7540: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64  );.    }.    add
7550: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
7560: 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 4f 70  dOp(v, OP_FileOp
7570: 65 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  en, 0, 0, 0, 0);
7580: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
7590: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
75a0: 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 7a 2c 20 70   pFilename->z, p
75b0: 46 69 6c 65 6e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  Filename->n);.  
75c0: 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75    sqliteVdbeDequ
75d0: 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a  oteP3(v, addr);.
75e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
75f0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20  dOp(v, OP_Open, 
7600: 30 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70  0, pTab->tnum, p
7610: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
7620: 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 64      for(i=1, pId
7630: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
7640: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
7650: 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  >pNext, i++){.  
7660: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7670: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20  dOp(v, OP_Open, 
7680: 69 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70  i, pIdx->tnum, p
7690: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Idx->zName, 0);.
76a0: 20 20 20 20 7d 0a 20 20 20 20 65 6e 64 20 3d 20      }.    end = 
76b0: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
76c0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 61 64 64 72  bel(v);.    addr
76d0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
76e0: 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 52 65 61  Op(v, OP_FileRea
76f0: 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 65  d, pTab->nCol, e
7700: 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  nd, 0, 0);.    i
7710: 66 28 20 70 44 65 6c 69 6d 69 74 65 72 20 29 7b  f( pDelimiter ){
7720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7730: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
7740: 72 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 7a  r, pDelimiter->z
7750: 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d 3e 6e 29  , pDelimiter->n)
7760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
7770: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61  beDequoteP3(v, a
7780: 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ddr);.    }else{
7790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
77a0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
77b0: 72 2c 20 22 5c 74 22 2c 20 31 29 3b 0a 20 20 20  r, "\t", 1);.   
77c0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
77d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
77e0: 52 65 63 6e 6f 2c 20 30 2c 20 30 2c 20 30 2c 20  Recno, 0, 0, 0, 
77f0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  0);.    if( pTab
7800: 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
7810: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7820: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
7830: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
7840: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7850: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
7860: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
7870: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c  eAddOp(v, OP_Fil
7880: 65 43 6f 6c 75 6d 6e 2c 20 69 2c 20 30 2c 20 30  eColumn, i, 0, 0
7890: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
78a0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
78b0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
78c0: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 30 2c  , pTab->nCol, 0,
78d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
78e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
78f0: 50 5f 50 75 74 2c 20 30 2c 20 30 2c 20 30 2c 20  P_Put, 0, 0, 0, 
7900: 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c  0);.    for(i=1,
7910: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
7920: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
7930: 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29  Idx->pNext, i++)
7940: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  {.      if( pIdx
7950: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
7960: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
7970: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
7980: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
7990: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
79a0: 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; j<pIdx->nColum
79b0: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
79c0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
79d0: 28 76 2c 20 4f 50 5f 46 69 6c 65 43 6f 6c 75 6d  (v, OP_FileColum
79e0: 6e 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n, pIdx->aiColum
79f0: 6e 5b 6a 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  n[j], 0, 0, 0);.
7a00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
7a10: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7a20: 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79 2c 20   OP_MakeIdxKey, 
7a30: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 30  pIdx->nColumn, 0
7a40: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
7a50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7a60: 2c 20 4f 50 5f 50 75 74 49 64 78 2c 20 69 2c 20  , OP_PutIdx, i, 
7a70: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
7a80: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7a90: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
7aa0: 30 2c 20 61 64 64 72 2c 20 30 2c 20 30 29 3b 0a  0, addr, 0, 0);.
7ab0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
7ac0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  dOp(v, OP_Noop, 
7ad0: 30 2c 20 30 2c 20 30 2c 20 65 6e 64 29 3b 0a 20  0, 0, 0, end);. 
7ae0: 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67     if( (db->flag
7af0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61  s & SQLITE_InTra
7b00: 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ns)==0 ){.      
7b10: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7b20: 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c  v, OP_Commit, 0,
7b30: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
7b40: 0a 20 20 7d 0a 20 20 0a 63 6f 70 79 5f 63 6c 65  .  }.  .copy_cle
7b50: 61 6e 75 70 3a 0a 20 20 72 65 74 75 72 6e 3b 0a  anup:.  return;.
7b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6e  }../*.** The non
7b70: 2d 73 74 61 6e 64 61 72 64 20 56 41 43 55 55 4d  -standard VACUUM
7b80: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
7b90: 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65   to clean up the
7ba0: 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 63 6f   database,.** co
7bb0: 6c 6c 61 70 73 65 20 66 72 65 65 20 73 70 61 63  llapse free spac
7bc0: 65 2c 20 65 74 63 2e 20 20 49 74 20 69 73 20 6d  e, etc.  It is m
7bd0: 6f 64 65 6c 6c 65 64 20 61 66 74 65 72 20 74 68  odelled after th
7be0: 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64  e VACUUM command
7bf0: 0a 2a 2a 20 69 6e 20 50 6f 73 74 67 72 65 53 51  .** in PostgreSQ
7c00: 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  L..*/.void sqlit
7c10: 65 56 61 63 75 75 6d 28 50 61 72 73 65 20 2a 70  eVacuum(Parse *p
7c20: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
7c30: 61 62 6c 65 4e 61 6d 65 29 7b 0a 20 20 63 68 61  ableName){.  cha
7c40: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65  r *zName;.  Vdbe
7c50: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *v;.  sqlite *d
7c60: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7c70: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
7c80: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
7c90: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
7ca0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61 62  turn;.  if( pTab
7cb0: 6c 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e  leName ){.    zN
7cc0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c  ame = sqliteTabl
7cd0: 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  eNameFromToken(p
7ce0: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 7d 65  TableName);.  }e
7cf0: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
7d00: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e   0;.  }.  if( zN
7d10: 61 6d 65 20 26 26 20 73 71 6c 69 74 65 46 69 6e  ame && sqliteFin
7d20: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
7d30: 29 3d 3d 30 0a 20 20 20 20 26 26 20 73 71 6c 69  )==0.    && sqli
7d40: 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  teFindTable(db, 
7d50: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
7d60: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
7d70: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
7d80: 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  g, "no such tabl
7d90: 65 20 6f 72 20 69 6e 64 65 78 3a 20 22 2c 20 7a  e or index: ", z
7da0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  Name, 0);.    pP
7db0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
7dc0: 20 20 67 6f 74 6f 20 76 61 63 75 75 6d 5f 63 6c    goto vacuum_cl
7dd0: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76 20 3d  eanup;.  }.  v =
7de0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
7df0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
7e00: 3d 30 20 29 20 67 6f 74 6f 20 76 61 63 75 75 6d  =0 ) goto vacuum
7e10: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 66 28 20  _cleanup;.  if( 
7e20: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
7e30: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
7e40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
7e50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61  eAddOp(v, OP_Tra
7e60: 6e 73 61 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  nsaction, 0, 0, 
7e70: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
7e80: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71   zName ){.    sq
7e90: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7ea0: 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a 65 2c 20   OP_Reorganize, 
7eb0: 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  0, 0, zName, 0);
7ec0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
7ed0: 74 20 68 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  t h;.    Table *
7ee0: 70 54 61 62 3b 0a 20 20 20 20 49 6e 64 65 78 20  pTab;.    Index 
7ef0: 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 68  *pIdx;.    for(h
7f00: 3d 30 3b 20 68 3c 4e 5f 48 41 53 48 3b 20 68 2b  =0; h<N_HASH; h+
7f10: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 54  +){.      for(pT
7f20: 61 62 3d 64 62 2d 3e 61 70 54 62 6c 48 61 73 68  ab=db->apTblHash
7f30: 5b 68 5d 3b 20 70 54 61 62 3b 20 70 54 61 62 3d  [h]; pTab; pTab=
7f40: 70 54 61 62 2d 3e 70 48 61 73 68 29 7b 0a 20 20  pTab->pHash){.  
7f50: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7f60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 6f 72  AddOp(v, OP_Reor
7f70: 67 61 6e 69 7a 65 2c 20 30 2c 20 30 2c 20 70 54  ganize, 0, 0, pT
7f80: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
7f90: 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
7fa0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
7fb0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
7fc0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
7fd0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7fe0: 28 76 2c 20 4f 50 5f 52 65 6f 72 67 61 6e 69 7a  (v, OP_Reorganiz
7ff0: 65 2c 20 30 2c 20 30 2c 20 70 49 64 78 2d 3e 7a  e, 0, 0, pIdx->z
8000: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
8010: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8020: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 64 62 2d  }.  }.  if( (db-
8030: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
8040: 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20  InTrans)==0 ){. 
8050: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
8060: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d 6d 69 74 2c  Op(v, OP_Commit,
8070: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
8080: 7d 0a 0a 76 61 63 75 75 6d 5f 63 6c 65 61 6e 75  }..vacuum_cleanu
8090: 70 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  p:.  sqliteFree(
80a0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
80b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
80c0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
80d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 42 65 67  /.void sqliteBeg
80e0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  inTransaction(Pa
80f0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
8100: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64  sqlite *db;.  Vd
8110: 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
8120: 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
8130: 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
8140: 20 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65   db->pBe==0 ) re
8150: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
8160: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
8170: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
8180: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
8190: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
81a0: 49 54 45 5f 49 6e 54 72 61 6e 73 20 29 20 72 65  ITE_InTrans ) re
81b0: 74 75 72 6e 3b 0a 20 20 76 20 3d 20 73 71 6c 69  turn;.  v = sqli
81c0: 74 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65  teGetVdbe(pParse
81d0: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
81e0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
81f0: 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
8200: 69 6f 6e 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29  ion, 1, 0, 0, 0)
8210: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
8220: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 54 72  s |= SQLITE_InTr
8230: 61 6e 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ans;.}../*.** Co
8240: 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
8250: 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
8260: 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  eCommitTransacti
8270: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
8280: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
8290: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
82a0: 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
82b0: 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
82c0: 3d 30 20 7c 7c 20 64 62 2d 3e 70 42 65 3d 3d 30  =0 || db->pBe==0
82d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
82e0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
82f0: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
8300: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
8310: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
8320: 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e   & SQLITE_InTran
8330: 73 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  s)==0 ) return;.
8340: 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
8350: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
8360: 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
8370: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
8380: 50 5f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 2c 20  P_Commit, 0, 0, 
8390: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  0, 0);.  }.  db-
83a0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
83b0: 45 5f 49 6e 54 72 61 6e 73 3b 0a 7d 0a 0a 2f 2a  E_InTrans;.}../*
83c0: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74  .** Rollback a t
83d0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
83e0: 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63  id sqliteRollbac
83f0: 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  kTransaction(Par
8400: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
8410: 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62  qlite *db;.  Vdb
8420: 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61  e *v;..  if( pPa
8430: 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
8440: 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
8450: 64 62 2d 3e 70 42 65 3d 3d 30 20 29 20 72 65 74  db->pBe==0 ) ret
8460: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
8470: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
8480: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
8490: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
84a0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
84b0: 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
84c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d 20  ) return;.  v = 
84d0: 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50  sqliteGetVdbe(pP
84e0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
84f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
8500: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c 6c  AddOp(v, OP_Roll
8510: 62 61 63 6b 2c 20 30 2c 20 30 2c 20 30 2c 20 30  back, 0, 0, 0, 0
8520: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
8530: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
8540: 54 72 61 6e 73 3b 0a 7d 0a                       Trans;.}.