/ Hex Artifact Content
Login

Artifact 82e7dfdf900428d706ab4f50e72732ce9110767a:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 31 39 39 39 2c 20 32 30 30 30 20 44  (c) 1999, 2000 D
0020: 2e 20 52 69 63 68 61 72 64 20 48 69 70 70 0a 2a  . Richard Hipp.*
0030: 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61  *.** This progra
0040: 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61  m is free softwa
0050: 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69  re; you can redi
0060: 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f  stribute it and/
0070: 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20  or.** modify it 
0080: 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20  under the terms 
0090: 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72  of the GNU Gener
00a0: 61 6c 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63  al Public.** Lic
00b0: 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 65  ense as publishe
00c0: 64 20 62 79 20 74 68 65 20 46 72 65 65 20 53 6f  d by the Free So
00d0: 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f  ftware Foundatio
00e0: 6e 3b 20 65 69 74 68 65 72 0a 2a 2a 20 76 65 72  n; either.** ver
00f0: 73 69 6f 6e 20 32 20 6f 66 20 74 68 65 20 4c 69  sion 2 of the Li
0100: 63 65 6e 73 65 2c 20 6f 72 20 28 61 74 20 79 6f  cense, or (at yo
0110: 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c  ur option) any l
0120: 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 2a 2a  ater version..**
0130: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0140: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
0150: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
0160: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
0170: 75 6c 2c 0a 2a 2a 20 62 75 74 20 57 49 54 48 4f  ul,.** but WITHO
0180: 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b  UT ANY WARRANTY;
0190: 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68   without even th
01a0: 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e  e implied warran
01b0: 74 79 20 6f 66 0a 2a 2a 20 4d 45 52 43 48 41 4e  ty of.** MERCHAN
01c0: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
01d0: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
01e0: 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53  ULAR PURPOSE.  S
01f0: 65 65 20 74 68 65 20 47 4e 55 0a 2a 2a 20 47 65  ee the GNU.** Ge
0200: 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63  neral Public Lic
0210: 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65  ense for more de
0220: 74 61 69 6c 73 2e 0a 2a 2a 20 0a 2a 2a 20 59 6f  tails..** .** Yo
0230: 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65  u should have re
0240: 63 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66  ceived a copy of
0250: 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c   the GNU General
0260: 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e   Public.** Licen
0270: 73 65 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  se along with th
0280: 69 73 20 6c 69 62 72 61 72 79 3b 20 69 66 20 6e  is library; if n
0290: 6f 74 2c 20 77 72 69 74 65 20 74 6f 20 74 68 65  ot, write to the
02a0: 0a 2a 2a 20 46 72 65 65 20 53 6f 66 74 77 61 72  .** Free Softwar
02b0: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e  e Foundation, In
02c0: 63 2e 2c 20 35 39 20 54 65 6d 70 6c 65 20 50 6c  c., 59 Temple Pl
02d0: 61 63 65 20 2d 20 53 75 69 74 65 20 33 33 30 2c  ace - Suite 330,
02e0: 0a 2a 2a 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 20  .** Boston, MA  
02f0: 30 32 31 31 31 2d 31 33 30 37 2c 20 55 53 41 2e  02111-1307, USA.
0300: 0a 2a 2a 0a 2a 2a 20 41 75 74 68 6f 72 20 63 6f  .**.** Author co
0310: 6e 74 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntact informatio
0320: 6e 3a 0a 2a 2a 20 20 20 64 72 68 40 68 77 61 63  n:.**   drh@hwac
0330: 69 2e 63 6f 6d 0a 2a 2a 20 20 20 68 74 74 70 3a  i.com.**   http:
0340: 2f 2f 77 77 77 2e 68 77 61 63 69 2e 63 6f 6d 2f  //www.hwaci.com/
0350: 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  drh/.**.********
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
03b0: 6f 6e 74 61 69 6e 73 20 43 20 63 6f 64 65 20 72  ontains C code r
03c0: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 61 72 65  outines that are
03d0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
03e0: 61 72 73 65 72 0a 2a 2a 20 77 68 65 6e 20 73 79  arser.** when sy
03f0: 6e 74 61 78 20 72 75 6c 65 73 20 61 72 65 20 72  ntax rules are r
0400: 65 64 75 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 24 49  educed..**.** $I
0410: 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20 31 2e 38  d: build.c,v 1.8
0420: 20 32 30 30 30 2f 30 35 2f 33 30 20 31 37 3a 33   2000/05/30 17:3
0430: 30 3a 33 36 20 64 72 68 20 45 78 70 20 24 0a 2a  0:36 drh Exp $.*
0440: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0450: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73  called after a s
0480: 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d  ingle SQL statem
0490: 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ent has been.** 
04a0: 70 61 72 73 65 64 20 61 6e 64 20 77 65 20 77 61  parsed and we wa
04b0: 6e 74 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  nt to execute th
04c0: 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  e code to implem
04d0: 65 6e 74 20 0a 2a 2a 20 74 68 65 20 73 74 61 74  ent .** the stat
04e0: 65 6d 65 6e 74 2e 20 20 50 72 69 6f 72 20 61 63  ement.  Prior ac
04f0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 73 68  tion routines sh
0500: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
0510: 79 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64  y.** constructed
0520: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 64 6f   VDBE code to do
0530: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 65   the work of the
0540: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
0550: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0560: 6a 75 73 74 20 68 61 73 20 74 6f 20 65 78 65 63  just has to exec
0570: 75 74 65 20 74 68 65 20 56 44 42 45 20 63 6f 64  ute the VDBE cod
0580: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  e..**.** Note th
0590: 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  at if an error o
05a0: 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67 68  ccurred, it migh
05b0: 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
05c0: 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f  at.** no VDBE co
05d0: 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  de was generated
05e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
05f0: 45 78 65 63 28 50 61 72 73 65 20 2a 70 50 61 72  Exec(Parse *pPar
0600: 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
0610: 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
0620: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
0630: 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ain ){.      sql
0640: 69 74 65 56 64 62 65 4c 69 73 74 28 70 50 61 72  iteVdbeList(pPar
0650: 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73  se->pVdbe, pPars
0660: 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c 20 70 50  e->xCallback, pP
0670: 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a 20 20 20  arse->pArg, .   
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0690: 20 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d    &pParse->zErrM
06a0: 73 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  sg);.    }else{.
06b0: 20 20 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63        FILE *trac
06c0: 65 20 3d 20 28 70 50 61 72 73 65 2d 3e 64 62 2d  e = (pParse->db-
06d0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
06e0: 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20  VdbeTrace)!=0 ? 
06f0: 73 74 64 65 72 72 20 3a 20 30 3b 0a 20 20 20 20  stderr : 0;.    
0700: 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63    sqliteVdbeTrac
0710: 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
0720: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 20 20 73   trace);.      s
0730: 71 6c 69 74 65 56 64 62 65 45 78 65 63 28 70 50  qliteVdbeExec(pP
0740: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61  arse->pVdbe, pPa
0750: 72 73 65 2d 3e 78 43 61 6c 6c 62 61 63 6b 2c 20  rse->xCallback, 
0760: 70 50 61 72 73 65 2d 3e 70 41 72 67 2c 20 0a 20  pParse->pArg, . 
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0780: 20 20 20 20 26 70 50 61 72 73 65 2d 3e 7a 45 72      &pParse->zEr
0790: 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rMsg);.    }.   
07a0: 20 73 71 6c 69 74 65 56 64 62 65 44 65 6c 65 74   sqliteVdbeDelet
07b0: 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 29  e(pParse->pVdbe)
07c0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56  ;.    pParse->pV
07d0: 64 62 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  dbe = 0;.  }.}..
07e0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
07f0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
0800: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
0810: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
0820: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
0830: 65 45 78 70 72 28 69 6e 74 20 6f 70 2c 20 45 78  eExpr(int op, Ex
0840: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
0850: 2a 70 52 69 67 68 74 2c 20 54 6f 6b 65 6e 20 2a  *pRight, Token *
0860: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
0870: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
0880: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
0890: 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20  zeof(Expr) );.  
08a0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
08b0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
08c0: 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 4e 65 77 2d  op = op;.  pNew-
08d0: 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a  >pLeft = pLeft;.
08e0: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
08f0: 20 70 52 69 67 68 74 3b 0a 20 20 69 66 28 20 70   pRight;.  if( p
0900: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 70 4e 65  Token ){.    pNe
0910: 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b  w->token = *pTok
0920: 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  en;.  }else{.   
0930: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d   pNew->token.z =
0940: 20 22 22 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74   "";.    pNew->t
0950: 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 7d 0a  oken.n = 0;.  }.
0960: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
0970: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
0980: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
0990: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75  on node for a fu
09a0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74  nction with mult
09b0: 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iple.** argument
09c0: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
09d0: 74 65 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 45  teExprFunction(E
09e0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
09f0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
0a00: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
0a10: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
0a20: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72  loc( sizeof(Expr
0a30: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
0a40: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0a50: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
0a60: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
0a70: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
0a80: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
0a90: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20      pNew->token 
0aa0: 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c  = *pToken;.  }el
0ab0: 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f  se{.    pNew->to
0ac0: 6b 65 6e 2e 7a 20 3d 20 22 22 3b 0a 20 20 20 20  ken.z = "";.    
0ad0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  pNew->token.n = 
0ae0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
0af0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pNew;.}../*.** R
0b00: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
0b10: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
0b20: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
0b30: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 45  liteExprDelete(E
0b40: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
0b50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
0b60: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 20 73  if( p->pLeft ) s
0b70: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
0b80: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
0b90: 20 70 2d 3e 70 52 69 67 68 74 20 29 20 73 71 6c   p->pRight ) sql
0ba0: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 2d  iteExprDelete(p-
0bb0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69  >pRight);.  sqli
0bc0: 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  teFree(p);.}../*
0bd0: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
0be0: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
0bf0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
0c00: 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74 20  s the.** format 
0c10: 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
0c20: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 67  database table g
0c30: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  iven the name.**
0c40: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e 20   of that table. 
0c50: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
0c60: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 54 61  not found..*/.Ta
0c70: 62 6c 65 20 2a 73 71 6c 69 74 65 46 69 6e 64 54  ble *sqliteFindT
0c80: 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  able(sqlite *db,
0c90: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
0ca0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
0cb0: 20 20 69 6e 74 20 68 3b 0a 0a 20 20 68 20 3d 20    int h;..  h = 
0cc0: 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61 73 65  sqliteHashNoCase
0cd0: 28 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e 5f 48  (zName, 0) % N_H
0ce0: 41 53 48 3b 0a 20 20 66 6f 72 28 70 54 61 62 6c  ASH;.  for(pTabl
0cf0: 65 3d 64 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b  e=db->apTblHash[
0d00: 68 5d 3b 20 70 54 61 62 6c 65 3b 20 70 54 61 62  h]; pTable; pTab
0d10: 6c 65 3d 70 54 61 62 6c 65 2d 3e 70 48 61 73 68  le=pTable->pHash
0d20: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
0d30: 65 53 74 72 49 43 6d 70 28 70 54 61 62 6c 65 2d  eStrICmp(pTable-
0d40: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  >zName, zName)==
0d50: 30 20 29 20 72 65 74 75 72 6e 20 70 54 61 62 6c  0 ) return pTabl
0d60: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
0d70: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  0;.}../*.** Loca
0d80: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0d90: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0da0: 64 65 73 63 72 69 62 65 73 20 74 68 65 0a 2a 2a  describes the.**
0db0: 20 66 6f 72 6d 61 74 20 6f 66 20 61 20 70 61 72   format of a par
0dc0: 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 61  ticular index ta
0dd0: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
0de0: 6d 65 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61  me.** of that ta
0df0: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
0e00: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
0e10: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
0e20: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
0e30: 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61 6d   *db, char *zNam
0e40: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a  e){.  Index *p;.
0e50: 20 20 69 6e 74 20 68 3b 0a 0a 20 20 68 20 3d 20    int h;..  h = 
0e60: 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61 73 65  sqliteHashNoCase
0e70: 28 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e 5f 48  (zName, 0) % N_H
0e80: 41 53 48 3b 0a 20 20 66 6f 72 28 70 3d 64 62 2d  ASH;.  for(p=db-
0e90: 3e 61 70 49 64 78 48 61 73 68 5b 68 5d 3b 20 70  >apIdxHash[h]; p
0ea0: 3b 20 70 3d 70 2d 3e 70 48 61 73 68 29 7b 0a 20  ; p=p->pHash){. 
0eb0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
0ec0: 49 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  ICmp(p->zName, z
0ed0: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
0ee0: 6e 20 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n p;.  }.  retur
0ef0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
0f00: 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69  move the given i
0f10: 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e  ndex from the in
0f20: 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20  dex hash table, 
0f30: 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20  and free.** its 
0f40: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
0f50: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64  s..**.** The ind
0f60: 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ex is removed fr
0f70: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
0f80: 68 61 73 68 20 74 61 62 6c 65 2c 20 62 75 74 20  hash table, but 
0f90: 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 6e 6c  it is.** not unl
0fa0: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 74  inked from the t
0fb0: 61 62 6c 65 20 74 68 61 74 20 69 73 20 62 65 69  able that is bei
0fc0: 6e 67 20 69 6e 64 65 78 65 64 2e 20 20 55 6e 6c  ng indexed.  Unl
0fd0: 69 6e 6b 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74  inking.** from t
0fe0: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
0ff0: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
1000: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
1010: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1020: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
1030: 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65  sqlite *db, Inde
1040: 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
1050: 74 20 68 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  t h;.  if( pInde
1060: 78 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  x->zName ){.    
1070: 68 20 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 6f  h = sqliteHashNo
1080: 43 61 73 65 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  Case(pIndex->zNa
1090: 6d 65 2c 20 30 29 20 25 20 4e 5f 48 41 53 48 3b  me, 0) % N_HASH;
10a0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 70 49  .    if( db->apI
10b0: 64 78 48 61 73 68 5b 68 5d 3d 3d 70 49 6e 64 65  dxHash[h]==pInde
10c0: 78 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61  x ){.      db->a
10d0: 70 49 64 78 48 61 73 68 5b 68 5d 20 3d 20 70 49  pIdxHash[h] = pI
10e0: 6e 64 65 78 2d 3e 70 48 61 73 68 3b 0a 20 20 20  ndex->pHash;.   
10f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
1100: 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  dex *p;.      fo
1110: 72 28 70 3d 64 62 2d 3e 61 70 49 64 78 48 61 73  r(p=db->apIdxHas
1120: 68 5b 68 5d 3b 20 70 20 26 26 20 70 2d 3e 70 48  h[h]; p && p->pH
1130: 61 73 68 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70  ash!=pIndex; p=p
1140: 2d 3e 70 48 61 73 68 29 7b 7d 0a 20 20 20 20 20  ->pHash){}.     
1150: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 48 61   if( p && p->pHa
1160: 73 68 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  sh==pIndex ){.  
1170: 20 20 20 20 20 20 70 2d 3e 70 48 61 73 68 20 3d        p->pHash =
1180: 20 70 49 6e 64 65 78 2d 3e 70 48 61 73 68 3b 0a   pIndex->pHash;.
1190: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11a0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
11b0: 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
11c0: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
11d0: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
11e0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
11f0: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
1200: 74 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  table.  No chang
1210: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
1220: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
1230: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
1240: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
1250: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
1260: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
1270: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
1280: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
1290: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
12a0: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  e hash table.  B
12b0: 75 74 20 64 6f 65 73 20 69 74 20 64 65 73 74 72  ut does it destr
12c0: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
12d0: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
12e0: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
12f0: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
1300: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1310: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
1320: 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  te *db, Table *p
1330: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
1340: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1350: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  , *pNext;.  if( 
1360: 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75  pTable==0 ) retu
1370: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1380: 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
1390: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61  ++){.    if( pTa
13a0: 62 6c 65 2d 3e 61 7a 43 6f 6c 5b 69 5d 20 29 20  ble->azCol[i] ) 
13b0: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
13c0: 65 2d 3e 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  e->azCol[i]);.  
13d0: 7d 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d  }.  for(pIndex =
13e0: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b   pTable->pIndex;
13f0: 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
1400: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
1410: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
1420: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c  t;.    sqliteDel
1430: 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  eteIndex(db, pIn
1440: 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  dex);.  }.  sqli
1450: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
1460: 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 46  zCol);.  sqliteF
1470: 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  ree(pTable);.}..
1480: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
1490: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 75 73  the name of a us
14a0: 65 72 20 74 61 62 6c 65 20 66 72 6f 6d 20 61 20  er table from a 
14b0: 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  token..**.** Spa
14c0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  ce to hold the n
14d0: 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ame is obtained 
14e0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
14f0: 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20  c() and must.** 
1500: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
1510: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1520: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1530: 20 2a 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d   *sqliteTableNam
1540: 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e  eFromToken(Token
1550: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
1560: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 73   *zName = 0;.  s
1570: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
1580: 26 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a  &zName, pName->z
1590: 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a  , pName->n, 0);.
15a0: 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65 28    sqliteDequote(
15b0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
15c0: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
15d0: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
15e0: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
15f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
1600: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
1610: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
1620: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
1630: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
1640: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
1650: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
1660: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
1670: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
1680: 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65 28  qliteStartTable(
1690: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
16a0: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 54 6f  oken *pStart, To
16b0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54  ken *pName){.  T
16c0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
16d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20  char *zName;..  
16e0: 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f  pParse->sFirstTo
16f0: 6b 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a 20  ken = *pStart;. 
1700: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54   zName = sqliteT
1710: 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ableNameFromToke
1720: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 70 54 61 62  n(pName);.  pTab
1730: 6c 65 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54  le = sqliteFindT
1740: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
1750: 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70   zName);.  if( p
1760: 54 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20  Table!=0 ){.    
1770: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
1780: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
1790: 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 30 2c 20  g, "table ", 0, 
17a0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
17b0: 3e 6e 2c 0a 20 20 20 20 20 20 20 20 22 20 61 6c  >n,.        " al
17c0: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 30  ready exists", 0
17d0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
17e0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
17f0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
1800: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1810: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 46 69 6e  .  if( sqliteFin
1820: 64 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  dIndex(pParse->d
1830: 62 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  b, zName) ){.   
1840: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
1850: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
1860: 67 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  g, "there is alr
1870: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
1880: 6d 65 64 20 22 2c 20 0a 20 20 20 20 20 20 20 7a  med ", .       z
1890: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
18a0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
18b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
18c0: 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r++;.    return;
18d0: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20  .  }.  pTable = 
18e0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
18f0: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
1900: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
1910: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
1920: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
1930: 45 72 72 4d 73 67 2c 20 22 6f 75 74 20 6f 66 20  ErrMsg, "out of 
1940: 6d 65 6d 6f 72 79 22 2c 20 30 29 3b 0a 20 20 20  memory", 0);.   
1950: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
1960: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1970: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
1980: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
1990: 6c 65 2d 3e 70 48 61 73 68 20 3d 20 30 3b 0a 20  le->pHash = 0;. 
19a0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
19b0: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 7a 43  0;.  pTable->azC
19c0: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
19d0: 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  ->pIndex = 0;.  
19e0: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
19f0: 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 44 65  Table ) sqliteDe
1a00: 6c 65 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  leteTable(pParse
1a10: 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e  ->db, pParse->pN
1a20: 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72  ewTable);.  pPar
1a30: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
1a40: 70 54 61 62 6c 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pTable;.}../*.**
1a50: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
1a60: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
1a70: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
1a80: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2f 0a 76  onstructed..*/.v
1a90: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c  oid sqliteAddCol
1aa0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
1ab0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
1ac0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
1ad0: 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28  char **pz;.  if(
1ae0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
1af0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
1b00: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 70 2d 3e  turn;.  if( (p->
1b10: 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29  nCol & 0x7)==0 )
1b20: 7b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 20 3d  {.    p->azCol =
1b30: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20   sqliteRealloc( 
1b40: 70 2d 3e 61 7a 43 6f 6c 2c 20 28 70 2d 3e 6e 43  p->azCol, (p->nC
1b50: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
1b60: 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a  azCol[0]));.  }.
1b70: 20 20 69 66 28 20 70 2d 3e 61 7a 43 6f 6c 3d 3d    if( p->azCol==
1b80: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  0 ){.    p->nCol
1b90: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1ba0: 3b 0a 20 20 7d 0a 20 20 70 7a 20 3d 20 26 70 2d  ;.  }.  pz = &p-
1bb0: 3e 61 7a 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2b 2b  >azCol[p->nCol++
1bc0: 5d 3b 0a 20 20 2a 70 7a 20 3d 20 30 3b 0a 20 20  ];.  *pz = 0;.  
1bd0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
1be0: 28 70 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  (pz, pName->z, p
1bf0: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 73  Name->n, 0);.  s
1c00: 71 6c 69 74 65 44 65 71 75 6f 74 65 28 2a 70 7a  qliteDequote(*pz
1c10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1c20: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1c30: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
1c40: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
1c50: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
1c60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1c70: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
1c80: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
1c90: 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
1ca0: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
1cb0: 74 61 62 6c 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  tables.  .**.** 
1cc0: 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  An entry for the
1cd0: 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69   table is made i
1ce0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  n the master tab
1cf0: 6c 65 2c 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 69  le, unless .** i
1d00: 6e 69 74 46 6c 61 67 3d 3d 31 2e 20 20 57 68 65  nitFlag==1.  Whe
1d10: 6e 20 69 6e 69 74 46 6c 61 67 3d 3d 31 2c 20 69  n initFlag==1, i
1d20: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
1d30: 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 6d 61  eading the.** ma
1d40: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
1d50: 73 65 20 77 65 20 6a 75 73 74 20 63 6f 6e 6e 65  se we just conne
1d60: 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  cted to the data
1d70: 62 61 73 65 2c 20 73 6f 20 0a 2a 2a 20 74 68 65  base, so .** the
1d80: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20   entry for this 
1d90: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
1da0: 69 73 74 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ists in the mast
1db0: 65 72 20 74 61 62 6c 65 2e 0a 2a 2a 20 57 65 20  er table..** We 
1dc0: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63  do not want to c
1dd0: 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a  reate it again..
1de0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 6e  */.void sqliteEn
1df0: 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  dTable(Parse *pP
1e00: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e  arse, Token *pEn
1e10: 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  d){.  Table *p;.
1e20: 20 20 69 6e 74 20 68 3b 0a 0a 20 20 69 66 28 20    int h;..  if( 
1e30: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
1e40: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 41 64 64  eturn;..  /* Add
1e50: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
1e60: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
1e70: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
1e80: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a  e database.  */.
1e90: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
1ea0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d 30  e->pNewTable)!=0
1eb0: 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c   && pParse->expl
1ec0: 61 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 68 20  ain==0 ){.    h 
1ed0: 3d 20 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61  = sqliteHashNoCa
1ee0: 73 65 28 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20  se(p->zName, 0) 
1ef0: 25 20 4e 5f 48 41 53 48 3b 0a 20 20 20 20 70 2d  % N_HASH;.    p-
1f00: 3e 70 48 61 73 68 20 3d 20 70 50 61 72 73 65 2d  >pHash = pParse-
1f10: 3e 64 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b 68  >db->apTblHash[h
1f20: 5d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ];.    pParse->d
1f30: 62 2d 3e 61 70 54 62 6c 48 61 73 68 5b 68 5d 20  b->apTblHash[h] 
1f40: 3d 20 70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = p;.    pParse-
1f50: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
1f60: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74    }..  /* If not
1f70: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74   initializing, t
1f80: 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 74  hen create the t
1f90: 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  able on disk..  
1fa0: 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  */.  if( !pParse
1fb0: 2d 3e 69 6e 69 74 46 6c 61 67 20 29 7b 0a 20 20  ->initFlag ){.  
1fc0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
1fd0: 61 64 64 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20  addTable[] = {. 
1fe0: 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20       { OP_Open, 
1ff0: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 4d 41 53         0, 0, MAS
2000: 54 45 52 5f 4e 41 4d 45 20 7d 2c 0a 20 20 20 20  TER_NAME },.    
2010: 20 20 7b 20 4f 50 5f 4e 65 77 2c 20 20 20 20 20    { OP_New,     
2020: 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 0a 20 20      0, 0, 0},.  
2030: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
2040: 20 20 20 20 20 20 30 2c 20 30 2c 20 22 74 61 62        0, 0, "tab
2050: 6c 65 22 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  le"     },.     
2060: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
2070: 20 20 20 30 2c 20 30 2c 20 30 7d 2c 20 20 20 20     0, 0, 0},    
2080: 20 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a          /* 3 */.
2090: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
20a0: 67 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d  g,      0, 0, 0}
20b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
20c0: 34 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  4 */.      { OP_
20d0: 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20  String,      0, 
20e0: 30 2c 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20  0, 0},          
20f0: 20 20 2f 2a 20 35 20 2a 2f 0a 20 20 20 20 20 20    /* 5 */.      
2100: 7b 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  { OP_MakeRecord,
2110: 20 20 34 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20    4, 0, 0},.    
2120: 20 20 7b 20 4f 50 5f 50 75 74 2c 20 20 20 20 20    { OP_Put,     
2130: 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 0a 20 20      0, 0, 0},.  
2140: 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20      { OP_Close, 
2150: 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 0a        0, 0, 0},.
2160: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e      };.    int n
2170: 2c 20 62 61 73 65 3b 0a 20 20 20 20 56 64 62 65  , base;.    Vdbe
2180: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2190: 64 62 65 3b 0a 0a 20 20 20 20 69 66 28 20 76 3d  dbe;..    if( v=
21a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =0 ){.      v = 
21b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
21c0: 73 71 6c 69 74 65 56 64 62 65 43 72 65 61 74 65  sqliteVdbeCreate
21d0: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 42 65  (pParse->db->pBe
21e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
21f0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
2200: 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 70 45 6e      n = (int)pEn
2210: 64 2d 3e 7a 20 2d 20 28 69 6e 74 29 70 50 61 72  d->z - (int)pPar
2220: 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e  se->sFirstToken.
2230: 7a 20 2b 20 31 3b 0a 20 20 20 20 62 61 73 65 20  z + 1;.    base 
2240: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
2250: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
2260: 7a 65 28 61 64 64 54 61 62 6c 65 29 2c 20 61 64  ze(addTable), ad
2270: 64 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c  dTable);.    sql
2280: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
2290: 76 2c 20 62 61 73 65 2b 33 2c 20 70 2d 3e 7a 4e  v, base+3, p->zN
22a0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
22b0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
22c0: 76 2c 20 62 61 73 65 2b 34 2c 20 70 2d 3e 7a 4e  v, base+4, p->zN
22d0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
22e0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
22f0: 76 2c 20 62 61 73 65 2b 35 2c 20 70 50 61 72 73  v, base+5, pPars
2300: 65 2d 3e 73 46 69 72 73 74 54 6f 6b 65 6e 2e 7a  e->sFirstToken.z
2310: 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , n);.  }.}../*.
2320: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
2330: 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62 6c  , look up a tabl
2340: 65 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d 65  e with that name
2350: 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c  .  If not found,
2360: 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72 72   leave.** an err
2370: 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  or for the parse
2380: 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20 72 65  r to find and re
2390: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
23a0: 61 74 69 63 20 54 61 62 6c 65 20 2a 73 71 6c 69  atic Table *sqli
23b0: 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  teTableFromToken
23c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23d0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20  Token *pTok){.  
23e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
23f0: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f  liteTableNameFro
2400: 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20  mToken(pTok);.  
2410: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
2420: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50  liteFindTable(pP
2430: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  arse->db, zName)
2440: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
2450: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61  Name);.  if( pTa
2460: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
2470: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
2480: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
2490: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22  no such table: "
24a0: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70 54  , 0, .        pT
24b0: 6f 6b 2d 3e 7a 2c 20 70 54 6f 6b 2d 3e 6e 2c 20  ok->z, pTok->n, 
24c0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
24d0: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
24e0: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
24f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2500: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
2510: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
2520: 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
2530: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
2540: 69 74 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72  iteDropTable(Par
2550: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
2560: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62  n *pName){.  Tab
2570: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 69 6e  le *pTable;.  in
2580: 74 20 68 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  t h;.  Vdbe *v;.
2590: 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20 70    int base;..  p
25a0: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 54 61  Table = sqliteTa
25b0: 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  bleFromToken(pPa
25c0: 72 73 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  rse, pName);.  i
25d0: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72  f( pTable==0 ) r
25e0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 54 61  eturn;.  if( pTa
25f0: 62 6c 65 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ble->readOnly ){
2600: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
2610: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
2620: 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22 2c  rrMsg, "table ",
2630: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20   pTable->zName, 
2640: 0a 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f  .       " may no
2650: 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30  t be dropped", 0
2660: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
2670: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
2680: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  n;.  }..  /* Gen
2690: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
26a0: 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 61  move the table a
26b0: 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  nd its reference
26c0: 20 69 6e 20 73 79 73 5f 6d 61 73 74 65 72 20 2a   in sys_master *
26d0: 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  /.  v = pParse->
26e0: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
26f0: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
2700: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
2710: 69 74 65 56 64 62 65 43 72 65 61 74 65 28 70 50  iteVdbeCreate(pP
2720: 61 72 73 65 2d 3e 64 62 2d 3e 70 42 65 29 3b 0a  arse->db->pBe);.
2730: 20 20 7d 0a 20 20 69 66 28 20 76 20 29 7b 0a 20    }.  if( v ){. 
2740: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
2750: 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b   dropTable[] = {
2760: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e  .      { OP_Open
2770: 2c 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20  ,       0, 0,   
2780: 20 20 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45       MASTER_NAME
2790: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4c   },.      { OP_L
27a0: 69 73 74 4f 70 65 6e 2c 20 20 20 30 2c 20 30 2c  istOpen,   0, 0,
27b0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
27c0: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
27d0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
27e0: 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20  0}, /* 2 */.    
27f0: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
2800: 20 20 20 30 2c 20 41 44 44 52 28 31 30 29 2c 20     0, ADDR(10), 
2810: 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20  0}, /* 3 */.    
2820: 20 20 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20    { OP_Dup,     
2830: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
2840: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 46  0},.      { OP_F
2850: 69 65 6c 64 2c 20 20 20 20 20 20 30 2c 20 32 2c  ield,      0, 2,
2860: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
2870: 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20    { OP_Ne,      
2880: 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20     0, ADDR(3),  
2890: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4b  0},.      { OP_K
28a0: 65 79 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c  ey,        0, 0,
28b0: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
28c0: 20 20 7b 20 4f 50 5f 4c 69 73 74 57 72 69 74 65    { OP_ListWrite
28d0: 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  ,  0, 0,        
28e0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47  0},.      { OP_G
28f0: 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44  oto,       0, AD
2900: 44 52 28 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20  DR(3),  0},.    
2910: 20 20 7b 20 4f 50 5f 4c 69 73 74 52 65 77 69 6e    { OP_ListRewin
2920: 64 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  d, 0, 0,        
2930: 30 7d 2c 20 2f 2a 20 31 30 20 2a 2f 0a 20 20 20  0}, /* 10 */.   
2940: 20 20 20 7b 20 4f 50 5f 4c 69 73 74 52 65 61 64     { OP_ListRead
2950: 2c 20 20 20 30 2c 20 41 44 44 52 28 31 34 29 2c  ,   0, ADDR(14),
2960: 20 30 7d 2c 20 2f 2a 20 31 31 20 2a 2f 0a 20 20   0}, /* 11 */.  
2970: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
2980: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
2990: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
29a0: 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20  _Goto,       0, 
29b0: 41 44 44 52 28 31 31 29 2c 20 30 7d 2c 0a 20 20  ADDR(11), 0},.  
29c0: 20 20 20 20 7b 20 4f 50 5f 44 65 73 74 72 6f 79      { OP_Destroy
29d0: 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ,    0, 0,      
29e0: 20 20 30 7d 2c 20 2f 2a 20 31 34 20 2a 2f 0a 20    0}, /* 14 */. 
29f0: 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c       { OP_Close,
2a00: 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20        0, 0,     
2a10: 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20     0},.    };.  
2a20: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
2a30: 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
2a40: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
2a50: 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54   ArraySize(dropT
2a60: 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65  able), dropTable
2a70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
2a80: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
2a90: 65 2b 32 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  e+2, pTable->zNa
2aa0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
2ab0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
2ac0: 2c 20 62 61 73 65 2b 31 34 2c 20 70 54 61 62 6c  , base+14, pTabl
2ad0: 65 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  e->zName, 0);.  
2ae0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c    for(pIdx=pTabl
2af0: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  e->pIndex; pIdx;
2b00: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
2b10: 74 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t){.      sqlite
2b20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2b30: 44 65 73 74 72 6f 79 2c 20 30 2c 20 30 2c 20 70  Destroy, 0, 0, p
2b40: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Idx->zName, 0);.
2b50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2b60: 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  Remove the table
2b70: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 66   structure and f
2b80: 72 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 2e 0a  ree its memory..
2b90: 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
2ba0: 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51 4c 20  ion: if the SQL 
2bb0: 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61 6e 20  statement began 
2bc0: 77 69 74 68 20 74 68 65 20 45 58 50 4c 41 49 4e  with the EXPLAIN
2bd0: 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74   keyword,.  ** t
2be0: 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 61  hen no changes a
2bf0: 72 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  re made..  */.  
2c00: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70  if( !pParse->exp
2c10: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 68 20 3d 20  lain ){.    h = 
2c20: 73 71 6c 69 74 65 48 61 73 68 4e 6f 43 61 73 65  sqliteHashNoCase
2c30: 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20  (pTable->zName, 
2c40: 30 29 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20 20  0) % N_HASH;.   
2c50: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
2c60: 3e 61 70 54 62 6c 48 61 73 68 5b 68 5d 3d 3d 70  >apTblHash[h]==p
2c70: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70  Table ){.      p
2c80: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 70 54 62 6c  Parse->db->apTbl
2c90: 48 61 73 68 5b 68 5d 20 3d 20 70 54 61 62 6c 65  Hash[h] = pTable
2ca0: 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 7d 65 6c  ->pHash;.    }el
2cb0: 73 65 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  se{.      Table 
2cc0: 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  *p;.      for(p=
2cd0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 70 54 62  pParse->db->apTb
2ce0: 6c 48 61 73 68 5b 68 5d 3b 20 70 20 26 26 20 70  lHash[h]; p && p
2cf0: 2d 3e 70 48 61 73 68 21 3d 70 54 61 62 6c 65 3b  ->pHash!=pTable;
2d00: 20 70 3d 70 2d 3e 70 48 61 73 68 29 7b 7d 0a 20   p=p->pHash){}. 
2d10: 20 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d       if( p && p-
2d20: 3e 70 48 61 73 68 3d 3d 70 54 61 62 6c 65 20 29  >pHash==pTable )
2d30: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 48 61  {.        p->pHa
2d40: 73 68 20 3d 20 70 54 61 62 6c 65 2d 3e 70 48 61  sh = pTable->pHa
2d50: 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sh;.      }.    
2d60: 7d 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  }.    sqliteDele
2d70: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  teTable(pParse->
2d80: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d  db, pTable);.  }
2d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2da0: 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
2db0: 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
2dc0: 70 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61  pIndex is the na
2dd0: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
2de0: 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69  .** and pTable i
2df0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
2e00: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
2e10: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
2e20: 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
2e30: 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
2e40: 61 72 79 20 6b 65 79 2e 20 20 49 6e 20 74 68 61  ary key.  In tha
2e50: 74 20 63 61 73 65 2c 20 75 73 65 20 70 50 61 72  t case, use pPar
2e60: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 61 73  se->pNewTable as
2e70: 20 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 74   the .** table t
2e80: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a  o be indexed..**
2e90: 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
2ea0: 69 73 74 20 6f 66 20 66 69 65 6c 64 73 20 74 6f  ist of fields to
2eb0: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
2ec0: 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
2ed0: 20 69 66 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20   if the.** most 
2ee0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 66  recently added f
2ef0: 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c  ield of the tabl
2f00: 65 20 69 73 20 6c 61 62 65 6c 65 64 20 61 73 20  e is labeled as 
2f10: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
2f20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43  .*/.void sqliteC
2f30: 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
2f40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
2f50: 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
2f60: 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
2f70: 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
2f80: 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  Name,    /* Name
2f90: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
2fa0: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
2fb0: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
2fc0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2fd0: 20 74 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   table to index.
2fe0: 20 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e    Use pParse->pN
2ff0: 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
3000: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c    IdList *pList,
3010: 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
3020: 66 69 65 6c 64 73 20 74 6f 20 62 65 20 69 6e 64  fields to be ind
3030: 65 78 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  exed */.  Token 
3040: 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68  *pStart,   /* Th
3050: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
3060: 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45  hat begins a CRE
3070: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
3080: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
3090: 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65  pEnd      /* The
30a0: 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
30b0: 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
30c0: 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  X statement */.)
30d0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
30e0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
30f0: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
3100: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
3110: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
3120: 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  o be created */.
3130: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
3140: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 68  0;.  int i, j, h
3150: 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
3160: 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b  ;    /* Fake tok
3170: 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
3180: 49 44 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a  ID list */..  /*
3190: 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
31a0: 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
31b0: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
31c0: 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
31d0: 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
31e0: 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b 0a  f( pTable!=0 ){.
31f0: 20 20 20 20 70 54 61 62 20 3d 20 20 73 71 6c 69      pTab =  sqli
3200: 74 65 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e  teTableFromToken
3210: 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29  (pParse, pTable)
3220: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
3230: 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70  Tab =  pParse->p
3240: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  NewTable;.  }.  
3250: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70  if( pTab==0 || p
3260: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
3270: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
3280: 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62  ndex;.  if( pTab
3290: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
32a0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
32b0: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
32c0: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54  sg, "table ", pT
32d0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ab->zName, .    
32e0: 20 20 22 20 6d 61 79 20 6e 6f 74 20 68 61 76 65    " may not have
32f0: 20 6e 65 77 20 69 6e 64 69 63 65 73 20 61 64 64   new indices add
3300: 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ed", 0);.    pPa
3310: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
3320: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
3330: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
3340: 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
3350: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
3360: 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
3370: 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
3380: 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
3390: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
33a0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
33b0: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
33c0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
33d0: 65 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  e = sqliteTableN
33e0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
33f0: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
3400: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20    zName = 0;.   
3410: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
3420: 28 26 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  (&zName, pTab->z
3430: 4e 61 6d 65 2c 20 22 5f 5f 70 72 69 6d 61 72 79  Name, "__primary
3440: 5f 6b 65 79 22 2c 20 30 29 3b 0a 20 20 7d 0a 20  _key", 0);.  }. 
3450: 20 69 66 28 20 73 71 6c 69 74 65 46 69 6e 64 49   if( sqliteFindI
3460: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
3470: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 73   zName) ){.    s
3480: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
3490: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
34a0: 20 22 69 6e 64 65 78 20 22 2c 20 7a 4e 61 6d 65   "index ", zName
34b0: 2c 20 0a 20 20 20 20 20 20 20 22 20 61 6c 72 65  , .       " alre
34c0: 61 64 79 20 65 78 69 73 74 73 22 2c 20 30 29 3b  ady exists", 0);
34d0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
34e0: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  r++;.    goto ex
34f0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
3500: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
3510: 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  eFindTable(pPars
3520: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 20 29 7b  e->db, zName) ){
3530: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
3540: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
3550: 72 72 4d 73 67 2c 20 22 74 68 65 72 65 20 69 73  rrMsg, "there is
3560: 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
3570: 20 6e 61 6d 65 64 20 22 2c 0a 20 20 20 20 20 20   named ",.      
3580: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
3590: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
35a0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
35b0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
35c0: 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
35d0: 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
35e0: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
35f0: 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
3600: 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
3610: 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 66  ut of the last f
3620: 69 65 6c 64 20 61 64 64 65 64 20 74 6f 20 74 68  ield added to th
3630: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
3640: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
3650: 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
3660: 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
3670: 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
3680: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
3690: 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70      nullId.z = p
36a0: 54 61 62 2d 3e 61 7a 43 6f 6c 5b 70 54 61 62 2d  Tab->azCol[pTab-
36b0: 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20 6e 75  >nCol-1];.    nu
36c0: 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  llId.n = strlen(
36d0: 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70  nullId.z);.    p
36e0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49 64 4c  List = sqliteIdL
36f0: 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e 75  istAppend(0, &nu
3700: 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
3710: 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
3720: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
3730: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ;.  }..  /* .  *
3740: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
3750: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
3760: 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d  .  */.  pIndex =
3770: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
3780: 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73  izeof(Index) + s
3790: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31  trlen(zName) + 1
37a0: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
37b0: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
37c0: 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e 49  f(int)*pList->nI
37d0: 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  d );.  if( pInde
37e0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
37f0: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
3800: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6f  rse->zErrMsg, "o
3810: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20 30  ut of memory", 0
3820: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
3830: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
3840: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
3850: 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d  x;.  }.  pIndex-
3860: 3e 61 69 46 69 65 6c 64 20 3d 20 28 69 6e 74 2a  >aiField = (int*
3870: 29 26 70 49 6e 64 65 78 5b 31 5d 3b 0a 20 20 70  )&pIndex[1];.  p
3880: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28  Index->zName = (
3890: 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61  char*)&pIndex->a
38a0: 69 46 69 65 6c 64 5b 70 4c 69 73 74 2d 3e 6e 49  iField[pList->nI
38b0: 64 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 49 6e  d];.  strcpy(pIn
38c0: 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
38d0: 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54  e);.  pIndex->pT
38e0: 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70  able = pTab;.  p
38f0: 49 6e 64 65 78 2d 3e 6e 46 69 65 6c 64 20 3d 20  Index->nField = 
3900: 70 4c 69 73 74 2d 3e 6e 49 64 3b 0a 0a 20 20 2f  pList->nId;..  /
3910: 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73  * Scan the names
3920: 20 6f 66 20 74 68 65 20 66 69 65 6c 64 73 20 6f   of the fields o
3930: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
3940: 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20  e indexed and.  
3950: 2a 2a 20 6c 6f 61 64 20 74 68 65 20 66 69 65 6c  ** load the fiel
3960: 64 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  d indices into t
3970: 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
3980: 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
3990: 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
39a0: 20 66 69 65 6c 64 20 69 73 20 6e 6f 74 20 66 6f   field is not fo
39b0: 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
39c0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
39d0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  d; i++){.    for
39e0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
39f0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
3a00: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
3a10: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
3a20: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 7a 43 6f 6c  ame, pTab->azCol
3a30: 5b 6a 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  [j])==0 ) break;
3a40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
3a50: 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
3a60: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
3a70: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
3a80: 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20 22  ErrMsg, "table "
3a90: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a  , pTab->zName, .
3aa0: 20 20 20 20 20 20 20 20 22 20 68 61 73 20 6e 6f          " has no
3ab0: 20 66 69 65 6c 64 20 6e 61 6d 65 64 20 22 2c 20   field named ", 
3ac0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
3ad0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  e, 0);.      pPa
3ae0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
3af0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
3b00: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 67 6f 74  ndex);.      got
3b10: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
3b20: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
3b30: 49 6e 64 65 78 2d 3e 61 69 46 69 65 6c 64 5b 69  Index->aiField[i
3b40: 5d 20 3d 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ] = j;.  }..  /*
3b50: 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e   Link the new In
3b60: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f  dex structure to
3b70: 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74   its table and t
3b80: 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a  o the other.  **
3b90: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
3ba0: 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 0a  ase structures..
3bb0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
3bc0: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29 7b  e->explain==0 ){
3bd0: 0a 20 20 20 20 68 20 3d 20 73 71 6c 69 74 65 48  .    h = sqliteH
3be0: 61 73 68 4e 6f 43 61 73 65 28 70 49 6e 64 65 78  ashNoCase(pIndex
3bf0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 25 20 4e 5f  ->zName, 0) % N_
3c00: 48 41 53 48 3b 0a 20 20 20 20 70 49 6e 64 65 78  HASH;.    pIndex
3c10: 2d 3e 70 48 61 73 68 20 3d 20 70 50 61 72 73 65  ->pHash = pParse
3c20: 2d 3e 64 62 2d 3e 61 70 49 64 78 48 61 73 68 5b  ->db->apIdxHash[
3c30: 68 5d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  h];.    pParse->
3c40: 64 62 2d 3e 61 70 49 64 78 48 61 73 68 5b 68 5d  db->apIdxHash[h]
3c50: 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70   = pIndex;.    p
3c60: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
3c70: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
3c80: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
3c90: 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  pIndex;.  }..  /
3ca0: 2a 20 49 66 20 74 68 65 20 69 6e 69 74 46 6c 61  * If the initFla
3cb0: 67 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61  g is 0 then crea
3cc0: 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  te the index on 
3cd0: 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  disk.  This.  **
3ce0: 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e   involves writin
3cf0: 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  g the index into
3d00: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
3d10: 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e  e and filling in
3d20: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
3d30: 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
3d40: 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e   table contents.
3d50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69  .  **.  ** The i
3d60: 6e 69 74 46 6c 61 67 20 69 73 20 30 20 77 68 65  nitFlag is 0 whe
3d70: 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74  n the user first
3d80: 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45   enters a CREATE
3d90: 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d   INDEX .  ** com
3da0: 6d 61 6e 64 2e 20 20 54 68 65 20 69 6e 69 74 46  mand.  The initF
3db0: 6c 61 67 20 69 73 20 31 20 77 68 65 6e 20 61 20  lag is 1 when a 
3dc0: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
3dd0: 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45  ed and .  ** CRE
3de0: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
3df0: 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75  ents are read ou
3e00: 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  t of the master 
3e10: 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20  table.  In.  ** 
3e20: 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20  the latter case 
3e30: 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
3e40: 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  y exists on disk
3e50: 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20  , which is why. 
3e60: 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
3e70: 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74  t to recreate it
3e80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
3e90: 72 73 65 2d 3e 69 6e 69 74 46 6c 61 67 3d 3d 30  rse->initFlag==0
3ea0: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
3eb0: 64 62 65 4f 70 20 61 64 64 54 61 62 6c 65 5b 5d  dbeOp addTable[]
3ec0: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
3ed0: 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 30 2c 20  Open,        0, 
3ee0: 30 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 7d 2c  0, MASTER_NAME},
3ef0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 77 2c  .      { OP_New,
3f00: 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30           0, 0, 0
3f10: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  },.      { OP_St
3f20: 72 69 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c  ring,      0, 0,
3f30: 20 22 69 6e 64 65 78 22 7d 2c 0a 20 20 20 20 20   "index"},.     
3f40: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
3f50: 20 20 20 30 2c 20 30 2c 20 30 7d 2c 20 20 2f 2a     0, 0, 0},  /*
3f60: 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   3 */.      { OP
3f70: 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 20 30 2c  _String,      0,
3f80: 20 30 2c 20 30 7d 2c 20 20 2f 2a 20 34 20 2a 2f   0, 0},  /* 4 */
3f90: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
3fa0: 6e 67 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30  ng,      0, 0, 0
3fb0: 7d 2c 20 20 2f 2a 20 35 20 2a 2f 0a 20 20 20 20  },  /* 5 */.    
3fc0: 20 20 7b 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72    { OP_MakeRecor
3fd0: 64 2c 20 20 34 2c 20 30 2c 20 30 7d 2c 0a 20 20  d,  4, 0, 0},.  
3fe0: 20 20 20 20 7b 20 4f 50 5f 50 75 74 2c 20 20 20      { OP_Put,   
3ff0: 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 0a        0, 0, 0},.
4000: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65        { OP_Close
4010: 2c 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d  ,       0, 0, 0}
4020: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ,.    };.    int
4030: 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   n;.    Vdbe *v 
4040: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
4050: 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c  .    int lbl1, l
4060: 62 6c 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  bl2;.    int i;.
4070: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  .    if( v==0 ){
4080: 0a 20 20 20 20 20 20 76 20 3d 20 70 50 61 72 73  .      v = pPars
4090: 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74  e->pVdbe = sqlit
40a0: 65 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  eVdbeCreate(pPar
40b0: 73 65 2d 3e 64 62 2d 3e 70 42 65 29 3b 0a 20 20  se->db->pBe);.  
40c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 76 3d 3d 30    }.    if( v==0
40d0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
40e0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
40f0: 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
4100: 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  d ){.      int b
4110: 61 73 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28  ase;.      n = (
4120: 69 6e 74 29 70 45 6e 64 2d 3e 7a 20 2d 20 28 69  int)pEnd->z - (i
4130: 6e 74 29 70 53 74 61 72 74 2d 3e 7a 20 2b 20 31  nt)pStart->z + 1
4140: 3b 0a 20 20 20 20 20 20 62 61 73 65 20 3d 20 73  ;.      base = s
4150: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
4160: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
4170: 61 64 64 54 61 62 6c 65 29 2c 20 61 64 64 54 61  addTable), addTa
4180: 62 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ble);.      sqli
4190: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
41a0: 2c 20 62 61 73 65 2b 33 2c 20 70 49 6e 64 65 78  , base+3, pIndex
41b0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
41c0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
41d0: 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 34 2c  ngeP3(v, base+4,
41e0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
41f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4200: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61  beChangeP3(v, ba
4210: 73 65 2b 35 2c 20 70 53 74 61 72 74 2d 3e 7a 2c  se+5, pStart->z,
4220: 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   n);.    }.    s
4230: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4240: 2c 20 4f 50 5f 4f 70 65 6e 2c 20 30 2c 20 30 2c  , OP_Open, 0, 0,
4250: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
4260: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
4270: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
4280: 2c 20 31 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  , 1, 0, pIndex->
4290: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 6c  zName, 0);.    l
42a0: 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65  bl1 = sqliteVdbe
42b0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
42c0: 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 56    lbl2 = sqliteV
42d0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
42e0: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
42f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
4300: 20 30 2c 20 6c 62 6c 32 2c 20 30 2c 20 6c 62 6c   0, lbl2, 0, lbl
4310: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  1);.    sqliteVd
4320: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
4330: 79 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  y, 0, 0, 0, 0);.
4340: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4350: 49 6e 64 65 78 2d 3e 6e 46 69 65 6c 64 3b 20 69  Index->nField; i
4360: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
4370: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4380: 5f 46 69 65 6c 64 2c 20 30 2c 20 70 49 6e 64 65  _Field, 0, pInde
4390: 78 2d 3e 61 69 46 69 65 6c 64 5b 69 5d 2c 20 30  x->aiField[i], 0
43a0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
43b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
43c0: 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70  v, OP_MakeKey, p
43d0: 49 6e 64 65 78 2d 3e 6e 46 69 65 6c 64 2c 20 30  Index->nField, 0
43e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
43f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4400: 4f 50 5f 50 75 74 49 64 78 2c 20 31 2c 20 30 2c  OP_PutIdx, 1, 0,
4410: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4420: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4430: 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 31 2c  P_Goto, 0, lbl1,
4440: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4450: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4460: 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 30 2c  P_Noop, 0, 0, 0,
4470: 20 6c 62 6c 32 29 3b 0a 20 20 20 20 73 71 6c 69   lbl2);.    sqli
4480: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4490: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 2c 20 30  P_Close, 0, 0, 0
44a0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
44b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
44c0: 43 6c 6f 73 65 2c 20 31 2c 20 30 2c 20 30 2c 20  Close, 1, 0, 0, 
44d0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  0);.  }..  /* Re
44e0: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 20 6f 6e 20  claim memory on 
44f0: 61 6e 20 45 58 50 4c 41 49 4e 20 63 61 6c 6c 2e  an EXPLAIN call.
4500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
4510: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
4520: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
4530: 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ndex);.  }..  /*
4540: 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
4550: 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
4560: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
4570: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c   sqliteIdListDel
4580: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71  ete(pList);.  sq
4590: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
45a0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
45b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
45c0: 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
45d0: 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
45e0: 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ex..*/.void sqli
45f0: 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  teDropIndex(Pars
4600: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
4610: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65   *pName){.  Inde
4620: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 63 68 61  x *pIndex;.  cha
4630: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 56 64 62 65  r *zName;.  Vdbe
4640: 20 2a 76 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20   *v;..  zName = 
4650: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
4660: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
4670: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
4680: 74 65 46 69 6e 64 49 6e 64 65 78 28 70 50 61 72  teFindIndex(pPar
4690: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  se->db, zName);.
46a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
46b0: 6d 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  me);.  if( pInde
46c0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
46d0: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
46e0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
46f0: 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 22  no such index: "
4700: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 70 4e  , 0, .        pN
4710: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
4720: 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
4730: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
4740: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
4750: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
4760: 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
4770: 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d  x and from the m
4780: 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
4790: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
47a0: 62 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43  be = sqliteVdbeC
47b0: 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62  reate(pParse->db
47c0: 2d 3e 70 42 65 29 3b 0a 20 20 69 66 28 20 76 20  ->pBe);.  if( v 
47d0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
47e0: 62 65 4f 70 20 64 72 6f 70 49 6e 64 65 78 5b 5d  beOp dropIndex[]
47f0: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f   = {.      { OP_
4800: 4f 70 65 6e 2c 20 20 20 20 20 20 20 30 2c 20 30  Open,       0, 0
4810: 2c 20 20 20 20 20 20 20 4d 41 53 54 45 52 5f 4e  ,       MASTER_N
4820: 41 4d 45 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  AME},.      { OP
4830: 5f 4c 69 73 74 4f 70 65 6e 2c 20 20 20 30 2c 20  _ListOpen,   0, 
4840: 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  0,       0},.   
4850: 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20     { OP_String, 
4860: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
4870: 30 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20  0}, /* 2 */.    
4880: 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
4890: 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30     0, ADDR(9), 0
48a0: 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20  }, /* 3 */.     
48b0: 20 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20 20   { OP_Dup,      
48c0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
48d0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 46 69 65  ,.      { OP_Fie
48e0: 6c 64 2c 20 20 20 20 20 20 30 2c 20 31 2c 20 20  ld,      0, 1,  
48f0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
4900: 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20   OP_Ne,         
4910: 30 2c 20 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a  0, ADDR(3), 0},.
4920: 20 20 20 20 20 20 7b 20 4f 50 5f 4b 65 79 2c 20        { OP_Key, 
4930: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20         0, 0,    
4940: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
4950: 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c  P_Delete,     0,
4960: 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   0,       0},.  
4970: 20 20 20 20 7b 20 4f 50 5f 44 65 73 74 72 6f 79      { OP_Destroy
4980: 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ,    0, 0,      
4990: 20 30 7d 2c 20 2f 2a 20 39 20 2a 2f 0a 20 20 20   0}, /* 9 */.   
49a0: 20 20 20 7b 20 4f 50 5f 43 6c 6f 73 65 2c 20 20     { OP_Close,  
49b0: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
49c0: 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69  0},.    };.    i
49d0: 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20 20 62 61  nt base;..    ba
49e0: 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  se = sqliteVdbeA
49f0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
4a00: 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29  ySize(dropIndex)
4a10: 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20  , dropIndex);.  
4a20: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
4a30: 67 65 50 33 28 76 2c 20 62 61 73 65 2b 32 2c 20  geP3(v, base+2, 
4a40: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
4a50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
4a60: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
4a70: 65 2b 39 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  e+9, pIndex->zNa
4a80: 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  me, 0);.  }..  /
4a90: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  * Remove the ind
4aa0: 65 78 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ex structure and
4ab0: 20 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72 79   free its memory
4ac0: 2e 20 20 45 78 63 65 70 74 20 69 66 20 74 68 65  .  Except if the
4ad0: 0a 20 20 2a 2a 20 45 58 50 4c 41 49 4e 20 6b 65  .  ** EXPLAIN ke
4ae0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
4af0: 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  , no changes are
4b00: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   made..  */.  if
4b10: 28 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  ( !pParse->expla
4b20: 69 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  in ){.    if( pI
4b30: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
4b40: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
4b50: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
4b60: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
4b70: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
4b80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
4b90: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66  ndex *p;.      f
4ba0: 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61  or(p=pIndex->pTa
4bb0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  ble->pIndex; p &
4bc0: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
4bd0: 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  ex; p=p->pNext){
4be0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26  }.      if( p &&
4bf0: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
4c00: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  x ){.        p->
4c10: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
4c20: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
4c30: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 44     }.    sqliteD
4c40: 65 6c 65 74 65 49 6e 64 65 78 28 70 50 61 72 73  eleteIndex(pPars
4c50: 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  e->db, pIndex);.
4c60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
4c70: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
4c80: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
4c90: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
4ca0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
4cb0: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
4cc0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
4cd0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
4ce0: 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  st..*/.ExprList 
4cf0: 2a 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41  *sqliteExprListA
4d00: 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20 2a  ppend(ExprList *
4d10: 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78  pList, Expr *pEx
4d20: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  pr, Token *pName
4d30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
4d40: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
4d50: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
4d60: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
4d70: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 7d 0a  xprList) );.  }.
4d80: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
4d90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
4da0: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26   (pList->nExpr &
4db0: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e   7)==0 ){.    in
4dc0: 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  t n = pList->nEx
4dd0: 70 72 20 2b 20 38 3b 0a 20 20 20 20 70 4c 69 73  pr + 8;.    pLis
4de0: 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65 61  t->a = sqliteRea
4df0: 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 6e  lloc(pList->a, n
4e00: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
4e10: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70  [0]));.    if( p
4e20: 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20  List->a==0 ){.  
4e30: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
4e40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
4e50: 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a  rn pList;.    }.
4e60: 20 20 7d 0a 20 20 69 20 3d 20 70 4c 69 73 74 2d    }.  i = pList-
4e70: 3e 6e 45 78 70 72 2b 2b 3b 0a 20 20 70 4c 69 73  >nExpr++;.  pLis
4e80: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20  t->a[i].pExpr = 
4e90: 70 45 78 70 72 3b 0a 20 20 70 4c 69 73 74 2d 3e  pExpr;.  pList->
4ea0: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[i].zName = 0;.
4eb0: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
4ec0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
4ed0: 69 6e 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d  ing(&pList->a[i]
4ee0: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a  .zName, pName->z
4ef0: 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a  , pName->n, 0);.
4f00: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
4f10: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
4f20: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame);.  }.  retu
4f30: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
4f40: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
4f50: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
4f60: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
4f70: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
4f80: 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  e(ExprList *pLis
4f90: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
4fa0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
4fb0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
4fc0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
4fd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
4fe0: 65 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69 73  eExprDelete(pLis
4ff0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
5000: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
5010: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
5020: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
5030: 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  ree(pList->a);. 
5040: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
5050: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  t);.}../*.** App
5060: 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
5070: 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
5080: 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
5090: 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
50a0: 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2f 0a 49 64  * need be..*/.Id
50b0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 49 64 4c 69  List *sqliteIdLi
50c0: 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20  stAppend(IdList 
50d0: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
50e0: 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
50f0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
5100: 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
5110: 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  oc( sizeof(IdLis
5120: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
5130: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
5140: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4c  0;.  }.  if( (pL
5150: 69 73 74 2d 3e 6e 49 64 20 26 20 37 29 3d 3d 30  ist->nId & 7)==0
5160: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61   ){.    pList->a
5170: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
5180: 28 70 4c 69 73 74 2d 3e 61 2c 20 28 70 4c 69 73  (pList->a, (pLis
5190: 74 2d 3e 6e 49 64 2b 38 29 2a 73 69 7a 65 6f 66  t->nId+8)*sizeof
51a0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b  (pList->a[0]) );
51b0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
51c0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  a==0 ){.      pL
51d0: 69 73 74 2d 3e 6e 49 64 20 3d 20 30 3b 0a 20 20  ist->nId = 0;.  
51e0: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74      return pList
51f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65  ;.    }.  }.  me
5200: 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70  mset(&pList->a[p
5210: 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73  List->nId], 0, s
5220: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
5230: 5d 29 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  ]));.  if( pToke
5240: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  n ){.    sqliteS
5250: 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73 74  etNString(&pList
5260: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e  ->a[pList->nId].
5270: 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  zName, pToken->z
5280: 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
5290: 0a 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f  .    sqliteDequo
52a0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  te(pList->a[pLis
52b0: 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->nId].zName);.
52c0: 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64    }.  pList->nId
52d0: 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  ++;.  return pLi
52e0: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  st;.}../*.** Add
52f0: 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65   an alias to the
5300: 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72   last identifier
5310: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64   on the given id
5320: 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a  entifier list..*
5330: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49 64 4c  /.void sqliteIdL
5340: 69 73 74 41 64 64 41 6c 69 61 73 28 49 64 4c 69  istAddAlias(IdLi
5350: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
5360: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
5370: 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d   pList && pList-
5380: 3e 6e 49 64 3e 30 20 29 7b 0a 20 20 20 20 69 6e  >nId>0 ){.    in
5390: 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e 6e 49 64  t i = pList->nId
53a0: 20 2d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   - 1;.    sqlite
53b0: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 4c 69 73  SetNString(&pLis
53c0: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 2c 20  t->a[i].zAlias, 
53d0: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65  pToken->z, pToke
53e0: 6e 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71  n->n, 0);.    sq
53f0: 6c 69 74 65 44 65 71 75 6f 74 65 28 70 4c 69 73  liteDequote(pLis
5400: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b  t->a[i].zAlias);
5410: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
5420: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 49  lete an entire I
5430: 64 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  dList.*/.void sq
5440: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
5450: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  (IdList *pList){
5460: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5470: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
5480: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
5490: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
54a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
54b0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
54c0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
54d0: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
54e0: 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 73  zAlias);.  }.  s
54f0: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
5500: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  >a);.  sqliteFre
5510: 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pList);.}../*.
5520: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5530: 69 73 20 63 61 6c 6c 20 74 6f 20 68 61 6e 64 6c  is call to handl
5540: 65 20 53 51 4c 20 6f 66 20 74 68 65 20 66 6f 6c  e SQL of the fol
5550: 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a  lowing form:.**.
5560: 2a 2a 20 20 20 20 69 6e 73 65 72 74 20 69 6e 74  **    insert int
5570: 6f 20 54 41 42 4c 45 20 28 49 44 4c 49 53 54 29  o TABLE (IDLIST)
5580: 20 76 61 6c 75 65 73 28 45 58 50 52 4c 49 53 54   values(EXPRLIST
5590: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61  ).**.** The para
55a0: 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 74  meters are the t
55b0: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
55c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
55d0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
55e0: 65 49 6e 73 65 72 74 28 0a 20 20 50 61 72 73 65  eInsert(.  Parse
55f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5600: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
5610: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
5620: 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 2f 2a  TableName,    /*
5630: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 69   Name of table i
5640: 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
5650: 20 69 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20   inserting */.  
5660: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
5670: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
5680: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 69 6e   values to be in
5690: 73 65 72 74 65 64 20 2a 2f 0a 20 20 49 64 4c 69  serted */.  IdLi
56a0: 73 74 20 2a 70 46 69 65 6c 64 20 20 20 20 20 20  st *pField      
56b0: 20 20 2f 2a 20 46 69 65 6c 64 20 6e 61 6d 65 20    /* Field name 
56c0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
56d0: 20 70 4c 69 73 74 2e 20 20 4d 69 67 68 74 20 62   pList.  Might b
56e0: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54  e NULL */.){.  T
56f0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 63 68  able *pTab;.  ch
5700: 61 72 20 2a 7a 54 61 62 3b 0a 20 20 69 6e 74 20  ar *zTab;.  int 
5710: 69 2c 20 6a 3b 0a 20 20 56 64 62 65 20 2a 76 3b  i, j;.  Vdbe *v;
5720: 0a 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74  ..  zTab = sqlit
5730: 65 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  eTableNameFromTo
5740: 6b 65 6e 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b  ken(pTableName);
5750: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
5760: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
5770: 2d 3e 64 62 2c 20 7a 54 61 62 29 3b 0a 20 20 73  ->db, zTab);.  s
5780: 71 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b  qliteFree(zTab);
5790: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
57a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  {.    sqliteSetN
57b0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
57c0: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
57d0: 68 20 74 61 62 6c 65 3a 20 22 2c 20 30 2c 20 0a  h table: ", 0, .
57e0: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 4e 61          pTableNa
57f0: 6d 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 4e 61 6d  me->z, pTableNam
5800: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 70 50  e->n, 0);.    pP
5810: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
5820: 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c    goto insert_cl
5830: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28  eanup;.  }.  if(
5840: 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20   pTab->readOnly 
5850: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
5860: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
5870: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
5880: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
5890: 20 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f          " may no
58a0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 22 2c 20  t be modified", 
58b0: 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  0);.    pParse->
58c0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
58d0: 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b   insert_cleanup;
58e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 65 6c  .  }.  if( pFiel
58f0: 64 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e  d==0 && pList->n
5900: 45 78 70 72 21 3d 70 54 61 62 2d 3e 6e 43 6f 6c  Expr!=pTab->nCol
5910: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 4e 75   ){.    char zNu
5920: 6d 31 5b 33 30 5d 3b 0a 20 20 20 20 63 68 61 72  m1[30];.    char
5930: 20 7a 4e 75 6d 32 5b 33 30 5d 3b 0a 20 20 20 20   zNum2[30];.    
5940: 73 70 72 69 6e 74 66 28 7a 4e 75 6d 31 2c 22 25  sprintf(zNum1,"%
5950: 64 22 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  d", pList->nExpr
5960: 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
5970: 4e 75 6d 32 2c 22 25 64 22 2c 20 70 54 61 62 2d  Num2,"%d", pTab-
5980: 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 73 71 6c 69  >nCol);.    sqli
5990: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
59a0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
59b0: 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e  able ", pTab->zN
59c0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 22 20 68 61  ame,.       " ha
59d0: 73 20 22 2c 20 7a 4e 75 6d 32 2c 20 22 20 63 6f  s ", zNum2, " co
59e0: 6c 75 6d 6e 73 20 62 75 74 20 22 2c 0a 20 20 20  lumns but ",.   
59f0: 20 20 20 20 7a 4e 75 6d 31 2c 20 22 20 76 61 6c      zNum1, " val
5a00: 75 65 73 20 77 65 72 65 20 73 75 70 70 6c 69 65  ues were supplie
5a10: 64 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72  d", 0);.    pPar
5a20: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
5a30: 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61  goto insert_clea
5a40: 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  nup;.  }.  if( p
5a50: 46 69 65 6c 64 21 3d 30 20 26 26 20 70 4c 69 73  Field!=0 && pLis
5a60: 74 2d 3e 6e 45 78 70 72 21 3d 70 46 69 65 6c 64  t->nExpr!=pField
5a70: 2d 3e 6e 49 64 20 29 7b 0a 20 20 20 20 63 68 61  ->nId ){.    cha
5a80: 72 20 7a 4e 75 6d 31 5b 33 30 5d 3b 0a 20 20 20  r zNum1[30];.   
5a90: 20 63 68 61 72 20 7a 4e 75 6d 32 5b 33 30 5d 3b   char zNum2[30];
5aa0: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 75  .    sprintf(zNu
5ab0: 6d 31 2c 22 25 64 22 2c 20 70 4c 69 73 74 2d 3e  m1,"%d", pList->
5ac0: 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 70 72 69  nExpr);.    spri
5ad0: 6e 74 66 28 7a 4e 75 6d 32 2c 22 25 64 22 2c 20  ntf(zNum2,"%d", 
5ae0: 70 46 69 65 6c 64 2d 3e 6e 49 64 29 3b 0a 20 20  pField->nId);.  
5af0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
5b00: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
5b10: 73 67 2c 20 7a 4e 75 6d 31 2c 20 22 20 76 61 6c  sg, zNum1, " val
5b20: 75 65 73 20 66 6f 72 20 22 2c 0a 20 20 20 20 20  ues for ",.     
5b30: 20 20 7a 4e 75 6d 32 2c 20 22 20 63 6f 6c 75 6d    zNum2, " colum
5b40: 6e 73 22 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ns", 0);.    pPa
5b50: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
5b60: 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65   goto insert_cle
5b70: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20  anup;.  }.  if( 
5b80: 70 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 66 6f  pField ){.    fo
5b90: 72 28 69 3d 30 3b 20 69 3c 70 46 69 65 6c 64 2d  r(i=0; i<pField-
5ba0: 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
5bb0: 20 20 70 46 69 65 6c 64 2d 3e 61 5b 69 5d 2e 69    pField->a[i].i
5bc0: 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  dx = -1;.    }. 
5bd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 46     for(i=0; i<pF
5be0: 69 65 6c 64 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  ield->nId; i++){
5bf0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
5c00: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
5c10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
5c20: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 46  sqliteStrICmp(pF
5c30: 69 65 6c 64 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  ield->a[i].zName
5c40: 2c 20 70 54 61 62 2d 3e 61 7a 43 6f 6c 5b 6a 5d  , pTab->azCol[j]
5c50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5c60: 20 20 70 46 69 65 6c 64 2d 3e 61 5b 69 5d 2e 69    pField->a[i].i
5c70: 64 78 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  dx = j;.        
5c80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5c90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5ca0: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
5cb0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
5cc0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
5cd0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
5ce0: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e  "table ", pTab->
5cf0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
5d00: 20 20 22 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d    " has no colum
5d10: 6e 20 6e 61 6d 65 64 20 22 2c 20 70 46 69 65 6c  n named ", pFiel
5d20: 64 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30  d->a[i].zName, 0
5d30: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
5d40: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
5d50: 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63     goto insert_c
5d60: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a  leanup;.      }.
5d70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 20 3d 20      }.  }.  v = 
5d80: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
5d90: 73 71 6c 69 74 65 56 64 62 65 43 72 65 61 74 65  sqliteVdbeCreate
5da0: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 42 65  (pParse->db->pBe
5db0: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
5dc0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
5dd0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5de0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 30  Op(v, OP_Open, 0
5df0: 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
5e00: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
5e10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5e20: 4e 65 77 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  New, 0, 0, 0, 0)
5e30: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
5e40: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
5e50: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
5e60: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c  v, OP_Dup, 0, 0,
5e70: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
5e80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
5e90: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
5ea0: 20 20 20 20 20 69 66 28 20 70 46 69 65 6c 64 3d       if( pField=
5eb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  =0 ){.        j 
5ec0: 3d 20 69 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = i;.      }else
5ed0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
5ee0: 30 3b 20 6a 3c 70 46 69 65 6c 64 2d 3e 6e 49 64  0; j<pField->nId
5ef0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
5f00: 20 20 69 66 28 20 70 46 69 65 6c 64 2d 3e 61 5b    if( pField->a[
5f10: 6a 5d 2e 69 64 78 3d 3d 69 20 29 20 62 72 65 61  j].idx==i ) brea
5f20: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
5f30: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5f40: 46 69 65 6c 64 20 26 26 20 6a 3e 3d 70 46 69 65  Field && j>=pFie
5f50: 6c 64 2d 3e 6e 49 64 20 29 7b 0a 20 20 20 20 20  ld->nId ){.     
5f60: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5f70: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
5f80: 20 30 2c 20 30 2c 20 22 22 2c 20 30 29 3b 0a 20   0, 0, "", 0);. 
5f90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5fa0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
5fb0: 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  de(pParse, pList
5fc0: 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[j].pExpr);. 
5fd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5fe0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5ff0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6000: 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 30  d, pTab->nCol, 0
6010: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6020: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6030: 4f 50 5f 50 75 74 2c 20 30 2c 20 30 2c 20 30 2c  OP_Put, 0, 0, 0,
6040: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
6050: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
6060: 6c 6f 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 30  lose, 0, 0, 0, 0
6070: 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  );.    for(pIdx=
6080: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
6090: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
60a0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
60b0: 20 70 49 64 78 2d 3e 70 4e 65 78 74 20 29 7b 0a   pIdx->pNext ){.
60c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
60d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
60e0: 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  p, 0, 0, 0, 0);.
60f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
6100: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6110: 20 4f 50 5f 4f 70 65 6e 2c 20 30 2c 20 30 2c 20   OP_Open, 0, 0, 
6120: 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pIdx->zName, 0);
6130: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
6140: 69 3c 70 49 64 78 2d 3e 6e 46 69 65 6c 64 3b 20  i<pIdx->nField; 
6150: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
6160: 74 20 69 64 78 20 3d 20 70 49 64 78 2d 3e 61 69  t idx = pIdx->ai
6170: 46 69 65 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20  Field[i];.      
6180: 20 20 69 66 28 20 70 46 69 65 6c 64 3d 3d 30 20    if( pField==0 
6190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 3d  ){.          j =
61a0: 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 65   idx;.        }e
61b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
61c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 69 65 6c 64  or(j=0; j<pField
61d0: 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nId; j++){.   
61e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69           if( pFi
61f0: 65 6c 64 2d 3e 61 5b 6a 5d 2e 69 64 78 3d 3d 69  eld->a[j].idx==i
6200: 64 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  dx ) break;.    
6210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6220: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  }.        if( pF
6230: 69 65 6c 64 20 26 26 20 6a 3e 3d 70 46 69 65 6c  ield && j>=pFiel
6240: 64 2d 3e 6e 49 64 20 29 7b 0a 20 20 20 20 20 20  d->nId ){.      
6250: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6260: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
6270: 2c 20 30 2c 20 30 2c 20 22 22 2c 20 30 29 3b 0a  , 0, 0, "", 0);.
6280: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6290: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45           sqliteE
62a0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
62b0: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70  pList->a[j].pExp
62c0: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
62d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
62e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
62f0: 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 49 64 78 2d  P_MakeKey, pIdx-
6300: 3e 6e 46 69 65 6c 64 2c 20 30 2c 20 30 2c 20 30  >nField, 0, 0, 0
6310: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6320: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
6330: 75 74 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c 20  utIdx, 0, 0, 0, 
6340: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
6350: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6360: 43 6c 6f 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Close, 0, 0, 0, 
6370: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 69  0);.    }.  }..i
6380: 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3a 0a 20  nsert_cleanup:. 
6390: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
63a0: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
63b0: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
63c0: 74 65 28 70 46 69 65 6c 64 29 3b 0a 7d 0a 0a 2f  te(pField);.}../
63d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
63e0: 65 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65  e walks an expre
63f0: 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72  ssion tree and r
6400: 65 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63  esolves referenc
6410: 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 66  es to.** table f
6420: 69 65 6c 64 73 2e 20 20 4e 6f 64 65 73 20 6f 66  ields.  Nodes of
6430: 20 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20   the form ID.ID 
6440: 6f 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e  or ID resolve in
6450: 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74  to an.** index t
6460: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74  o the table in t
6470: 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e  he table list an
6480: 64 20 61 20 66 69 65 6c 64 20 6f 66 66 73 65 74  d a field offset
6490: 2e 20 20 54 68 65 20 6f 70 63 6f 64 65 0a 2a 2a  .  The opcode.**
64a0: 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20   for such nodes 
64b0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
64c0: 5f 46 49 45 4c 44 2e 20 20 54 68 65 20 69 54 61  _FIELD.  The iTa
64d0: 62 6c 65 20 76 61 6c 75 65 20 69 73 20 63 68 61  ble value is cha
64e0: 6e 67 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 69  nged.** to the i
64f0: 6e 64 65 78 20 6f 66 20 74 68 65 20 72 65 66 65  ndex of the refe
6500: 72 65 6e 63 65 64 20 74 61 62 6c 65 20 69 6e 20  renced table in 
6510: 70 54 61 62 4c 69 73 74 2c 20 61 6e 64 20 74 68  pTabList, and th
6520: 65 20 69 46 69 65 6c 64 20 76 61 6c 75 65 0a 2a  e iField value.*
6530: 2a 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  * is changed to 
6540: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
6550: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 72 65   field of the re
6560: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 0a  ferenced table..
6570: 2a 2a 0a 2a 2a 20 55 6e 6b 6e 6f 77 6e 20 66 69  **.** Unknown fi
6580: 65 6c 64 73 20 6f 72 20 74 61 62 6c 65 73 20 70  elds or tables p
6590: 72 6f 76 6f 6b 65 20 61 6e 20 65 72 72 6f 72 2e  rovoke an error.
65a0: 20 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72    The function r
65b0: 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 6e 75  eturns.** the nu
65c0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
65d0: 65 65 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 61  een and leaves a
65e0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
65f0: 6f 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  on pParse->zErrM
6600: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
6610: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
6620: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
6630: 64 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  dList *pTabList,
6640: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
6650: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
6660: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
6670: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
6680: 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69  .    /* A lone i
6690: 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 20  dentifier */.   
66a0: 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20   case TK_ID: {. 
66b0: 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30       int cnt = 0
66c0: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
66d0: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
66e0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
66f0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
6700: 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
6710: 7a 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  z = pExpr->token
6720: 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  .z;.      int n 
6730: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
6740: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
6750: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64   i<pTabList->nId
6760: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6770: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 54  int j;.        T
6780: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
6790: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
67a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
67b0: 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ab==0 ) continue
67c0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
67d0: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
67e0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
67f0: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49   if( sqliteStrNI
6800: 43 6d 70 28 70 54 61 62 2d 3e 61 7a 43 6f 6c 5b  Cmp(pTab->azCol[
6810: 6a 5d 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a  j], z, n)==0 ){.
6820: 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b              cnt+
6830: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  +;.            p
6840: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
6850: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
6860: 78 70 72 2d 3e 69 46 69 65 6c 64 20 3d 20 6a 3b  xpr->iField = j;
6870: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6890: 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20       if( cnt==0 
68a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
68b0: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
68c0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e  rse->zErrMsg, "n
68d0: 6f 20 73 75 63 68 20 66 69 65 6c 64 3a 20 22 2c  o such field: ",
68e0: 20 2d 31 2c 20 20 0a 20 20 20 20 20 20 20 20 20   -1,  .         
68f0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
6900: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
6910: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
6920: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
6930: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
6940: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
6950: 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  nt>1 ){.        
6960: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
6970: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
6980: 67 2c 20 22 61 6d 62 69 67 75 6f 75 73 20 66 69  g, "ambiguous fi
6990: 65 6c 64 20 6e 61 6d 65 3a 20 22 2c 20 2d 31 2c  eld name: ", -1,
69a0: 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78    .          pEx
69b0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
69c0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b  pr->token.n, 0);
69d0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
69e0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
69f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
6a00: 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e   }.      pExpr->
6a10: 6f 70 20 3d 20 54 4b 5f 46 49 45 4c 44 3b 0a 20  op = TK_FIELD;. 
6a20: 20 20 20 20 20 62 72 65 61 6b 3b 20 0a 20 20 20       break; .   
6a30: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74   }.  .    /* A t
6a40: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 66 69  able name and fi
6a50: 65 6c 64 20 6e 61 6d 65 3a 20 20 49 44 2e 49 44  eld name:  ID.ID
6a60: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
6a70: 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  DOT: {.      int
6a80: 20 63 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e   cnt = 0;   /* N
6a90: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 65 73  umber of matches
6aa0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
6ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
6ac0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
6ad0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a    Expr *pLeft, *
6ae0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 4c 65  pRight;    /* Le
6af0: 66 74 20 61 6e 64 20 72 69 67 68 74 20 73 75 62  ft and right sub
6b00: 62 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65 20  branches of the 
6b10: 65 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  expr */.      in
6b20: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
6b30: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
6b40: 20 6f 66 20 61 6e 20 69 64 65 6e 74 69 66 69 65   of an identifie
6b50: 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  r */.      char 
6b60: 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
6b70: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 61      /* Text of a
6b80: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a  n identifier */.
6b90: 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70  .      pLeft = p
6ba0: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
6bb0: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
6bc0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
6bd0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 26   assert( pLeft &
6be0: 26 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  & pLeft->op==TK_
6bf0: 49 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ID );.      asse
6c00: 72 74 28 20 70 52 69 67 68 74 20 26 26 20 70 52  rt( pRight && pR
6c10: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  ight->op==TK_ID 
6c20: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 52 69  );.      n = pRi
6c30: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  ght->token.n;.  
6c40: 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e      z = pRight->
6c50: 74 6f 6b 65 6e 2e 7a 3b 20 20 20 20 20 20 0a 20  token.z;      . 
6c60: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6c70: 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69  pTabList->nId; i
6c80: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
6c90: 20 6a 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   j;.        char
6ca0: 20 2a 7a 54 61 62 3b 0a 20 20 20 20 20 20 20 20   *zTab;.        
6cb0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
6cc0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
6cd0: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  b;.        if( p
6ce0: 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Tab==0 ) continu
6cf0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
6d00: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  TabList->a[i].zA
6d10: 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
6d20: 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73    zTab = pTabLis
6d30: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a  t->a[i].zAlias;.
6d40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6d50: 20 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20           zTab = 
6d60: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
6d70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
6d80: 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d  f( sqliteStrNICm
6d90: 70 28 7a 54 61 62 2c 20 70 4c 65 66 74 2d 3e 74  p(zTab, pLeft->t
6da0: 6f 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74  oken.z, pLeft->t
6db0: 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 20 63 6f 6e  oken.n)!=0 ) con
6dc0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66  tinue;.        f
6dd0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
6de0: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
6df0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6e00: 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 61  StrNICmp(pTab->a
6e10: 7a 43 6f 6c 5b 6a 5d 2c 20 7a 2c 20 6e 29 3d 3d  zCol[j], z, n)==
6e20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6e30: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
6e40: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
6e50: 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  e = i;.         
6e60: 20 20 20 70 45 78 70 72 2d 3e 69 46 69 65 6c 64     pExpr->iField
6e70: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
6e80: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
6e90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6e    }.      if( cn
6ea0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
6eb0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
6ec0: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
6ed0: 67 2c 20 22 6e 6f 20 73 75 63 68 20 66 69 65 6c  g, "no such fiel
6ee0: 64 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20  d: ", -1,  .    
6ef0: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
6f00: 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b  en.z, pLeft->tok
6f10: 65 6e 2e 6e 2c 20 22 2e 22 2c 20 31 2c 20 7a 2c  en.n, ".", 1, z,
6f20: 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   n, 0);.        
6f30: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
6f40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
6f50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6f60: 28 20 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20  ( cnt>1 ){.     
6f70: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
6f80: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
6f90: 72 4d 73 67 2c 20 22 61 6d 62 69 67 75 6f 75 73  rMsg, "ambiguous
6fa0: 20 66 69 65 6c 64 20 6e 61 6d 65 3a 20 22 2c 20   field name: ", 
6fb0: 2d 31 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20  -1,  .          
6fc0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
6fd0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  pExpr->token.n, 
6fe0: 22 2e 22 2c 20 31 2c 20 7a 2c 20 6e 2c 20 30 29  ".", 1, z, n, 0)
6ff0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
7000: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
7010: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
7020: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
7030: 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74  ExprDelete(pLeft
7040: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
7050: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20  pLeft = 0;.     
7060: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
7070: 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  e(pRight);.     
7080: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
7090: 20 30 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   0;.      pExpr-
70a0: 3e 6f 70 20 3d 20 54 4b 5f 46 49 45 4c 44 3b 0a  >op = TK_FIELD;.
70b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
70c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61   }..    /* For a
70d0: 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20 72 65  ll else, just re
70e0: 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20 74  cursively walk t
70f0: 68 65 20 74 72 65 65 20 2a 2f 0a 20 20 20 20 64  he tree */.    d
7100: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
7110: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
7120: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26   .            &&
7130: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
7140: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54  veIds(pParse, pT
7150: 61 62 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70  abList, pExpr->p
7160: 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
7170: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
7180: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
7190: 70 72 2d 3e 70 52 69 67 68 74 20 0a 20 20 20 20  pr->pRight .    
71a0: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
71b0: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
71c0: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
71d0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
71e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
71f0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
7200: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
7210: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
7220: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45  int i;.        E
7230: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
7240: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
7250: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
7260: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
7270: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
7280: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 52 65  if( sqliteExprRe
7290: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
72a0: 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 69 73 74   pTabList, pList
72b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
72c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
72d0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20  urn 1;.         
72e0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
72f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
7300: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
7310: 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 53 45  .** Process a SE
7320: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
7330: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 65  */.void sqliteSe
7340: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
7350: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
7360: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
7370: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
7380: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
7390: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c   /* List of fiel
73a0: 64 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 20  ds to extract.  
73b0: 4e 55 4c 4c 20 6d 65 61 6e 73 20 22 2a 22 20 2a  NULL means "*" *
73c0: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 54 61 62  /.  IdList *pTab
73d0: 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 4c 69  List,      /* Li
73e0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
73f0: 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
7400: 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
7410: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
7420: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
7430: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
7440: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
7450: 79 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y     /* The ORD
7460: 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
7470: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ay be NULL */.){
7480: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 57  .  int i, j;.  W
7490: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
74a0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
74b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
74c0: 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  >0 ) goto select
74d0: 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 20  _cleanup;..  /* 
74e0: 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
74f0: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
7500: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f   list..  */.  fo
7510: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
7520: 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
7530: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
7540: 2e 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69  .pTab = sqliteFi
7550: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
7560: 64 62 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  db, pTabList->a[
7570: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  i].zName);.    i
7580: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
7590: 5d 2e 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ].pTab==0 ){.   
75a0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
75b0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
75c0: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  Msg, "no such ta
75d0: 62 6c 65 3a 20 22 2c 20 0a 20 20 20 20 20 20 20  ble: ", .       
75e0: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
75f0: 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  .zName, 0);.    
7600: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
7610: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  ;.      goto sel
7620: 65 63 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ect_cleanup;.   
7630: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
7640: 74 68 65 20 6c 69 73 74 20 6f 66 20 66 69 65 6c  the list of fiel
7650: 64 73 20 74 6f 20 72 65 74 72 69 65 76 65 20 69  ds to retrieve i
7660: 73 20 22 2a 22 20 74 68 65 6e 20 72 65 70 6c 61  s "*" then repla
7670: 63 65 20 69 74 20 77 69 74 68 0a 20 20 2a 2a 20  ce it with.  ** 
7680: 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 66 69  a list of all fi
7690: 65 6c 64 73 20 66 72 6f 6d 20 61 6c 6c 20 74 61  elds from all ta
76a0: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bles..  */.  if(
76b0: 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20   pEList==0 ){.  
76c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
76d0: 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  bList->nId; i++)
76e0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
76f0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
7700: 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[i].pTab;.     
7710: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
7720: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
7730: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
7740: 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  r = sqliteExpr(T
7750: 4b 5f 46 49 45 4c 44 2c 20 30 2c 20 30 2c 20 30  K_FIELD, 0, 0, 0
7760: 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
7770: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 3b 0a 20 20  ->iTable = i;.  
7780: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 46 69        pExpr->iFi
7790: 65 6c 64 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  eld = j;.       
77a0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
77b0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
77c0: 45 4c 69 73 74 2c 20 70 45 78 70 72 2c 20 30 29  EList, pExpr, 0)
77d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
77e0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76    }..  /* Resolv
77f0: 65 20 74 68 65 20 66 69 65 6c 64 20 6e 61 6d 65  e the field name
7800: 73 20 69 6e 20 61 6c 6c 20 74 68 65 20 65 78 70  s in all the exp
7810: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
7820: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
7830: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
7840: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
7850: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
7860: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
7870: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
7880: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  pr) ){.      got
7890: 6f 20 73 65 6c 65 63 74 5f 63 6c 65 61 6e 75 70  o select_cleanup
78a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
78b0: 28 20 70 57 68 65 72 65 20 26 26 20 73 71 6c 69  ( pWhere && sqli
78c0: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
78d0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
78e0: 74 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20  t, pWhere) ){.  
78f0: 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 63 6c    goto select_cl
7900: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28  eanup;.  }.  if(
7910: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
7920: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
7930: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
7940: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
7950: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
7960: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
7970: 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  st, pOrderBy->a[
7980: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
7990: 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
79a0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
79b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
79c0: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
79d0: 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
79e0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
79f0: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
7a00: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
7a10: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 56  >pVdbe = sqliteV
7a20: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
7a30: 2d 3e 64 62 2d 3e 70 42 65 29 3b 0a 20 20 7d 0a  ->db->pBe);.  }.
7a40: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
7a50: 6f 20 73 65 6c 65 63 74 5f 63 6c 65 61 6e 75 70  o select_cleanup
7a60: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
7a70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64   ){.    sqliteVd
7a80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f  beAddOp(v, OP_So
7a90: 72 74 4f 70 65 6e 2c 20 30 2c 20 30 2c 20 30 2c  rtOpen, 0, 0, 0,
7aa0: 20 30 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20   0);.  }...  /* 
7ab0: 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
7ac0: 6e 61 6d 65 73 0a 20 20 2a 2f 0a 20 20 73 71 6c  names.  */.  sql
7ad0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
7ae0: 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75 6e 74 2c 20  OP_ColumnCount, 
7af0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
7b00: 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69  , 0, 0);.  for(i
7b10: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
7b20: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
7b30: 78 70 72 20 2a 70 3b 0a 20 20 20 20 69 66 28 20  xpr *p;.    if( 
7b40: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
7b50: 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  me ){.      char
7b60: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
7b70: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
7b80: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73      int addr = s
7b90: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7ba0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
7bb0: 20 69 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 30 29   i, 0, zName, 0)
7bc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d  ;.      if( zNam
7bd0: 65 5b 30 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4e  e[0]=='\'' || zN
7be0: 61 6d 65 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20  ame[0]=='"' ){. 
7bf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
7c00: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64  eDequoteP3(v, ad
7c10: 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dr);.      }.   
7c20: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7c30: 20 7d 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73   }.    p = pELis
7c40: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
7c50: 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b     if( p->op!=TK
7c60: 5f 46 49 45 4c 44 20 29 7b 0a 20 20 20 20 20 20  _FIELD ){.      
7c70: 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a  char zName[30];.
7c80: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e        sprintf(zN
7c90: 61 6d 65 2c 20 22 66 69 65 6c 64 25 64 22 2c 20  ame, "field%d", 
7ca0: 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  i+1);.      sqli
7cb0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7cc0: 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c  P_ColumnName, i,
7cd0: 20 30 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20   0, zName, 0);. 
7ce0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7cf0: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 49  if( pTabList->nI
7d00: 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  d>1 ){.        c
7d10: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
7d20: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
7d30: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
7d40: 61 5b 70 2d 3e 69 54 61 62 6c 65 5d 2e 70 54 61  a[p->iTable].pTa
7d50: 62 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  b;.        sqlit
7d60: 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  eSetString(&zNam
7d70: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
7d80: 22 2e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ".", .          
7d90: 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 43 6f 6c       pTab->azCol
7da0: 5b 70 2d 3e 69 46 69 65 6c 64 5d 2c 20 30 29 3b  [p->iField], 0);
7db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
7dc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
7dd0: 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 2c  olumnName, i, 0,
7de0: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
7df0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
7e00: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
7e10: 73 65 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  se{.        Tabl
7e20: 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69  e *pTab = pTabLi
7e30: 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  st->a[0].pTab;. 
7e40: 20 20 20 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 43 6f 6c  eAddOp(v, OP_Col
7e60: 75 6d 6e 4e 61 6d 65 2c 20 69 2c 20 30 2c 20 70  umnName, i, 0, p
7e70: 54 61 62 2d 3e 61 7a 43 6f 6c 5b 70 2d 3e 69 46  Tab->azCol[p->iF
7e80: 69 65 6c 64 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ield], 0);.     
7e90: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
7ea0: 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
7eb0: 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 20  abase scan.  */ 
7ec0: 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c   .  pWInfo = sql
7ed0: 69 74 65 57 68 65 72 65 42 65 67 69 6e 28 70 50  iteWhereBegin(pP
7ee0: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
7ef0: 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 69 66  pWhere, 0);.  if
7f00: 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
7f10: 74 6f 20 73 65 6c 65 63 74 5f 63 6c 65 61 6e 75  to select_cleanu
7f20: 70 3b 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68  p;..  /* Pull th
7f30: 65 20 72 65 71 75 65 73 74 65 64 20 66 69 65 6c  e requested fiel
7f40: 64 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ds..  */.  for(i
7f50: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
7f60: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
7f70: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
7f80: 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
7f90: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  i].pExpr);.  }. 
7fa0: 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20   .  /* If there 
7fb0: 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
7fc0: 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 63  lause, then we c
7fd0: 61 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 61  an invoke the ca
7fe0: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 72 69 67 68  llback.  ** righ
7ff0: 74 20 61 77 61 79 2e 20 20 49 66 20 74 68 65 72  t away.  If ther
8000: 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
8010: 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
8020: 6f 20 70 75 74 20 74 68 65 0a 20 20 2a 2a 20 64  o put the.  ** d
8030: 61 74 61 20 69 6e 74 6f 20 61 6e 20 61 70 70 72  ata into an appr
8040: 6f 70 72 69 61 74 65 20 73 6f 72 74 65 72 20 72  opriate sorter r
8050: 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ecord..  */.  if
8060: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
8070: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
8080: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
8090: 61 63 6b 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ack, pEList->nEx
80a0: 70 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  pr, 0, 0, 0);.  
80b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
80c0: 2a 7a 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  *zSortOrder;.   
80d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
80e0: 28 76 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 52  (v, OP_SortMakeR
80f0: 65 63 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ec, pEList->nExp
8100: 72 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  r, 0, 0, 0);.   
8110: 20 7a 53 6f 72 74 4f 72 64 65 72 20 3d 20 73 71   zSortOrder = sq
8120: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 4f 72 64  liteMalloc( pOrd
8130: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 20  erBy->nExpr + 1 
8140: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 6f 72 74  );.    if( zSort
8150: 4f 72 64 65 72 3d 3d 30 20 29 20 67 6f 74 6f 20  Order==0 ) goto 
8160: 73 65 6c 65 63 74 5f 63 6c 65 61 6e 75 70 3b 0a  select_cleanup;.
8170: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
8180: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
8190: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 6f 72  i++){.      zSor
81a0: 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
81b0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 69 64 78 20 3f  erBy->a[i].idx ?
81c0: 20 27 2d 27 20 3a 20 27 2b 27 3b 0a 20 20 20 20   '-' : '+';.    
81d0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
81e0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
81f0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
8200: 20 20 20 20 7d 0a 20 20 20 20 7a 53 6f 72 74 4f      }.    zSortO
8210: 72 64 65 72 5b 70 4f 72 64 65 72 42 79 2d 3e 6e  rder[pOrderBy->n
8220: 45 78 70 72 5d 20 3d 20 30 3b 0a 20 20 20 20 73  Expr] = 0;.    s
8230: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8240: 2c 20 4f 50 5f 53 6f 72 74 4d 61 6b 65 4b 65 79  , OP_SortMakeKey
8250: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
8260: 72 2c 20 30 2c 20 7a 53 6f 72 74 4f 72 64 65 72  r, 0, zSortOrder
8270: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
8280: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8290: 53 6f 72 74 50 75 74 2c 20 30 2c 20 30 2c 20 30  SortPut, 0, 0, 0
82a0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
82b0: 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
82c0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f   scan loop..  */
82d0: 0a 20 20 73 71 6c 69 74 65 57 68 65 72 65 45 6e  .  sqliteWhereEn
82e0: 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a  d(pWInfo);..  /*
82f0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
8300: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
8310: 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
8320: 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
8330: 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
8340: 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
8350: 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
8360: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
8370: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
8380: 65 6e 64 20 3d 20 73 71 6c 69 74 65 56 64 62 65  end = sqliteVdbe
8390: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
83a0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
83b0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
83c0: 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 30 2c 20 30  v, OP_Sort, 0, 0
83d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 64 64  , 0, 0);.    add
83e0: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
83f0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 4e 65  dOp(v, OP_SortNe
8400: 78 74 2c 20 30 2c 20 65 6e 64 2c 20 30 2c 20 30  xt, 0, end, 0, 0
8410: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
8420: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
8430: 74 43 61 6c 6c 62 61 63 6b 2c 20 70 45 4c 69 73  tCallback, pELis
8440: 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 20 30 2c 20  t->nExpr, 0, 0, 
8450: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
8460: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
8470: 74 6f 2c 20 30 2c 20 61 64 64 72 2c 20 30 2c 20  to, 0, addr, 0, 
8480: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
8490: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
84a0: 6f 70 2c 20 30 2c 20 30 2c 20 30 2c 20 65 6e 64  op, 0, 0, 0, end
84b0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 77  );.  }..  /* Alw
84c0: 61 79 73 20 65 78 65 63 75 74 65 20 74 68 65 20  ays execute the 
84d0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 62  following code b
84e0: 65 66 6f 72 65 20 65 78 69 74 69 6e 67 2c 20 69  efore exiting, i
84f0: 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  n order to.  ** 
8500: 72 65 6c 65 61 73 65 20 72 65 73 6f 75 72 63 65  release resource
8510: 73 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 63  s..  */.select_c
8520: 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
8530: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
8540: 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  EList);.  sqlite
8550: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61  IdListDelete(pTa
8560: 62 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  bList);.  sqlite
8570: 45 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 72  ExprDelete(pWher
8580: 65 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  e);.  sqliteExpr
8590: 4c 69 73 74 44 65 6c 65 74 65 28 70 4f 72 64 65  ListDelete(pOrde
85a0: 72 42 79 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  rBy);.  return;.
85b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
85c0: 20 61 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 73   a DELETE FROM s
85d0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
85e0: 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 46 72  d sqliteDeleteFr
85f0: 6f 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  om(.  Parse *pPa
8600: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
8610: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
8620: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
8630: 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f  TableName,     /
8640: 2a 20 54 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  * The table from
8650: 20 77 68 69 63 68 20 77 65 20 73 68 6f 75 6c 64   which we should
8660: 20 64 65 6c 65 74 65 20 74 68 69 6e 67 73 20 2a   delete things *
8670: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
8680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8690: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
86a0: 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a   May be null */.
86b0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  ){.  Vdbe *v;   
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
86d0: 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
86e0: 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
86f0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
8700: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
8710: 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 72  ble from which r
8720: 65 63 6f 72 64 73 20 77 69 6c 6c 20 62 65 20 64  ecords will be d
8730: 65 6c 65 74 65 64 20 2a 2f 0a 20 20 49 64 4c 69  eleted */.  IdLi
8740: 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
8750: 20 20 20 2f 2a 20 41 6e 20 49 44 20 6c 69 73 74     /* An ID list
8760: 20 68 6f 6c 64 69 6e 67 20 70 54 61 62 20 61 6e   holding pTab an
8770: 64 20 6e 6f 74 68 69 6e 67 20 65 6c 73 65 20 2a  d nothing else *
8780: 2f 0a 20 20 69 6e 74 20 65 6e 64 2c 20 61 64 64  /.  int end, add
8790: 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  r;         /* A 
87a0: 63 6f 75 70 6c 65 20 61 64 64 72 65 73 73 65 73  couple addresses
87b0: 20 6f 66 20 67 65 6e 65 72 61 74 65 64 20 63 6f   of generated co
87c0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
87e0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
87f0: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
8800: 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 49 6e  WInfo;     /* In
8810: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
8820: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
8830: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
8840: 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x;           /* 
8850: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
8860: 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20   indices of the 
8870: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4c  table */..  /* L
8880: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
8890: 77 68 69 63 68 20 77 65 20 77 61 6e 74 20 74 6f  which we want to
88a0: 20 75 70 64 61 74 65 2e 20 20 54 68 69 73 20 74   update.  This t
88b0: 61 62 6c 65 20 68 61 73 20 74 6f 20 62 65 0a 20  able has to be. 
88c0: 20 2a 2a 20 70 75 74 20 69 6e 20 61 6e 20 49 64   ** put in an Id
88d0: 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20 62  List structure b
88e0: 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 66 20 74  ecause some of t
88f0: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 77  he subroutines w
8900: 69 6c 6c 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ill.  ** will be
8910: 20 63 61 6c 6c 69 6e 67 20 61 72 65 20 64 65 73   calling are des
8920: 69 67 6e 65 64 20 74 6f 20 77 6f 72 6b 20 77 69  igned to work wi
8930: 74 68 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  th multiple tabl
8940: 65 73 20 61 6e 64 20 65 78 70 65 63 74 0a 20 20  es and expect.  
8950: 2a 2a 20 61 6e 20 49 64 4c 69 73 74 2a 20 70 61  ** an IdList* pa
8960: 72 61 6d 65 74 65 72 20 69 6e 73 74 65 61 64 20  rameter instead 
8970: 6f 66 20 6a 75 73 74 20 61 20 54 61 62 6c 65 2a  of just a Table*
8980: 20 70 61 72 61 6d 65 67 65 72 2e 0a 20 20 2a 2f   parameger..  */
8990: 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 73 71  .  pTabList = sq
89a0: 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64  liteIdListAppend
89b0: 28 30 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b  (0, pTableName);
89c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
89d0: 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  abList->nId; i++
89e0: 29 7b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 2d  ){.    pTabList-
89f0: 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 73 71 6c  >a[i].pTab = sql
8a00: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61  iteFindTable(pPa
8a10: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 4c 69 73  rse->db, pTabLis
8a20: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
8a30: 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
8a40: 2d 3e 61 5b 69 5d 2e 70 54 61 62 3d 3d 30 20 29  ->a[i].pTab==0 )
8a50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
8a60: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
8a70: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
8a80: 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 0a 20 20  ch table: ", .  
8a90: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
8aa0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b  >a[i].zName, 0);
8ab0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
8ac0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74  Err++;.      got
8ad0: 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63 6c  o delete_from_cl
8ae0: 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20  eanup;.    }.   
8af0: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
8b00: 5b 69 5d 2e 70 54 61 62 2d 3e 72 65 61 64 4f 6e  [i].pTab->readOn
8b10: 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ly ){.      sqli
8b20: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
8b30: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
8b40: 61 62 6c 65 20 22 2c 20 70 54 61 62 4c 69 73 74  able ", pTabList
8b50: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 0a 20 20  ->a[i].zName,.  
8b60: 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20        " may not 
8b70: 62 65 20 6d 6f 64 69 66 69 65 64 22 2c 20 30 29  be modified", 0)
8b80: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
8b90: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f  nErr++;.      go
8ba0: 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63  to delete_from_c
8bb0: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
8bc0: 7d 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c  }.  pTab = pTabL
8bd0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  ist->a[0].pTab;.
8be0: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68  .  /* Resolve th
8bf0: 65 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 69 6e  e field names in
8c00: 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73   all the express
8c10: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
8c20: 20 70 57 68 65 72 65 20 26 26 20 73 71 6c 69 74   pWhere && sqlit
8c30: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
8c40: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
8c50: 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20  , pWhere) ){.   
8c60: 20 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f   goto delete_fro
8c70: 6d 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  m_cleanup;.  }..
8c80: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
8c90: 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f  ating code..  */
8ca0: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
8cb0: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
8cc0: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
8cd0: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
8ce0: 74 65 56 64 62 65 43 72 65 61 74 65 28 70 50 61  teVdbeCreate(pPa
8cf0: 72 73 65 2d 3e 64 62 2d 3e 70 42 65 29 3b 0a 20  rse->db->pBe);. 
8d00: 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20   }.  if( v==0 ) 
8d10: 67 6f 74 6f 20 64 65 6c 65 74 65 5f 66 72 6f 6d  goto delete_from
8d20: 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 20  _cleanup;..  /* 
8d30: 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
8d40: 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 73  se scan.  */.  s
8d50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8d60: 2c 20 4f 50 5f 4c 69 73 74 4f 70 65 6e 2c 20 30  , OP_ListOpen, 0
8d70: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70 57  , 0, 0, 0);.  pW
8d80: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 57 68 65  Info = sqliteWhe
8d90: 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
8da0: 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
8db0: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 57 49 6e  , 1);.  if( pWIn
8dc0: 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 6c  fo==0 ) goto del
8dd0: 65 74 65 5f 66 72 6f 6d 5f 63 6c 65 61 6e 75 70  ete_from_cleanup
8de0: 3b 0a 0a 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72  ;..  /* Remember
8df0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 65 76   the index of ev
8e00: 65 72 79 20 69 74 65 6d 20 74 6f 20 62 65 20 64  ery item to be d
8e10: 65 6c 65 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  eleted..  */.  s
8e20: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
8e30: 2c 20 4f 50 5f 4c 69 73 74 57 72 69 74 65 2c 20  , OP_ListWrite, 
8e40: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  0, 0, 0, 0);..  
8e50: 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
8e60: 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
8e70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 57 68 65 72   */.  sqliteWher
8e80: 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20  eEnd(pWInfo);.. 
8e90: 20 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79   /* Delete every
8ea0: 20 69 74 65 6d 20 69 64 65 6e 74 69 66 69 65 64   item identified
8eb0: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 20 20   in the list..  
8ec0: 2a 2f 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  */.  sqliteVdbeA
8ed0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 73 74 52  ddOp(v, OP_ListR
8ee0: 65 77 69 6e 64 2c 20 30 2c 20 30 2c 20 30 2c 20  ewind, 0, 0, 0, 
8ef0: 30 29 3b 0a 20 20 66 6f 72 28 69 3d 31 2c 20 70  0);.  for(i=1, p
8f00: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
8f10: 3b 20 70 49 64 78 3b 20 69 2b 2b 2c 20 70 49 64  ; pIdx; i++, pId
8f20: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
8f30: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
8f40: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20  dOp(v, OP_Open, 
8f50: 69 2c 20 30 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  i, 0, pIdx->zNam
8f60: 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65 6e 64  e, 0);.  }.  end
8f70: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
8f80: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64  eLabel(v);.  add
8f90: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
8fa0: 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 73 74 52 65  dOp(v, OP_ListRe
8fb0: 61 64 2c 20 30 2c 20 65 6e 64 2c 20 30 2c 20 30  ad, 0, end, 0, 0
8fc0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70  );.  if( pTab->p
8fd0: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
8fe0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
8ff0: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30 2c  OP_Dup, 0, 0, 0,
9000: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
9010: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
9020: 65 74 63 68 2c 20 30 2c 20 30 2c 20 30 2c 20 30  etch, 0, 0, 0, 0
9030: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  );.    for(i=1, 
9040: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
9050: 78 3b 20 70 49 64 78 3b 20 69 2b 2b 2c 20 70 49  x; pIdx; i++, pI
9060: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
9070: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
9080: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
9090: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
90a0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
90b0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
90c0: 78 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  x->nField; j++){
90d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
90e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
90f0: 69 65 6c 64 2c 20 30 2c 20 70 49 64 78 2d 3e 61  ield, 0, pIdx->a
9100: 69 46 69 65 6c 64 5b 6a 5d 2c 20 30 2c 20 30 29  iField[j], 0, 0)
9110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9120: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9130: 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70  v, OP_MakeKey, p
9140: 49 64 78 2d 3e 6e 46 69 65 6c 64 2c 20 30 2c 20  Idx->nField, 0, 
9150: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
9160: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
9170: 4f 50 5f 44 65 6c 65 74 65 49 64 78 2c 20 69 2c  OP_DeleteIdx, i,
9180: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
9190: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 64 62  .  }.  sqliteVdb
91a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c  eAddOp(v, OP_Del
91b0: 65 74 65 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  ete, 0, 0, 0, 0)
91c0: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64  ;.  sqliteVdbeAd
91d0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
91e0: 30 2c 20 61 64 64 72 2c 20 30 2c 20 30 29 3b 0a  0, addr, 0, 0);.
91f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
9200: 70 28 76 2c 20 4f 50 5f 4c 69 73 74 43 6c 6f 73  p(v, OP_ListClos
9210: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 65 6e 64 29  e, 0, 0, 0, end)
9220: 3b 0a 0a 64 65 6c 65 74 65 5f 66 72 6f 6d 5f 63  ;..delete_from_c
9230: 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
9240: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61  IdListDelete(pTa
9250: 62 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  bList);.  sqlite
9260: 45 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 72  ExprDelete(pWher
9270: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
9280: 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61  ./*.** Process a
9290: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
92a0: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
92b0: 74 65 55 70 64 61 74 65 28 0a 20 20 50 61 72 73  teUpdate(.  Pars
92c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
92d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
92e0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
92f0: 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c  ken *pTableName,
9300: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
9310: 65 20 69 6e 20 77 68 69 63 68 20 77 65 20 73 68  e in which we sh
9320: 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 69 6e  ould change thin
9330: 67 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  gs */.  ExprList
9340: 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 20 20 2f   *pChanges,    /
9350: 2a 20 54 68 69 6e 67 73 20 74 6f 20 62 65 20 63  * Things to be c
9360: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 45 78 70 72  hanged */.  Expr
9370: 20 2a 70 57 68 65 72 65 20 20 20 20 20 20 20 20   *pWhere        
9380: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
9390: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
93a0: 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  null */.){.  int
93b0: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
93c0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
93d0: 74 65 72 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20  ters */.  Table 
93e0: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
93f0: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f   /* The table to
9400: 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20   be updated */. 
9410: 20 49 64 4c 69 73 74 20 2a 70 54 61 62 4c 69 73   IdList *pTabLis
9420: 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20  t = 0;  /* List 
9430: 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 6e 6c 79 20  containing only 
9440: 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 65 6e  pTab */.  int en
9450: 64 2c 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  d, addr;        
9460: 20 2f 2a 20 41 20 63 6f 75 70 6c 65 20 6f 66 20   /* A couple of 
9470: 61 64 64 72 65 73 73 65 73 20 69 6e 20 74 68 65  addresses in the
9480: 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20   generated code 
9490: 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
94a0: 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 49  pWInfo;     /* I
94b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
94c0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
94d0: 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  e */.  Vdbe *v; 
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
94f0: 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
9500: 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
9510: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
9520: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
9530: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 69 6e 64  looping over ind
9540: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  ices */.  int nI
9550: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
9560: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
9570: 64 69 63 65 73 20 74 68 61 74 20 6e 65 65 64 20  dices that need 
9580: 75 70 64 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e  updating */.  In
9590: 64 65 78 20 2a 2a 61 70 49 64 78 20 3d 20 30 3b  dex **apIdx = 0;
95a0: 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79       /* An array
95b0: 20 6f 66 20 69 6e 64 69 63 65 73 20 74 68 61 74   of indices that
95c0: 20 6e 65 65 64 20 75 70 64 61 74 69 6e 67 20 74   need updating t
95d0: 6f 6f 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 58 52  oo */.  int *aXR
95e0: 65 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ef = 0;        /
95f0: 2a 20 61 58 52 65 66 5b 69 5d 20 69 73 20 74 68  * aXRef[i] is th
9600: 65 20 69 6e 64 65 78 20 69 6e 20 70 43 68 61 6e  e index in pChan
9610: 67 65 73 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 0a  ges->a[] of the.
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9630: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 65           ** an e
9640: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68  xpression for th
9650: 65 20 69 2d 74 68 20 66 69 65 6c 64 20 6f 66 20  e i-th field of 
9660: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20  the table..     
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9680: 20 20 20 20 2a 2a 20 61 58 52 65 66 5b 69 5d 3d      ** aXRef[i]=
9690: 3d 2d 31 20 69 66 20 74 68 65 20 69 2d 74 68 20  =-1 if the i-th 
96a0: 66 69 65 6c 64 20 69 73 20 6e 6f 74 20 63 68 61  field is not cha
96b0: 6e 67 65 64 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 4c  nged. */..  /* L
96c0: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
96d0: 77 68 69 63 68 20 77 65 20 77 61 6e 74 20 74 6f  which we want to
96e0: 20 75 70 64 61 74 65 2e 20 20 54 68 69 73 20 74   update.  This t
96f0: 61 62 6c 65 20 68 61 73 20 74 6f 20 62 65 0a 20  able has to be. 
9700: 20 2a 2a 20 70 75 74 20 69 6e 20 61 6e 20 49 64   ** put in an Id
9710: 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20 62  List structure b
9720: 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 66 20 74  ecause some of t
9730: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 77  he subroutines w
9740: 69 6c 6c 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ill.  ** will be
9750: 20 63 61 6c 6c 69 6e 67 20 61 72 65 20 64 65 73   calling are des
9760: 69 67 6e 65 64 20 74 6f 20 77 6f 72 6b 20 77 69  igned to work wi
9770: 74 68 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  th multiple tabl
9780: 65 73 20 61 6e 64 20 65 78 70 65 63 74 0a 20 20  es and expect.  
9790: 2a 2a 20 61 6e 20 49 64 4c 69 73 74 2a 20 70 61  ** an IdList* pa
97a0: 72 61 6d 65 74 65 72 20 69 6e 73 74 65 61 64 20  rameter instead 
97b0: 6f 66 20 6a 75 73 74 20 61 20 54 61 62 6c 65 2a  of just a Table*
97c0: 20 70 61 72 61 6d 65 67 65 72 2e 0a 20 20 2a 2f   parameger..  */
97d0: 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 73 71  .  pTabList = sq
97e0: 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64  liteIdListAppend
97f0: 28 30 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b  (0, pTableName);
9800: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
9810: 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  abList->nId; i++
9820: 29 7b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 2d  ){.    pTabList-
9830: 3e 61 5b 69 5d 2e 70 54 61 62 20 3d 20 73 71 6c  >a[i].pTab = sql
9840: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50 61  iteFindTable(pPa
9850: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 4c 69 73  rse->db, pTabLis
9860: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
9870: 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
9880: 2d 3e 61 5b 69 5d 2e 70 54 61 62 3d 3d 30 20 29  ->a[i].pTab==0 )
9890: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
98a0: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
98b0: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
98c0: 63 68 20 74 61 62 6c 65 3a 20 22 2c 20 0a 20 20  ch table: ", .  
98d0: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2d         pTabList-
98e0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b  >a[i].zName, 0);
98f0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
9900: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 67 6f 74  Err++;.      got
9910: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
9920: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9930: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
9940: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  Tab->readOnly ){
9950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
9960: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
9970: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
9980: 22 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  ", pTabList->a[i
9990: 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ].zName,.       
99a0: 20 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 6d 6f   " may not be mo
99b0: 64 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20  dified", 0);.   
99c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
99d0: 2b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 75 70  +;.      goto up
99e0: 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  date_cleanup;.  
99f0: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d    }.  }.  pTab =
9a00: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
9a10: 70 54 61 62 3b 0a 20 20 61 58 52 65 66 20 3d 20  pTab;.  aXRef = 
9a20: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
9a30: 7a 65 6f 66 28 69 6e 74 29 20 2a 20 70 54 61 62  zeof(int) * pTab
9a40: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 69 66 28 20  ->nCol );.  if( 
9a50: 61 58 52 65 66 3d 3d 30 20 29 20 67 6f 74 6f 20  aXRef==0 ) goto 
9a60: 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a  update_cleanup;.
9a70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
9a80: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 20 61 58  b->nCol; i++) aX
9a90: 52 65 66 5b 69 5d 20 3d 20 2d 31 3b 0a 0a 20 20  Ref[i] = -1;..  
9aa0: 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 66  /* Resolve the f
9ab0: 69 65 6c 64 20 6e 61 6d 65 73 20 69 6e 20 61 6c  ield names in al
9ac0: 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  l the expression
9ad0: 73 20 69 6e 20 62 6f 74 68 20 74 68 65 0a 20 20  s in both the.  
9ae0: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
9af0: 61 6e 64 20 69 6e 20 74 68 65 20 6e 65 77 20 76  and in the new v
9b00: 61 6c 75 65 73 2e 20 20 41 6c 73 6f 20 66 69 6e  alues.  Also fin
9b10: 64 20 74 68 65 20 66 69 65 6c 64 20 69 6e 64 65  d the field inde
9b20: 78 0a 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20  x.  ** for each 
9b30: 66 69 65 6c 64 20 74 6f 20 62 65 20 75 70 64 61  field to be upda
9b40: 74 65 64 20 69 6e 20 74 68 65 20 70 43 68 61 6e  ted in the pChan
9b50: 67 65 73 20 61 72 72 61 79 2e 0a 20 20 2a 2f 0a  ges array..  */.
9b60: 20 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20    if( pWhere && 
9b70: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
9b80: 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
9b90: 62 4c 69 73 74 2c 20 70 57 68 65 72 65 29 20 29  bList, pWhere) )
9ba0: 7b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74  {.    goto updat
9bb0: 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
9bc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 61   for(i=0; i<pCha
9bd0: 6e 67 65 73 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  nges->nExpr; i++
9be0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
9bf0: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
9c00: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
9c10: 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d  , pChanges->a[i]
9c20: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
9c30: 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65   goto update_cle
9c40: 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
9c50: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
9c60: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
9c70: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 54     if( strcmp(pT
9c80: 61 62 2d 3e 61 7a 43 6f 6c 5b 6a 5d 2c 20 70 43  ab->azCol[j], pC
9c90: 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  hanges->a[i].zNa
9ca0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
9cb0: 20 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d    pChanges->a[i]
9cc0: 2e 69 64 78 20 3d 20 6a 3b 0a 20 20 20 20 20 20  .idx = j;.      
9cd0: 20 20 61 58 52 65 66 5b 6a 5d 20 3d 20 69 3b 0a    aXRef[j] = i;.
9ce0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9cf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9d00: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
9d10: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
9d20: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
9d30: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e  rse->zErrMsg, "n
9d40: 6f 20 73 75 63 68 20 66 69 65 6c 64 3a 20 22 2c  o such field: ",
9d50: 20 0a 20 20 20 20 20 20 20 20 20 70 43 68 61 6e   .         pChan
9d60: 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ges->a[i].zName,
9d70: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
9d80: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
9d90: 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65   goto update_cle
9da0: 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  anup;.    }.  }.
9db0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
9dc0: 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 61 72  emory for the ar
9dd0: 72 61 79 20 61 70 49 64 78 5b 5d 20 61 6e 64 20  ray apIdx[] and 
9de0: 66 69 6c 6c 20 69 74 20 70 6f 69 6e 74 65 72 73  fill it pointers
9df0: 20 74 6f 20 65 76 65 72 79 0a 20 20 2a 2a 20 69   to every.  ** i
9e00: 6e 64 65 78 20 74 68 61 74 20 6e 65 65 64 73 20  ndex that needs 
9e10: 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20 20  to be updated.  
9e20: 49 6e 64 69 63 65 73 20 6f 6e 6c 79 20 6e 65 65  Indices only nee
9e30: 64 20 75 70 64 61 74 69 6e 67 20 69 66 20 74 68  d updating if th
9e40: 65 69 72 0a 20 20 2a 2a 20 6b 65 79 20 69 6e 63  eir.  ** key inc
9e50: 6c 75 64 65 73 20 6f 6e 65 20 6f 66 20 74 68 65  ludes one of the
9e60: 20 66 69 65 6c 64 73 20 6e 61 6d 65 64 20 69 6e   fields named in
9e70: 20 70 43 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a   pChanges..  */.
9e80: 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49    for(nIdx=0, pI
9e90: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
9ea0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
9eb0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 66 6f  ->pNext){.    fo
9ec0: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
9ed0: 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
9ee0: 20 20 20 69 66 28 20 61 58 52 65 66 5b 70 49 64     if( aXRef[pId
9ef0: 78 2d 3e 61 69 46 69 65 6c 64 5b 69 5d 5d 3e 3d  x->aiField[i]]>=
9f00: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
9f10: 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d  .    if( i<pIdx-
9f20: 3e 6e 46 69 65 6c 64 20 29 20 6e 49 64 78 2b 2b  >nField ) nIdx++
9f30: 3b 0a 20 20 7d 0a 20 20 61 70 49 64 78 20 3d 20  ;.  }.  apIdx = 
9f40: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
9f50: 7a 65 6f 66 28 49 6e 64 65 78 2a 29 20 2a 20 6e  zeof(Index*) * n
9f60: 49 64 78 20 29 3b 0a 20 20 69 66 28 20 61 70 49  Idx );.  if( apI
9f70: 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64  dx==0 ) goto upd
9f80: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 66  ate_cleanup;.  f
9f90: 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49 64 78 3d  or(nIdx=0, pIdx=
9fa0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
9fb0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
9fc0: 4e 65 78 74 29 7b 0a 20 20 20 20 66 6f 72 28 69  Next){.    for(i
9fd0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 46 69 65  =0; i<pIdx->nFie
9fe0: 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; i++){.      
9ff0: 69 66 28 20 61 58 52 65 66 5b 70 49 64 78 2d 3e  if( aXRef[pIdx->
a000: 61 69 46 69 65 6c 64 5b 69 5d 5d 3e 3d 30 20 29  aiField[i]]>=0 )
a010: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a020: 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 46    if( i<pIdx->nF
a030: 69 65 6c 64 20 29 20 61 70 49 64 78 5b 6e 49 64  ield ) apIdx[nId
a040: 78 2b 2b 5d 20 3d 20 70 49 64 78 3b 0a 20 20 7d  x++] = pIdx;.  }
a050: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
a060: 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
a070: 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
a080: 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
a090: 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50  =0 ){.    v = pP
a0a0: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
a0b0: 6c 69 74 65 56 64 62 65 43 72 65 61 74 65 28 70  liteVdbeCreate(p
a0c0: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 42 65 29 3b  Parse->db->pBe);
a0d0: 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20  .  }.  if( v==0 
a0e0: 29 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c  ) goto update_cl
a0f0: 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 20 42 65 67  eanup;..  /* Beg
a100: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
a110: 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  scan.  */.  sqli
a120: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
a130: 50 5f 4c 69 73 74 4f 70 65 6e 2c 20 30 2c 20 30  P_ListOpen, 0, 0
a140: 2c 20 30 2c 20 30 29 3b 0a 20 20 70 57 49 6e 66  , 0, 0);.  pWInf
a150: 6f 20 3d 20 73 71 6c 69 74 65 57 68 65 72 65 42  o = sqliteWhereB
a160: 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
a170: 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 31  bList, pWhere, 1
a180: 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  );.  if( pWInfo=
a190: 3d 30 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65  =0 ) goto update
a1a0: 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 20  _cleanup;..  /* 
a1b0: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 64  Remember the ind
a1c0: 65 78 20 6f 66 20 65 76 65 72 79 20 69 74 65 6d  ex of every item
a1d0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
a1e0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 56 64 62    */.  sqliteVdb
a1f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 73  eAddOp(v, OP_Lis
a200: 74 57 72 69 74 65 2c 20 30 2c 20 30 2c 20 30 2c  tWrite, 0, 0, 0,
a210: 20 30 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 74   0);..  /* End t
a220: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
a230: 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71   loop..  */.  sq
a240: 6c 69 74 65 57 68 65 72 65 45 6e 64 28 70 57 49  liteWhereEnd(pWI
a250: 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 52 65 77 69  nfo);..  /* Rewi
a260: 6e 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 72  nd the list of r
a270: 65 63 6f 72 64 73 20 74 68 61 74 20 6e 65 65 64  ecords that need
a280: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 61   to be updated a
a290: 6e 64 0a 20 20 2a 2a 20 6f 70 65 6e 20 65 76 65  nd.  ** open eve
a2a0: 72 79 20 69 6e 64 65 78 20 74 68 61 74 20 6e 65  ry index that ne
a2b0: 65 64 73 20 75 70 64 61 74 69 6e 67 2e 0a 20 20  eds updating..  
a2c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  */.  sqliteVdbeA
a2d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 73 74 52  ddOp(v, OP_ListR
a2e0: 65 77 69 6e 64 2c 20 30 2c 20 30 2c 20 30 2c 20  ewind, 0, 0, 0, 
a2f0: 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0);.  for(i=0; i
a300: 3c 6e 49 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nIdx; i++){.   
a310: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a320: 28 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 69 2b 31  (v, OP_Open, i+1
a330: 2c 20 30 2c 20 61 70 49 64 78 5b 69 5d 2d 3e 7a  , 0, apIdx[i]->z
a340: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  Name, 0);.  }.. 
a350: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 65 76   /* Loop over ev
a360: 65 72 79 20 72 65 63 6f 72 64 20 74 68 61 74 20  ery record that 
a370: 6e 65 65 64 73 20 75 70 64 61 74 69 6e 67 2e 20  needs updating. 
a380: 20 57 65 20 68 61 76 65 20 74 6f 20 6c 6f 61 64   We have to load
a390: 0a 20 20 2a 2a 20 74 68 65 20 6f 6c 64 20 64 61  .  ** the old da
a3a0: 74 61 20 66 6f 72 20 65 61 63 68 20 72 65 63 6f  ta for each reco
a3b0: 72 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  rd to be updated
a3c0: 20 62 65 63 61 75 73 65 20 73 6f 6d 65 20 66 69   because some fi
a3d0: 65 6c 64 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20  elds.  ** might 
a3e0: 6e 6f 74 20 63 68 61 6e 67 65 20 61 6e 64 20 77  not change and w
a3f0: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
a400: 6f 70 79 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  opy the old valu
a410: 65 2c 20 74 68 65 72 65 66 6f 72 65 2e 0a 20 20  e, therefore..  
a420: 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20 6f 6c 64  ** Also, the old
a430: 20 64 61 74 61 20 69 73 20 6e 65 65 64 65 64 20   data is needed 
a440: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6f 6c  to delete the ol
a450: 64 20 69 6e 64 65 78 20 65 6e 74 69 72 65 73 2e  d index entires.
a460: 0a 20 20 2a 2f 0a 20 20 65 6e 64 20 3d 20 73 71  .  */.  end = sq
a470: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
a480: 6c 28 76 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  l(v);.  addr = s
a490: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a4a0: 2c 20 4f 50 5f 4c 69 73 74 52 65 61 64 2c 20 30  , OP_ListRead, 0
a4b0: 2c 20 65 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20  , end, 0, 0);.  
a4c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
a4d0: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c  v, OP_Dup, 0, 0,
a4e0: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
a4f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a500: 46 65 74 63 68 2c 20 30 2c 20 30 2c 20 30 2c 20  Fetch, 0, 0, 0, 
a510: 30 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  0);..  /* Delete
a520: 20 74 68 65 20 6f 6c 64 20 69 6e 64 69 63 65 73   the old indices
a530: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
a540: 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20   record..  */.  
a550: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 64 78 3b  for(i=0; i<nIdx;
a560: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
a570: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
a580: 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30  _Dup, 0, 0, 0, 0
a590: 29 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 61 70  );.    pIdx = ap
a5a0: 49 64 78 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  Idx[i];.    for(
a5b0: 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 46 69  j=0; j<pIdx->nFi
a5c0: 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  eld; j++){.     
a5d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
a5e0: 28 76 2c 20 4f 50 5f 46 69 65 6c 64 2c 20 30 2c  (v, OP_Field, 0,
a5f0: 20 70 49 64 78 2d 3e 61 69 46 69 65 6c 64 5b 6a   pIdx->aiField[j
a600: 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ], 0, 0);.    }.
a610: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a620: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65  dOp(v, OP_MakeKe
a630: 79 2c 20 70 49 64 78 2d 3e 6e 46 69 65 6c 64 2c  y, pIdx->nField,
a640: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
a650: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a660: 2c 20 4f 50 5f 44 65 6c 65 74 65 49 64 78 2c 20  , OP_DeleteIdx, 
a670: 69 2b 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  i+1, 0, 0, 0);. 
a680: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
a690: 20 61 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6e 65   a completely ne
a6a0: 77 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  w data for this 
a6b0: 72 65 63 6f 72 64 2e 20 20 0a 20 20 2a 2f 0a 20  record.  .  */. 
a6c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
a6d0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
a6e0: 20 20 6a 20 3d 20 61 58 52 65 66 5b 69 5d 3b 0a    j = aXRef[i];.
a6f0: 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20      if( j<0 ){. 
a700: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
a710: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 65 6c 64  ddOp(v, OP_Field
a720: 2c 20 30 2c 20 69 2c 20 30 2c 20 30 29 3b 0a 20  , 0, i, 0, 0);. 
a730: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a740: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
a750: 50 61 72 73 65 2c 20 70 43 68 61 6e 67 65 73 2d  Parse, pChanges-
a760: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[j].pExpr);.  
a770: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e    }.  }..  /* In
a780: 73 65 72 74 20 6e 65 77 20 69 6e 64 65 78 20 65  sert new index e
a790: 6e 74 72 69 65 73 20 74 68 61 74 20 63 6f 72 72  ntries that corr
a7a0: 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 6e 65  espond to the ne
a7b0: 77 20 64 61 74 61 0a 20 20 2a 2f 0a 20 20 66 6f  w data.  */.  fo
a7c0: 72 28 69 3d 30 3b 20 69 3c 6e 49 64 78 3b 20 69  r(i=0; i<nIdx; i
a7d0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  ++){.    sqliteV
a7e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
a7f0: 75 70 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  up, pTab->nCol, 
a800: 30 2c 20 30 2c 20 30 29 3b 20 2f 2a 20 54 68 65  0, 0, 0); /* The
a810: 20 4b 45 59 20 2a 2f 0a 20 20 20 20 70 49 64 78   KEY */.    pIdx
a820: 20 3d 20 61 70 49 64 78 5b 69 5d 3b 0a 20 20 20   = apIdx[i];.   
a830: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
a840: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
a850: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
a860: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
a870: 20 6a 2b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 70 49   j+pTab->nCol-pI
a880: 64 78 2d 3e 61 69 46 69 65 6c 64 5b 6a 5d 2c 20  dx->aiField[j], 
a890: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
a8a0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
a8b0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b 65  dOp(v, OP_MakeKe
a8c0: 79 2c 20 70 49 64 78 2d 3e 6e 46 69 65 6c 64 2c  y, pIdx->nField,
a8d0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
a8e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
a8f0: 2c 20 4f 50 5f 50 75 74 49 64 78 2c 20 69 2b 31  , OP_PutIdx, i+1
a900: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
a910: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
a920: 6e 65 77 20 64 61 74 61 20 62 61 63 6b 20 69 6e  new data back in
a930: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
a940: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 56 64  .  */.  sqliteVd
a950: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
a960: 6b 65 52 65 63 6f 72 64 2c 20 70 54 61 62 2d 3e  keRecord, pTab->
a970: 6e 43 6f 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  nCol, 0, 0, 0);.
a980: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
a990: 70 28 76 2c 20 4f 50 5f 50 75 74 2c 20 30 2c 20  p(v, OP_Put, 0, 
a9a0: 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  0, 0, 0);..  /* 
a9b0: 52 65 70 65 61 74 20 74 68 65 20 61 62 6f 76 65  Repeat the above
a9c0: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 72   with the next r
a9d0: 65 63 6f 72 64 20 74 6f 20 62 65 20 75 70 64 61  ecord to be upda
a9e0: 74 65 64 2c 20 75 6e 74 69 6c 0a 20 20 2a 2a 20  ted, until.  ** 
a9f0: 61 6c 6c 20 72 65 63 6f 72 64 20 73 65 6c 65 63  all record selec
aa00: 74 65 64 20 62 79 20 74 68 65 20 57 48 45 52 45  ted by the WHERE
aa10: 20 63 6c 61 75 73 65 20 68 61 76 65 20 62 65 65   clause have bee
aa20: 6e 20 75 70 64 61 74 65 64 2e 0a 20 20 2a 2f 0a  n updated..  */.
aa30: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
aa40: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
aa50: 20 61 64 64 72 2c 20 30 2c 20 30 29 3b 0a 20 20   addr, 0, 0);.  
aa60: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
aa70: 76 2c 20 4f 50 5f 4c 69 73 74 43 6c 6f 73 65 2c  v, OP_ListClose,
aa80: 20 30 2c 20 30 2c 20 30 2c 20 65 6e 64 29 3b 0a   0, 0, 0, end);.
aa90: 0a 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3a  .update_cleanup:
aaa0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 61 70  .  sqliteFree(ap
aab0: 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  Idx);.  sqliteFr
aac0: 65 65 28 61 58 52 65 66 29 3b 0a 20 20 73 71 6c  ee(aXRef);.  sql
aad0: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
aae0: 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 73 71 6c  pTabList);.  sql
aaf0: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
ab00: 65 28 70 43 68 61 6e 67 65 73 29 3b 0a 20 20 73  e(pChanges);.  s
ab10: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
ab20: 70 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72  pWhere);.  retur
ab30: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  n;.}../*.** The 
ab40: 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 69 73 20  COPY command is 
ab50: 66 6f 72 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  for compatibilit
ab60: 79 20 77 69 74 68 20 50 6f 73 74 67 72 65 53 51  y with PostgreSQ
ab70: 4c 20 61 6e 64 20 73 70 65 63 69 66 69 63 69 61  L and specificia
ab80: 6c 6c 79 0a 2a 2a 20 66 6f 72 20 74 68 65 20 61  lly.** for the a
ab90: 62 69 6c 69 74 79 20 74 6f 20 72 65 61 64 20 74  bility to read t
aba0: 68 65 20 6f 75 74 70 75 74 20 6f 66 20 70 67 5f  he output of pg_
abb0: 64 75 6d 70 2e 20 20 54 68 65 20 66 6f 72 6d 61  dump.  The forma
abc0: 74 20 69 73 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f  t is as.** follo
abd0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 4f 50  ws:.**.**    COP
abe0: 59 20 74 61 62 6c 65 20 46 52 4f 4d 20 66 69 6c  Y table FROM fil
abf0: 65 20 5b 55 53 49 4e 47 20 44 45 4c 49 4d 49 54  e [USING DELIMIT
ac00: 45 52 53 20 73 74 72 69 6e 67 5d 0a 2a 2a 0a 2a  ERS string].**.*
ac10: 2a 20 22 74 61 62 6c 65 22 20 69 73 20 61 6e 20  * "table" is an 
ac20: 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6e  existing table n
ac30: 61 6d 65 2e 20 20 57 65 20 77 69 6c 6c 20 72 65  ame.  We will re
ac40: 61 64 20 6c 69 6e 65 73 20 6f 66 20 63 6f 64 65  ad lines of code
ac50: 20 66 72 6f 6d 0a 2a 2a 20 66 69 6c 65 20 74 6f   from.** file to
ac60: 20 66 69 6c 6c 20 74 68 69 73 20 74 61 62 6c 65   fill this table
ac70: 20 77 69 74 68 20 64 61 74 61 2e 20 20 46 69 6c   with data.  Fil
ac80: 65 20 6d 69 67 68 74 20 62 65 20 22 73 74 64 69  e might be "stdi
ac90: 6e 22 2e 20 20 54 68 65 20 6f 70 74 69 6f 6e 61  n".  The optiona
aca0: 6c 0a 2a 2a 20 64 65 6c 69 6d 69 74 65 72 20 73  l.** delimiter s
acb0: 74 72 69 6e 67 20 69 64 65 6e 74 69 66 69 65 73  tring identifies
acc0: 20 74 68 65 20 66 69 65 6c 64 20 73 65 70 61 72   the field separ
acd0: 61 74 6f 72 73 2e 20 20 54 68 65 20 64 65 66 61  ators.  The defa
ace0: 75 6c 74 20 69 73 20 61 20 74 61 62 2e 0a 2a 2f  ult is a tab..*/
acf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 70 79  .void sqliteCopy
ad00: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ad10: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
ad20: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
ad30: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
ad40: 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 54 68 65 20  eName,   /* The 
ad50: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
ad60: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
ad70: 77 69 6c 6c 20 69 6e 73 65 72 74 20 2a 2f 0a 20  will insert */. 
ad80: 20 54 6f 6b 65 6e 20 2a 70 46 69 6c 65 6e 61 6d   Token *pFilenam
ad90: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c  e,    /* The fil
ada0: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
adb0: 6f 62 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69  obtain informati
adc0: 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
add0: 44 65 6c 69 6d 69 74 65 72 20 20 20 20 2f 2a 20  Delimiter    /* 
ade0: 55 73 65 20 74 68 69 73 20 61 73 20 74 68 65 20  Use this as the 
adf0: 66 69 65 6c 64 20 64 65 6c 69 6d 69 74 65 72 20  field delimiter 
ae00: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
ae10: 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61  Tab;.  char *zTa
ae20: 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  b;.  int i, j;. 
ae30: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
ae40: 61 64 64 72 2c 20 65 6e 64 3b 0a 20 20 49 6e 64  addr, end;.  Ind
ae50: 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20 7a 54 61  ex *pIdx;..  zTa
ae60: 62 20 3d 20 73 71 6c 69 74 65 54 61 62 6c 65 4e  b = sqliteTableN
ae70: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61  ameFromToken(pTa
ae80: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 70 54 61 62  bleName);.  pTab
ae90: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
aea0: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
aeb0: 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  Tab);.  sqliteFr
aec0: 65 65 28 7a 54 61 62 29 3b 0a 20 20 69 66 28 20  ee(zTab);.  if( 
aed0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
aee0: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
aef0: 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67  &pParse->zErrMsg
af00: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
af10: 3a 20 22 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  : ", 0, .       
af20: 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 7a 2c 20   pTableName->z, 
af30: 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e 2c 20 30  pTableName->n, 0
af40: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
af50: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
af60: 63 6f 70 79 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  copy_cleanup;.  
af70: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  }.  if( pTab->re
af80: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
af90: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70  liteSetString(&p
afa0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
afb0: 22 74 61 62 6c 65 20 22 2c 20 70 54 61 62 2d 3e  "table ", pTab->
afc0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 22  zName,.        "
afd0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6d 6f 64 69   may not be modi
afe0: 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 70  fied", 0);.    p
aff0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
b000: 20 20 20 67 6f 74 6f 20 63 6f 70 79 5f 63 6c 65     goto copy_cle
b010: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  anup;.  }.  v = 
b020: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
b030: 73 71 6c 69 74 65 56 64 62 65 43 72 65 61 74 65  sqliteVdbeCreate
b040: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 42 65  (pParse->db->pBe
b050: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
b060: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56    addr = sqliteV
b070: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
b080: 69 6c 65 4f 70 65 6e 2c 20 30 2c 20 30 2c 20 30  ileOpen, 0, 0, 0
b090: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
b0a0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
b0b0: 61 64 64 72 2c 20 70 46 69 6c 65 6e 61 6d 65 2d  addr, pFilename-
b0c0: 3e 7a 2c 20 70 46 69 6c 65 6e 61 6d 65 2d 3e 6e  >z, pFilename->n
b0d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
b0e0: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64  eDequoteP3(v, ad
b0f0: 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56  dr);.    sqliteV
b100: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
b110: 70 65 6e 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  pen, 0, 0, pTab-
b120: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
b130: 66 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54  for(i=1, pIdx=pT
b140: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
b150: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
b160: 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  xt, i++){.      
b170: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b180: 76 2c 20 4f 50 5f 4f 70 65 6e 2c 20 69 2c 20 30  v, OP_Open, i, 0
b190: 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30  , pIdx->zName, 0
b1a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 64  );.    }.    end
b1b0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
b1c0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 61  eLabel(v);.    a
b1d0: 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65  ddr = sqliteVdbe
b1e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65  AddOp(v, OP_File
b1f0: 52 65 61 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  Read, pTab->nCol
b200: 2c 20 65 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20  , end, 0, 0);.  
b210: 20 20 69 66 28 20 70 44 65 6c 69 6d 69 74 65 72    if( pDelimiter
b220: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b230: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
b240: 61 64 64 72 2c 20 70 44 65 6c 69 6d 69 74 65 72  addr, pDelimiter
b250: 2d 3e 7a 2c 20 70 44 65 6c 69 6d 69 74 65 72 2d  ->z, pDelimiter-
b260: 3e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >n);.      sqlit
b270: 65 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76  eVdbeDequoteP3(v
b280: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c  , addr);.    }el
b290: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
b2a0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
b2b0: 61 64 64 72 2c 20 22 5c 74 22 2c 20 31 29 3b 0a  addr, "\t", 1);.
b2c0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
b2d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b2e0: 4e 65 77 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  New, 0, 0, 0, 0)
b2f0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
b300: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
b310: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b320: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c  v, OP_Dup, 0, 0,
b330: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
b340: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
b350: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
b360: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b370: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 6c 65 46  ddOp(v, OP_FileF
b380: 69 65 6c 64 2c 20 69 2c 20 30 2c 20 30 2c 20 30  ield, i, 0, 0, 0
b390: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
b3a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b3b0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
b3c0: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 30 2c 20 30 2c  Tab->nCol, 0, 0,
b3d0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56   0);.    sqliteV
b3e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
b3f0: 75 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  ut, 0, 0, 0, 0);
b400: 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49  .    for(i=1, pI
b410: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
b420: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
b430: 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20  ->pNext, i++){. 
b440: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70       if( pIdx->p
b450: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
b460: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
b470: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c  v, OP_Dup, 0, 0,
b480: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
b490: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
b4a0: 3c 70 49 64 78 2d 3e 6e 46 69 65 6c 64 3b 20 6a  <pIdx->nField; j
b4b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
b4c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
b4d0: 4f 50 5f 46 69 6c 65 46 69 65 6c 64 2c 20 70 49  OP_FileField, pI
b4e0: 64 78 2d 3e 61 69 46 69 65 6c 64 5b 6a 5d 2c 20  dx->aiField[j], 
b4f0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
b500: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  }.      sqliteVd
b510: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
b520: 6b 65 4b 65 79 2c 20 70 49 64 78 2d 3e 6e 46 69  keKey, pIdx->nFi
b530: 65 6c 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  eld, 0, 0, 0);. 
b540: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
b550: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 64  ddOp(v, OP_PutId
b560: 78 2c 20 69 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  x, i, 0, 0, 0);.
b570: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
b580: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b590: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2c 20 30  Goto, 0, addr, 0
b5a0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
b5b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b5c0: 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 30 2c 20 65  Noop, 0, 0, 0, e
b5d0: 6e 64 29 3b 0a 20 20 7d 0a 20 20 0a 63 6f 70 79  nd);.  }.  .copy
b5e0: 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 72 65 74 75  _cleanup:.  retu
b5f0: 72 6e 3b 0a 7d 0a                                rn;.}.