/ Hex Artifact Content
Login

Artifact 162fc0b86dcd61d164dedc77081a5e7daf6b8fb0:


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 74 6f 20 68 61 6e 64  arser.** to hand
03f0: 6c 65 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  le UPDATE statem
0400: 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  ents..**.** $Id:
0410: 20 75 70 64 61 74 65 2e 63 2c 76 20 31 2e 37 20   update.c,v 1.7 
0420: 32 30 30 30 2f 30 36 2f 31 39 20 31 39 3a 30 39  2000/06/19 19:09
0430: 3a 30 39 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :09 drh Exp $.*/
0440: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0450: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 50  eInt.h"../*.** P
0460: 72 6f 63 65 73 73 20 61 6e 20 55 50 44 41 54 45  rocess an UPDATE
0470: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
0480: 6f 69 64 20 73 71 6c 69 74 65 55 70 64 61 74 65  oid sqliteUpdate
0490: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
04a0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
04b0: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
04c0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
04d0: 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  bleName,     /* 
04e0: 54 68 65 20 74 61 62 6c 65 20 69 6e 20 77 68 69  The table in whi
04f0: 63 68 20 77 65 20 73 68 6f 75 6c 64 20 63 68 61  ch we should cha
0500: 6e 67 65 20 74 68 69 6e 67 73 20 2a 2f 0a 20 20  nge things */.  
0510: 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67  ExprList *pChang
0520: 65 73 2c 20 20 20 20 2f 2a 20 54 68 69 6e 67 73  es,    /* Things
0530: 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20 2a   to be changed *
0540: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
0550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0560: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
0570: 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a   May be null */.
0580: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
0590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
05a0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
05b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
05c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
05d0: 74 61 62 6c 65 20 74 6f 20 62 65 20 75 70 64 61  table to be upda
05e0: 74 65 64 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  ted */.  IdList 
05f0: 2a 70 54 61 62 4c 69 73 74 20 3d 20 30 3b 20 20  *pTabList = 0;  
0600: 2f 2a 20 4c 69 73 74 20 63 6f 6e 74 61 69 6e 69  /* List containi
0610: 6e 67 20 6f 6e 6c 79 20 70 54 61 62 20 2a 2f 0a  ng only pTab */.
0620: 20 20 69 6e 74 20 65 6e 64 2c 20 61 64 64 72 3b    int end, addr;
0630: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
0640: 75 70 6c 65 20 6f 66 20 61 64 64 72 65 73 73 65  uple of addresse
0650: 73 20 69 6e 20 74 68 65 20 67 65 6e 65 72 61 74  s in the generat
0660: 65 64 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65  ed code */.  Whe
0670: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
0680: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
0690: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45  on about the WHE
06a0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 56  RE clause */.  V
06b0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
06c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
06d0: 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
06e0: 67 69 6e 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  gine */.  Index 
06f0: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
0700: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
0710: 6f 76 65 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a  over indices */.
0720: 20 20 69 6e 74 20 6e 49 64 78 3b 20 20 20 20 20    int nIdx;     
0730: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
0740: 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20 74 68  er of indices th
0750: 61 74 20 6e 65 65 64 20 75 70 64 61 74 69 6e 67  at need updating
0760: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 3b 20   */.  int base; 
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0780: 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 61  Index of first a
0790: 76 61 69 6c 61 62 6c 65 20 74 61 62 6c 65 20 63  vailable table c
07a0: 75 72 73 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  ursor */.  Index
07b0: 20 2a 2a 61 70 49 64 78 20 3d 20 30 3b 20 20 20   **apIdx = 0;   
07c0: 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66    /* An array of
07d0: 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 6e 65   indices that ne
07e0: 65 64 20 75 70 64 61 74 69 6e 67 20 74 6f 6f 20  ed updating too 
07f0: 2a 2f 0a 20 20 69 6e 74 20 2a 61 58 52 65 66 20  */.  int *aXRef 
0800: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 61  = 0;        /* a
0810: 58 52 65 66 5b 69 5d 20 69 73 20 74 68 65 20 69  XRef[i] is the i
0820: 6e 64 65 78 20 69 6e 20 70 43 68 61 6e 67 65 73  ndex in pChanges
0830: 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 0a 20 20 20  ->a[] of the.   
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 20 20 2a 2a 20 61 6e 20 65 78 70 72        ** an expr
0860: 65 73 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69  ession for the i
0870: 2d 74 68 20 66 69 65 6c 64 20 6f 66 20 74 68 65  -th field of the
0880: 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20   table..        
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08a0: 20 2a 2a 20 61 58 52 65 66 5b 69 5d 3d 3d 2d 31   ** aXRef[i]==-1
08b0: 20 69 66 20 74 68 65 20 69 2d 74 68 20 66 69 65   if the i-th fie
08c0: 6c 64 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ld is not change
08d0: 64 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 63 61  d. */..  /* Loca
08e0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 77 68 69  te the table whi
08f0: 63 68 20 77 65 20 77 61 6e 74 20 74 6f 20 75 70  ch we want to up
0900: 64 61 74 65 2e 20 20 54 68 69 73 20 74 61 62 6c  date.  This tabl
0910: 65 20 68 61 73 20 74 6f 20 62 65 0a 20 20 2a 2a  e has to be.  **
0920: 20 70 75 74 20 69 6e 20 61 6e 20 49 64 4c 69 73   put in an IdLis
0930: 74 20 73 74 72 75 63 74 75 72 65 20 62 65 63 61  t structure beca
0940: 75 73 65 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  use some of the 
0950: 73 75 62 72 6f 75 74 69 6e 65 73 20 77 65 0a 20  subroutines we. 
0960: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c   ** will be call
0970: 69 6e 67 20 61 72 65 20 64 65 73 69 67 6e 65 64  ing are designed
0980: 20 74 6f 20 77 6f 72 6b 20 77 69 74 68 20 6d 75   to work with mu
0990: 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 6e  ltiple tables an
09a0: 64 20 65 78 70 65 63 74 0a 20 20 2a 2a 20 61 6e  d expect.  ** an
09b0: 20 49 64 4c 69 73 74 2a 20 70 61 72 61 6d 65 74   IdList* paramet
09c0: 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 6a 75  er instead of ju
09d0: 73 74 20 61 20 54 61 62 6c 65 2a 20 70 61 72 61  st a Table* para
09e0: 6d 65 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 54  meger..  */.  pT
09f0: 61 62 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49  abList = sqliteI
0a00: 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 70  dListAppend(0, p
0a10: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 66 6f  TableName);.  fo
0a20: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
0a30: 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
0a40: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
0a50: 2e 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69  .pTab = sqliteFi
0a60: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
0a70: 64 62 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  db, pTabList->a[
0a80: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  i].zName);.    i
0a90: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  f( pTabList->a[i
0aa0: 5d 2e 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ].pTab==0 ){.   
0ab0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
0ac0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
0ad0: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  Msg, "no such ta
0ae0: 62 6c 65 3a 20 22 2c 20 0a 20 20 20 20 20 20 20  ble: ", .       
0af0: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d    pTabList->a[i]
0b00: 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  .zName, 0);.    
0b10: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
0b20: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 75 70 64  ;.      goto upd
0b30: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ate_cleanup;.   
0b40: 20 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 4c   }.    if( pTabL
0b50: 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e  ist->a[i].pTab->
0b60: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
0b70: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
0b80: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
0b90: 73 67 2c 20 22 74 61 62 6c 65 20 22 2c 20 70 54  sg, "table ", pT
0ba0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  abList->a[i].zNa
0bb0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 22 20 6d 61  me,.        " ma
0bc0: 79 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  y not be modifie
0bd0: 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  d", 0);.      pP
0be0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
0bf0: 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
0c00: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
0c10: 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62   }.  pTab = pTab
0c20: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
0c30: 0a 20 20 61 58 52 65 66 20 3d 20 73 71 6c 69 74  .  aXRef = sqlit
0c40: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
0c50: 69 6e 74 29 20 2a 20 70 54 61 62 2d 3e 6e 43 6f  int) * pTab->nCo
0c60: 6c 20 29 3b 0a 20 20 69 66 28 20 61 58 52 65 66  l );.  if( aXRef
0c70: 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64 61 74  ==0 ) goto updat
0c80: 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 66 6f 72  e_cleanup;.  for
0c90: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
0ca0: 6f 6c 3b 20 69 2b 2b 29 20 61 58 52 65 66 5b 69  ol; i++) aXRef[i
0cb0: 5d 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 52 65  ] = -1;..  /* Re
0cc0: 73 6f 6c 76 65 20 74 68 65 20 66 69 65 6c 64 20  solve the field 
0cd0: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 74 68 65  names in all the
0ce0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
0cf0: 62 6f 74 68 20 74 68 65 0a 20 20 2a 2a 20 57 48  both the.  ** WH
0d00: 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 69  ERE clause and i
0d10: 6e 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 73  n the new values
0d20: 2e 20 20 41 6c 73 6f 20 66 69 6e 64 20 74 68 65  .  Also find the
0d30: 20 66 69 65 6c 64 20 69 6e 64 65 78 0a 20 20 2a   field index.  *
0d40: 2a 20 66 6f 72 20 65 61 63 68 20 66 69 65 6c 64  * for each field
0d50: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 69   to be updated i
0d60: 6e 20 74 68 65 20 70 43 68 61 6e 67 65 73 20 61  n the pChanges a
0d70: 72 72 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rray..  */.  if(
0d80: 20 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73   pWhere ){.    s
0d90: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
0da0: 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  InSelect(pParse,
0db0: 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a 20 20   pWhere);.  }.  
0dc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 61 6e  for(i=0; i<pChan
0dd0: 67 65 73 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ges->nExpr; i++)
0de0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 78 70 72  {.    sqliteExpr
0df0: 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28  ResolveInSelect(
0e00: 70 50 61 72 73 65 2c 20 70 43 68 61 6e 67 65 73  pParse, pChanges
0e10: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
0e20: 20 7d 0a 20 20 69 66 28 20 70 57 68 65 72 65 20   }.  if( pWhere 
0e30: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
0e40: 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  eExprResolveIds(
0e50: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
0e60: 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20  , pWhere) ){.   
0e70: 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63     goto update_c
0e80: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
0e90: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
0ea0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 57  Check(pParse, pW
0eb0: 68 65 72 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20  here, 0, 0) ){. 
0ec0: 20 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65       goto update
0ed0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a  _cleanup;.    }.
0ee0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
0ef0: 3c 70 43 68 61 6e 67 65 73 2d 3e 6e 45 78 70 72  <pChanges->nExpr
0f00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
0f10: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
0f20: 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
0f30: 62 4c 69 73 74 2c 20 70 43 68 61 6e 67 65 73 2d  bList, pChanges-
0f40: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
0f50: 20 20 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74        goto updat
0f60: 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
0f70: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45  .    if( sqliteE
0f80: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
0f90: 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e   pChanges->a[i].
0fa0: 70 45 78 70 72 2c 20 30 2c 20 30 29 20 29 7b 0a  pExpr, 0, 0) ){.
0fb0: 20 20 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74        goto updat
0fc0: 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
0fd0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
0fe0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
0ff0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
1000: 74 65 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e  teStrICmp(pTab->
1010: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
1020: 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e  Changes->a[i].zN
1030: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
1040: 20 20 20 61 58 52 65 66 5b 6a 5d 20 3d 20 69 3b     aXRef[j] = i;
1050: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1060: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1070: 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
1080: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
1090: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
10a0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
10b0: 6e 6f 20 73 75 63 68 20 66 69 65 6c 64 3a 20 22  no such field: "
10c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 70 43 68 61  , .         pCha
10d0: 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  nges->a[i].zName
10e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
10f0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
1100: 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c    goto update_cl
1110: 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  eanup;.    }.  }
1120: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1130: 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 61  memory for the a
1140: 72 72 61 79 20 61 70 49 64 78 5b 5d 20 61 6e 64  rray apIdx[] and
1150: 20 66 69 6c 6c 20 69 74 20 70 6f 69 6e 74 65 72   fill it pointer
1160: 73 20 74 6f 20 65 76 65 72 79 0a 20 20 2a 2a 20  s to every.  ** 
1170: 69 6e 64 65 78 20 74 68 61 74 20 6e 65 65 64 73  index that needs
1180: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20   to be updated. 
1190: 20 49 6e 64 69 63 65 73 20 6f 6e 6c 79 20 6e 65   Indices only ne
11a0: 65 64 20 75 70 64 61 74 69 6e 67 20 69 66 20 74  ed updating if t
11b0: 68 65 69 72 0a 20 20 2a 2a 20 6b 65 79 20 69 6e  heir.  ** key in
11c0: 63 6c 75 64 65 73 20 6f 6e 65 20 6f 66 20 74 68  cludes one of th
11d0: 65 20 66 69 65 6c 64 73 20 6e 61 6d 65 64 20 69  e fields named i
11e0: 6e 20 70 43 68 61 6e 67 65 73 2e 0a 20 20 2a 2f  n pChanges..  */
11f0: 0a 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70  .  for(nIdx=0, p
1200: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
1210: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
1220: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 66  x->pNext){.    f
1230: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
1240: 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  nField; i++){.  
1250: 20 20 20 20 69 66 28 20 61 58 52 65 66 5b 70 49      if( aXRef[pI
1260: 64 78 2d 3e 61 69 46 69 65 6c 64 5b 69 5d 5d 3e  dx->aiField[i]]>
1270: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1280: 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49 64 78  }.    if( i<pIdx
1290: 2d 3e 6e 46 69 65 6c 64 20 29 20 6e 49 64 78 2b  ->nField ) nIdx+
12a0: 2b 3b 0a 20 20 7d 0a 20 20 61 70 49 64 78 20 3d  +;.  }.  apIdx =
12b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
12c0: 69 7a 65 6f 66 28 49 6e 64 65 78 2a 29 20 2a 20  izeof(Index*) * 
12d0: 6e 49 64 78 20 29 3b 0a 20 20 69 66 28 20 61 70  nIdx );.  if( ap
12e0: 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70  Idx==0 ) goto up
12f0: 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  date_cleanup;.  
1300: 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49 64 78  for(nIdx=0, pIdx
1310: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
1320: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
1330: 70 4e 65 78 74 29 7b 0a 20 20 20 20 66 6f 72 28  pNext){.    for(
1340: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 46 69  i=0; i<pIdx->nFi
1350: 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  eld; i++){.     
1360: 20 69 66 28 20 61 58 52 65 66 5b 70 49 64 78 2d   if( aXRef[pIdx-
1370: 3e 61 69 46 69 65 6c 64 5b 69 5d 5d 3e 3d 30 20  >aiField[i]]>=0 
1380: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
1390: 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e     if( i<pIdx->n
13a0: 46 69 65 6c 64 20 29 20 61 70 49 64 78 5b 6e 49  Field ) apIdx[nI
13b0: 64 78 2b 2b 5d 20 3d 20 70 49 64 78 3b 0a 20 20  dx++] = pIdx;.  
13c0: 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
13d0: 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
13e0: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
13f0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1400: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
1410: 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75  to update_cleanu
1420: 70 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74  p;..  /* Begin t
1430: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
1440: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 56 64  .  */.  sqliteVd
1450: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69  beAddOp(v, OP_Li
1460: 73 74 4f 70 65 6e 2c 20 30 2c 20 30 2c 20 30 2c  stOpen, 0, 0, 0,
1470: 20 30 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20   0);.  pWInfo = 
1480: 73 71 6c 69 74 65 57 68 65 72 65 42 65 67 69 6e  sqliteWhereBegin
1490: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
14a0: 74 2c 20 70 57 68 65 72 65 2c 20 31 29 3b 0a 20  t, pWhere, 1);. 
14b0: 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
14c0: 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65   goto update_cle
14d0: 61 6e 75 70 3b 0a 0a 20 20 2f 2a 20 52 65 6d 65  anup;..  /* Reme
14e0: 6d 62 65 72 20 74 68 65 20 69 6e 64 65 78 20 6f  mber the index o
14f0: 66 20 65 76 65 72 79 20 69 74 65 6d 20 74 6f 20  f every item to 
1500: 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 2a 2f  be updated..  */
1510: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64  .  sqliteVdbeAdd
1520: 4f 70 28 76 2c 20 4f 50 5f 4c 69 73 74 57 72 69  Op(v, OP_ListWri
1530: 74 65 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  te, 0, 0, 0, 0);
1540: 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64  ..  /* End the d
1550: 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
1560: 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  p..  */.  sqlite
1570: 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
1580: 3b 0a 0a 20 20 2f 2a 20 52 65 77 69 6e 64 20 74  ;..  /* Rewind t
1590: 68 65 20 6c 69 73 74 20 6f 66 20 72 65 63 6f 72  he list of recor
15a0: 64 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  ds that need to 
15b0: 62 65 20 75 70 64 61 74 65 64 20 61 6e 64 0a 20  be updated and. 
15c0: 20 2a 2a 20 6f 70 65 6e 20 65 76 65 72 79 20 69   ** open every i
15d0: 6e 64 65 78 20 74 68 61 74 20 6e 65 65 64 73 20  ndex that needs 
15e0: 75 70 64 61 74 69 6e 67 2e 0a 20 20 2a 2f 0a 20  updating..  */. 
15f0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1600: 28 76 2c 20 4f 50 5f 4c 69 73 74 52 65 77 69 6e  (v, OP_ListRewin
1610: 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d, 0, 0, 0, 0);.
1620: 20 20 62 61 73 65 20 3d 20 70 50 61 72 73 65 2d    base = pParse-
1630: 3e 6e 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 56  >nTab;.  sqliteV
1640: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
1650: 70 65 6e 2c 20 62 61 73 65 2c 20 31 2c 20 70 54  pen, base, 1, pT
1660: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
1670: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 64 78   for(i=0; i<nIdx
1680: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1690: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
16a0: 50 5f 4f 70 65 6e 2c 20 62 61 73 65 2b 69 2b 31  P_Open, base+i+1
16b0: 2c 20 31 2c 20 61 70 49 64 78 5b 69 5d 2d 3e 7a  , 1, apIdx[i]->z
16c0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  Name, 0);.  }.. 
16d0: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 65 76   /* Loop over ev
16e0: 65 72 79 20 72 65 63 6f 72 64 20 74 68 61 74 20  ery record that 
16f0: 6e 65 65 64 73 20 75 70 64 61 74 69 6e 67 2e 20  needs updating. 
1700: 20 57 65 20 68 61 76 65 20 74 6f 20 6c 6f 61 64   We have to load
1710: 0a 20 20 2a 2a 20 74 68 65 20 6f 6c 64 20 64 61  .  ** the old da
1720: 74 61 20 66 6f 72 20 65 61 63 68 20 72 65 63 6f  ta for each reco
1730: 72 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  rd to be updated
1740: 20 62 65 63 61 75 73 65 20 73 6f 6d 65 20 66 69   because some fi
1750: 65 6c 64 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20  elds.  ** might 
1760: 6e 6f 74 20 63 68 61 6e 67 65 20 61 6e 64 20 77  not change and w
1770: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
1780: 6f 70 79 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  opy the old valu
1790: 65 2e 0a 20 20 2a 2a 20 41 6c 73 6f 2c 20 74 68  e..  ** Also, th
17a0: 65 20 6f 6c 64 20 64 61 74 61 20 69 73 20 6e 65  e old data is ne
17b0: 65 64 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  eded to delete t
17c0: 68 65 20 6f 6c 64 20 69 6e 64 65 78 20 65 6e 74  he old index ent
17d0: 69 72 65 73 2e 0a 20 20 2a 2f 0a 20 20 65 6e 64  ires..  */.  end
17e0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
17f0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64  eLabel(v);.  add
1800: 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64  r = sqliteVdbeAd
1810: 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 73 74 52 65  dOp(v, OP_ListRe
1820: 61 64 2c 20 30 2c 20 65 6e 64 2c 20 30 2c 20 30  ad, 0, end, 0, 0
1830: 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  );.  sqliteVdbeA
1840: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
1850: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73  0, 0, 0, 0);.  s
1860: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
1870: 2c 20 4f 50 5f 46 65 74 63 68 2c 20 62 61 73 65  , OP_Fetch, base
1880: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 2f  , 0, 0, 0);..  /
1890: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6f 6c 64  * Delete the old
18a0: 20 69 6e 64 69 63 65 73 20 66 6f 72 20 74 68 65   indices for the
18b0: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 2e   current record.
18c0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
18d0: 20 69 3c 6e 49 64 78 3b 20 69 2b 2b 29 7b 0a 20   i<nIdx; i++){. 
18e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
18f0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
1900: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70   0, 0, 0);.    p
1910: 49 64 78 20 3d 20 61 70 49 64 78 5b 69 5d 3b 0a  Idx = apIdx[i];.
1920: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1930: 49 64 78 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  Idx->nField; j++
1940: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
1950: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
1960: 69 65 6c 64 2c 20 62 61 73 65 2c 20 70 49 64 78  ield, base, pIdx
1970: 2d 3e 61 69 46 69 65 6c 64 5b 6a 5d 2c 20 30 2c  ->aiField[j], 0,
1980: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
1990: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
19a0: 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 70 49  , OP_MakeKey, pI
19b0: 64 78 2d 3e 6e 46 69 65 6c 64 2c 20 30 2c 20 30  dx->nField, 0, 0
19c0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
19d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
19e0: 44 65 6c 65 74 65 49 64 78 2c 20 62 61 73 65 2b  DeleteIdx, base+
19f0: 69 2b 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  i+1, 0, 0, 0);. 
1a00: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
1a10: 20 61 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6e 65   a completely ne
1a20: 77 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  w data for this 
1a30: 72 65 63 6f 72 64 2e 20 20 0a 20 20 2a 2f 0a 20  record.  .  */. 
1a40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1a50: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1a60: 20 20 6a 20 3d 20 61 58 52 65 66 5b 69 5d 3b 0a    j = aXRef[i];.
1a70: 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20      if( j<0 ){. 
1a80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
1a90: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 65 6c 64  ddOp(v, OP_Field
1aa0: 2c 20 62 61 73 65 2c 20 69 2c 20 30 2c 20 30 29  , base, i, 0, 0)
1ab0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ac0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
1ad0: 65 28 70 50 61 72 73 65 2c 20 70 43 68 61 6e 67  e(pParse, pChang
1ae0: 65 73 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b  es->a[j].pExpr);
1af0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1b00: 20 49 6e 73 65 72 74 20 6e 65 77 20 69 6e 64 65   Insert new inde
1b10: 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 63  x entries that c
1b20: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
1b30: 20 6e 65 77 20 64 61 74 61 0a 20 20 2a 2f 0a 20   new data.  */. 
1b40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 64 78   for(i=0; i<nIdx
1b50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1b60: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
1b70: 50 5f 44 75 70 2c 20 70 54 61 62 2d 3e 6e 43 6f  P_Dup, pTab->nCo
1b80: 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 20 2f 2a 20  l, 0, 0, 0); /* 
1b90: 54 68 65 20 4b 45 59 20 2a 2f 0a 20 20 20 20 70  The KEY */.    p
1ba0: 49 64 78 20 3d 20 61 70 49 64 78 5b 69 5d 3b 0a  Idx = apIdx[i];.
1bb0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1bc0: 49 64 78 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  Idx->nField; j++
1bd0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
1be0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
1bf0: 75 70 2c 20 6a 2b 70 54 61 62 2d 3e 6e 43 6f 6c  up, j+pTab->nCol
1c00: 2d 70 49 64 78 2d 3e 61 69 46 69 65 6c 64 5b 6a  -pIdx->aiField[j
1c10: 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ], 0, 0, 0);.   
1c20: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
1c30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
1c40: 65 4b 65 79 2c 20 70 49 64 78 2d 3e 6e 46 69 65  eKey, pIdx->nFie
1c50: 6c 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ld, 0, 0, 0);.  
1c60: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
1c70: 70 28 76 2c 20 4f 50 5f 50 75 74 49 64 78 2c 20  p(v, OP_PutIdx, 
1c80: 62 61 73 65 2b 69 2b 31 2c 20 30 2c 20 30 2c 20  base+i+1, 0, 0, 
1c90: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  0);.  }..  /* Wr
1ca0: 69 74 65 20 74 68 65 20 6e 65 77 20 64 61 74 61  ite the new data
1cb0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
1cc0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
1cd0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
1ce0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
1cf0: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 30 2c  , pTab->nCol, 0,
1d00: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
1d10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1d20: 50 75 74 2c 20 62 61 73 65 2c 20 30 2c 20 30 2c  Put, base, 0, 0,
1d30: 20 30 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 65 61   0);..  /* Repea
1d40: 74 20 74 68 65 20 61 62 6f 76 65 20 77 69 74 68  t the above with
1d50: 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64   the next record
1d60: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2c 20   to be updated, 
1d70: 75 6e 74 69 6c 0a 20 20 2a 2a 20 61 6c 6c 20 72  until.  ** all r
1d80: 65 63 6f 72 64 20 73 65 6c 65 63 74 65 64 20 62  ecord selected b
1d90: 79 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  y the WHERE clau
1da0: 73 65 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  se have been upd
1db0: 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ated..  */.  sql
1dc0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
1dd0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
1de0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
1df0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1e00: 5f 4c 69 73 74 43 6c 6f 73 65 2c 20 30 2c 20 30  _ListClose, 0, 0
1e10: 2c 20 30 2c 20 65 6e 64 29 3b 0a 0a 75 70 64 61  , 0, end);..upda
1e20: 74 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  te_cleanup:.  sq
1e30: 6c 69 74 65 46 72 65 65 28 61 70 49 64 78 29 3b  liteFree(apIdx);
1e40: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 61 58  .  sqliteFree(aX
1e50: 52 65 66 29 3b 0a 20 20 73 71 6c 69 74 65 49 64  Ref);.  sqliteId
1e60: 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61 62 4c  ListDelete(pTabL
1e70: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 45 78  ist);.  sqliteEx
1e80: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 43 68  prListDelete(pCh
1e90: 61 6e 67 65 73 29 3b 0a 20 20 73 71 6c 69 74 65  anges);.  sqlite
1ea0: 45 78 70 72 44 65 6c 65 74 65 28 70 57 68 65 72  ExprDelete(pWher
1eb0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.