/ Hex Artifact Content
Login

Artifact f322317ee492c0a648f8a44fd805dd85dbbe2f05:


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 36 31 20 32 30 30 38 2f 30 31 2f 30   1.161 2008/01/0
0200: 35 20 31 37 3a 33 39 3a 33 30 20 64 61 6e 69 65  5 17:39:30 danie
0210: 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a  lk1977 Exp $.*/.
0220: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0230: 49 6e 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20  Int.h"..#ifndef 
0240: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
0250: 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 46 6f 72 77  UALTABLE./* Forw
0260: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
0270: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
0280: 70 64 61 74 65 56 69 72 74 75 61 6c 54 61 62 6c  pdateVirtualTabl
0290: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
02a0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se,       /* The
02b0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
02c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
02d0: 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  Src,       /* Th
02e0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
02f0: 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20 2a  to be modified *
0300: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
0310: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0320: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
0330: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68  .  ExprList *pCh
0340: 61 6e 67 65 73 2c 20 20 2f 2a 20 54 68 65 20 63  anges,  /* The c
0350: 6f 6c 75 6d 6e 73 20 74 6f 20 63 68 61 6e 67 65  olumns to change
0360: 20 69 6e 20 74 68 65 20 55 50 44 41 54 45 20 73   in the UPDATE s
0370: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  tatement */.  Ex
0380: 70 72 20 2a 70 52 6f 77 69 64 45 78 70 72 2c 20  pr *pRowidExpr, 
0390: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
03a0: 20 75 73 65 64 20 74 6f 20 72 65 63 6f 6d 70 75   used to recompu
03b0: 74 65 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  te the rowid */.
03c0: 20 20 69 6e 74 20 2a 61 58 52 65 66 2c 20 20 20    int *aXRef,   
03d0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
03e0: 67 20 66 72 6f 6d 20 63 6f 6c 75 6d 6e 73 20 6f  g from columns o
03f0: 66 20 70 54 61 62 20 74 6f 20 65 6e 74 72 69 65  f pTab to entrie
0400: 73 20 69 6e 20 70 43 68 61 6e 67 65 73 20 2a 2f  s in pChanges */
0410: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 20  .  Expr *pWhere 
0420: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
0430: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 55   clause of the U
0440: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  PDATE statement 
0450: 2a 2f 0a 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  */.);.#endif /* 
0460: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
0470: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
0480: 2a 2a 20 54 68 65 20 6d 6f 73 74 20 72 65 63 65  ** The most rece
0490: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
04a0: 75 63 74 69 6f 6e 20 77 61 73 20 61 6e 20 4f 50  uction was an OP
04b0: 5f 43 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 72 69  _Column to retri
04c0: 65 76 65 20 74 68 65 0a 2a 2a 20 69 2d 74 68 20  eve the.** i-th 
04d0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
04e0: 70 54 61 62 2e 20 54 68 69 73 20 72 6f 75 74 69  pTab. This routi
04f0: 6e 65 20 73 65 74 73 20 74 68 65 20 50 34 20 70  ne sets the P4 p
0500: 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20  arameter of the 
0510: 0a 2a 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 20 74 6f  .** OP_Column to
0520: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
0530: 75 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a  ue, if any..**.*
0540: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  * The default va
0550: 6c 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  lue of a column 
0560: 69 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  is specified by 
0570: 61 20 44 45 46 41 55 4c 54 20 63 6c 61 75 73 65  a DEFAULT clause
0580: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 6c 75   in the .** colu
0590: 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 54  mn definition. T
05a0: 68 69 73 20 77 61 73 20 65 69 74 68 65 72 20 73  his was either s
05b0: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 75  upplied by the u
05c0: 73 65 72 20 77 68 65 6e 20 74 68 65 20 74 61 62  ser when the tab
05d0: 6c 65 0a 2a 2a 20 77 61 73 20 63 72 65 61 74 65  le.** was create
05e0: 64 2c 20 6f 72 20 61 64 64 65 64 20 6c 61 74 65  d, or added late
05f0: 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 64  r to the table d
0600: 65 66 69 6e 69 74 69 6f 6e 20 62 79 20 61 6e 20  efinition by an 
0610: 41 4c 54 45 52 20 54 41 42 4c 45 0a 2a 2a 20 63  ALTER TABLE.** c
0620: 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 6c  ommand. If the l
0630: 61 74 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  atter, then the 
0640: 72 6f 77 2d 72 65 63 6f 72 64 73 20 69 6e 20 74  row-records in t
0650: 68 65 20 74 61 62 6c 65 20 62 74 72 65 65 20 6f  he table btree o
0660: 6e 20 64 69 73 6b 0a 2a 2a 20 6d 61 79 20 6e 6f  n disk.** may no
0670: 74 20 63 6f 6e 74 61 69 6e 20 61 20 76 61 6c 75  t contain a valu
0680: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
0690: 20 61 6e 64 20 74 68 65 20 64 65 66 61 75 6c 74   and the default
06a0: 20 76 61 6c 75 65 2c 20 74 61 6b 65 6e 0a 2a 2a   value, taken.**
06b0: 20 66 72 6f 6d 20 74 68 65 20 50 34 20 70 61 72   from the P4 par
06c0: 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20 4f 50  ameter of the OP
06d0: 5f 43 6f 6c 75 6d 6e 20 69 6e 73 74 72 75 63 74  _Column instruct
06e0: 69 6f 6e 2c 20 69 73 20 72 65 74 75 72 6e 65 64  ion, is returned
06f0: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 49 66 20   instead..** If 
0700: 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e  the former, then
0710: 20 61 6c 6c 20 72 6f 77 2d 72 65 63 6f 72 64 73   all row-records
0720: 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
0730: 74 6f 20 69 6e 63 6c 75 64 65 20 61 20 76 61 6c  to include a val
0740: 75 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ue.** for the co
0750: 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 50 34 20  lumn and the P4 
0760: 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 72 65 71  value is not req
0770: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6c  uired..**.** Col
0780: 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  umn definitions 
0790: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 41 4c  created by an AL
07a0: 54 45 52 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e  TER TABLE comman
07b0: 64 20 6d 61 79 20 6f 6e 6c 79 20 68 61 76 65 20  d may only have 
07c0: 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 64 65 66 61  .** literal defa
07d0: 75 6c 74 20 76 61 6c 75 65 73 20 73 70 65 63 69  ult values speci
07e0: 66 69 65 64 3a 20 61 20 6e 75 6d 62 65 72 2c 20  fied: a number, 
07f0: 6e 75 6c 6c 20 6f 72 20 61 20 73 74 72 69 6e 67  null or a string
0800: 2e 20 28 49 66 20 61 20 6d 6f 72 65 0a 2a 2a 20  . (If a more.** 
0810: 63 6f 6d 70 6c 69 63 61 74 65 64 20 64 65 66 61  complicated defa
0820: 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 20 76  ult expression v
0830: 61 6c 75 65 20 77 61 73 20 70 72 6f 76 69 64 65  alue was provide
0840: 64 2c 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  d, it is evaluat
0850: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ed .** when the 
0860: 41 4c 54 45 52 20 54 41 42 4c 45 20 69 73 20 65  ALTER TABLE is e
0870: 78 65 63 75 74 65 64 20 61 6e 64 20 6f 6e 65 20  xecuted and one 
0880: 6f 66 20 74 68 65 20 6c 69 74 65 72 61 6c 20 76  of the literal v
0890: 61 6c 75 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  alues written.**
08a0: 20 69 6e 74 6f 20 74 68 65 20 73 71 6c 69 74 65   into the sqlite
08b0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 29 0a  _master table.).
08c0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 66 6f 72 65 2c  **.** Therefore,
08d0: 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65   the P4 paramete
08e0: 72 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  r is only requir
08f0: 65 64 20 69 66 20 74 68 65 20 64 65 66 61 75 6c  ed if the defaul
0900: 74 20 76 61 6c 75 65 20 66 6f 72 0a 2a 2a 20 74  t value for.** t
0910: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 61 20 6c  he column is a l
0920: 69 74 65 72 61 6c 20 6e 75 6d 62 65 72 2c 20 73  iteral number, s
0930: 74 72 69 6e 67 20 6f 72 20 6e 75 6c 6c 2e 20 54  tring or null. T
0940: 68 65 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  he sqlite3ValueF
0950: 72 6f 6d 45 78 70 72 28 29 0a 2a 2a 20 66 75 6e  romExpr().** fun
0960: 63 74 69 6f 6e 20 69 73 20 63 61 70 61 62 6c 65  ction is capable
0970: 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67   of transforming
0980: 20 74 68 65 73 65 20 74 79 70 65 73 20 6f 66 20   these types of 
0990: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 74 6f  expressions into
09a0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  .** sqlite3_valu
09b0: 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 76 6f  e objects..*/.vo
09c0: 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  id sqlite3Column
09d0: 44 65 66 61 75 6c 74 28 56 64 62 65 20 2a 76 2c  Default(Vdbe *v,
09e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e   Table *pTab, in
09f0: 74 20 69 29 7b 0a 20 20 69 66 28 20 70 54 61 62  t i){.  if( pTab
0a00: 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65   && !pTab->pSele
0a10: 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
0a20: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 75 65 3b  3_value *pValue;
0a30: 0a 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e  .    u8 enc = EN
0a40: 43 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  C(sqlite3VdbeDb(
0a50: 76 29 29 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  v));.    Column 
0a60: 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61  *pCol = &pTab->a
0a70: 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 56 64 62 65  Col[i];.    Vdbe
0a80: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
0a90: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
0aa0: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 29 3b  , pCol->zName));
0ab0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70  .    assert( i<p
0ac0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0ad0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f   sqlite3ValueFro
0ae0: 6d 45 78 70 72 28 73 71 6c 69 74 65 33 56 64 62  mExpr(sqlite3Vdb
0af0: 65 44 62 28 76 29 2c 20 70 43 6f 6c 2d 3e 70 44  eDb(v), pCol->pD
0b00: 66 6c 74 2c 20 65 6e 63 2c 20 0a 20 20 20 20 20  flt, enc, .     
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
0b30: 74 79 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20  ty, &pValue);.  
0b40: 20 20 69 66 28 20 70 56 61 6c 75 65 20 29 7b 0a    if( pValue ){.
0b50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
0b60: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
0b70: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
0b80: 56 61 6c 75 65 2c 20 50 34 5f 4d 45 4d 29 3b 0a  Value, P4_MEM);.
0b90: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
0ba0: 2a 2a 20 50 72 6f 63 65 73 73 20 61 6e 20 55 50  ** Process an UP
0bb0: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  DATE statement..
0bc0: 2a 2a 0a 2a 2a 20 20 20 55 50 44 41 54 45 20 4f  **.**   UPDATE O
0bd0: 52 20 49 47 4e 4f 52 45 20 74 61 62 6c 65 5f 77  R IGNORE table_w
0be0: 78 79 7a 20 53 45 54 20 61 3d 62 2c 20 63 3d 64  xyz SET a=b, c=d
0bf0: 20 57 48 45 52 45 20 65 3c 35 20 41 4e 44 20 66   WHERE e<5 AND f
0c00: 20 4e 4f 54 20 4e 55 4c 4c 3b 0a 2a 2a 20 20 20   NOT NULL;.**   
0c10: 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 2f         \_______/
0c20: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20   \________/     
0c30: 5c 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 5c  \______/       \
0c40: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
0c50: 2f 0a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6f  /.*            o
0c60: 6e 45 72 72 6f 72 20 20 20 70 54 61 62 4c 69 73  nError   pTabLis
0c70: 74 20 20 20 20 20 20 70 43 68 61 6e 67 65 73 20  t      pChanges 
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 68 65              pWhe
0c90: 72 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  re.*/.void sqlit
0ca0: 65 33 55 70 64 61 74 65 28 0a 20 20 50 61 72 73  e3Update(.  Pars
0cb0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
0cc0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
0cd0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
0ce0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
0cf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
0d00: 65 20 69 6e 20 77 68 69 63 68 20 77 65 20 73 68  e in which we sh
0d10: 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 69 6e  ould change thin
0d20: 67 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  gs */.  ExprList
0d30: 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 20 20 2f   *pChanges,    /
0d40: 2a 20 54 68 69 6e 67 73 20 74 6f 20 62 65 20 63  * Things to be c
0d50: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 45 78 70 72  hanged */.  Expr
0d60: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
0d70: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
0d80: 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
0d90: 6e 75 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  null */.  int on
0da0: 45 72 72 6f 72 20 20 20 20 20 20 20 20 20 20 20  Error           
0db0: 20 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c   /* How to handl
0dc0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72  e constraint err
0dd0: 6f 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ors */.){.  int 
0de0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
0df0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
0e00: 65 72 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ers */.  Table *
0e10: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
0e20: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20  /* The table to 
0e30: 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20  be updated */.  
0e40: 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 20 20 20  int addr = 0;   
0e50: 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 69         /* VDBE i
0e60: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65  nstruction addre
0e70: 73 73 20 6f 66 20 74 68 65 20 73 74 61 72 74 20  ss of the start 
0e80: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
0e90: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
0ea0: 66 6f 3b 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  fo;     /* Infor
0eb0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
0ec0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
0ed0: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
0ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0ef0: 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
0f00: 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 49 6e  e engine */.  In
0f10: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
0f20: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
0f30: 69 6e 67 20 6f 76 65 72 20 69 6e 64 69 63 65 73  ing over indices
0f40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 64 78 3b 20   */.  int nIdx; 
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f60: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 69 63 65  Number of indice
0f70: 73 20 74 68 61 74 20 6e 65 65 64 20 75 70 64 61  s that need upda
0f80: 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  ting */.  int nI
0f90: 64 78 54 6f 74 61 6c 3b 20 20 20 20 20 20 20 20  dxTotal;        
0fa0: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
0fb0: 20 6f 66 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20   of indices */. 
0fc0: 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
0fd0: 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
0fe0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
0ff0: 20 70 54 61 62 20 2a 2f 0a 20 20 73 71 6c 69 74   pTab */.  sqlit
1000: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
1010: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1020: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
1030: 20 49 6e 64 65 78 20 2a 2a 61 70 49 64 78 20 3d   Index **apIdx =
1040: 20 30 3b 20 20 20 20 20 2f 2a 20 41 6e 20 61 72   0;     /* An ar
1050: 72 61 79 20 6f 66 20 69 6e 64 69 63 65 73 20 74  ray of indices t
1060: 68 61 74 20 6e 65 65 64 20 75 70 64 61 74 69 6e  hat need updatin
1070: 67 20 74 6f 6f 20 2a 2f 0a 20 20 63 68 61 72 20  g too */.  char 
1080: 2a 61 49 64 78 55 73 65 64 20 3d 20 30 3b 20 20  *aIdxUsed = 0;  
1090: 20 20 2f 2a 20 61 49 64 78 55 73 65 64 5b 69 5d    /* aIdxUsed[i]
10a0: 3d 3d 31 20 69 66 20 74 68 65 20 69 2d 74 68 20  ==1 if the i-th 
10b0: 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 2a 2f  index is used */
10c0: 0a 20 20 69 6e 74 20 2a 61 58 52 65 66 20 3d 20  .  int *aXRef = 
10d0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 58 52  0;        /* aXR
10e0: 65 66 5b 69 5d 20 69 73 20 74 68 65 20 69 6e 64  ef[i] is the ind
10f0: 65 78 20 69 6e 20 70 43 68 61 6e 67 65 73 2d 3e  ex in pChanges->
1100: 61 5b 5d 20 6f 66 20 74 68 65 0a 20 20 20 20 20  a[] of the.     
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1120: 20 20 20 20 2a 2a 20 61 6e 20 65 78 70 72 65 73      ** an expres
1130: 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 2d 74  sion for the i-t
1140: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
1150: 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20  table..         
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1170: 2a 2a 20 61 58 52 65 66 5b 69 5d 3d 3d 2d 31 20  ** aXRef[i]==-1 
1180: 69 66 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75  if the i-th colu
1190: 6d 6e 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  mn is not change
11a0: 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 63 68 6e 67  d. */.  int chng
11b0: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 2f  Rowid;         /
11c0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 72 65  * True if the re
11d0: 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20 62  cord number is b
11e0: 65 69 6e 67 20 63 68 61 6e 67 65 64 20 2a 2f 0a  eing changed */.
11f0: 20 20 45 78 70 72 20 2a 70 52 6f 77 69 64 45 78    Expr *pRowidEx
1200: 70 72 20 3d 20 30 3b 20 20 2f 2a 20 45 78 70 72  pr = 0;  /* Expr
1210: 65 73 73 69 6f 6e 20 64 65 66 69 6e 69 6e 67 20  ession defining 
1220: 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 6e  the new record n
1230: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  umber */.  int o
1240: 70 65 6e 41 6c 6c 20 3d 20 30 3b 20 20 20 20 20  penAll = 0;     
1250: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
1260: 20 69 6e 64 69 63 65 73 20 6e 65 65 64 20 74 6f   indices need to
1270: 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
1280: 41 75 74 68 43 6f 6e 74 65 78 74 20 73 43 6f 6e  AuthContext sCon
1290: 74 65 78 74 3b 20 20 2f 2a 20 54 68 65 20 61 75  text;  /* The au
12a0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 6f 6e 74  thorization cont
12b0: 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ext */.  NameCon
12c0: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
12d0: 2f 2a 20 54 68 65 20 6e 61 6d 65 2d 63 6f 6e 74  /* The name-cont
12e0: 65 78 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 65  ext to resolve e
12f0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 2a 2f  xpressions in */
1300: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
1310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1320: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1330: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
1340: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 69 6e   updated */.  in
1350: 74 20 6d 65 6d 43 6e 74 20 3d 20 30 3b 20 20 20  t memCnt = 0;   
1360: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
1370: 65 6c 6c 20 75 73 65 64 20 66 6f 72 20 63 6f 75  ell used for cou
1380: 6e 74 69 6e 67 20 72 6f 77 73 20 63 68 61 6e 67  nting rows chang
1390: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 31  ed */.  int mem1
13a0: 3b 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79  ;      /* Memory
13b0: 20 61 64 64 72 65 73 73 20 73 74 6f 72 69 6e 67   address storing
13c0: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 6e   the rowid for n
13d0: 65 78 74 20 72 6f 77 20 74 6f 20 75 70 64 61 74  ext row to updat
13e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69  e */.  int iRowi
13f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
1400: 20 4d 65 6d 6f 72 79 20 61 64 64 72 65 73 73 20   Memory address 
1410: 73 74 6f 72 69 6e 67 20 72 6f 77 69 64 73 20 2a  storing rowids *
1420: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1430: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
1440: 20 69 6e 74 20 69 73 56 69 65 77 3b 20 20 20 20   int isView;    
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1460: 20 54 72 79 69 6e 67 20 74 6f 20 75 70 64 61 74   Trying to updat
1470: 65 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  e a view */.  in
1480: 74 20 74 72 69 67 67 65 72 73 5f 65 78 69 73 74  t triggers_exist
1490: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 72   = 0;      /* Tr
14a0: 75 65 20 69 66 20 61 6e 79 20 72 6f 77 20 74 72  ue if any row tr
14b0: 69 67 67 65 72 73 20 65 78 69 73 74 20 2a 2f 0a  iggers exist */.
14c0: 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 69 42 65  #endif.  int iBe
14d0: 67 69 6e 41 66 74 65 72 54 72 69 67 67 65 72 3b  ginAfterTrigger;
14e0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
14f0: 20 6f 66 20 61 66 74 65 72 20 74 72 69 67 67 65   of after trigge
1500: 72 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69  r program */.  i
1510: 6e 74 20 69 45 6e 64 41 66 74 65 72 54 72 69 67  nt iEndAfterTrig
1520: 67 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  ger;        /* E
1530: 78 69 74 20 6f 66 20 61 66 74 65 72 20 74 72 69  xit of after tri
1540: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 2a 2f 0a  gger program */.
1550: 20 20 69 6e 74 20 69 42 65 67 69 6e 42 65 66 6f    int iBeginBefo
1560: 72 65 54 72 69 67 67 65 72 3b 20 20 20 20 20 2f  reTrigger;     /
1570: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 62 65 66  * Address of bef
1580: 6f 72 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  ore trigger prog
1590: 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ram */.  int iEn
15a0: 64 42 65 66 6f 72 65 54 72 69 67 67 65 72 3b 20  dBeforeTrigger; 
15b0: 20 20 20 20 20 20 2f 2a 20 45 78 69 74 20 6f 66        /* Exit of
15c0: 20 62 65 66 6f 72 65 20 74 72 69 67 67 65 72 20   before trigger 
15d0: 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 75 33 32  program */.  u32
15e0: 20 6f 6c 64 5f 63 6f 6c 5f 6d 61 73 6b 20 3d 20   old_col_mask = 
15f0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  0;        /* Mas
1600: 6b 20 6f 66 20 4f 4c 44 2e 2a 20 63 6f 6c 75 6d  k of OLD.* colum
1610: 6e 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 75  ns in use */.  u
1620: 33 32 20 6e 65 77 5f 63 6f 6c 5f 6d 61 73 6b 20  32 new_col_mask 
1630: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  = 0;        /* M
1640: 61 73 6b 20 6f 66 20 4e 45 57 2e 2a 20 63 6f 6c  ask of NEW.* col
1650: 75 6d 6e 73 20 69 6e 20 75 73 65 20 2a 2f 0a 0a  umns in use */..
1660: 20 20 69 6e 74 20 6e 65 77 49 64 78 20 20 20 20    int newIdx    
1670: 20 20 3d 20 2d 31 3b 20 20 2f 2a 20 69 6e 64 65    = -1;  /* inde
1680: 78 20 6f 66 20 74 72 69 67 67 65 72 20 22 6e 65  x of trigger "ne
1690: 77 22 20 74 65 6d 70 20 74 61 62 6c 65 20 20 20  w" temp table   
16a0: 20 20 20 20 2a 2f 0a 20 20 69 6e 74 20 6f 6c 64      */.  int old
16b0: 49 64 78 20 20 20 20 20 20 3d 20 2d 31 3b 20 20  Idx      = -1;  
16c0: 2f 2a 20 69 6e 64 65 78 20 6f 66 20 74 72 69 67  /* index of trig
16d0: 67 65 72 20 22 6f 6c 64 22 20 74 65 6d 70 20 74  ger "old" temp t
16e0: 61 62 6c 65 20 20 20 20 20 20 20 2a 2f 0a 0a 20  able       */.. 
16f0: 20 73 43 6f 6e 74 65 78 74 2e 70 50 61 72 73 65   sContext.pParse
1700: 20 3d 20 30 3b 0a 20 20 64 62 20 3d 20 70 50 61   = 0;.  db = pPa
1710: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
1720: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1730: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1740: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61  ){.    goto upda
1750: 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  te_cleanup;.  }.
1760: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69    assert( pTabLi
1770: 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 0a  st->nSrc==1 );..
1780: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
1790: 74 61 62 6c 65 20 77 68 69 63 68 20 77 65 20 77  table which we w
17a0: 61 6e 74 20 74 6f 20 75 70 64 61 74 65 2e 20 0a  ant to update. .
17b0: 20 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71    */.  pTab = sq
17c0: 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
17d0: 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  up(pParse, pTabL
17e0: 69 73 74 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ist);.  if( pTab
17f0: 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64 61 74  ==0 ) goto updat
1800: 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 44 62  e_cleanup;.  iDb
1810: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1820: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
1830: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1840: 61 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  a);..  /* Figure
1850: 20 6f 75 74 20 69 66 20 77 65 20 68 61 76 65 20   out if we have 
1860: 61 6e 79 20 74 72 69 67 67 65 72 73 20 61 6e 64  any triggers and
1870: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   if the table be
1880: 69 6e 67 0a 20 20 2a 2a 20 75 70 64 61 74 65 64  ing.  ** updated
1890: 20 69 73 20 61 20 76 69 65 77 0a 20 20 2a 2f 0a   is a view.  */.
18a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18b0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 74 72  MIT_TRIGGER.  tr
18c0: 69 67 67 65 72 73 5f 65 78 69 73 74 20 3d 20 73  iggers_exist = s
18d0: 71 6c 69 74 65 33 54 72 69 67 67 65 72 73 45 78  qlite3TriggersEx
18e0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
18f0: 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 70 43 68  , TK_UPDATE, pCh
1900: 61 6e 67 65 73 29 3b 0a 20 20 69 73 56 69 65 77  anges);.  isView
1910: 20 3d 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74   = pTab->pSelect
1920: 21 3d 30 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66  !=0;.#else.# def
1930: 69 6e 65 20 74 72 69 67 67 65 72 73 5f 65 78 69  ine triggers_exi
1940: 73 74 20 30 0a 23 20 64 65 66 69 6e 65 20 69 73  st 0.# define is
1950: 56 69 65 77 20 30 0a 23 65 6e 64 69 66 0a 23 69  View 0.#endif.#i
1960: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
1970: 5f 56 49 45 57 0a 23 20 75 6e 64 65 66 20 69 73  _VIEW.# undef is
1980: 56 69 65 77 0a 23 20 64 65 66 69 6e 65 20 69 73  View.# define is
1990: 56 69 65 77 20 30 0a 23 65 6e 64 69 66 0a 0a 20  View 0.#endif.. 
19a0: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52 65   if( sqlite3IsRe
19b0: 61 64 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20 70  adOnly(pParse, p
19c0: 54 61 62 2c 20 74 72 69 67 67 65 72 73 5f 65 78  Tab, triggers_ex
19d0: 69 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ist) ){.    goto
19e0: 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b   update_cleanup;
19f0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1a00: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
1a10: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
1a20: 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 75  b) ){.    goto u
1a30: 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  pdate_cleanup;. 
1a40: 20 7d 0a 20 20 61 58 52 65 66 20 3d 20 73 71 6c   }.  aXRef = sql
1a50: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a60: 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 20  db, sizeof(int) 
1a70: 2a 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  * pTab->nCol );.
1a80: 20 20 69 66 28 20 61 58 52 65 66 3d 3d 30 20 29    if( aXRef==0 )
1a90: 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65   goto update_cle
1aa0: 61 6e 75 70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  anup;.  for(i=0;
1ab0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
1ac0: 2b 2b 29 20 61 58 52 65 66 5b 69 5d 20 3d 20 2d  ++) aXRef[i] = -
1ad0: 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  1;..  /* If ther
1ae0: 65 20 61 72 65 20 46 4f 52 20 45 41 43 48 20 52  e are FOR EACH R
1af0: 4f 57 20 74 72 69 67 67 65 72 73 2c 20 61 6c 6c  OW triggers, all
1b00: 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f  ocate cursors fo
1b10: 72 20 74 68 65 0a 20 20 2a 2a 20 73 70 65 63 69  r the.  ** speci
1b20: 61 6c 20 4f 4c 44 20 61 6e 64 20 4e 45 57 20 74  al OLD and NEW t
1b30: 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28  ables.  */.  if(
1b40: 20 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20   triggers_exist 
1b50: 29 7b 0a 20 20 20 20 6e 65 77 49 64 78 20 3d 20  ){.    newIdx = 
1b60: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1b70: 20 20 20 20 6f 6c 64 49 64 78 20 3d 20 70 50 61      oldIdx = pPa
1b80: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d  rse->nTab++;.  }
1b90: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1ba0: 61 20 63 75 72 73 6f 72 73 20 66 6f 72 20 74 68  a cursors for th
1bb0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1bc0: 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c  table and for al
1bd0: 6c 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a 2a 20  l indices..  ** 
1be0: 54 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  The index cursor
1bf0: 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 75  s might not be u
1c00: 73 65 64 2c 20 62 75 74 20 69 66 20 74 68 65 79  sed, but if they
1c10: 20 61 72 65 20 75 73 65 64 20 74 68 65 79 0a 20   are used they. 
1c20: 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6f 63 63 75   ** need to occu
1c30: 72 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  r right after th
1c40: 65 20 64 61 74 61 62 61 73 65 20 63 75 72 73 6f  e database curso
1c50: 72 2e 20 20 53 6f 20 67 6f 20 61 68 65 61 64 20  r.  So go ahead 
1c60: 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  and.  ** allocat
1c70: 65 20 65 6e 6f 75 67 68 20 73 70 61 63 65 2c 20  e enough space, 
1c80: 6a 75 73 74 20 69 6e 20 63 61 73 65 2e 0a 20 20  just in case..  
1c90: 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 2d 3e 61  */.  pTabList->a
1ca0: 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 69 43  [0].iCursor = iC
1cb0: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
1cc0: 62 2b 2b 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  b++;.  for(pIdx=
1cd0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
1ce0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
1cf0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 50 61 72 73  Next){.    pPars
1d00: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 0a 0a  e->nTab++;.  }..
1d10: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1d20: 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  the name-context
1d30: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e   */.  memset(&sN
1d40: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
1d50: 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  ));.  sNC.pParse
1d60: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e 43   = pParse;.  sNC
1d70: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
1d80: 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f  List;..  /* Reso
1d90: 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  lve the column n
1da0: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 74 68 65 20  ames in all the 
1db0: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
1dc0: 68 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 55  he.  ** of the U
1dd0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
1de0: 20 20 41 6c 73 6f 20 66 69 6e 64 20 74 68 65 20    Also find the 
1df0: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 20 20 2a  column index.  *
1e00: 2a 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  * for each colum
1e10: 6e 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  n to be updated 
1e20: 69 6e 20 74 68 65 20 70 43 68 61 6e 67 65 73 20  in the pChanges 
1e30: 61 72 72 61 79 2e 20 20 46 6f 72 20 65 61 63 68  array.  For each
1e40: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 74 6f 20  .  ** column to 
1e50: 62 65 20 75 70 64 61 74 65 64 2c 20 6d 61 6b 65  be updated, make
1e60: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 75   sure we have au
1e70: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63  thorization to c
1e80: 68 61 6e 67 65 0a 20 20 2a 2a 20 74 68 61 74 20  hange.  ** that 
1e90: 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2f 0a 20 20 63  column..  */.  c
1ea0: 68 6e 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  hngRowid = 0;.  
1eb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 61 6e  for(i=0; i<pChan
1ec0: 67 65 73 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ges->nExpr; i++)
1ed0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1ee0: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
1ef0: 73 28 26 73 4e 43 2c 20 70 43 68 61 6e 67 65 73  s(&sNC, pChanges
1f00: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
1f10: 0a 20 20 20 20 20 20 67 6f 74 6f 20 75 70 64 61  .      goto upda
1f20: 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  te_cleanup;.    
1f30: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  }.    for(j=0; j
1f40: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
1f50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
1f60: 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62  ite3StrICmp(pTab
1f70: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
1f80: 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e   pChanges->a[i].
1f90: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
1fa0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62       if( j==pTab
1fb0: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
1fc0: 20 20 20 20 20 63 68 6e 67 52 6f 77 69 64 20 3d       chngRowid =
1fd0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 52   1;.          pR
1fe0: 6f 77 69 64 45 78 70 72 20 3d 20 70 43 68 61 6e  owidExpr = pChan
1ff0: 67 65 73 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ges->a[i].pExpr;
2000: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2010: 20 20 20 61 58 52 65 66 5b 6a 5d 20 3d 20 69 3b     aXRef[j] = i;
2020: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2030: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2040: 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
2050: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Col ){.      if(
2060: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
2070: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a  pChanges->a[i].z
2080: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
2090: 20 63 68 6e 67 52 6f 77 69 64 20 3d 20 31 3b 0a   chngRowid = 1;.
20a0: 20 20 20 20 20 20 20 20 70 52 6f 77 69 64 45 78          pRowidEx
20b0: 70 72 20 3d 20 70 43 68 61 6e 67 65 73 2d 3e 61  pr = pChanges->a
20c0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
20d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20f0: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
2100: 20 63 6f 6c 75 6d 6e 3a 20 25 73 22 2c 20 70 43   column: %s", pC
2110: 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  hanges->a[i].zNa
2120: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
2130: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
2140: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2150: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2160: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
2170: 4e 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e  N.    {.      in
2180: 74 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  t rc;.      rc =
2190: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
21a0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
21b0: 5f 55 50 44 41 54 45 2c 20 70 54 61 62 2d 3e 7a  _UPDATE, pTab->z
21c0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
21f0: 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44  Name, db->aDb[iD
2200: 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b].zName);.     
2210: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2220: 44 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 20 20  DENY ){.        
2230: 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61  goto update_clea
2240: 6e 75 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nup;.      }else
2250: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2260: 49 47 4e 4f 52 45 20 29 7b 0a 20 20 20 20 20 20  IGNORE ){.      
2270: 20 20 61 58 52 65 66 5b 6a 5d 20 3d 20 2d 31 3b    aXRef[j] = -1;
2280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
2290: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
22a0: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
22b0: 66 6f 72 20 74 68 65 20 61 72 72 61 79 20 61 70  for the array ap
22c0: 49 64 78 5b 5d 20 61 6e 64 20 66 69 6c 6c 20 69  Idx[] and fill i
22d0: 74 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  t with pointers 
22e0: 74 6f 20 65 76 65 72 79 0a 20 20 2a 2a 20 69 6e  to every.  ** in
22f0: 64 65 78 20 74 68 61 74 20 6e 65 65 64 73 20 74  dex that needs t
2300: 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20 20 49  o be updated.  I
2310: 6e 64 69 63 65 73 20 6f 6e 6c 79 20 6e 65 65 64  ndices only need
2320: 20 75 70 64 61 74 69 6e 67 20 69 66 20 74 68 65   updating if the
2330: 69 72 0a 20 20 2a 2a 20 6b 65 79 20 69 6e 63 6c  ir.  ** key incl
2340: 75 64 65 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  udes one of the 
2350: 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64 20 69 6e  columns named in
2360: 20 70 43 68 61 6e 67 65 73 20 6f 72 20 69 66 20   pChanges or if 
2370: 74 68 65 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  the record.  ** 
2380: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6f 72  number of the or
2390: 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 65 6e 74  iginal table ent
23a0: 72 79 20 69 73 20 63 68 61 6e 67 69 6e 67 2e 0a  ry is changing..
23b0: 20 20 2a 2f 0a 20 20 66 6f 72 28 6e 49 64 78 3d    */.  for(nIdx=
23c0: 6e 49 64 78 54 6f 74 61 6c 3d 30 2c 20 70 49 64  nIdxTotal=0, pId
23d0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
23e0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
23f0: 3e 70 4e 65 78 74 2c 20 6e 49 64 78 54 6f 74 61  >pNext, nIdxTota
2400: 6c 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 68  l++){.    if( ch
2410: 6e 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  ngRowid ){.     
2420: 20 69 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   i = 0;.    }els
2430: 65 20 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  e {.      for(i=
2440: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
2450: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
2460: 20 20 69 66 28 20 61 58 52 65 66 5b 70 49 64 78    if( aXRef[pIdx
2470: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 3e 3d  ->aiColumn[i]]>=
2480: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
2490: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
24a0: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
24b0: 20 29 20 6e 49 64 78 2b 2b 3b 0a 20 20 7d 0a 20   ) nIdx++;.  }. 
24c0: 20 69 66 28 20 6e 49 64 78 54 6f 74 61 6c 3e 30   if( nIdxTotal>0
24d0: 20 29 7b 0a 20 20 20 20 61 70 49 64 78 20 3d 20   ){.    apIdx = 
24e0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
24f0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 6e  aw(db, sizeof(In
2500: 64 65 78 2a 29 20 2a 20 6e 49 64 78 20 2b 20 6e  dex*) * nIdx + n
2510: 49 64 78 54 6f 74 61 6c 20 29 3b 0a 20 20 20 20  IdxTotal );.    
2520: 69 66 28 20 61 70 49 64 78 3d 3d 30 20 29 20 67  if( apIdx==0 ) g
2530: 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e  oto update_clean
2540: 75 70 3b 0a 20 20 20 20 61 49 64 78 55 73 65 64  up;.    aIdxUsed
2550: 20 3d 20 28 63 68 61 72 2a 29 26 61 70 49 64 78   = (char*)&apIdx
2560: 5b 6e 49 64 78 5d 3b 0a 20 20 7d 0a 20 20 66 6f  [nIdx];.  }.  fo
2570: 72 28 6e 49 64 78 3d 6a 3d 30 2c 20 70 49 64 78  r(nIdx=j=0, pIdx
2580: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
2590: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
25a0: 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20  pNext, j++){.   
25b0: 20 69 66 28 20 63 68 6e 67 52 6f 77 69 64 20 29   if( chngRowid )
25c0: 7b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20  {.      i = 0;. 
25d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
25f0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
2600: 20 20 20 20 20 20 20 20 69 66 28 20 61 58 52 65          if( aXRe
2610: 66 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  f[pIdx->aiColumn
2620: 5b 69 5d 5d 3e 3d 30 20 29 20 62 72 65 61 6b 3b  [i]]>=0 ) break;
2630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2640: 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e     if( i<pIdx->n
2650: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
2660: 61 70 49 64 78 5b 6e 49 64 78 2b 2b 5d 20 3d 20  apIdx[nIdx++] = 
2670: 70 49 64 78 3b 0a 20 20 20 20 20 20 61 49 64 78  pIdx;.      aIdx
2680: 55 73 65 64 5b 6a 5d 20 3d 20 31 3b 0a 20 20 20  Used[j] = 1;.   
2690: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 49   }else{.      aI
26a0: 64 78 55 73 65 64 5b 6a 5d 20 3d 20 30 3b 0a 20  dxUsed[j] = 0;. 
26b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
26c0: 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
26d0: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  code..  */.  v =
26e0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
26f0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
2700: 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64 61 74  ==0 ) goto updat
2710: 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 66 28  e_cleanup;.  if(
2720: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
2730: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  =0 ) sqlite3Vdbe
2740: 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 76 29 3b  CountChanges(v);
2750: 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  .  sqlite3BeginW
2760: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
2770: 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
2780: 20 6d 65 6d 31 20 3d 20 2b 2b 70 50 61 72 73 65   mem1 = ++pParse
2790: 2d 3e 6e 4d 65 6d 3b 0a 0a 23 69 66 6e 64 65 66  ->nMem;..#ifndef
27a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
27b0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 56  TUALTABLE.  /* V
27c0: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 75  irtual tables mu
27d0: 73 74 20 62 65 20 68 61 6e 64 6c 65 64 20 73 65  st be handled se
27e0: 70 61 72 61 74 65 6c 79 20 2a 2f 0a 20 20 69 66  parately */.  if
27f0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
2800: 29 20 29 7b 0a 20 20 20 20 75 70 64 61 74 65 56  ) ){.    updateV
2810: 69 72 74 75 61 6c 54 61 62 6c 65 28 70 50 61 72  irtualTable(pPar
2820: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 54  se, pTabList, pT
2830: 61 62 2c 20 70 43 68 61 6e 67 65 73 2c 20 70 52  ab, pChanges, pR
2840: 6f 77 69 64 45 78 70 72 2c 20 61 58 52 65 66 2c  owidExpr, aXRef,
2850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2860: 20 20 20 20 20 20 20 20 70 57 68 65 72 65 29 3b          pWhere);
2870: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
2880: 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
2890: 30 3b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61  0;.    goto upda
28a0: 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  te_cleanup;.  }.
28b0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 73  #endif..  /* Res
28c0: 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  olve the column 
28d0: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 74 68 65  names in all the
28e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
28f0: 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 20 63  the.  ** WHERE c
2900: 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
2910: 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
2920: 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20  olveNames(&sNC, 
2930: 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 67  pWhere) ){.    g
2940: 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e  oto update_clean
2950: 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  up;.  }..  /* St
2960: 61 72 74 20 74 68 65 20 76 69 65 77 20 63 6f 6e  art the view con
2970: 74 65 78 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20  text.  */.  if( 
2980: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 73 71  isView ){.    sq
2990: 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78 74  lite3AuthContext
29a0: 50 75 73 68 28 70 50 61 72 73 65 2c 20 26 73 43  Push(pParse, &sC
29b0: 6f 6e 74 65 78 74 2c 20 70 54 61 62 2d 3e 7a 4e  ontext, pTab->zN
29c0: 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ame);.  }..  /* 
29d0: 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  Generate the cod
29e0: 65 20 66 6f 72 20 74 72 69 67 67 65 72 73 2e 0a  e for triggers..
29f0: 20 20 2a 2f 0a 20 20 69 66 28 20 74 72 69 67 67    */.  if( trigg
2a00: 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20 20  ers_exist ){.   
2a10: 20 69 6e 74 20 69 47 6f 74 6f 3b 0a 0a 20 20 20   int iGoto;..   
2a20: 20 2f 2a 20 43 72 65 61 74 65 20 70 73 65 75 64   /* Create pseud
2a30: 6f 2d 74 61 62 6c 65 73 20 66 6f 72 20 4e 45 57  o-tables for NEW
2a40: 20 61 6e 64 20 4f 4c 44 0a 20 20 20 20 2a 2f 0a   and OLD.    */.
2a50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
2a70: 50 73 65 75 64 6f 2c 20 6f 6c 64 49 64 78 2c 20  Pseudo, oldIdx, 
2a80: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
2a90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2aa0: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 6f  SetNumColumns, o
2ab0: 6c 64 49 64 78 2c 20 70 54 61 62 2d 3e 6e 43 6f  ldIdx, pTab->nCo
2ac0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
2ad0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2ae0: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 6e 65 77 49  OpenPseudo, newI
2af0: 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  dx, 0);.    sqli
2b00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2b10: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
2b20: 73 2c 20 6e 65 77 49 64 78 2c 20 70 54 61 62 2d  s, newIdx, pTab-
2b30: 3e 6e 43 6f 6c 29 3b 0a 0a 20 20 20 20 69 47 6f  >nCol);..    iGo
2b40: 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
2b50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
2b60: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 64  o, 0, 0);.    ad
2b70: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2b80: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2b90: 20 20 69 42 65 67 69 6e 42 65 66 6f 72 65 54 72    iBeginBeforeTr
2ba0: 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56  igger = sqlite3V
2bb0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2bc0: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
2bd0: 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72  e3CodeRowTrigger
2be0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 55 50 44 41  (pParse, TK_UPDA
2bf0: 54 45 2c 20 70 43 68 61 6e 67 65 73 2c 20 54 52  TE, pChanges, TR
2c00: 49 47 47 45 52 5f 42 45 46 4f 52 45 2c 20 70 54  IGGER_BEFORE, pT
2c10: 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 65  ab,.          ne
2c20: 77 49 64 78 2c 20 6f 6c 64 49 64 78 2c 20 6f 6e  wIdx, oldIdx, on
2c30: 45 72 72 6f 72 2c 20 61 64 64 72 2c 20 26 6f 6c  Error, addr, &ol
2c40: 64 5f 63 6f 6c 5f 6d 61 73 6b 2c 20 26 6e 65 77  d_col_mask, &new
2c50: 5f 63 6f 6c 5f 6d 61 73 6b 29 20 29 7b 0a 20 20  _col_mask) ){.  
2c60: 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
2c70: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
2c80: 20 20 20 69 45 6e 64 42 65 66 6f 72 65 54 72 69     iEndBeforeTri
2c90: 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64  gger = sqlite3Vd
2ca0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2cb0: 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  oto, 0, 0);.    
2cc0: 69 42 65 67 69 6e 41 66 74 65 72 54 72 69 67 67  iBeginAfterTrigg
2cd0: 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  er = sqlite3Vdbe
2ce0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2cf0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
2d00: 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 70 50  odeRowTrigger(pP
2d10: 61 72 73 65 2c 20 54 4b 5f 55 50 44 41 54 45 2c  arse, TK_UPDATE,
2d20: 20 70 43 68 61 6e 67 65 73 2c 20 54 52 49 47 47   pChanges, TRIGG
2d30: 45 52 5f 41 46 54 45 52 2c 20 70 54 61 62 2c 20  ER_AFTER, pTab, 
2d40: 0a 20 20 20 20 20 20 20 20 20 20 6e 65 77 49 64  .          newId
2d50: 78 2c 20 6f 6c 64 49 64 78 2c 20 6f 6e 45 72 72  x, oldIdx, onErr
2d60: 6f 72 2c 20 61 64 64 72 2c 20 26 6f 6c 64 5f 63  or, addr, &old_c
2d70: 6f 6c 5f 6d 61 73 6b 2c 20 26 6e 65 77 5f 63 6f  ol_mask, &new_co
2d80: 6c 5f 6d 61 73 6b 29 20 29 7b 0a 20 20 20 20 20  l_mask) ){.     
2d90: 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65   goto update_cle
2da0: 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
2db0: 69 45 6e 64 41 66 74 65 72 54 72 69 67 67 65 72  iEndAfterTrigger
2dc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2dd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
2de0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
2df0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2e00: 76 2c 20 69 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a  v, iGoto);.  }..
2e10: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 74    /* If we are t
2e20: 72 79 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  rying to update 
2e30: 61 20 76 69 65 77 2c 20 72 65 61 6c 69 7a 65 20  a view, realize 
2e40: 74 68 61 74 20 76 69 65 77 20 69 6e 74 6f 0a 20  that view into. 
2e50: 20 2a 2a 20 61 20 65 70 68 65 6d 65 72 61 6c 20   ** a ephemeral 
2e60: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
2e70: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
2e80: 53 65 6c 65 63 74 20 2a 70 56 69 65 77 3b 0a 20  Select *pView;. 
2e90: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
2ea0: 73 74 20 3d 20 7b 53 52 54 5f 45 70 68 65 6d 54  st = {SRT_EphemT
2eb0: 61 62 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 70  ab, 0, 0};.    p
2ec0: 56 69 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65  View = sqlite3Se
2ed0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
2ee0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
2ef0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4d 61 73  sqlite3SelectMas
2f00: 6b 28 70 50 61 72 73 65 2c 20 70 56 69 65 77 2c  k(pParse, pView,
2f10: 20 6f 6c 64 5f 63 6f 6c 5f 6d 61 73 6b 7c 6e 65   old_col_mask|ne
2f20: 77 5f 63 6f 6c 5f 6d 61 73 6b 29 3b 0a 20 20 20  w_col_mask);.   
2f30: 20 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 69 43   dest.iParm = iC
2f40: 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ur;.    sqlite3S
2f50: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 56  elect(pParse, pV
2f60: 69 65 77 2c 20 26 64 65 73 74 2c 20 30 2c 20 30  iew, &dest, 0, 0
2f70: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
2f80: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
2f90: 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  (pView);.  }..  
2fa0: 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
2fb0: 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a  abase scan.  */.
2fc0: 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2fd0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2fe0: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2ff0: 57 68 65 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Where, 0, 0);.  
3000: 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
3010: 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61  goto update_clea
3020: 6e 75 70 3b 0a 0a 20 20 2f 2a 20 52 65 6d 65 6d  nup;..  /* Remem
3030: 62 65 72 20 74 68 65 20 72 6f 77 69 64 20 6f 66  ber the rowid of
3040: 20 65 76 65 72 79 20 69 74 65 6d 20 74 6f 20 62   every item to b
3050: 65 20 75 70 64 61 74 65 64 2e 0a 20 20 2a 2f 0a  e updated..  */.
3060: 20 20 69 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61    iRowid = ++pPa
3070: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
3080: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3090: 2c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  , IsVirtual(pTab
30a0: 29 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a 20  ) ? OP_VRowid : 
30b0: 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
30c0: 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  iRowid);.  sqlit
30d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
30e0: 4f 50 5f 46 69 66 6f 57 72 69 74 65 2c 20 69 52  OP_FifoWrite, iR
30f0: 6f 77 69 64 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  owid, 0);..  /* 
3100: 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
3110: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f   scan loop..  */
3120: 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
3130: 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f  nd(pWInfo);..  /
3140: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
3150: 20 63 6f 75 6e 74 20 6f 66 20 75 70 64 61 74 65   count of update
3160: 64 20 72 6f 77 73 0a 20 20 2a 2f 0a 20 20 69 66  d rows.  */.  if
3170: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
3180: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 26  LITE_CountRows &
3190: 26 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53  & !pParse->trigS
31a0: 74 61 63 6b 20 29 7b 0a 20 20 20 20 6d 65 6d 43  tack ){.    memC
31b0: 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
31c0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
31d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
31e0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 6d 65 6d  _Integer, 0, mem
31f0: 43 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cnt);.  }..  if(
3200: 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56   !isView && !IsV
3210: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
3220: 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 4f      /* .    ** O
3230: 70 65 6e 20 65 76 65 72 79 20 69 6e 64 65 78 20  pen every index 
3240: 74 68 61 74 20 6e 65 65 64 73 20 75 70 64 61 74  that needs updat
3250: 69 6e 67 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ing.  Note that 
3260: 69 66 20 61 6e 79 0a 20 20 20 20 2a 2a 20 69 6e  if any.    ** in
3270: 64 65 78 20 63 6f 75 6c 64 20 70 6f 74 65 6e 74  dex could potent
3280: 69 61 6c 6c 79 20 69 6e 76 6f 6b 65 20 61 20 52  ially invoke a R
3290: 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20  EPLACE conflict 
32a0: 72 65 73 6f 6c 75 74 69 6f 6e 20 0a 20 20 20 20  resolution .    
32b0: 2a 2a 20 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ** action, then 
32c0: 77 65 20 6e 65 65 64 20 74 6f 20 6f 70 65 6e 20  we need to open 
32d0: 61 6c 6c 20 69 6e 64 69 63 65 73 20 62 65 63 61  all indices beca
32e0: 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
32f0: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 64  d.    ** to be d
3300: 65 6c 65 74 69 6e 67 20 73 6f 6d 65 20 72 65 63  eleting some rec
3310: 6f 72 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ords..    */.   
3320: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
3330: 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
3340: 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
3350: 65 6e 57 72 69 74 65 29 3b 20 0a 20 20 20 20 69  enWrite); .    i
3360: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  f( onError==OE_R
3370: 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eplace ){.      
3380: 6f 70 65 6e 41 6c 6c 20 3d 20 31 3b 0a 20 20 20  openAll = 1;.   
3390: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 70   }else{.      op
33a0: 65 6e 41 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  enAll = 0;.     
33b0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
33c0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
33d0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
33e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
33f0: 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
3400: 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eplace ){.      
3410: 20 20 20 20 6f 70 65 6e 41 6c 6c 20 3d 20 31 3b      openAll = 1;
3420: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
3430: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3440: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
3450: 72 28 69 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  r(i=0, pIdx=pTab
3460: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
3470: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
3480: 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , i++){.      if
3490: 28 20 6f 70 65 6e 41 6c 6c 20 7c 7c 20 61 49 64  ( openAll || aId
34a0: 78 55 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20  xUsed[i] ){.    
34b0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
34c0: 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
34d0: 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
34e0: 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 73  pIdx);.        s
34f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
3500: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
3510: 2c 20 69 43 75 72 2b 69 2b 31 2c 20 70 49 64 78  , iCur+i+1, pIdx
3520: 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20  ->tnum, iDb,.   
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c      (char*)pKey,
3550: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
3560: 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20 61 73  OFF);.        as
3570: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 54  sert( pParse->nT
3580: 61 62 3e 69 43 75 72 2b 69 2b 31 20 29 3b 0a 20  ab>iCur+i+1 );. 
3590: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
35a0: 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 62 61  .  .  /* Jump ba
35b0: 63 6b 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ck to this point
35c0: 20 69 66 20 61 20 74 72 69 67 67 65 72 20 65 6e   if a trigger en
35d0: 63 6f 75 6e 74 65 72 73 20 61 6e 20 49 47 4e 4f  counters an IGNO
35e0: 52 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 2a  RE constraint. *
35f0: 2f 0a 20 20 69 66 28 20 74 72 69 67 67 65 72 73  /.  if( triggers
3600: 5f 65 78 69 73 74 20 29 7b 0a 20 20 20 20 73 71  _exist ){.    sq
3610: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
3620: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 29 3b 0a  Label(v, addr);.
3630: 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 70 20 6f 66    }..  /* Top of
3640: 20 74 68 65 20 75 70 64 61 74 65 20 6c 6f 6f 70   the update loop
3650: 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 73 71 6c   */.  addr = sql
3660: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3670: 2c 20 4f 50 5f 46 69 66 6f 52 65 61 64 2c 20 69  , OP_FifoRead, i
3680: 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 73 71 6c  Rowid, 0);.  sql
3690: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
36a0: 2c 20 4f 50 5f 53 74 61 63 6b 44 65 70 74 68 2c  , OP_StackDepth,
36b0: 20 2d 31 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20   -1, 0);..  if( 
36c0: 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 29  triggers_exist )
36d0: 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 75  {.    /* Make cu
36e0: 72 73 6f 72 20 69 43 75 72 20 70 6f 69 6e 74 20  rsor iCur point 
36f0: 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 74 68  to the record th
3700: 61 74 20 69 73 20 62 65 69 6e 67 20 75 70 64 61  at is being upda
3710: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
3720: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3730: 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
3740: 73 2c 20 69 43 75 72 2c 20 61 64 64 72 2c 20 69  s, iCur, addr, i
3750: 52 6f 77 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20  Rowid);..    /* 
3760: 47 65 6e 65 72 61 74 65 20 74 68 65 20 4f 4c 44  Generate the OLD
3770: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20   table.    */.  
3780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3790: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
37a0: 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 69   iCur, 0);.    i
37b0: 66 28 20 21 6f 6c 64 5f 63 6f 6c 5f 6d 61 73 6b  f( !old_col_mask
37c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
37d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
37e0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20  P_Null, 0, 0);. 
37f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3800: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3810: 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
3820: 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d   iCur, 0);.    }
3830: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
3840: 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c 20 6f  Insert(pParse, o
3850: 6c 64 49 64 78 2c 20 30 29 3b 0a 0a 20 20 20 20  ldIdx, 0);..    
3860: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
3870: 4e 45 57 20 74 61 62 6c 65 0a 20 20 20 20 2a 2f  NEW table.    */
3880: 0a 20 20 20 20 69 66 28 20 63 68 6e 67 52 6f 77  .    if( chngRow
3890: 69 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  id ){.      sqli
38a0: 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61  te3ExprCodeAndCa
38b0: 63 68 65 28 70 50 61 72 73 65 2c 20 70 52 6f 77  che(pParse, pRow
38c0: 69 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c  idExpr);.    }el
38d0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
38e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
38f0: 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 30  P_Rowid, iCur, 0
3900: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
3910: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
3920: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
3930: 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( i==pTab->iPK
3940: 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ey ){.        sq
3950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3960: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
3970: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
3980: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
3990: 20 20 20 6a 20 3d 20 61 58 52 65 66 5b 69 5d 3b     j = aXRef[i];
39a0: 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 5f 63  .      if( new_c
39b0: 6f 6c 5f 6d 61 73 6b 26 28 28 75 33 32 29 31 3c  ol_mask&((u32)1<
39c0: 3c 69 29 20 7c 7c 20 6e 65 77 5f 63 6f 6c 5f 6d  <i) || new_col_m
39d0: 61 73 6b 3d 3d 30 78 66 66 66 66 66 66 66 66 20  ask==0xffffffff 
39e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  ){.        if( j
39f0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
3a00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3a10: 32 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  2(v, OP_Column, 
3a20: 69 43 75 72 2c 20 69 29 3b 0a 20 20 20 20 20 20  iCur, i);.      
3a30: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
3a40: 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
3a50: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , i);.        }e
3a60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
3a70: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e  qlite3ExprCodeAn
3a80: 64 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 70  dCache(pParse, p
3a90: 43 68 61 6e 67 65 73 2d 3e 61 5b 6a 5d 2e 70 45  Changes->a[j].pE
3aa0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
3ab0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3ad0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
3ae0: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 0, 0);.      
3af0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
3b00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3b10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3b20: 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 30 29 3b 0a  pTab->nCol, 0);.
3b30: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
3b40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3b50: 54 61 62 6c 65 41 66 66 69 6e 69 74 79 53 74 72  TableAffinityStr
3b60: 28 76 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d  (v, pTab);.    }
3b70: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
3b80: 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 75 70 64  >nErr ) goto upd
3b90: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ate_cleanup;.   
3ba0: 20 73 71 6c 69 74 65 33 43 6f 64 65 49 6e 73 65   sqlite3CodeInse
3bb0: 72 74 28 70 50 61 72 73 65 2c 20 6e 65 77 49 64  rt(pParse, newId
3bc0: 78 2c 20 30 29 3b 0a 0a 20 20 20 20 73 71 6c 69  x, 0);..    sqli
3bd0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3be0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 65   OP_Goto, 0, iBe
3bf0: 67 69 6e 42 65 66 6f 72 65 54 72 69 67 67 65 72  ginBeforeTrigger
3c00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3c10: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 45  beJumpHere(v, iE
3c20: 6e 64 42 65 66 6f 72 65 54 72 69 67 67 65 72 29  ndBeforeTrigger)
3c30: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73  ;.  }..  if( !is
3c40: 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75  View && !IsVirtu
3c50: 61 6c 28 70 54 61 62 29 20 29 7b 0a 0a 20 20 20  al(pTab) ){..   
3c60: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 65 76   /* Loop over ev
3c70: 65 72 79 20 72 65 63 6f 72 64 20 74 68 61 74 20  ery record that 
3c80: 6e 65 65 64 73 20 75 70 64 61 74 69 6e 67 2e 20  needs updating. 
3c90: 20 57 65 20 68 61 76 65 20 74 6f 20 6c 6f 61 64   We have to load
3ca0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 6c 64 20  .    ** the old 
3cb0: 64 61 74 61 20 66 6f 72 20 65 61 63 68 20 72 65  data for each re
3cc0: 63 6f 72 64 20 74 6f 20 62 65 20 75 70 64 61 74  cord to be updat
3cd0: 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 20  ed because some 
3ce0: 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 6d  columns.    ** m
3cf0: 69 67 68 74 20 6e 6f 74 20 63 68 61 6e 67 65 20  ight not change 
3d00: 61 6e 64 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  and we will need
3d10: 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6f 6c 64   to copy the old
3d20: 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2a 20 41   value..    ** A
3d30: 6c 73 6f 2c 20 74 68 65 20 6f 6c 64 20 64 61 74  lso, the old dat
3d40: 61 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 64  a is needed to d
3d50: 65 6c 65 74 65 20 74 68 65 20 6f 6c 64 20 69 6e  elete the old in
3d60: 64 65 78 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  dex entries..   
3d70: 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 74 68 65 20   ** So make the 
3d80: 63 75 72 73 6f 72 20 70 6f 69 6e 74 20 61 74 20  cursor point at 
3d90: 74 68 65 20 6f 6c 64 20 72 65 63 6f 72 64 2e 0a  the old record..
3da0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
3db0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3dc0: 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43  OP_NotExists, iC
3dd0: 75 72 2c 20 61 64 64 72 2c 20 69 52 6f 77 69 64  ur, addr, iRowid
3de0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3df0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
3e00: 43 6f 70 79 2c 20 69 52 6f 77 69 64 2c 20 30 29  Copy, iRowid, 0)
3e10: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
3e20: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 77   record number w
3e30: 69 6c 6c 20 63 68 61 6e 67 65 2c 20 70 75 73 68  ill change, push
3e40: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
3e50: 65 72 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20  er as it.    ** 
3e60: 77 69 6c 6c 20 62 65 20 61 66 74 65 72 20 74 68  will be after th
3e70: 65 20 75 70 64 61 74 65 2e 20 28 54 68 65 20 6f  e update. (The o
3e80: 6c 64 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  ld record number
3e90: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 20 20   is currently.  
3ea0: 20 20 2a 2a 20 6f 6e 20 74 6f 70 20 6f 66 20 74    ** on top of t
3eb0: 68 65 20 73 74 61 63 6b 2e 29 0a 20 20 20 20 2a  he stack.).    *
3ec0: 2f 0a 20 20 20 20 69 66 28 20 63 68 6e 67 52 6f  /.    if( chngRo
3ed0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  wid ){.      sql
3ee0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
3ef0: 72 73 65 2c 20 70 52 6f 77 69 64 45 78 70 72 2c  rse, pRowidExpr,
3f00: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
3f10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3f20: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c  OP_MustBeInt, 0,
3f30: 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
3f40: 2f 2a 20 43 6f 6d 70 75 74 65 20 6e 65 77 20 64  /* Compute new d
3f50: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 65 63  ata for this rec
3f60: 6f 72 64 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20  ord.  .    */.  
3f70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
3f80: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
3f90: 20 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62       if( i==pTab
3fa0: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
3fb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3fc0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
3fd0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
3fe0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3ff0: 7d 0a 20 20 20 20 20 20 6a 20 3d 20 61 58 52 65  }.      j = aXRe
4000: 66 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  f[i];.      if( 
4010: 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  j<0 ){.        s
4020: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4030: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
4040: 43 75 72 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  Cur, i);.       
4050: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
4060: 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
4070: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4080: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
4090: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
40a0: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 6a 5d 2e 70  pChanges->a[j].p
40b0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
40c0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
40d0: 44 6f 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68  Do constraint ch
40e0: 65 63 6b 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ecks.    */.    
40f0: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
4100: 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
4110: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43  pParse, pTab, iC
4120: 75 72 2c 20 61 49 64 78 55 73 65 64 2c 20 63 68  ur, aIdxUsed, ch
4130: 6e 67 52 6f 77 69 64 2c 20 31 2c 0a 20 20 20 20  ngRowid, 1,.    
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
4160: 6e 45 72 72 6f 72 2c 20 61 64 64 72 29 3b 0a 0a  nError, addr);..
4170: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
4180: 65 20 6f 6c 64 20 69 6e 64 69 63 65 73 20 66 6f  e old indices fo
4190: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  r the current re
41a0: 63 6f 72 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cord..    */.   
41b0: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
41c0: 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28 76  RowIndexDelete(v
41d0: 2c 20 70 54 61 62 2c 20 69 43 75 72 2c 20 61 49  , pTab, iCur, aI
41e0: 64 78 55 73 65 64 29 3b 0a 0a 20 20 20 20 2f 2a  dxUsed);..    /*
41f0: 20 49 66 20 63 68 61 6e 67 69 6e 67 20 74 68 65   If changing the
4200: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2c 20   record number, 
4210: 64 65 6c 65 74 65 20 74 68 65 20 6f 6c 64 20 72  delete the old r
4220: 65 63 6f 72 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ecord..    */.  
4230: 20 20 69 66 28 20 63 68 6e 67 52 6f 77 69 64 20    if( chngRowid 
4240: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4250: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4260: 5f 44 65 6c 65 74 65 2c 20 69 43 75 72 2c 20 30  _Delete, iCur, 0
4270: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
4280: 20 43 72 65 61 74 65 20 74 68 65 20 6e 65 77 20   Create the new 
4290: 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61 6e  index entries an
42a0: 64 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  d the new record
42b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
42c0: 69 74 65 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65  ite3CompleteInse
42d0: 72 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  rtion(pParse, pT
42e0: 61 62 2c 20 69 43 75 72 2c 20 61 49 64 78 55 73  ab, iCur, aIdxUs
42f0: 65 64 2c 20 63 68 6e 67 52 6f 77 69 64 2c 20 31  ed, chngRowid, 1
4300: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  , -1, 0);.  }.. 
4310: 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
4320: 65 20 72 6f 77 20 63 6f 75 6e 74 65 72 20 0a 20  e row counter . 
4330: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c   */.  if( db->fl
4340: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
4350: 6e 74 52 6f 77 73 20 26 26 20 21 70 50 61 72 73  ntRows && !pPars
4360: 65 2d 3e 74 72 69 67 53 74 61 63 6b 29 7b 0a 20  e->trigStack){. 
4370: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4380: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
4390: 6d 2c 20 6d 65 6d 43 6e 74 2c 20 31 29 3b 0a 20  m, memCnt, 1);. 
43a0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
43b0: 65 20 61 72 65 20 74 72 69 67 67 65 72 73 2c 20  e are triggers, 
43c0: 63 6c 6f 73 65 20 61 6c 6c 20 74 68 65 20 63 75  close all the cu
43d0: 72 73 6f 72 73 20 61 66 74 65 72 20 65 61 63 68  rsors after each
43e0: 20 69 74 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20   iteration.  ** 
43f0: 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
4400: 2e 20 20 54 68 65 20 66 69 72 65 20 74 68 65 20  .  The fire the 
4410: 61 66 74 65 72 20 74 72 69 67 67 65 72 73 2e 0a  after triggers..
4420: 20 20 2a 2f 0a 20 20 69 66 28 20 74 72 69 67 67    */.  if( trigg
4430: 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20 20  ers_exist ){.   
4440: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4450: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
4460: 2c 20 69 42 65 67 69 6e 41 66 74 65 72 54 72 69  , iBeginAfterTri
4470: 67 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  gger);.    sqlit
4480: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4490: 2c 20 69 45 6e 64 41 66 74 65 72 54 72 69 67 67  , iEndAfterTrigg
44a0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  er);.  }..  /* R
44b0: 65 70 65 61 74 20 74 68 65 20 61 62 6f 76 65 20  epeat the above 
44c0: 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 72 65  with the next re
44d0: 63 6f 72 64 20 74 6f 20 62 65 20 75 70 64 61 74  cord to be updat
44e0: 65 64 2c 20 75 6e 74 69 6c 0a 20 20 2a 2a 20 61  ed, until.  ** a
44f0: 6c 6c 20 72 65 63 6f 72 64 20 73 65 6c 65 63 74  ll record select
4500: 65 64 20 62 79 20 74 68 65 20 57 48 45 52 45 20  ed by the WHERE 
4510: 63 6c 61 75 73 65 20 68 61 76 65 20 62 65 65 6e  clause have been
4520: 20 75 70 64 61 74 65 64 2e 0a 20 20 2a 2f 0a 20   updated..  */. 
4530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4540: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
4550: 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74  , addr);.  sqlit
4560: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4570: 2c 20 61 64 64 72 29 3b 0a 0a 20 20 2f 2a 20 43  , addr);..  /* C
4580: 6c 6f 73 65 20 61 6c 6c 20 74 61 62 6c 65 73 20  lose all tables 
4590: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  */.  for(i=0, pI
45a0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
45b0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
45c0: 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20  ->pNext, i++){. 
45d0: 20 20 20 69 66 28 20 6f 70 65 6e 41 6c 6c 20 7c     if( openAll |
45e0: 7c 20 61 49 64 78 55 73 65 64 5b 69 5d 20 29 7b  | aIdxUsed[i] ){
45f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4600: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
4610: 6c 6f 73 65 2c 20 69 43 75 72 2b 69 2b 31 2c 20  lose, iCur+i+1, 
4620: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
4630: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4640: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  2(v, OP_Close, i
4650: 43 75 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 74  Cur, 0);.  if( t
4660: 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b  riggers_exist ){
4670: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4680: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
4690: 73 65 2c 20 6e 65 77 49 64 78 2c 20 30 29 3b 0a  se, newIdx, 0);.
46a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
46b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
46c0: 65 2c 20 6f 6c 64 49 64 78 2c 20 30 29 3b 0a 20  e, oldIdx, 0);. 
46d0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65   }..  /*.  ** Re
46e0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
46f0: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72  of rows that wer
4700: 65 20 63 68 61 6e 67 65 64 2e 20 49 66 20 74 68  e changed. If th
4710: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 0a 20  is routine is . 
4720: 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 63   ** generating c
4730: 6f 64 65 20 62 65 63 61 75 73 65 20 6f 66 20 61  ode because of a
4740: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
4750: 4e 65 73 74 65 64 50 61 72 73 65 28 29 2c 20 64  NestedParse(), d
4760: 6f 20 6e 6f 74 0a 20 20 2a 2a 20 69 6e 76 6f 6b  o not.  ** invok
4770: 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  e the callback f
4780: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
4790: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
47a0: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
47b0: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72 69   && !pParse->tri
47c0: 67 53 74 61 63 6b 20 26 26 20 70 50 61 72 73 65  gStack && pParse
47d0: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20  ->nested==0 ){. 
47e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
47f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
4800: 74 52 6f 77 2c 20 6d 65 6d 43 6e 74 2c 20 31 29  tRow, memCnt, 1)
4810: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4820: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31  eSetNumCols(v, 1
4830: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4840: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
4850: 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  0, COLNAME_NAME,
4860: 20 22 72 6f 77 73 20 75 70 64 61 74 65 64 22 2c   "rows updated",
4870: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P4_STATIC);.  }
4880: 0a 0a 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  ..update_cleanup
4890: 3a 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 43  :.  sqlite3AuthC
48a0: 6f 6e 74 65 78 74 50 6f 70 28 26 73 43 6f 6e 74  ontextPop(&sCont
48b0: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ext);.  sqlite3_
48c0: 66 72 65 65 28 61 70 49 64 78 29 3b 0a 20 20 73  free(apIdx);.  s
48d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 58 52 65  qlite3_free(aXRe
48e0: 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  f);.  sqlite3Src
48f0: 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61 62 4c  ListDelete(pTabL
4900: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ist);.  sqlite3E
4910: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 43  xprListDelete(pC
4920: 68 61 6e 67 65 73 29 3b 0a 20 20 73 71 6c 69 74  hanges);.  sqlit
4930: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 57 68  e3ExprDelete(pWh
4940: 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ere);.  return;.
4950: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4960: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
4970: 42 4c 45 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  BLE./*.** Genera
4980: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 55  te code for an U
4990: 50 44 41 54 45 20 6f 66 20 61 20 76 69 72 74 75  PDATE of a virtu
49a0: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
49b0: 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20  The strategy is 
49c0: 74 68 61 74 20 77 65 20 63 72 65 61 74 65 20 61  that we create a
49d0: 6e 20 65 70 68 65 6d 65 72 69 61 6c 20 74 61 62  n ephemerial tab
49e0: 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  le that contains
49f0: 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 72 6f 77  .** for each row
4a00: 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 3a 0a   to be changed:.
4a10: 2a 2a 0a 2a 2a 20 20 20 28 41 29 20 20 54 68 65  **.**   (A)  The
4a20: 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77 69 64 20   original rowid 
4a30: 6f 66 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20  of that row..** 
4a40: 20 20 28 42 29 20 20 54 68 65 20 72 65 76 69 73    (B)  The revis
4a50: 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  ed rowid for the
4a60: 20 72 6f 77 2e 20 28 6e 6f 74 65 31 29 0a 2a 2a   row. (note1).**
4a70: 20 20 20 28 43 29 20 20 54 68 65 20 63 6f 6e 74     (C)  The cont
4a80: 65 6e 74 20 6f 66 20 65 76 65 72 79 20 63 6f 6c  ent of every col
4a90: 75 6d 6e 20 69 6e 20 74 68 65 20 72 6f 77 2e 0a  umn in the row..
4aa0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 77 65 20 6c 6f  **.** Then we lo
4ab0: 6f 70 20 6f 76 65 72 20 74 68 69 73 20 65 70 68  op over this eph
4ac0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 61 6e 64  emeral table and
4ad0: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e   for each row in
4ae0: 0a 2a 2a 20 74 68 65 20 65 70 68 65 72 6d 65 72  .** the ephermer
4af0: 61 6c 20 74 61 62 6c 65 20 63 61 6c 6c 20 56 55  al table call VU
4b00: 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  pdate..**.** Whe
4b10: 6e 20 66 69 6e 69 73 68 65 64 2c 20 64 72 6f 70  n finished, drop
4b20: 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
4b30: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 6e 6f 74  able..**.** (not
4b40: 65 31 29 20 41 63 74 75 61 6c 6c 79 2c 20 69 66  e1) Actually, if
4b50: 20 77 65 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61   we know in adva
4b60: 6e 63 65 20 74 68 61 74 20 28 41 29 20 69 73 20  nce that (A) is 
4b70: 61 6c 77 61 79 73 20 74 68 65 20 73 61 6d 65 0a  always the same.
4b80: 2a 2a 20 61 73 20 28 42 29 20 77 65 20 6f 6e 6c  ** as (B) we onl
4b90: 79 20 73 74 6f 72 65 20 28 41 29 2c 20 74 68 65  y store (A), the
4ba0: 6e 20 64 75 70 6c 69 63 61 74 65 20 28 41 29 20  n duplicate (A) 
4bb0: 77 68 65 6e 20 70 75 6c 6c 69 6e 67 0a 2a 2a 20  when pulling.** 
4bc0: 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65 70  it out of the ep
4bd0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 62 65  hemeral table be
4be0: 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 56 55 70  fore calling VUp
4bf0: 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  date..*/.static 
4c00: 76 6f 69 64 20 75 70 64 61 74 65 56 69 72 74 75  void updateVirtu
4c10: 61 6c 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  alTable(.  Parse
4c20: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4c30: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
4c40: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
4c50: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
4c60: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
4c70: 74 61 62 6c 65 20 74 6f 20 62 65 20 6d 6f 64 69  table to be modi
4c80: 66 69 65 64 20 2a 2f 0a 20 20 54 61 62 6c 65 20  fied */.  Table 
4c90: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  *pTab,         /
4ca0: 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 74 61  * The virtual ta
4cb0: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
4cc0: 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f 2a  t *pChanges,  /*
4cd0: 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20   The columns to 
4ce0: 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20 55 50  change in the UP
4cf0: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  DATE statement *
4d00: 2f 0a 20 20 45 78 70 72 20 2a 70 52 6f 77 69 64  /.  Expr *pRowid
4d10: 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ,        /* Expr
4d20: 65 73 73 69 6f 6e 20 75 73 65 64 20 74 6f 20 72  ession used to r
4d30: 65 63 6f 6d 70 75 74 65 20 74 68 65 20 72 6f 77  ecompute the row
4d40: 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 58 52  id */.  int *aXR
4d50: 65 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ef,          /* 
4d60: 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 63 6f 6c  Mapping from col
4d70: 75 6d 6e 73 20 6f 66 20 70 54 61 62 20 74 6f 20  umns of pTab to 
4d80: 65 6e 74 72 69 65 73 20 69 6e 20 70 43 68 61 6e  entries in pChan
4d90: 67 65 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ges */.  Expr *p
4da0: 57 68 65 72 65 20 20 20 20 20 20 20 20 20 2f 2a  Where         /*
4db0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
4dc0: 20 74 68 65 20 55 50 44 41 54 45 20 73 74 61 74   the UPDATE stat
4dd0: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
4de0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4df0: 70 56 64 62 65 3b 20 20 2f 2a 20 56 69 72 74 75  pVdbe;  /* Virtu
4e00: 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
4e10: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
4e20: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
4e30: 69 73 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ist = 0;     /* 
4e40: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
4e50: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
4e60: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
4e70: 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 30 3b  ct *pSelect = 0;
4e80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
4e90: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
4ea0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20  .  Expr *pExpr; 
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ec0: 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73  Temporary expres
4ed0: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 70  sion */.  int ep
4ee0: 68 65 6d 54 61 62 3b 20 20 20 20 20 20 20 20 20  hemTab;         
4ef0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 68 6f 6c      /* Table hol
4f00: 64 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ding the result 
4f10: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f  of the SELECT */
4f20: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f40: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
4f50: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4f70: 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66  ddress of top of
4f80: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69   loop */.  int i
4f90: 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
4fa0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
4fb0: 67 69 73 74 65 72 20 69 6e 20 73 65 74 20 70 61  gister in set pa
4fc0: 73 73 65 64 20 74 6f 20 4f 50 5f 56 55 70 64 61  ssed to OP_VUpda
4fd0: 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  te */.  sqlite3 
4fe0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4ff0: 3b 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f  ; /* Database co
5000: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
5010: 6e 73 74 20 63 68 61 72 20 2a 70 56 74 61 62 20  nst char *pVtab 
5020: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
5030: 54 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 53 65  Tab->pVtab;.  Se
5040: 6c 65 63 74 44 65 73 74 20 64 65 73 74 20 3d 20  lectDest dest = 
5050: 7b 53 52 54 5f 54 61 62 6c 65 2c 20 30 2c 20 30  {SRT_Table, 0, 0
5060: 7d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75  };..  /* Constru
5070: 63 74 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  ct the SELECT st
5080: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
5090: 6c 20 66 69 6e 64 20 74 68 65 20 6e 65 77 20 76  l find the new v
50a0: 61 6c 75 65 73 20 66 6f 72 0a 20 20 2a 2a 20 61  alues for.  ** a
50b0: 6c 6c 20 75 70 64 61 74 65 64 20 72 6f 77 73 2e  ll updated rows.
50c0: 20 0a 20 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20   .  */.  pEList 
50d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
50e0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
50f0: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 20 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61       sqlite3Crea
5120: 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c  teIdExpr(pParse,
5130: 20 22 5f 72 6f 77 69 64 5f 22 29 2c 20 30 29 3b   "_rowid_"), 0);
5140: 0a 20 20 69 66 28 20 70 52 6f 77 69 64 20 29 7b  .  if( pRowid ){
5150: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
5160: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
5170: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 45 4c 69  end(pParse, pELi
5180: 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
51b0: 70 72 44 75 70 28 64 62 2c 20 70 52 6f 77 69 64  prDup(db, pRowid
51c0: 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ), 0);.  }.  ass
51d0: 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79  ert( pTab->iPKey
51e0: 3c 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  <0 );.  for(i=0;
51f0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
5200: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 58 52  ++){.    if( aXR
5210: 65 66 5b 69 5d 3e 3d 30 20 29 7b 0a 20 20 20 20  ef[i]>=0 ){.    
5220: 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
5230: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 68  3ExprDup(db, pCh
5240: 61 6e 67 65 73 2d 3e 61 5b 61 58 52 65 66 5b 69  anges->a[aXRef[i
5250: 5d 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  ]].pExpr);.    }
5260: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70  else{.      pExp
5270: 72 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  r = sqlite3Creat
5280: 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c 20  eIdExpr(pParse, 
5290: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
52a0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
52b0: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
52c0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
52d0: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 70  Parse, pEList, p
52e0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Expr, 0);.  }.  
52f0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
5300: 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73  3SelectNew(pPars
5310: 65 2c 20 70 45 4c 69 73 74 2c 20 70 53 72 63 2c  e, pEList, pSrc,
5320: 20 70 57 68 65 72 65 2c 20 30 2c 20 30 2c 20 30   pWhere, 0, 0, 0
5330: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 0a 20  , 0, 0, 0);.  . 
5340: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 65   /* Create the e
5350: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69  phemeral table i
5360: 6e 74 6f 20 77 68 69 63 68 20 74 68 65 20 75 70  nto which the up
5370: 64 61 74 65 20 72 65 73 75 6c 74 73 20 77 69 6c  date results wil
5380: 6c 0a 20 20 2a 2a 20 62 65 20 73 74 6f 72 65 64  l.  ** be stored
5390: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
53a0: 20 76 20 29 3b 0a 20 20 65 70 68 65 6d 54 61 62   v );.  ephemTab
53b0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
53c0: 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  +;.  sqlite3Vdbe
53d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
53e0: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 65 70 68 65  nEphemeral, ephe
53f0: 6d 54 61 62 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  mTab, pTab->nCol
5400: 2b 31 2b 28 70 52 6f 77 69 64 21 3d 30 29 29 3b  +1+(pRowid!=0));
5410: 0a 0a 20 20 2f 2a 20 66 69 6c 6c 20 74 68 65 20  ..  /* fill the 
5420: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
5430: 0a 20 20 2a 2f 0a 20 20 64 65 73 74 2e 69 50 61  .  */.  dest.iPa
5440: 72 6d 20 3d 20 65 70 68 65 6d 54 61 62 3b 0a 20  rm = ephemTab;. 
5450: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
5460: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
5470: 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  &dest, 0, 0, 0, 
5480: 30 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  0);..  /* Genera
5490: 74 65 20 63 6f 64 65 20 74 6f 20 73 63 61 6e 20  te code to scan 
54a0: 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
54b0: 62 6c 65 20 61 6e 64 20 63 61 6c 6c 20 56 55 70  ble and call VUp
54c0: 64 61 74 65 2e 20 2a 2f 0a 20 20 69 52 65 67 20  date. */.  iReg 
54d0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
54e0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
54f0: 20 2b 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   += pTab->nCol+1
5500: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5510: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
5520: 6e 64 2c 20 65 70 68 65 6d 54 61 62 2c 20 30 29  nd, ephemTab, 0)
5530: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
5540: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5550: 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  r(v);.  sqlite3V
5560: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5570: 43 6f 6c 75 6d 6e 2c 20 20 65 70 68 65 6d 54 61  Column,  ephemTa
5580: 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 73  b, 0, iReg);.  s
5590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
55a0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 65  (v, OP_Column, e
55b0: 70 68 65 6d 54 61 62 2c 20 28 70 52 6f 77 69 64  phemTab, (pRowid
55c0: 3f 31 3a 30 29 2c 20 69 52 65 67 2b 31 29 3b 0a  ?1:0), iReg+1);.
55d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
55e0: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
55f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5600: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
5610: 6e 2c 20 65 70 68 65 6d 54 61 62 2c 20 69 2b 31  n, ephemTab, i+1
5620: 2b 28 70 52 6f 77 69 64 21 3d 30 29 2c 20 69 52  +(pRowid!=0), iR
5630: 65 67 2b 32 2b 69 29 3b 0a 20 20 7d 0a 20 20 70  eg+2+i);.  }.  p
5640: 50 61 72 73 65 2d 3e 70 56 69 72 74 75 61 6c 4c  Parse->pVirtualL
5650: 6f 63 6b 20 3d 20 70 54 61 62 3b 0a 20 20 73 71  ock = pTab;.  sq
5660: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
5670: 76 2c 20 4f 50 5f 56 55 70 64 61 74 65 2c 20 30  v, OP_VUpdate, 0
5680: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 32 2c 20  , pTab->nCol+2, 
5690: 69 52 65 67 2c 20 70 56 74 61 62 2c 20 50 34 5f  iReg, pVtab, P4_
56a0: 56 54 41 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  VTAB);.  sqlite3
56b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
56c0: 5f 4e 65 78 74 2c 20 65 70 68 65 6d 54 61 62 2c  _Next, ephemTab,
56d0: 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65   addr);.  sqlite
56e0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
56f0: 20 61 64 64 72 2d 31 29 3b 0a 20 20 73 71 6c 69   addr-1);.  sqli
5700: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5710: 20 4f 50 5f 43 6c 6f 73 65 2c 20 65 70 68 65 6d   OP_Close, ephem
5720: 54 61 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 43  Tab, 0);..  /* C
5730: 6c 65 61 6e 75 70 20 2a 2f 0a 20 20 73 71 6c 69  leanup */.  sqli
5740: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
5750: 70 53 65 6c 65 63 74 29 3b 20 20 0a 7d 0a 23 65  pSelect);  .}.#e
5760: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
5770: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
5780: 20 2a 2f 0a                                       */.