/ Hex Artifact Content
Login

Artifact 5e638a61102776c0f0333994e18361b40598b44f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 55 50 44 41 54 45 20 73   handle UPDATE s
01d0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
01e0: 20 24 49 64 3a 20 75 70 64 61 74 65 2e 63 2c 76   $Id: update.c,v
01f0: 20 31 2e 31 32 35 20 32 30 30 36 2f 30 36 2f 31   1.125 2006/06/1
0200: 34 20 31 39 3a 30 30 3a 32 32 20 64 72 68 20 45  4 19:00:22 drh E
0210: 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  xp $.*/.#include
0220: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0230: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 6f 73 74 20 72  /*.** The most r
0240: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
0250: 73 74 72 75 63 74 69 6f 6e 20 77 61 73 20 61 6e  struction was an
0260: 20 4f 50 5f 43 6f 6c 75 6d 6e 20 74 6f 20 72 65   OP_Column to re
0270: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 69 2d  trieve the.** i-
0280: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  th column of tab
0290: 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 72 6f  le pTab. This ro
02a0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 50  utine sets the P
02b0: 33 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74  3 parameter of t
02c0: 68 65 20 0a 2a 2a 20 4f 50 5f 43 6f 6c 75 6d 6e  he .** OP_Column
02d0: 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20   to the default 
02e0: 76 61 6c 75 65 2c 20 69 66 20 61 6e 79 2e 0a 2a  value, if any..*
02f0: 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
0300: 20 76 61 6c 75 65 20 6f 66 20 61 20 63 6f 6c 75   value of a colu
0310: 6d 6e 20 69 73 20 73 70 65 63 69 66 69 65 64 20  mn is specified 
0320: 62 79 20 61 20 44 45 46 41 55 4c 54 20 63 6c 61  by a DEFAULT cla
0330: 75 73 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 63  use in the .** c
0340: 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
0350: 2e 20 54 68 69 73 20 77 61 73 20 65 69 74 68 65  . This was eithe
0360: 72 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68  r supplied by th
0370: 65 20 75 73 65 72 20 77 68 65 6e 20 74 68 65 20  e user when the 
0380: 74 61 62 6c 65 0a 2a 2a 20 77 61 73 20 63 72 65  table.** was cre
0390: 61 74 65 64 2c 20 6f 72 20 61 64 64 65 64 20 6c  ated, or added l
03a0: 61 74 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c  ater to the tabl
03b0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 62 79 20  e definition by 
03c0: 61 6e 20 41 4c 54 45 52 20 54 41 42 4c 45 0a 2a  an ALTER TABLE.*
03d0: 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68  * command. If th
03e0: 65 20 6c 61 74 74 65 72 2c 20 74 68 65 6e 20 74  e latter, then t
03f0: 68 65 20 72 6f 77 2d 72 65 63 6f 72 64 73 20 69  he row-records i
0400: 6e 20 74 68 65 20 74 61 62 6c 65 20 62 74 72 65  n the table btre
0410: 65 20 6f 6e 20 64 69 73 6b 0a 2a 2a 20 6d 61 79  e on disk.** may
0420: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 76   not contain a v
0430: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  alue for the col
0440: 75 6d 6e 20 61 6e 64 20 74 68 65 20 64 65 66 61  umn and the defa
0450: 75 6c 74 20 76 61 6c 75 65 2c 20 74 61 6b 65 6e  ult value, taken
0460: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 50 33 20  .** from the P3 
0470: 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68 65  parameter of the
0480: 20 4f 50 5f 43 6f 6c 75 6d 6e 20 69 6e 73 74 72   OP_Column instr
0490: 75 63 74 69 6f 6e 2c 20 69 73 20 72 65 74 75 72  uction, is retur
04a0: 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 20  ned instead..** 
04b0: 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74  If the former, t
04c0: 68 65 6e 20 61 6c 6c 20 72 6f 77 2d 72 65 63 6f  hen all row-reco
04d0: 72 64 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  rds are guarante
04e0: 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 61 20  ed to include a 
04f0: 76 61 6c 75 65 0a 2a 2a 20 66 6f 72 20 74 68 65  value.** for the
0500: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20   column and the 
0510: 50 33 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20  P3 value is not 
0520: 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
0530: 43 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  Column definitio
0540: 6e 73 20 63 72 65 61 74 65 64 20 62 79 20 61 6e  ns created by an
0550: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 63 6f 6d   ALTER TABLE com
0560: 6d 61 6e 64 20 6d 61 79 20 6f 6e 6c 79 20 68 61  mand may only ha
0570: 76 65 20 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 64  ve .** literal d
0580: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 73 70  efault values sp
0590: 65 63 69 66 69 65 64 3a 20 61 20 6e 75 6d 62 65  ecified: a numbe
05a0: 72 2c 20 6e 75 6c 6c 20 6f 72 20 61 20 73 74 72  r, null or a str
05b0: 69 6e 67 2e 20 28 49 66 20 61 20 6d 6f 72 65 0a  ing. (If a more.
05c0: 2a 2a 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 64  ** complicated d
05d0: 65 66 61 75 6c 74 20 65 78 70 72 65 73 73 69 6f  efault expressio
05e0: 6e 20 76 61 6c 75 65 20 77 61 73 20 70 72 6f 76  n value was prov
05f0: 69 64 65 64 2c 20 69 74 20 69 73 20 65 76 61 6c  ided, it is eval
0600: 75 61 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 74  uated .** when t
0610: 68 65 20 41 4c 54 45 52 20 54 41 42 4c 45 20 69  he ALTER TABLE i
0620: 73 20 65 78 65 63 75 74 65 64 20 61 6e 64 20 6f  s executed and o
0630: 6e 65 20 6f 66 20 74 68 65 20 6c 69 74 65 72 61  ne of the litera
0640: 6c 20 76 61 6c 75 65 73 20 77 72 69 74 74 65 6e  l values written
0650: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 71 6c  .** into the sql
0660: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
0670: 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 66 6f  .).**.** Therefo
0680: 72 65 2c 20 74 68 65 20 50 33 20 70 61 72 61 6d  re, the P3 param
0690: 65 74 65 72 20 69 73 20 6f 6e 6c 79 20 72 65 71  eter is only req
06a0: 75 69 72 65 64 20 69 66 20 74 68 65 20 64 65 66  uired if the def
06b0: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 0a 2a  ault value for.*
06c0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  * the column is 
06d0: 61 20 6c 69 74 65 72 61 6c 20 6e 75 6d 62 65 72  a literal number
06e0: 2c 20 73 74 72 69 6e 67 20 6f 72 20 6e 75 6c 6c  , string or null
06f0: 2e 20 54 68 65 20 73 71 6c 69 74 65 33 56 61 6c  . The sqlite3Val
0700: 75 65 46 72 6f 6d 45 78 70 72 28 29 0a 2a 2a 20  ueFromExpr().** 
0710: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 70 61  function is capa
0720: 62 6c 65 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d  ble of transform
0730: 69 6e 67 20 74 68 65 73 65 20 74 79 70 65 73 20  ing these types 
0740: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  of expressions i
0750: 6e 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  nto.** sqlite3_v
0760: 61 6c 75 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  alue objects..*/
0770: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c  .void sqlite3Col
0780: 75 6d 6e 44 65 66 61 75 6c 74 28 56 64 62 65 20  umnDefault(Vdbe 
0790: 2a 76 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  *v, Table *pTab,
07a0: 20 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20 70   int i){.  if( p
07b0: 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53  Tab && !pTab->pS
07c0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
07d0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
07e0: 75 65 3b 0a 20 20 20 20 75 38 20 65 6e 63 20 3d  ue;.    u8 enc =
07f0: 20 45 4e 43 28 73 71 6c 69 74 65 33 56 64 62 65   ENC(sqlite3Vdbe
0800: 44 62 28 76 29 29 3b 0a 20 20 20 20 43 6f 6c 75  Db(v));.    Colu
0810: 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62  mn *pCol = &pTab
0820: 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 73  ->aCol[i];.    s
0830: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45  qlite3ValueFromE
0840: 78 70 72 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 2c  xpr(pCol->pDflt,
0850: 20 65 6e 63 2c 20 70 43 6f 6c 2d 3e 61 66 66 69   enc, pCol->affi
0860: 6e 69 74 79 2c 20 26 70 56 61 6c 75 65 29 3b 0a  nity, &pValue);.
0870: 20 20 20 20 69 66 28 20 70 56 61 6c 75 65 20 29      if( pValue )
0880: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
0890: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
08a0: 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  1, (const char *
08b0: 29 70 56 61 6c 75 65 2c 20 50 33 5f 4d 45 4d 29  )pValue, P3_MEM)
08c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
08d0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
08e0: 76 2c 20 22 23 20 25 73 2e 25 73 22 2c 20 70 54  v, "# %s.%s", pT
08f0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f 6c 2d  ab->zName, pCol-
0900: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  >zName));.    }.
0910: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f    }.}../*.** Pro
0920: 63 65 73 73 20 61 6e 20 55 50 44 41 54 45 20 73  cess an UPDATE s
0930: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
0940: 20 20 55 50 44 41 54 45 20 4f 52 20 49 47 4e 4f    UPDATE OR IGNO
0950: 52 45 20 74 61 62 6c 65 5f 77 78 79 7a 20 53 45  RE table_wxyz SE
0960: 54 20 61 3d 62 2c 20 63 3d 64 20 57 48 45 52 45  T a=b, c=d WHERE
0970: 20 65 3c 35 20 41 4e 44 20 66 20 4e 4f 54 20 4e   e<5 AND f NOT N
0980: 55 4c 4c 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ULL;.**         
0990: 20 5c 5f 5f 5f 5f 5f 5f 5f 2f 20 5c 5f 5f 5f 5f   \_______/ \____
09a0: 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f  ____/     \_____
09b0: 5f 2f 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  _/       \______
09c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 20 20 20  __________/.*   
09d0: 20 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72           onError
09e0: 20 20 20 70 54 61 62 4c 69 73 74 20 20 20 20 20     pTabList     
09f0: 20 70 43 68 61 6e 67 65 73 20 20 20 20 20 20 20   pChanges       
0a00: 20 20 20 20 20 20 70 57 68 65 72 65 0a 2a 2f 0a        pWhere.*/.
0a10: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 70 64 61  void sqlite3Upda
0a20: 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  te(.  Parse *pPa
0a30: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
0a40: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
0a50: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
0a60: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 2f  *pTabList,     /
0a70: 2a 20 54 68 65 20 74 61 62 6c 65 20 69 6e 20 77  * The table in w
0a80: 68 69 63 68 20 77 65 20 73 68 6f 75 6c 64 20 63  hich we should c
0a90: 68 61 6e 67 65 20 74 68 69 6e 67 73 20 2a 2f 0a  hange things */.
0aa0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61    ExprList *pCha
0ab0: 6e 67 65 73 2c 20 20 20 20 2f 2a 20 54 68 69 6e  nges,    /* Thin
0ac0: 67 73 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  gs to be changed
0ad0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0ae0: 72 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re,          /* 
0af0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
0b00: 2e 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a  .  May be null *
0b10: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20  /.  int onError 
0b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
0b30: 77 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73  w to handle cons
0b40: 74 72 61 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f  traint errors */
0b50: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b70: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
0b80: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
0b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0ba0: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 75 70 64   table to be upd
0bb0: 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ated */.  int ad
0bc0: 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dr = 0;         
0bd0: 20 2f 2a 20 56 44 42 45 20 69 6e 73 74 72 75 63   /* VDBE instruc
0be0: 74 69 6f 6e 20 61 64 64 72 65 73 73 20 6f 66 20  tion address of 
0bf0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0c00: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
0c10: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
0c20: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
0c30: 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45   about the WHERE
0c40: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 56 64 62   clause */.  Vdb
0c50: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
0c60: 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
0c70: 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  al database engi
0c80: 6e 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ne */.  Index *p
0c90: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Idx;           /
0ca0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
0cb0: 65 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  er indices */.  
0cc0: 69 6e 74 20 6e 49 64 78 3b 20 20 20 20 20 20 20  int nIdx;       
0cd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0ce0: 20 6f 66 20 69 6e 64 69 63 65 73 20 74 68 61 74   of indices that
0cf0: 20 6e 65 65 64 20 75 70 64 61 74 69 6e 67 20 2a   need updating *
0d00: 2f 0a 20 20 69 6e 74 20 6e 49 64 78 54 6f 74 61  /.  int nIdxTota
0d10: 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  l;         /* To
0d20: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
0d30: 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  dices */.  int i
0d40: 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
0d50: 20 20 2f 2a 20 56 44 42 45 20 43 75 72 73 6f 72    /* VDBE Cursor
0d60: 20 6e 75 6d 62 65 72 20 6f 66 20 70 54 61 62 20   number of pTab 
0d70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
0d80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
0d90: 68 65 20 64 61 74 61 62 61 73 65 20 73 74 72 75  he database stru
0da0: 63 74 75 72 65 20 2a 2f 0a 20 20 49 6e 64 65 78  cture */.  Index
0db0: 20 2a 2a 61 70 49 64 78 20 3d 20 30 3b 20 20 20   **apIdx = 0;   
0dc0: 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66    /* An array of
0dd0: 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 6e 65   indices that ne
0de0: 65 64 20 75 70 64 61 74 69 6e 67 20 74 6f 6f 20  ed updating too 
0df0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 49 64 78 55  */.  char *aIdxU
0e00: 73 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 61  sed = 0;    /* a
0e10: 49 64 78 55 73 65 64 5b 69 5d 3d 3d 31 20 69 66  IdxUsed[i]==1 if
0e20: 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   the i-th index 
0e30: 69 73 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  is used */.  int
0e40: 20 2a 61 58 52 65 66 20 3d 20 30 3b 20 20 20 20   *aXRef = 0;    
0e50: 20 20 20 20 2f 2a 20 61 58 52 65 66 5b 69 5d 20      /* aXRef[i] 
0e60: 69 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  is the index in 
0e70: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 5d 20 6f 66  pChanges->a[] of
0e80: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
0ea0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   an expression f
0eb0: 6f 72 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75  or the i-th colu
0ec0: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  mn of the table.
0ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ee0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 58 52            ** aXR
0ef0: 65 66 5b 69 5d 3d 3d 2d 31 20 69 66 20 74 68 65  ef[i]==-1 if the
0f00: 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 69 73 20   i-th column is 
0f10: 6e 6f 74 20 63 68 61 6e 67 65 64 2e 20 2a 2f 0a  not changed. */.
0f20: 20 20 69 6e 74 20 63 68 6e 67 52 6f 77 69 64 3b    int chngRowid;
0f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
0f40: 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 6e   if the record n
0f50: 75 6d 62 65 72 20 69 73 20 62 65 69 6e 67 20 63  umber is being c
0f60: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 45 78 70 72  hanged */.  Expr
0f70: 20 2a 70 52 6f 77 69 64 45 78 70 72 20 3d 20 30   *pRowidExpr = 0
0f80: 3b 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e  ;  /* Expression
0f90: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 6e 65   defining the ne
0fa0: 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  w record number 
0fb0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 41 6c 6c  */.  int openAll
0fc0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
0fd0: 72 75 65 20 69 66 20 61 6c 6c 20 69 6e 64 69 63  rue if all indic
0fe0: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6f 70  es need to be op
0ff0: 65 6e 65 64 20 2a 2f 0a 20 20 41 75 74 68 43 6f  ened */.  AuthCo
1000: 6e 74 65 78 74 20 73 43 6f 6e 74 65 78 74 3b 20  ntext sContext; 
1010: 20 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a   /* The authoriz
1020: 61 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f  ation context */
1030: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
1040: 4e 43 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  NC;       /* The
1050: 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f   name-context to
1060: 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73   resolve express
1070: 69 6f 6e 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  ions in */.  int
1080: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
1090: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
10a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
10b0: 61 62 6c 65 20 62 65 69 6e 67 20 75 70 64 61 74  able being updat
10c0: 65 64 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ed */..#ifndef S
10d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
10e0: 45 52 0a 20 20 69 6e 74 20 69 73 56 69 65 77 3b  ER.  int isView;
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 75    /* Trying to u
1110: 70 64 61 74 65 20 61 20 76 69 65 77 20 2a 2f 0a  pdate a view */.
1120: 20 20 69 6e 74 20 74 72 69 67 67 65 72 73 5f 65    int triggers_e
1130: 78 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  xist = 0;      /
1140: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 72 6f  * True if any ro
1150: 77 20 74 72 69 67 67 65 72 73 20 65 78 69 73 74  w triggers exist
1160: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e   */.#endif..  in
1170: 74 20 6e 65 77 49 64 78 20 20 20 20 20 20 3d 20  t newIdx      = 
1180: 2d 31 3b 20 20 2f 2a 20 69 6e 64 65 78 20 6f 66  -1;  /* index of
1190: 20 74 72 69 67 67 65 72 20 22 6e 65 77 22 20 74   trigger "new" t
11a0: 65 6d 70 20 74 61 62 6c 65 20 20 20 20 20 20 20  emp table       
11b0: 2a 2f 0a 20 20 69 6e 74 20 6f 6c 64 49 64 78 20  */.  int oldIdx 
11c0: 20 20 20 20 20 3d 20 2d 31 3b 20 20 2f 2a 20 69       = -1;  /* i
11d0: 6e 64 65 78 20 6f 66 20 74 72 69 67 67 65 72 20  ndex of trigger 
11e0: 22 6f 6c 64 22 20 74 65 6d 70 20 74 61 62 6c 65  "old" temp table
11f0: 20 20 20 20 20 20 20 2a 2f 0a 0a 20 20 73 43 6f         */..  sCo
1200: 6e 74 65 78 74 2e 70 50 61 72 73 65 20 3d 20 30  ntext.pParse = 0
1210: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1220: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d  nErr || sqlite3M
1230: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b  allocFailed() ){
1240: 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65  .    goto update
1250: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
1260: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1270: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c  .  assert( pTabL
1280: 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ist->nSrc==1 );.
1290: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
12a0: 20 74 61 62 6c 65 20 77 68 69 63 68 20 77 65 20   table which we 
12b0: 77 61 6e 74 20 74 6f 20 75 70 64 61 74 65 2e 20  want to update. 
12c0: 0a 20 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73  .  */.  pTab = s
12d0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
12e0: 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62  kup(pParse, pTab
12f0: 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 54 61  List);.  if( pTa
1300: 62 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64 61  b==0 ) goto upda
1310: 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 44  te_cleanup;.  iD
1320: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
1330: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
1340: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
1350: 6d 61 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ma);..  /* Figur
1360: 65 20 6f 75 74 20 69 66 20 77 65 20 68 61 76 65  e out if we have
1370: 20 61 6e 79 20 74 72 69 67 67 65 72 73 20 61 6e   any triggers an
1380: 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 62  d if the table b
1390: 65 69 6e 67 0a 20 20 2a 2a 20 75 70 64 61 74 65  eing.  ** update
13a0: 64 20 69 73 20 61 20 76 69 65 77 0a 20 20 2a 2f  d is a view.  */
13b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13c0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 74  OMIT_TRIGGER.  t
13d0: 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 3d 20  riggers_exist = 
13e0: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 73 45  sqlite3TriggersE
13f0: 78 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61  xist(pParse, pTa
1400: 62 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 70 43  b, TK_UPDATE, pC
1410: 68 61 6e 67 65 73 29 3b 0a 20 20 69 73 56 69 65  hanges);.  isVie
1420: 77 20 3d 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  w = pTab->pSelec
1430: 74 21 3d 30 3b 0a 23 65 6c 73 65 0a 23 20 64 65  t!=0;.#else.# de
1440: 66 69 6e 65 20 74 72 69 67 67 65 72 73 5f 65 78  fine triggers_ex
1450: 69 73 74 20 30 0a 23 20 64 65 66 69 6e 65 20 69  ist 0.# define i
1460: 73 56 69 65 77 20 30 0a 23 65 6e 64 69 66 0a 23  sView 0.#endif.#
1470: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
1480: 54 5f 56 49 45 57 0a 23 20 75 6e 64 65 66 20 69  T_VIEW.# undef i
1490: 73 56 69 65 77 0a 23 20 64 65 66 69 6e 65 20 69  sView.# define i
14a0: 73 56 69 65 77 20 30 0a 23 65 6e 64 69 66 0a 0a  sView 0.#endif..
14b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52    if( sqlite3IsR
14c0: 65 61 64 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20  eadOnly(pParse, 
14d0: 70 54 61 62 2c 20 74 72 69 67 67 65 72 73 5f 65  pTab, triggers_e
14e0: 78 69 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74  xist) ){.    got
14f0: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
1500: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69  ;.  }.  if( isVi
1510: 65 77 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  ew ){.    if( sq
1520: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
1530: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
1540: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 67  pTab) ){.      g
1550: 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e  oto update_clean
1560: 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  up;.    }.  }.  
1570: 61 58 52 65 66 20 3d 20 73 71 6c 69 74 65 4d 61  aXRef = sqliteMa
1580: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
1590: 69 6e 74 29 20 2a 20 70 54 61 62 2d 3e 6e 43 6f  int) * pTab->nCo
15a0: 6c 20 29 3b 0a 20 20 69 66 28 20 61 58 52 65 66  l );.  if( aXRef
15b0: 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64 61 74  ==0 ) goto updat
15c0: 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 66 6f 72  e_cleanup;.  for
15d0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
15e0: 6f 6c 3b 20 69 2b 2b 29 20 61 58 52 65 66 5b 69  ol; i++) aXRef[i
15f0: 5d 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66  ] = -1;..  /* If
1600: 20 74 68 65 72 65 20 61 72 65 20 46 4f 52 20 45   there are FOR E
1610: 41 43 48 20 52 4f 57 20 74 72 69 67 67 65 72 73  ACH ROW triggers
1620: 2c 20 61 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  , allocate curso
1630: 72 73 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  rs for the.  ** 
1640: 73 70 65 63 69 61 6c 20 4f 4c 44 20 61 6e 64 20  special OLD and 
1650: 4e 45 57 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a  NEW tables.  */.
1660: 20 20 69 66 28 20 74 72 69 67 67 65 72 73 5f 65    if( triggers_e
1670: 78 69 73 74 20 29 7b 0a 20 20 20 20 6e 65 77 49  xist ){.    newI
1680: 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
1690: 62 2b 2b 3b 0a 20 20 20 20 6f 6c 64 49 64 78 20  b++;.    oldIdx 
16a0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
16b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ;.  }..  /* Allo
16c0: 63 61 74 65 20 61 20 63 75 72 73 6f 72 73 20 66  cate a cursors f
16d0: 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
16e0: 62 61 73 65 20 74 61 62 6c 65 20 61 6e 64 20 66  base table and f
16f0: 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 0a  or all indices..
1700: 20 20 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 63    ** The index c
1710: 75 72 73 6f 72 73 20 6d 69 67 68 74 20 6e 6f 74  ursors might not
1720: 20 62 65 20 75 73 65 64 2c 20 62 75 74 20 69 66   be used, but if
1730: 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74   they are used t
1740: 68 65 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f  hey.  ** need to
1750: 20 6f 63 63 75 72 20 72 69 67 68 74 20 61 66 74   occur right aft
1760: 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  er the database 
1770: 63 75 72 73 6f 72 2e 20 20 53 6f 20 67 6f 20 61  cursor.  So go a
1780: 68 65 61 64 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  head and.  ** al
1790: 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 73 70  locate enough sp
17a0: 61 63 65 2c 20 6a 75 73 74 20 69 6e 20 63 61 73  ace, just in cas
17b0: 65 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69  e..  */.  pTabLi
17c0: 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
17d0: 20 3d 20 69 43 75 72 20 3d 20 70 50 61 72 73 65   = iCur = pParse
17e0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 66 6f 72 28  ->nTab++;.  for(
17f0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
1800: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
1810: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
1820: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1830: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
1840: 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 2d 63 6f  lize the name-co
1850: 6e 74 65 78 74 20 2a 2f 0a 20 20 6d 65 6d 73 65  ntext */.  memse
1860: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
1870: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
1880: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
1890: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
18a0: 20 70 54 61 62 4c 69 73 74 3b 0a 0a 20 20 2f 2a   pTabList;..  /*
18b0: 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c   Resolve the col
18c0: 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  umn names in all
18d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
18e0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 66 20   of the.  ** of 
18f0: 74 68 65 20 55 50 44 41 54 45 20 73 74 61 74 65  the UPDATE state
1900: 6d 65 6e 74 2e 20 20 41 6c 73 6f 20 66 69 6e 64  ment.  Also find
1910: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 65   the column inde
1920: 78 0a 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20  x.  ** for each 
1930: 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 75 70 64  column to be upd
1940: 61 74 65 64 20 69 6e 20 74 68 65 20 70 43 68 61  ated in the pCha
1950: 6e 67 65 73 20 61 72 72 61 79 2e 20 20 46 6f 72  nges array.  For
1960: 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 6c 75 6d   each.  ** colum
1970: 6e 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2c  n to be updated,
1980: 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   make sure we ha
1990: 76 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  ve authorization
19a0: 20 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20   to change.  ** 
19b0: 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a  that column..  *
19c0: 2f 0a 20 20 63 68 6e 67 52 6f 77 69 64 20 3d 20  /.  chngRowid = 
19d0: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
19e0: 70 43 68 61 6e 67 65 73 2d 3e 6e 45 78 70 72 3b  pChanges->nExpr;
19f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1a00: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
1a10: 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 43 68  eNames(&sNC, pCh
1a20: 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 70 45 78 70  anges->a[i].pExp
1a30: 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  r) ){.      goto
1a40: 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b   update_cleanup;
1a50: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a  .    }.    for(j
1a60: 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
1a70: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
1a80: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1a90: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  (pTab->aCol[j].z
1aa0: 4e 61 6d 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e  Name, pChanges->
1ab0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
1ac0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  {.        if( j=
1ad0: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
1ae0: 20 20 20 20 20 20 20 20 20 20 63 68 6e 67 52 6f            chngRo
1af0: 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  wid = 1;.       
1b00: 20 20 20 70 52 6f 77 69 64 45 78 70 72 20 3d 20     pRowidExpr = 
1b10: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 70  pChanges->a[i].p
1b20: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
1b30: 20 20 20 20 20 20 20 20 61 58 52 65 66 5b 6a 5d          aXRef[j]
1b40: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 62 72   = i;.        br
1b50: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1b60: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
1b70: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
1b80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52    if( sqlite3IsR
1b90: 6f 77 69 64 28 70 43 68 61 6e 67 65 73 2d 3e 61  owid(pChanges->a
1ba0: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  [i].zName) ){.  
1bb0: 20 20 20 20 20 20 63 68 6e 67 52 6f 77 69 64 20        chngRowid 
1bc0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 52 6f  = 1;.        pRo
1bd0: 77 69 64 45 78 70 72 20 3d 20 70 43 68 61 6e 67  widExpr = pChang
1be0: 65 73 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  es->a[i].pExpr;.
1bf0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1c10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
1c20: 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73   such column: %s
1c30: 22 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69  ", pChanges->a[i
1c40: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
1c50: 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c    goto update_cl
1c60: 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20  eanup;.      }. 
1c70: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1c80: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1c90: 5a 41 54 49 4f 4e 0a 20 20 20 20 7b 0a 20 20 20  ZATION.    {.   
1ca0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
1cb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 75 74   rc = sqlite3Aut
1cc0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1cd0: 51 4c 49 54 45 5f 55 50 44 41 54 45 2c 20 70 54  QLITE_UPDATE, pT
1ce0: 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
1d10: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61  [j].zName, db->a
1d20: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a  Db[iDb].zName);.
1d30: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1d40: 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20  LITE_DENY ){.   
1d50: 20 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65       goto update
1d60: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
1d70: 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1d80: 4c 49 54 45 5f 49 47 4e 4f 52 45 20 29 7b 0a 20  LITE_IGNORE ){. 
1d90: 20 20 20 20 20 20 20 61 58 52 65 66 5b 6a 5d 20         aXRef[j] 
1da0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
1db0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
1dc0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
1dd0: 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 61 72 72  mory for the arr
1de0: 61 79 20 61 70 49 64 78 5b 5d 20 61 6e 64 20 66  ay apIdx[] and f
1df0: 69 6c 6c 20 69 74 20 77 69 74 68 20 70 6f 69 6e  ill it with poin
1e00: 74 65 72 73 20 74 6f 20 65 76 65 72 79 0a 20 20  ters to every.  
1e10: 2a 2a 20 69 6e 64 65 78 20 74 68 61 74 20 6e 65  ** index that ne
1e20: 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
1e30: 64 2e 20 20 49 6e 64 69 63 65 73 20 6f 6e 6c 79  d.  Indices only
1e40: 20 6e 65 65 64 20 75 70 64 61 74 69 6e 67 20 69   need updating i
1e50: 66 20 74 68 65 69 72 0a 20 20 2a 2a 20 6b 65 79  f their.  ** key
1e60: 20 69 6e 63 6c 75 64 65 73 20 6f 6e 65 20 6f 66   includes one of
1e70: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
1e80: 65 64 20 69 6e 20 70 43 68 61 6e 67 65 73 20 6f  ed in pChanges o
1e90: 72 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 0a  r if the record.
1ea0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 74    ** number of t
1eb0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  he original tabl
1ec0: 65 20 65 6e 74 72 79 20 69 73 20 63 68 61 6e 67  e entry is chang
1ed0: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
1ee0: 6e 49 64 78 3d 6e 49 64 78 54 6f 74 61 6c 3d 30  nIdx=nIdxTotal=0
1ef0: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
1f00: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
1f10: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64  pIdx->pNext, nId
1f20: 78 54 6f 74 61 6c 2b 2b 29 7b 0a 20 20 20 20 69  xTotal++){.    i
1f30: 66 28 20 63 68 6e 67 52 6f 77 69 64 20 29 7b 0a  f( chngRowid ){.
1f40: 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20        i = 0;.   
1f50: 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 66   }else {.      f
1f60: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
1f70: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
1f80: 20 20 20 20 20 20 20 69 66 28 20 61 58 52 65 66         if( aXRef
1f90: 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
1fa0: 69 5d 5d 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a  i]]>=0 ) break;.
1fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1fc0: 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43    if( i<pIdx->nC
1fd0: 6f 6c 75 6d 6e 20 29 20 6e 49 64 78 2b 2b 3b 0a  olumn ) nIdx++;.
1fe0: 20 20 7d 0a 20 20 69 66 28 20 6e 49 64 78 54 6f    }.  if( nIdxTo
1ff0: 74 61 6c 3e 30 20 29 7b 0a 20 20 20 20 61 70 49  tal>0 ){.    apI
2000: 64 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  dx = sqliteMallo
2010: 63 52 61 77 28 20 73 69 7a 65 6f 66 28 49 6e 64  cRaw( sizeof(Ind
2020: 65 78 2a 29 20 2a 20 6e 49 64 78 20 2b 20 6e 49  ex*) * nIdx + nI
2030: 64 78 54 6f 74 61 6c 20 29 3b 0a 20 20 20 20 69  dxTotal );.    i
2040: 66 28 20 61 70 49 64 78 3d 3d 30 20 29 20 67 6f  f( apIdx==0 ) go
2050: 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75  to update_cleanu
2060: 70 3b 0a 20 20 20 20 61 49 64 78 55 73 65 64 20  p;.    aIdxUsed 
2070: 3d 20 28 63 68 61 72 2a 29 26 61 70 49 64 78 5b  = (char*)&apIdx[
2080: 6e 49 64 78 5d 3b 0a 20 20 7d 0a 20 20 66 6f 72  nIdx];.  }.  for
2090: 28 6e 49 64 78 3d 6a 3d 30 2c 20 70 49 64 78 3d  (nIdx=j=0, pIdx=
20a0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
20b0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
20c0: 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20  Next, j++){.    
20d0: 69 66 28 20 63 68 6e 67 52 6f 77 69 64 20 29 7b  if( chngRowid ){
20e0: 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  .      i = 0;.  
20f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
2100: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
2110: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
2120: 20 20 20 20 20 20 20 69 66 28 20 61 58 52 65 66         if( aXRef
2130: 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
2140: 69 5d 5d 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a  i]]>=0 ) break;.
2150: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2160: 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43    if( i<pIdx->nC
2170: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 61  olumn ){.      a
2180: 70 49 64 78 5b 6e 49 64 78 2b 2b 5d 20 3d 20 70  pIdx[nIdx++] = p
2190: 49 64 78 3b 0a 20 20 20 20 20 20 61 49 64 78 55  Idx;.      aIdxU
21a0: 73 65 64 5b 6a 5d 20 3d 20 31 3b 0a 20 20 20 20  sed[j] = 1;.    
21b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 49 64  }else{.      aId
21c0: 78 55 73 65 64 5b 6a 5d 20 3d 20 30 3b 0a 20 20  xUsed[j] = 0;.  
21d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
21e0: 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e  solve the column
21f0: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 74 68   names in all th
2200: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
2210: 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 20   the.  ** WHERE 
2220: 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  clause..  */.  i
2230: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
2240: 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
2250: 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20   pWhere) ){.    
2260: 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61  goto update_clea
2270: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  nup;.  }..  /* S
2280: 74 61 72 74 20 74 68 65 20 76 69 65 77 20 63 6f  tart the view co
2290: 6e 74 65 78 74 0a 20 20 2a 2f 0a 20 20 69 66 28  ntext.  */.  if(
22a0: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 73   isView ){.    s
22b0: 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78  qlite3AuthContex
22c0: 74 50 75 73 68 28 70 50 61 72 73 65 2c 20 26 73  tPush(pParse, &s
22d0: 43 6f 6e 74 65 78 74 2c 20 70 54 61 62 2d 3e 7a  Context, pTab->z
22e0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Name);.  }..  /*
22f0: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
2300: 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76  g code..  */.  v
2310: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
2320: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
2330: 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64   v==0 ) goto upd
2340: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69  ate_cleanup;.  i
2350: 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  f( pParse->neste
2360: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  d==0 ) sqlite3Vd
2370: 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 76  beCountChanges(v
2380: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
2390: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
23a0: 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
23b0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
23c0: 20 74 72 79 69 6e 67 20 74 6f 20 75 70 64 61 74   trying to updat
23d0: 65 20 61 20 76 69 65 77 2c 20 72 65 61 6c 69 7a  e a view, realiz
23e0: 65 20 74 68 61 74 20 76 69 65 77 20 69 6e 74 6f  e that view into
23f0: 0a 20 20 2a 2a 20 61 20 65 70 68 65 6d 65 72 61  .  ** a ephemera
2400: 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  l table..  */.  
2410: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
2420: 20 20 53 65 6c 65 63 74 20 2a 70 56 69 65 77 3b    Select *pView;
2430: 0a 20 20 20 20 70 56 69 65 77 20 3d 20 73 71 6c  .    pView = sql
2440: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 54  ite3SelectDup(pT
2450: 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab->pSelect);.  
2460: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
2470: 70 50 61 72 73 65 2c 20 70 56 69 65 77 2c 20 53  pParse, pView, S
2480: 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 69 43 75  RT_EphemTab, iCu
2490: 72 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  r, 0, 0, 0, 0);.
24a0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
24b0: 74 44 65 6c 65 74 65 28 70 56 69 65 77 29 3b 0a  tDelete(pView);.
24c0: 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
24d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
24e0: 6e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20  n.  */.  pWInfo 
24f0: 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2500: 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
2510: 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 29  List, pWhere, 0)
2520: 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d  ;.  if( pWInfo==
2530: 30 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65 5f  0 ) goto update_
2540: 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 20 52  cleanup;..  /* R
2550: 65 6d 65 6d 62 65 72 20 74 68 65 20 72 6f 77 69  emember the rowi
2560: 64 20 6f 66 20 65 76 65 72 79 20 69 74 65 6d 20  d of every item 
2570: 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
2580: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
2590: 65 41 64 64 4f 70 28 76 2c 20 49 73 56 69 72 74  eAddOp(v, IsVirt
25a0: 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56  ual(pTab) ? OP_V
25b0: 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77 69 64  Rowid : OP_Rowid
25c0: 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 73 71  , iCur, 0);.  sq
25d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
25e0: 2c 20 4f 50 5f 46 69 66 6f 57 72 69 74 65 2c 20  , OP_FifoWrite, 
25f0: 30 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64  0, 0);..  /* End
2600: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2610: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20  an loop..  */.  
2620: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2630: 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49  pWInfo);..  /* I
2640: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
2650: 75 6e 74 20 6f 66 20 75 70 64 61 74 65 64 20 72  unt of updated r
2660: 6f 77 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ows.  */.  if( d
2670: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
2680: 45 5f 43 6f 75 6e 74 52 6f 77 73 20 26 26 20 21  E_CountRows && !
2690: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
26a0: 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
26b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
26c0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
26d0: 20 20 7d 0a 0a 20 20 69 66 28 20 74 72 69 67 67    }..  if( trigg
26e0: 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20 20  ers_exist ){.   
26f0: 20 2f 2a 20 43 72 65 61 74 65 20 70 73 65 75 64   /* Create pseud
2700: 6f 2d 74 61 62 6c 65 73 20 66 6f 72 20 4e 45 57  o-tables for NEW
2710: 20 61 6e 64 20 4f 4c 44 0a 20 20 20 20 2a 2f 0a   and OLD.    */.
2720: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2730: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  ddOp(v, OP_OpenP
2740: 73 65 75 64 6f 2c 20 6f 6c 64 49 64 78 2c 20 30  seudo, oldIdx, 0
2750: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2760: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
2770: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 6f 6c 64  tNumColumns, old
2780: 49 64 78 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  Idx, pTab->nCol)
2790: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
27a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
27b0: 6e 50 73 65 75 64 6f 2c 20 6e 65 77 49 64 78 2c  nPseudo, newIdx,
27c0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
27d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
27e0: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 6e  SetNumColumns, n
27f0: 65 77 49 64 78 2c 20 70 54 61 62 2d 3e 6e 43 6f  ewIdx, pTab->nCo
2800: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  l);..    /* The 
2810: 74 6f 70 20 6f 66 20 74 68 65 20 75 70 64 61 74  top of the updat
2820: 65 20 6c 6f 6f 70 20 66 6f 72 20 77 68 65 6e 20  e loop for when 
2830: 74 68 65 72 65 20 61 72 65 20 74 72 69 67 67 65  there are trigge
2840: 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  rs..    */.    a
2850: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2860: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 69 66  eAddOp(v, OP_Fif
2870: 6f 52 65 61 64 2c 20 30 2c 20 30 29 3b 0a 0a 20  oRead, 0, 0);.. 
2880: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
2890: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
28a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
28b0: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
28c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28d0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
28e0: 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65  0);.      /* Ope
28f0: 6e 20 61 20 63 75 72 73 6f 72 20 61 6e 64 20 6d  n a cursor and m
2900: 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
2910: 74 68 65 20 72 65 63 6f 72 64 20 74 68 61 74 20  the record that 
2920: 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  is.      ** bein
2930: 67 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  g updated..     
2940: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2950: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
2960: 65 2c 20 69 43 75 72 2c 20 69 44 62 2c 20 70 54  e, iCur, iDb, pT
2970: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
2980: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2990: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
29a0: 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c  OP_MoveGe, iCur,
29b0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e   0);..    /* Gen
29c0: 65 72 61 74 65 20 74 68 65 20 4f 4c 44 20 74 61  erate the OLD ta
29d0: 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ble.    */.    s
29e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
29f0: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
2a00: 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
2a10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2a20: 50 5f 52 6f 77 44 61 74 61 2c 20 69 43 75 72 2c  P_RowData, iCur,
2a30: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2a40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2a50: 49 6e 73 65 72 74 2c 20 6f 6c 64 49 64 78 2c 20  Insert, oldIdx, 
2a60: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  0);..    /* Gene
2a70: 72 61 74 65 20 74 68 65 20 4e 45 57 20 74 61 62  rate the NEW tab
2a80: 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  le.    */.    if
2a90: 28 20 63 68 6e 67 52 6f 77 69 64 20 29 7b 0a 20  ( chngRowid ){. 
2aa0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2ab0: 43 6f 64 65 41 6e 64 43 61 63 68 65 28 70 50 61  CodeAndCache(pPa
2ac0: 72 73 65 2c 20 70 52 6f 77 69 64 45 78 70 72 29  rse, pRowidExpr)
2ad0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ae0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2af0: 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  dOp(v, OP_Rowid,
2b00: 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d   iCur, 0);.    }
2b10: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b20: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
2b30: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70  {.      if( i==p
2b40: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
2b50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
2b70: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 0, 0);.      
2b80: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2b90: 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 61 58    }.      j = aX
2ba0: 52 65 66 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Ref[i];.      if
2bb0: 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( j<0 ){.       
2bc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2bd0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
2be0: 69 43 75 72 2c 20 69 29 3b 0a 20 20 20 20 20 20  iCur, i);.      
2bf0: 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44    sqlite3ColumnD
2c00: 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20  efault(v, pTab, 
2c10: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  i);.      }else{
2c20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c30: 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65  ExprCodeAndCache
2c40: 28 70 50 61 72 73 65 2c 20 70 43 68 61 6e 67 65  (pParse, pChange
2c50: 73 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a  s->a[j].pExpr);.
2c60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c80: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
2c90: 6f 72 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ord, pTab->nCol,
2ca0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73   0);.    if( !is
2cb0: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71  View ){.      sq
2cc0: 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69  lite3TableAffini
2cd0: 74 79 53 74 72 28 76 2c 20 70 54 61 62 29 3b 0a  tyStr(v, pTab);.
2ce0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
2cf0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
2d00: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
2d10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2d20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73  eAddOp(v, OP_Ins
2d30: 65 72 74 2c 20 6e 65 77 49 64 78 2c 20 30 29 3b  ert, newIdx, 0);
2d40: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
2d50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2d70: 5f 43 6c 6f 73 65 2c 20 69 43 75 72 2c 20 30 29  _Close, iCur, 0)
2d80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2d90: 46 69 72 65 20 74 68 65 20 42 45 46 4f 52 45 20  Fire the BEFORE 
2da0: 61 6e 64 20 49 4e 53 54 45 41 44 20 4f 46 20 74  and INSTEAD OF t
2db0: 72 69 67 67 65 72 73 0a 20 20 20 20 2a 2f 0a 20  riggers.    */. 
2dc0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
2dd0: 64 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61  deRowTrigger(pPa
2de0: 72 73 65 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20  rse, TK_UPDATE, 
2df0: 70 43 68 61 6e 67 65 73 2c 20 54 52 49 47 47 45  pChanges, TRIGGE
2e00: 52 5f 42 45 46 4f 52 45 2c 20 70 54 61 62 2c 0a  R_BEFORE, pTab,.
2e10: 20 20 20 20 20 20 20 20 20 20 6e 65 77 49 64 78            newIdx
2e20: 2c 20 6f 6c 64 49 64 78 2c 20 6f 6e 45 72 72 6f  , oldIdx, onErro
2e30: 72 2c 20 61 64 64 72 29 20 29 7b 0a 20 20 20 20  r, addr) ){.    
2e40: 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c    goto update_cl
2e50: 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  eanup;.    }.  }
2e60: 0a 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  ..  if( !isView 
2e70: 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
2e80: 61 62 29 20 29 7b 0a 20 20 20 20 2f 2a 20 0a 20  ab) ){.    /* . 
2e90: 20 20 20 2a 2a 20 4f 70 65 6e 20 65 76 65 72 79     ** Open every
2ea0: 20 69 6e 64 65 78 20 74 68 61 74 20 6e 65 65 64   index that need
2eb0: 73 20 75 70 64 61 74 69 6e 67 2e 20 20 4e 6f 74  s updating.  Not
2ec0: 65 20 74 68 61 74 20 69 66 20 61 6e 79 0a 20 20  e that if any.  
2ed0: 20 20 2a 2a 20 69 6e 64 65 78 20 63 6f 75 6c 64    ** index could
2ee0: 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6e 76   potentially inv
2ef0: 6f 6b 65 20 61 20 52 45 50 4c 41 43 45 20 63 6f  oke a REPLACE co
2f00: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
2f10: 6e 20 0a 20 20 20 20 2a 2a 20 61 63 74 69 6f 6e  n .    ** action
2f20: 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
2f30: 6f 20 6f 70 65 6e 20 61 6c 6c 20 69 6e 64 69 63  o open all indic
2f40: 65 73 20 62 65 63 61 75 73 65 20 77 65 20 6d 69  es because we mi
2f50: 67 68 74 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  ght need.    ** 
2f60: 74 6f 20 62 65 20 64 65 6c 65 74 69 6e 67 20 73  to be deleting s
2f70: 6f 6d 65 20 72 65 63 6f 72 64 73 2e 0a 20 20 20  ome records..   
2f80: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
2f90: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
2fa0: 20 69 43 75 72 2c 20 69 44 62 2c 20 70 54 61 62   iCur, iDb, pTab
2fb0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 29 3b  , OP_OpenWrite);
2fc0: 20 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f   .    if( onErro
2fd0: 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r==OE_Replace ){
2fe0: 0a 20 20 20 20 20 20 6f 70 65 6e 41 6c 6c 20 3d  .      openAll =
2ff0: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
3000: 20 20 20 20 20 6f 70 65 6e 41 6c 6c 20 3d 20 30       openAll = 0
3010: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78  ;.      for(pIdx
3020: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
3030: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
3040: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
3050: 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
3060: 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r==OE_Replace ){
3070: 0a 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e 41  .          openA
3080: 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ll = 1;.        
3090: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
30a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
30b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
30c0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
30d0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
30e0: 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20  ->pNext, i++){. 
30f0: 20 20 20 20 20 69 66 28 20 6f 70 65 6e 41 6c 6c       if( openAll
3100: 20 7c 7c 20 61 49 64 78 55 73 65 64 5b 69 5d 20   || aIdxUsed[i] 
3110: 29 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  ){.        KeyIn
3120: 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  fo *pKey = sqlit
3130: 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
3140: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
3150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3160: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
3170: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
3180: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
3190: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
31a0: 57 72 69 74 65 2c 20 69 43 75 72 2b 69 2b 31 2c  Write, iCur+i+1,
31b0: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20   pIdx->tnum,.   
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c      (char*)pKey,
31e0: 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
31f0: 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20 61 73  OFF);.        as
3200: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 54  sert( pParse->nT
3210: 61 62 3e 69 43 75 72 2b 69 2b 31 20 29 3b 0a 20  ab>iCur+i+1 );. 
3220: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3230: 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 65    /* Loop over e
3240: 76 65 72 79 20 72 65 63 6f 72 64 20 74 68 61 74  very record that
3250: 20 6e 65 65 64 73 20 75 70 64 61 74 69 6e 67 2e   needs updating.
3260: 20 20 57 65 20 68 61 76 65 20 74 6f 20 6c 6f 61    We have to loa
3270: 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 6c 64  d.    ** the old
3280: 20 64 61 74 61 20 66 6f 72 20 65 61 63 68 20 72   data for each r
3290: 65 63 6f 72 64 20 74 6f 20 62 65 20 75 70 64 61  ecord to be upda
32a0: 74 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65  ted because some
32b0: 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20   columns.    ** 
32c0: 6d 69 67 68 74 20 6e 6f 74 20 63 68 61 6e 67 65  might not change
32d0: 20 61 6e 64 20 77 65 20 77 69 6c 6c 20 6e 65 65   and we will nee
32e0: 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6f 6c  d to copy the ol
32f0: 64 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2a 20  d value..    ** 
3300: 41 6c 73 6f 2c 20 74 68 65 20 6f 6c 64 20 64 61  Also, the old da
3310: 74 61 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20  ta is needed to 
3320: 64 65 6c 65 74 65 20 74 68 65 20 6f 6c 64 20 69  delete the old i
3330: 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 0a 20 20  ndex entries..  
3340: 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 74 68 65    ** So make the
3350: 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 20 61 74   cursor point at
3360: 20 74 68 65 20 6f 6c 64 20 72 65 63 6f 72 64 2e   the old record.
3370: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3380: 21 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20  !triggers_exist 
3390: 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ){.      addr = 
33a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33b0: 28 76 2c 20 4f 50 5f 46 69 66 6f 52 65 61 64 2c  (v, OP_FifoRead,
33c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
33d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
33e0: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
33f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
3400: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3410: 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
3420: 72 2c 20 61 64 64 72 29 3b 0a 0a 20 20 20 20 2f  r, addr);..    /
3430: 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
3440: 6e 75 6d 62 65 72 20 77 69 6c 6c 20 63 68 61 6e  number will chan
3450: 67 65 2c 20 70 75 73 68 20 74 68 65 20 72 65 63  ge, push the rec
3460: 6f 72 64 20 6e 75 6d 62 65 72 20 61 73 20 69 74  ord number as it
3470: 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
3480: 61 66 74 65 72 20 74 68 65 20 75 70 64 61 74 65  after the update
3490: 2e 20 28 54 68 65 20 6f 6c 64 20 72 65 63 6f 72  . (The old recor
34a0: 64 20 6e 75 6d 62 65 72 20 69 73 20 63 75 72 72  d number is curr
34b0: 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6f 6e 20  ently.    ** on 
34c0: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
34d0: 2e 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  .).    */.    if
34e0: 28 20 63 68 6e 67 52 6f 77 69 64 20 29 7b 0a 20  ( chngRowid ){. 
34f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3500: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 6f  Code(pParse, pRo
3510: 77 69 64 45 78 70 72 29 3b 0a 20 20 20 20 20 20  widExpr);.      
3520: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3530: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
3540: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  , 0, 0);.    }..
3550: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6e      /* Compute n
3560: 65 77 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  ew data for this
3570: 20 72 65 63 6f 72 64 2e 20 20 0a 20 20 20 20 2a   record.  .    *
3580: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
3590: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
35a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  ){.      if( i==
35b0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
35c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
35d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
35e0: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 0, 0);.     
35f0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
3600: 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 61     }.      j = a
3610: 58 52 65 66 5b 69 5d 3b 0a 20 20 20 20 20 20 69  XRef[i];.      i
3620: 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( j<0 ){.      
3630: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3640: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
3650: 20 69 43 75 72 2c 20 69 29 3b 0a 20 20 20 20 20   iCur, i);.     
3660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
3670: 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
3680: 20 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   i);.      }else
3690: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
36a0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
36b0: 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 6a 5d  , pChanges->a[j]
36c0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
36d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
36e0: 6f 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65  o constraint che
36f0: 63 6b 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  cks.    */.    s
3700: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f  qlite3GenerateCo
3710: 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 70  nstraintChecks(p
3720: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 75  Parse, pTab, iCu
3730: 72 2c 20 61 49 64 78 55 73 65 64 2c 20 63 68 6e  r, aIdxUsed, chn
3740: 67 52 6f 77 69 64 2c 20 31 2c 0a 20 20 20 20 20  gRowid, 1,.     
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e                on
3770: 45 72 72 6f 72 2c 20 61 64 64 72 29 3b 0a 0a 20  Error, addr);.. 
3780: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
3790: 20 6f 6c 64 20 69 6e 64 69 63 65 73 20 66 6f 72   old indices for
37a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
37b0: 6f 72 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ord..    */.    
37c0: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52  sqlite3GenerateR
37d0: 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28 76 2c  owIndexDelete(v,
37e0: 20 70 54 61 62 2c 20 69 43 75 72 2c 20 61 49 64   pTab, iCur, aId
37f0: 78 55 73 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20  xUsed);..    /* 
3800: 49 66 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  If changing the 
3810: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2c 20 64  record number, d
3820: 65 6c 65 74 65 20 74 68 65 20 6f 6c 64 20 72 65  elete the old re
3830: 63 6f 72 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cord..    */.   
3840: 20 69 66 28 20 63 68 6e 67 52 6f 77 69 64 20 29   if( chngRowid )
3850: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
3860: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
3870: 65 6c 65 74 65 2c 20 69 43 75 72 2c 20 30 29 3b  elete, iCur, 0);
3880: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
3890: 72 65 61 74 65 20 74 68 65 20 6e 65 77 20 69 6e  reate the new in
38a0: 64 65 78 20 65 6e 74 72 69 65 73 20 61 6e 64 20  dex entries and 
38b0: 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a  the new record..
38c0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
38d0: 65 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74  e3CompleteInsert
38e0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
38f0: 2c 20 69 43 75 72 2c 20 61 49 64 78 55 73 65 64  , iCur, aIdxUsed
3900: 2c 20 63 68 6e 67 52 6f 77 69 64 2c 20 31 2c 20  , chngRowid, 1, 
3910: 2d 31 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  -1);.  }..#ifnde
3920: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
3930: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
3940: 20 21 69 73 56 69 65 77 20 26 26 20 49 73 56 69   !isView && IsVi
3950: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
3960: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
3970: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3980: 5f 46 69 66 6f 52 65 61 64 2c 20 30 2c 20 30 29  _FifoRead, 0, 0)
3990: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
39a0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 77   record number w
39b0: 69 6c 6c 20 63 68 61 6e 67 65 2c 20 70 75 73 68  ill change, push
39c0: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
39d0: 65 72 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20  er as it.    ** 
39e0: 77 69 6c 6c 20 62 65 20 61 66 74 65 72 20 74 68  will be after th
39f0: 65 20 75 70 64 61 74 65 2e 20 28 54 68 65 20 6f  e update. (The o
3a00: 6c 64 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  ld record number
3a10: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 20 20   is currently.  
3a20: 20 20 2a 2a 20 6f 6e 20 74 6f 70 20 6f 66 20 74    ** on top of t
3a30: 68 65 20 73 74 61 63 6b 2e 29 0a 20 20 20 20 2a  he stack.).    *
3a40: 2f 0a 20 20 20 20 69 66 28 20 63 68 6e 67 52 6f  /.    if( chngRo
3a50: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  wid ){.      sql
3a60: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
3a70: 72 73 65 2c 20 70 52 6f 77 69 64 45 78 70 72 29  rse, pRowidExpr)
3a80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3a90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3aa0: 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b  ustBeInt, 0, 0);
3ab0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3ac0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3ad0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
3ae0: 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
3af0: 2f 2a 20 43 6f 6d 70 75 74 65 20 6e 65 77 20 64  /* Compute new d
3b00: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 65 63  ata for this rec
3b10: 6f 72 64 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20  ord.  .    */.  
3b20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
3b30: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
3b40: 20 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62       if( i==pTab
3b50: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
3b60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3b70: 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  dOp(v, OP_Null, 
3b80: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 63  0, 0);.        c
3b90: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
3ba0: 0a 20 20 20 20 20 20 6a 20 3d 20 61 58 52 65 66  .      j = aXRef
3bb0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  [i];.      if( j
3bc0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  <0 ){.        sq
3bd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3be0: 2c 20 4f 50 5f 56 4e 6f 43 68 61 6e 67 65 2c 20  , OP_VNoChange, 
3bf0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  0, 0);.      }el
3c00: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3c10: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
3c20: 73 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b  se, pChanges->a[
3c30: 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  j].pExpr);.     
3c40: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
3c50: 20 4d 61 6b 65 20 74 68 65 20 75 70 64 61 74 65   Make the update
3c60: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
3c70: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56 55 70  dbeOp3(v, OP_VUp
3c80: 64 61 74 65 2c 20 30 2c 20 70 54 61 62 2d 3e 6e  date, 0, pTab->n
3c90: 43 6f 6c 2b 32 2c 20 0a 20 20 20 20 20 20 20 20  Col+2, .        
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
3cb0: 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 61 62 2d  onst char*)pTab-
3cc0: 3e 70 56 74 61 62 2c 20 50 33 5f 56 54 41 42 29  >pVtab, P3_VTAB)
3cd0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
3ce0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
3cf0: 55 41 4c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 63  UAL */..  /* Inc
3d00: 72 65 6d 65 6e 74 20 74 68 65 20 72 6f 77 20 63  rement the row c
3d10: 6f 75 6e 74 65 72 20 0a 20 20 2a 2f 0a 20 20 69  ounter .  */.  i
3d20: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
3d30: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20  QLITE_CountRows 
3d40: 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67  && !pParse->trig
3d50: 53 74 61 63 6b 29 7b 0a 20 20 20 20 73 71 6c 69  Stack){.    sqli
3d60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3d70: 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29  OP_AddImm, 1, 0)
3d80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
3d90: 68 65 72 65 20 61 72 65 20 74 72 69 67 67 65 72  here are trigger
3da0: 73 2c 20 63 6c 6f 73 65 20 61 6c 6c 20 74 68 65  s, close all the
3db0: 20 63 75 72 73 6f 72 73 20 61 66 74 65 72 20 65   cursors after e
3dc0: 61 63 68 20 69 74 65 72 61 74 69 6f 6e 0a 20 20  ach iteration.  
3dd0: 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  ** through the l
3de0: 6f 6f 70 2e 20 20 54 68 65 20 66 69 72 65 20 74  oop.  The fire t
3df0: 68 65 20 61 66 74 65 72 20 74 72 69 67 67 65 72  he after trigger
3e00: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74 72  s..  */.  if( tr
3e10: 69 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a  iggers_exist ){.
3e20: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
3e30: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
3e40: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
3e50: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
3e60: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b  pIdx->pNext, i++
3e70: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  ){.        if( o
3e80: 70 65 6e 41 6c 6c 20 7c 7c 20 61 49 64 78 55 73  penAll || aIdxUs
3e90: 65 64 5b 69 5d 20 29 0a 20 20 20 20 20 20 20 20  ed[i] ).        
3ea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3eb0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
3ec0: 69 43 75 72 2b 69 2b 31 2c 20 30 29 3b 0a 20 20  iCur+i+1, 0);.  
3ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
3ee0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3ef0: 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 75 72 2c 20  OP_Close, iCur, 
3f00: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
3f10: 28 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f 77  ( sqlite3CodeRow
3f20: 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20  Trigger(pParse, 
3f30: 54 4b 5f 55 50 44 41 54 45 2c 20 70 43 68 61 6e  TK_UPDATE, pChan
3f40: 67 65 73 2c 20 54 52 49 47 47 45 52 5f 41 46 54  ges, TRIGGER_AFT
3f50: 45 52 2c 20 70 54 61 62 2c 20 0a 20 20 20 20 20  ER, pTab, .     
3f60: 20 20 20 20 20 6e 65 77 49 64 78 2c 20 6f 6c 64       newIdx, old
3f70: 49 64 78 2c 20 6f 6e 45 72 72 6f 72 2c 20 61 64  Idx, onError, ad
3f80: 64 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  dr) ){.      got
3f90: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
3fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
3fb0: 2a 20 52 65 70 65 61 74 20 74 68 65 20 61 62 6f  * Repeat the abo
3fc0: 76 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ve with the next
3fd0: 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 75 70   record to be up
3fe0: 64 61 74 65 64 2c 20 75 6e 74 69 6c 0a 20 20 2a  dated, until.  *
3ff0: 2a 20 61 6c 6c 20 72 65 63 6f 72 64 20 73 65 6c  * all record sel
4000: 65 63 74 65 64 20 62 79 20 74 68 65 20 57 48 45  ected by the WHE
4010: 52 45 20 63 6c 61 75 73 65 20 68 61 76 65 20 62  RE clause have b
4020: 65 65 6e 20 75 70 64 61 74 65 64 2e 0a 20 20 2a  een updated..  *
4030: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
4040: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4050: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c   0, addr);.  sql
4060: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4070: 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20 20 2f 2a  (v, addr);..  /*
4080: 20 43 6c 6f 73 65 20 61 6c 6c 20 74 61 62 6c 65   Close all table
4090: 73 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20  s if there were 
40a0: 6e 6f 20 46 4f 52 20 45 41 43 48 20 52 4f 57 20  no FOR EACH ROW 
40b0: 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 66  triggers */.  if
40c0: 28 20 21 74 72 69 67 67 65 72 73 5f 65 78 69 73  ( !triggers_exis
40d0: 74 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  t && !IsVirtual(
40e0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 66 6f 72  pTab) ){.    for
40f0: 28 69 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d  (i=0, pIdx=pTab-
4100: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
4110: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
4120: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4130: 20 6f 70 65 6e 41 6c 6c 20 7c 7c 20 61 49 64 78   openAll || aIdx
4140: 55 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Used[i] ){.     
4150: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4160: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
4170: 20 69 43 75 72 2b 69 2b 31 2c 20 30 29 3b 0a 20   iCur+i+1, 0);. 
4180: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4190: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
41a0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  p(v, OP_Close, i
41b0: 43 75 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  Cur, 0);.  }else
41c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
41d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
41e0: 73 65 2c 20 6e 65 77 49 64 78 2c 20 30 29 3b 0a  se, newIdx, 0);.
41f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4200: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
4210: 2c 20 6f 6c 64 49 64 78 2c 20 30 29 3b 0a 20 20  , oldIdx, 0);.  
4220: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 74  }..  /*.  ** Ret
4230: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
4240: 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
4250: 20 63 68 61 6e 67 65 64 2e 20 49 66 20 74 68 69   changed. If thi
4260: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 0a 20 20  s routine is .  
4270: 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  ** generating co
4280: 64 65 20 62 65 63 61 75 73 65 20 6f 66 20 61 20  de because of a 
4290: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4e  call to sqlite3N
42a0: 65 73 74 65 64 50 61 72 73 65 28 29 2c 20 64 6f  estedParse(), do
42b0: 20 6e 6f 74 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65   not.  ** invoke
42c0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
42d0: 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  nction..  */.  i
42e0: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
42f0: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20  QLITE_CountRows 
4300: 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67  && !pParse->trig
4310: 53 74 61 63 6b 20 26 26 20 70 50 61 72 73 65 2d  Stack && pParse-
4320: 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20  >nested==0 ){.  
4330: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4340: 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
4350: 6b 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  k, 1, 0);.    sq
4360: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
4370: 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73  ols(v, 1);.    s
4380: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
4390: 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41  Name(v, 0, COLNA
43a0: 4d 45 5f 4e 41 4d 45 2c 20 22 72 6f 77 73 20 75  ME_NAME, "rows u
43b0: 70 64 61 74 65 64 22 2c 20 50 33 5f 53 54 41 54  pdated", P3_STAT
43c0: 49 43 29 3b 0a 20 20 7d 0a 0a 75 70 64 61 74 65  IC);.  }..update
43d0: 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
43e0: 74 65 33 41 75 74 68 43 6f 6e 74 65 78 74 50 6f  te3AuthContextPo
43f0: 70 28 26 73 43 6f 6e 74 65 78 74 29 3b 0a 20 20  p(&sContext);.  
4400: 73 71 6c 69 74 65 46 72 65 65 28 61 70 49 64 78  sqliteFree(apIdx
4410: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
4420: 61 58 52 65 66 29 3b 0a 20 20 73 71 6c 69 74 65  aXRef);.  sqlite
4430: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
4440: 54 61 62 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  TabList);.  sqli
4450: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4460: 65 28 70 43 68 61 6e 67 65 73 29 3b 0a 20 20 73  e(pChanges);.  s
4470: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4480: 28 70 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75  (pWhere);.  retu
4490: 72 6e 3b 0a 7d 0a                                rn;.}.