/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 4e630e47852e206d0b29ec63ea0402e0b7ba328a1c19dd645ae8ac7bd0a378cf:


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 2f 0a 23 69  tatements..*/.#i
01e0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
01f0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
0200: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
0210: 4c 54 41 42 4c 45 0a 2f 2a 20 46 6f 72 77 61 72  LTABLE./* Forwar
0220: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
0240: 61 74 65 56 69 72 74 75 61 6c 54 61 62 6c 65 28  ateVirtualTable(
0250: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0260: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
0270: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
0280: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
0290: 63 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  c,       /* The 
02a0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 6f  virtual table to
02b0: 20 62 65 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a   be modified */.
02c0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
02d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
02e0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
02f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e   ExprList *pChan
0300: 67 65 73 2c 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ges,  /* The col
0310: 75 6d 6e 73 20 74 6f 20 63 68 61 6e 67 65 20 69  umns to change i
0320: 6e 20 74 68 65 20 55 50 44 41 54 45 20 73 74 61  n the UPDATE sta
0330: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  tement */.  Expr
0340: 20 2a 70 52 6f 77 69 64 45 78 70 72 2c 20 20 20   *pRowidExpr,   
0350: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 75   /* Expression u
0360: 73 65 64 20 74 6f 20 72 65 63 6f 6d 70 75 74 65  sed to recompute
0370: 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
0380: 69 6e 74 20 2a 61 58 52 65 66 2c 20 20 20 20 20  int *aXRef,     
0390: 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
03a0: 66 72 6f 6d 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  from columns of 
03b0: 70 54 61 62 20 74 6f 20 65 6e 74 72 69 65 73 20  pTab to entries 
03c0: 69 6e 20 70 43 68 61 6e 67 65 73 20 2a 2f 0a 20  in pChanges */. 
03d0: 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
03e0: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
03f0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 55 50 44  lause of the UPD
0400: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
0410: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20  .  int onError  
0420: 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f          /* ON CO
0430: 4e 46 4c 49 43 54 20 73 74 72 61 74 65 67 79 20  NFLICT strategy 
0440: 2a 2f 0a 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  */.);.#endif /* 
0450: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
0460: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
0470: 2a 2a 20 54 68 65 20 6d 6f 73 74 20 72 65 63 65  ** The most rece
0480: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
0490: 75 63 74 69 6f 6e 20 77 61 73 20 61 6e 20 4f 50  uction was an OP
04a0: 5f 43 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 72 69  _Column to retri
04b0: 65 76 65 20 74 68 65 0a 2a 2a 20 69 2d 74 68 20  eve the.** i-th 
04c0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
04d0: 70 54 61 62 2e 20 54 68 69 73 20 72 6f 75 74 69  pTab. This routi
04e0: 6e 65 20 73 65 74 73 20 74 68 65 20 50 34 20 70  ne sets the P4 p
04f0: 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20  arameter of the 
0500: 0a 2a 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 20 74 6f  .** OP_Column to
0510: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
0520: 75 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a  ue, if any..**.*
0530: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  * The default va
0540: 6c 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  lue of a column 
0550: 69 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  is specified by 
0560: 61 20 44 45 46 41 55 4c 54 20 63 6c 61 75 73 65  a DEFAULT clause
0570: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 6c 75   in the .** colu
0580: 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 54  mn definition. T
0590: 68 69 73 20 77 61 73 20 65 69 74 68 65 72 20 73  his was either s
05a0: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 75  upplied by the u
05b0: 73 65 72 20 77 68 65 6e 20 74 68 65 20 74 61 62  ser when the tab
05c0: 6c 65 0a 2a 2a 20 77 61 73 20 63 72 65 61 74 65  le.** was create
05d0: 64 2c 20 6f 72 20 61 64 64 65 64 20 6c 61 74 65  d, or added late
05e0: 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 64  r to the table d
05f0: 65 66 69 6e 69 74 69 6f 6e 20 62 79 20 61 6e 20  efinition by an 
0600: 41 4c 54 45 52 20 54 41 42 4c 45 0a 2a 2a 20 63  ALTER TABLE.** c
0610: 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 6c  ommand. If the l
0620: 61 74 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  atter, then the 
0630: 72 6f 77 2d 72 65 63 6f 72 64 73 20 69 6e 20 74  row-records in t
0640: 68 65 20 74 61 62 6c 65 20 62 74 72 65 65 20 6f  he table btree o
0650: 6e 20 64 69 73 6b 0a 2a 2a 20 6d 61 79 20 6e 6f  n disk.** may no
0660: 74 20 63 6f 6e 74 61 69 6e 20 61 20 76 61 6c 75  t contain a valu
0670: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
0680: 20 61 6e 64 20 74 68 65 20 64 65 66 61 75 6c 74   and the default
0690: 20 76 61 6c 75 65 2c 20 74 61 6b 65 6e 0a 2a 2a   value, taken.**
06a0: 20 66 72 6f 6d 20 74 68 65 20 50 34 20 70 61 72   from the P4 par
06b0: 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20 4f 50  ameter of the OP
06c0: 5f 43 6f 6c 75 6d 6e 20 69 6e 73 74 72 75 63 74  _Column instruct
06d0: 69 6f 6e 2c 20 69 73 20 72 65 74 75 72 6e 65 64  ion, is returned
06e0: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 49 66 20   instead..** If 
06f0: 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e  the former, then
0700: 20 61 6c 6c 20 72 6f 77 2d 72 65 63 6f 72 64 73   all row-records
0710: 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
0720: 74 6f 20 69 6e 63 6c 75 64 65 20 61 20 76 61 6c  to include a val
0730: 75 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ue.** for the co
0740: 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 50 34 20  lumn and the P4 
0750: 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 72 65 71  value is not req
0760: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6c  uired..**.** Col
0770: 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  umn definitions 
0780: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 41 4c  created by an AL
0790: 54 45 52 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e  TER TABLE comman
07a0: 64 20 6d 61 79 20 6f 6e 6c 79 20 68 61 76 65 20  d may only have 
07b0: 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 64 65 66 61  .** literal defa
07c0: 75 6c 74 20 76 61 6c 75 65 73 20 73 70 65 63 69  ult values speci
07d0: 66 69 65 64 3a 20 61 20 6e 75 6d 62 65 72 2c 20  fied: a number, 
07e0: 6e 75 6c 6c 20 6f 72 20 61 20 73 74 72 69 6e 67  null or a string
07f0: 2e 20 28 49 66 20 61 20 6d 6f 72 65 0a 2a 2a 20  . (If a more.** 
0800: 63 6f 6d 70 6c 69 63 61 74 65 64 20 64 65 66 61  complicated defa
0810: 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 20 76  ult expression v
0820: 61 6c 75 65 20 77 61 73 20 70 72 6f 76 69 64 65  alue was provide
0830: 64 2c 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  d, it is evaluat
0840: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ed .** when the 
0850: 41 4c 54 45 52 20 54 41 42 4c 45 20 69 73 20 65  ALTER TABLE is e
0860: 78 65 63 75 74 65 64 20 61 6e 64 20 6f 6e 65 20  xecuted and one 
0870: 6f 66 20 74 68 65 20 6c 69 74 65 72 61 6c 20 76  of the literal v
0880: 61 6c 75 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  alues written.**
0890: 20 69 6e 74 6f 20 74 68 65 20 73 71 6c 69 74 65   into the sqlite
08a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 29 0a  _master table.).
08b0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 66 6f 72 65 2c  **.** Therefore,
08c0: 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65   the P4 paramete
08d0: 72 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  r is only requir
08e0: 65 64 20 69 66 20 74 68 65 20 64 65 66 61 75 6c  ed if the defaul
08f0: 74 20 76 61 6c 75 65 20 66 6f 72 0a 2a 2a 20 74  t value for.** t
0900: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 61 20 6c  he column is a l
0910: 69 74 65 72 61 6c 20 6e 75 6d 62 65 72 2c 20 73  iteral number, s
0920: 74 72 69 6e 67 20 6f 72 20 6e 75 6c 6c 2e 20 54  tring or null. T
0930: 68 65 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  he sqlite3ValueF
0940: 72 6f 6d 45 78 70 72 28 29 0a 2a 2a 20 66 75 6e  romExpr().** fun
0950: 63 74 69 6f 6e 20 69 73 20 63 61 70 61 62 6c 65  ction is capable
0960: 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67   of transforming
0970: 20 74 68 65 73 65 20 74 79 70 65 73 20 6f 66 20   these types of 
0980: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 74 6f  expressions into
0990: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  .** sqlite3_valu
09a0: 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a  e objects..**.**
09b0: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 52   If parameter iR
09c0: 65 67 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  eg is not negati
09d0: 76 65 2c 20 63 6f 64 65 20 61 6e 20 4f 50 5f 52  ve, code an OP_R
09e0: 65 61 6c 41 66 66 69 6e 69 74 79 20 69 6e 73 74  ealAffinity inst
09f0: 72 75 63 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 72 65  ruction.** on re
0a00: 67 69 73 74 65 72 20 69 52 65 67 2e 20 54 68 69  gister iReg. Thi
0a10: 73 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 61  s is used when a
0a20: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 74  n equivalent int
0a30: 65 67 65 72 20 76 61 6c 75 65 20 69 73 20 0a 2a  eger value is .*
0a40: 2a 20 73 74 6f 72 65 64 20 69 6e 20 70 6c 61 63  * stored in plac
0a50: 65 20 6f 66 20 61 6e 20 38 2d 62 79 74 65 20 66  e of an 8-byte f
0a60: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
0a70: 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  lue in order to 
0a80: 73 61 76 65 20 0a 2a 2a 20 73 70 61 63 65 2e 0a  save .** space..
0a90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
0aa0: 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 56 64 62  olumnDefault(Vdb
0ab0: 65 20 2a 76 2c 20 54 61 62 6c 65 20 2a 70 54 61  e *v, Table *pTa
0ac0: 62 2c 20 69 6e 74 20 69 2c 20 69 6e 74 20 69 52  b, int i, int iR
0ad0: 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  eg){.  assert( p
0ae0: 54 61 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Tab!=0 );.  if( 
0af0: 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29  !pTab->pSelect )
0b00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
0b10: 6c 75 65 20 2a 70 56 61 6c 75 65 20 3d 20 30 3b  lue *pValue = 0;
0b20: 0a 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e  .    u8 enc = EN
0b30: 43 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  C(sqlite3VdbeDb(
0b40: 76 29 29 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  v));.    Column 
0b50: 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61  *pCol = &pTab->a
0b60: 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 56 64 62 65  Col[i];.    Vdbe
0b70: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
0b80: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
0b90: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 29 3b  , pCol->zName));
0ba0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70  .    assert( i<p
0bb0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0bc0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f   sqlite3ValueFro
0bd0: 6d 45 78 70 72 28 73 71 6c 69 74 65 33 56 64 62  mExpr(sqlite3Vdb
0be0: 65 44 62 28 76 29 2c 20 70 43 6f 6c 2d 3e 70 44  eDb(v), pCol->pD
0bf0: 66 6c 74 2c 20 65 6e 63 2c 20 0a 20 20 20 20 20  flt, enc, .     
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c10: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
0c20: 74 79 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20  ty, &pValue);.  
0c30: 20 20 69 66 28 20 70 56 61 6c 75 65 20 29 7b 0a    if( pValue ){.
0c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
0c50: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 56 61  eAppendP4(v, pVa
0c60: 6c 75 65 2c 20 50 34 5f 4d 45 4d 29 3b 0a 20 20  lue, P4_MEM);.  
0c70: 20 20 7d 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20    }.  }.#ifndef 
0c80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
0c90: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 69 66 28  TING_POINT.  if(
0ca0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 61   pTab->aCol[i].a
0cb0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
0cc0: 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20  AFF_REAL ){.    
0cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0ce0: 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
0cf0: 6e 69 74 79 2c 20 69 52 65 67 29 3b 0a 20 20 7d  nity, iReg);.  }
0d00: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
0d10: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
0d20: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20   column iCol of 
0d30: 69 6e 64 65 78 20 70 49 64 78 20 72 65 66 65 72  index pIdx refer
0d40: 65 6e 63 65 73 20 61 6e 79 20 6f 66 20 74 68 65  ences any of the
0d50: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 64 65 66 69  .** columns defi
0d60: 6e 65 64 20 62 79 20 61 58 52 65 66 20 61 6e 64  ned by aXRef and
0d70: 20 63 68 6e 67 52 6f 77 69 64 2e 20 20 52 65 74   chngRowid.  Ret
0d80: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64  urn true if it d
0d90: 6f 65 73 0a 2a 2a 20 61 6e 64 20 66 61 6c 73 65  oes.** and false
0da0: 20 69 66 20 6e 6f 74 2e 20 20 54 68 69 73 20 69   if not.  This i
0db0: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
0dc0: 6e 2e 20 20 46 61 6c 73 65 2d 70 6f 73 69 74 69  n.  False-positi
0dd0: 76 65 73 20 61 72 65 20 61 0a 2a 2a 20 70 65 72  ves are a.** per
0de0: 66 6f 72 6d 61 6e 63 65 20 64 65 67 72 61 64 61  formance degrada
0df0: 74 69 6f 6e 2c 20 62 75 74 20 66 61 6c 73 65 2d  tion, but false-
0e00: 6e 65 67 61 74 69 76 65 73 20 63 61 6e 20 72 65  negatives can re
0e10: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 72 75 70  sult in a corrup
0e20: 74 0a 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 69  t.** index and i
0e30: 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 73  ncorrect answers
0e40: 2e 0a 2a 2a 0a 2a 2a 20 61 58 52 65 66 5b 6a 5d  ..**.** aXRef[j]
0e50: 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 6e 65 67   will be non-neg
0e60: 61 74 69 76 65 20 69 66 20 63 6f 6c 75 6d 6e 20  ative if column 
0e70: 6a 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  j of the origina
0e80: 6c 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 62 65  l table is.** be
0e90: 69 6e 67 20 75 70 64 61 74 65 64 2e 20 20 63 68  ing updated.  ch
0ea0: 6e 67 52 6f 77 69 64 20 77 69 6c 6c 20 62 65 20  ngRowid will be 
0eb0: 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 69  true if the rowi
0ec0: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  d of the table i
0ed0: 73 0a 2a 2a 20 62 65 69 6e 67 20 75 70 64 61 74  s.** being updat
0ee0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
0ef0: 74 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 49 73 42  t indexColumnIsB
0f00: 65 69 6e 67 55 70 64 61 74 65 64 28 0a 20 20 49  eingUpdated(.  I
0f10: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
0f20: 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
0f30: 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
0f40: 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a  iCol,         /*
0f50: 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   Which column of
0f60: 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 68   the index to ch
0f70: 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 58  eck */.  int *aX
0f80: 52 65 66 2c 20 20 20 20 20 20 20 2f 2a 20 61 58  Ref,       /* aX
0f90: 52 65 66 5b 6a 5d 3e 3d 30 20 69 66 20 63 6f 6c  Ref[j]>=0 if col
0fa0: 75 6d 6e 20 6a 20 69 73 20 62 65 69 6e 67 20 75  umn j is being u
0fb0: 70 64 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  pdated */.  int 
0fc0: 63 68 6e 67 52 6f 77 69 64 20 20 20 20 20 2f 2a  chngRowid     /*
0fd0: 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77   true if the row
0fe0: 69 64 20 69 73 20 62 65 69 6e 67 20 75 70 64 61  id is being upda
0ff0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20  ted */.){.  i16 
1000: 69 49 64 78 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  iIdxCol = pIdx->
1010: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a  aiColumn[iCol];.
1020: 20 20 61 73 73 65 72 74 28 20 69 49 64 78 43 6f    assert( iIdxCo
1030: 6c 21 3d 58 4e 5f 52 4f 57 49 44 20 29 3b 20 2f  l!=XN_ROWID ); /
1040: 2a 20 43 61 6e 6e 6f 74 20 69 6e 64 65 78 20 72  * Cannot index r
1050: 6f 77 69 64 20 2a 2f 0a 20 20 69 66 28 20 69 49  owid */.  if( iI
1060: 64 78 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20  dxCol>=0 ){.    
1070: 72 65 74 75 72 6e 20 61 58 52 65 66 5b 69 49 64  return aXRef[iId
1080: 78 43 6f 6c 5d 3e 3d 30 3b 0a 20 20 7d 0a 20 20  xCol]>=0;.  }.  
1090: 61 73 73 65 72 74 28 20 69 49 64 78 43 6f 6c 3d  assert( iIdxCol=
10a0: 3d 58 4e 5f 45 58 50 52 20 29 3b 0a 20 20 61 73  =XN_EXPR );.  as
10b0: 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c  sert( pIdx->aCol
10c0: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  Expr!=0 );.  ass
10d0: 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45  ert( pIdx->aColE
10e0: 78 70 72 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  xpr->a[iCol].pEx
10f0: 70 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  pr!=0 );.  retur
1100: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 66  n sqlite3ExprRef
1110: 65 72 65 6e 63 65 73 55 70 64 61 74 65 64 43 6f  erencesUpdatedCo
1120: 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 43 6f 6c 45  lumn(pIdx->aColE
1130: 78 70 72 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  xpr->a[iCol].pEx
1140: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1170: 61 58 52 65 66 2c 63 68 6e 67 52 6f 77 69 64 29  aXRef,chngRowid)
1180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
1190: 20 74 6f 20 73 65 65 20 69 66 20 69 6e 64 65 78   to see if index
11a0: 20 70 49 64 78 20 69 73 20 61 20 70 61 72 74 69   pIdx is a parti
11b0: 61 6c 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63  al index whose c
11c0: 6f 6e 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 65 78  onditional.** ex
11d0: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 63  pression might c
11e0: 68 61 6e 67 65 20 76 61 6c 75 65 73 20 64 75 65  hange values due
11f0: 20 74 6f 20 61 6e 20 55 50 44 41 54 45 2e 20 20   to an UPDATE.  
1200: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 0a 2a  Return true if.*
1210: 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 73  * the index is s
1220: 75 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67 65  ubject to change
1230: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
1240: 65 20 69 6e 64 65 78 20 69 73 20 67 75 61 72 61  e index is guara
1250: 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75  nteed.** to be u
1260: 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 69 73 20  nchanged.  This 
1270: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
1280: 6f 6e 2e 20 20 46 61 6c 73 65 2d 70 6f 73 69 74  on.  False-posit
1290: 69 76 65 73 20 61 72 65 20 61 0a 2a 2a 20 70 65  ives are a.** pe
12a0: 72 66 6f 72 6d 61 6e 63 65 20 64 65 67 72 61 64  rformance degrad
12b0: 61 74 69 6f 6e 2c 20 62 75 74 20 66 61 6c 73 65  ation, but false
12c0: 2d 6e 65 67 61 74 69 76 65 73 20 63 61 6e 20 72  -negatives can r
12d0: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 72 75  esult in a corru
12e0: 70 74 0a 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20  pt.** index and 
12f0: 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
1300: 73 2e 0a 2a 2a 0a 2a 2a 20 61 58 52 65 66 5b 6a  s..**.** aXRef[j
1310: 5d 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 6e 65  ] will be non-ne
1320: 67 61 74 69 76 65 20 69 66 20 63 6f 6c 75 6d 6e  gative if column
1330: 20 6a 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e   j of the origin
1340: 61 6c 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 62  al table is.** b
1350: 65 69 6e 67 20 75 70 64 61 74 65 64 2e 20 20 63  eing updated.  c
1360: 68 6e 67 52 6f 77 69 64 20 77 69 6c 6c 20 62 65  hngRowid will be
1370: 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77   true if the row
1380: 69 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  id of the table 
1390: 69 73 0a 2a 2a 20 62 65 69 6e 67 20 75 70 64 61  is.** being upda
13a0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
13b0: 6e 74 20 69 6e 64 65 78 57 68 65 72 65 43 6c 61  nt indexWhereCla
13c0: 75 73 65 4d 69 67 68 74 43 68 61 6e 67 65 28 0a  useMightChange(.
13d0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
13e0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
13f0: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
1400: 6e 74 20 2a 61 58 52 65 66 2c 20 20 20 20 20 20  nt *aXRef,      
1410: 20 2f 2a 20 61 58 52 65 66 5b 6a 5d 3e 3d 30 20   /* aXRef[j]>=0 
1420: 69 66 20 63 6f 6c 75 6d 6e 20 6a 20 69 73 20 62  if column j is b
1430: 65 69 6e 67 20 75 70 64 61 74 65 64 20 2a 2f 0a  eing updated */.
1440: 20 20 69 6e 74 20 63 68 6e 67 52 6f 77 69 64 20    int chngRowid 
1450: 20 20 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74      /* true if t
1460: 68 65 20 72 6f 77 69 64 20 69 73 20 62 65 69 6e  he rowid is bein
1470: 67 20 75 70 64 61 74 65 64 20 2a 2f 0a 29 7b 0a  g updated */.){.
1480: 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72    if( pIdx->pPar
1490: 74 49 64 78 57 68 65 72 65 3d 3d 30 20 29 20 72  tIdxWhere==0 ) r
14a0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
14b0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 66  n sqlite3ExprRef
14c0: 65 72 65 6e 63 65 73 55 70 64 61 74 65 64 43 6f  erencesUpdatedCo
14d0: 6c 75 6d 6e 28 70 49 64 78 2d 3e 70 50 61 72 74  lumn(pIdx->pPart
14e0: 49 64 78 57 68 65 72 65 2c 0a 20 20 20 20 20 20  IdxWhere,.      
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 20 20 20 61 58 52 65 66 2c 20 63 68 6e        aXRef, chn
1520: 67 52 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gRowid);.}../*.*
1530: 2a 20 50 72 6f 63 65 73 73 20 61 6e 20 55 50 44  * Process an UPD
1540: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ATE statement..*
1550: 2a 0a 2a 2a 20 20 20 55 50 44 41 54 45 20 4f 52  *.**   UPDATE OR
1560: 20 49 47 4e 4f 52 45 20 74 61 62 6c 65 5f 77 78   IGNORE table_wx
1570: 79 7a 20 53 45 54 20 61 3d 62 2c 20 63 3d 64 20  yz SET a=b, c=d 
1580: 57 48 45 52 45 20 65 3c 35 20 41 4e 44 20 66 20  WHERE e<5 AND f 
1590: 4e 4f 54 20 4e 55 4c 4c 3b 0a 2a 2a 20 20 20 20  NOT NULL;.**    
15a0: 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 2f 20        \_______/ 
15b0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
15c0: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 5c 5f  ______/       \_
15d0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
15e0: 0a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e  .*            on
15f0: 45 72 72 6f 72 20 20 20 70 54 61 62 4c 69 73 74  Error   pTabList
1600: 20 20 20 20 20 20 70 43 68 61 6e 67 65 73 20 20        pChanges  
1610: 20 20 20 20 20 20 20 20 20 20 20 70 57 68 65 72             pWher
1620: 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  e.*/.void sqlite
1630: 33 55 70 64 61 74 65 28 0a 20 20 50 61 72 73 65  3Update(.  Parse
1640: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1650: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1660: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
1670: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
1680: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1690: 20 69 6e 20 77 68 69 63 68 20 77 65 20 73 68 6f   in which we sho
16a0: 75 6c 64 20 63 68 61 6e 67 65 20 74 68 69 6e 67  uld change thing
16b0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
16c0: 2a 70 43 68 61 6e 67 65 73 2c 20 20 20 20 2f 2a  *pChanges,    /*
16d0: 20 54 68 69 6e 67 73 20 74 6f 20 62 65 20 63 68   Things to be ch
16e0: 61 6e 67 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  anged */.  Expr 
16f0: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
1700: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1710: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 6e  lause.  May be n
1720: 75 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ull */.  int onE
1730: 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rror,           
1740: 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65  /* How to handle
1750: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f   constraint erro
1760: 72 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  rs */.  ExprList
1770: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f   *pOrderBy,    /
1780: 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
1790: 65 2e 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a  e. May be null *
17a0: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
17b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  ,          /* LI
17c0: 4d 49 54 20 63 6c 61 75 73 65 2e 20 4d 61 79 20  MIT clause. May 
17d0: 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 55 70 73  be null */.  Ups
17e0: 65 72 74 20 2a 70 55 70 73 65 72 74 20 20 20 20  ert *pUpsert    
17f0: 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49      /* ON CONFLI
1800: 43 54 20 63 6c 61 75 73 65 2c 20 6f 72 20 6e 75  CT clause, or nu
1810: 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ll */.){.  int i
1820: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
1830: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1840: 72 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  rs */.  Table *p
1850: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Tab;           /
1860: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
1870: 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 69  e updated */.  i
1880: 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 30 3b 20  nt addrTop = 0; 
1890: 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 69 6e        /* VDBE in
18a0: 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73  struction addres
18b0: 73 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f  s of the start o
18c0: 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
18d0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
18e0: 6f 3b 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o;     /* Inform
18f0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1900: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1910: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
1920: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1930: 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
1940: 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 49 6e 64   engine */.  Ind
1950: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
1960: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1970: 6e 67 20 6f 76 65 72 20 69 6e 64 69 63 65 73 20  ng over indices 
1980: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b  */.  Index *pPk;
1990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19a0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
19b0: 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54  ndex for WITHOUT
19c0: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
19d0: 0a 20 20 69 6e 74 20 6e 49 64 78 3b 20 20 20 20  .  int nIdx;    
19e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19f0: 62 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20 74  ber of indices t
1a00: 68 61 74 20 6e 65 65 64 20 75 70 64 61 74 69 6e  hat need updatin
1a10: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  g */.  int iBase
1a20: 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur;          /*
1a30: 20 42 61 73 65 20 63 75 72 73 6f 72 20 6e 75 6d   Base cursor num
1a40: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61  ber */.  int iDa
1a50: 74 61 43 75 72 3b 20 20 20 20 20 20 20 20 20 20  taCur;          
1a60: 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 68  /* Cursor for th
1a70: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 64 61 74 61  e canonical data
1a80: 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
1a90: 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20  iIdxCur;        
1aa0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72     /* Cursor for
1ab0: 20 74 68 65 20 66 69 72 73 74 20 69 6e 64 65 78   the first index
1ac0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1ad0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
1ae0: 54 68 65 20 64 61 74 61 62 61 73 65 20 73 74 72  The database str
1af0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
1b00: 2a 61 52 65 67 49 64 78 20 3d 20 30 3b 20 20 20  *aRegIdx = 0;   
1b10: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
1b20: 73 74 65 72 20 69 6e 20 61 72 72 61 79 20 61 73  ster in array as
1b30: 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20 69  signed to each i
1b40: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ndex */.  int *a
1b50: 58 52 65 66 20 3d 20 30 3b 20 20 20 20 20 20 20  XRef = 0;       
1b60: 20 2f 2a 20 61 58 52 65 66 5b 69 5d 20 69 73 20   /* aXRef[i] is 
1b70: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 43 68  the index in pCh
1b80: 61 6e 67 65 73 2d 3e 61 5b 5d 20 6f 66 20 74 68  anges->a[] of th
1b90: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
1ba0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e             ** an
1bb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   expression for 
1bc0: 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20  the i-th column 
1bd0: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 20 20 20 2a 2a 20 61 58 52 65 66 5b         ** aXRef[
1c00: 69 5d 3d 3d 2d 31 20 69 66 20 74 68 65 20 69 2d  i]==-1 if the i-
1c10: 74 68 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  th column is not
1c20: 20 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 20 20 75   changed. */.  u
1c30: 38 20 2a 61 54 6f 4f 70 65 6e 3b 20 20 20 20 20  8 *aToOpen;     
1c40: 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 74        /* 1 for t
1c50: 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65  ables and indice
1c60: 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  s to be opened *
1c70: 2f 0a 20 20 75 38 20 63 68 6e 67 50 6b 3b 20 20  /.  u8 chngPk;  
1c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52             /* PR
1c90: 49 4d 41 52 59 20 4b 45 59 20 63 68 61 6e 67 65  IMARY KEY change
1ca0: 64 20 69 6e 20 61 20 57 49 54 48 4f 55 54 20 52  d in a WITHOUT R
1cb0: 4f 57 49 44 20 74 61 62 6c 65 20 2a 2f 0a 20 20  OWID table */.  
1cc0: 75 38 20 63 68 6e 67 52 6f 77 69 64 3b 20 20 20  u8 chngRowid;   
1cd0: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
1ce0: 63 68 61 6e 67 65 64 20 69 6e 20 61 20 6e 6f 72  changed in a nor
1cf0: 6d 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  mal table */.  u
1d00: 38 20 63 68 6e 67 4b 65 79 3b 20 20 20 20 20 20  8 chngKey;      
1d10: 20 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20        /* Either 
1d20: 63 68 6e 67 50 6b 20 6f 72 20 63 68 6e 67 52 6f  chngPk or chngRo
1d30: 77 69 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  wid */.  Expr *p
1d40: 52 6f 77 69 64 45 78 70 72 20 3d 20 30 3b 20 20  RowidExpr = 0;  
1d50: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 64 65  /* Expression de
1d60: 66 69 6e 69 6e 67 20 74 68 65 20 6e 65 77 20 72  fining the new r
1d70: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a 2f 0a  ecord number */.
1d80: 20 20 41 75 74 68 43 6f 6e 74 65 78 74 20 73 43    AuthContext sC
1d90: 6f 6e 74 65 78 74 3b 20 20 2f 2a 20 54 68 65 20  ontext;  /* The 
1da0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 6f  authorization co
1db0: 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43  ntext */.  NameC
1dc0: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
1dd0: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 2d 63 6f    /* The name-co
1de0: 6e 74 65 78 74 20 74 6f 20 72 65 73 6f 6c 76 65  ntext to resolve
1df0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
1e00: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1e20: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
1e30: 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ng the table bei
1e40: 6e 67 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20  ng updated */.  
1e50: 69 6e 74 20 65 4f 6e 65 50 61 73 73 3b 20 20 20  int eOnePass;   
1e60: 20 20 20 20 20 20 20 2f 2a 20 4f 4e 45 50 41 53         /* ONEPAS
1e70: 53 5f 58 58 58 20 76 61 6c 75 65 20 66 72 6f 6d  S_XXX value from
1e80: 20 77 68 65 72 65 2e 63 20 2a 2f 0a 20 20 69 6e   where.c */.  in
1e90: 74 20 68 61 73 46 4b 3b 20 20 20 20 20 20 20 20  t hasFK;        
1ea0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1eb0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 72 6f 63  foreign key proc
1ec0: 65 73 73 69 6e 67 20 69 73 20 72 65 71 75 69 72  essing is requir
1ed0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  ed */.  int labe
1ee0: 6c 42 72 65 61 6b 3b 20 20 20 20 20 20 20 20 2f  lBreak;        /
1ef0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
1f00: 72 65 61 6b 20 6f 75 74 20 6f 66 20 55 50 44 41  reak out of UPDA
1f10: 54 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  TE loop */.  int
1f20: 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 3b 20   labelContinue; 
1f30: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1f40: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 6e 65 78   to continue nex
1f50: 74 20 73 74 65 70 20 6f 66 20 55 50 44 41 54 45  t step of UPDATE
1f60: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 66   loop */.  int f
1f70: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1f80: 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73    /* Flags for s
1f90: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1fa0: 28 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  () */..#ifndef S
1fb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
1fc0: 45 52 0a 20 20 69 6e 74 20 69 73 56 69 65 77 3b  ER.  int isView;
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fe0: 72 75 65 20 77 68 65 6e 20 75 70 64 61 74 69 6e  rue when updatin
1ff0: 67 20 61 20 76 69 65 77 20 28 49 4e 53 54 45 41  g a view (INSTEA
2000: 44 20 4f 46 20 74 72 69 67 67 65 72 29 20 2a 2f  D OF trigger) */
2010: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
2020: 67 67 65 72 3b 20 20 20 20 20 2f 2a 20 4c 69 73  gger;     /* Lis
2030: 74 20 6f 66 20 74 72 69 67 67 65 72 73 20 6f 6e  t of triggers on
2040: 20 70 54 61 62 2c 20 69 66 20 72 65 71 75 69 72   pTab, if requir
2050: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 6d 61 73  ed */.  int tmas
2060: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
2070: 2a 20 4d 61 73 6b 20 6f 66 20 54 52 49 47 47 45  * Mask of TRIGGE
2080: 52 5f 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52  R_BEFORE|TRIGGER
2090: 5f 41 46 54 45 52 20 2a 2f 0a 23 65 6e 64 69 66  _AFTER */.#endif
20a0: 0a 20 20 69 6e 74 20 6e 65 77 6d 61 73 6b 3b 20  .  int newmask; 
20b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
20c0: 6b 20 6f 66 20 4e 45 57 2e 2a 20 63 6f 6c 75 6d  k of NEW.* colum
20d0: 6e 73 20 61 63 63 65 73 73 65 64 20 62 79 20 42  ns accessed by B
20e0: 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 20 2a  EFORE triggers *
20f0: 2f 0a 20 20 69 6e 74 20 69 45 70 68 20 3d 20 30  /.  int iEph = 0
2100: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 70  ;          /* Ep
2110: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 68 6f  hemeral table ho
2120: 6c 64 69 6e 67 20 61 6c 6c 20 70 72 69 6d 61 72  lding all primar
2130: 79 20 6b 65 79 20 76 61 6c 75 65 73 20 2a 2f 0a  y key values */.
2140: 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 20    int nKey = 0; 
2150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2160: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
2170: 6e 20 72 65 67 4b 65 79 20 66 6f 72 20 57 49 54  n regKey for WIT
2180: 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20  HOUT ROWID */.  
2190: 69 6e 74 20 61 69 43 75 72 4f 6e 65 50 61 73 73  int aiCurOnePass
21a0: 5b 32 5d 3b 20 20 20 2f 2a 20 54 68 65 20 77 72  [2];   /* The wr
21b0: 69 74 65 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  ite cursors open
21c0: 65 64 20 62 79 20 57 48 45 52 45 5f 4f 4e 45 50  ed by WHERE_ONEP
21d0: 41 53 53 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ASS */.  int add
21e0: 72 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  rOpen = 0;      
21f0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
2200: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a  _OpenEphemeral *
2210: 2f 0a 20 20 69 6e 74 20 69 50 6b 20 3d 20 30 3b  /.  int iPk = 0;
2220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2230: 72 73 74 20 6f 66 20 6e 50 6b 20 63 65 6c 6c 73  rst of nPk cells
2240: 20 68 6f 6c 64 69 6e 67 20 50 52 49 4d 41 52 59   holding PRIMARY
2250: 20 4b 45 59 20 76 61 6c 75 65 20 2a 2f 0a 20 20   KEY value */.  
2260: 69 31 36 20 6e 50 6b 20 3d 20 30 3b 20 20 20 20  i16 nPk = 0;    
2270: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2280: 20 6f 66 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f   of components o
2290: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
22a0: 59 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 70 6c  Y */.  int bRepl
22b0: 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ace = 0;      /*
22c0: 20 54 72 75 65 20 69 66 20 52 45 50 4c 41 43 45   True if REPLACE
22d0: 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
22e0: 74 69 6f 6e 20 6d 69 67 68 74 20 68 61 70 70 65  tion might happe
22f0: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73  n */..  /* Regis
2300: 74 65 72 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 20  ter Allocations 
2310: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 43  */.  int regRowC
2320: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 41  ount = 0;   /* A
2330: 20 63 6f 75 6e 74 20 6f 66 20 72 6f 77 73 20 63   count of rows c
2340: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20  hanged */.  int 
2350: 72 65 67 4f 6c 64 52 6f 77 69 64 20 3d 20 30 3b  regOldRowid = 0;
2360: 20 20 20 2f 2a 20 54 68 65 20 6f 6c 64 20 72 6f     /* The old ro
2370: 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  wid */.  int reg
2380: 4e 65 77 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  NewRowid = 0;   
2390: 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 77 69 64  /* The new rowid
23a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77   */.  int regNew
23b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
23c0: 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4e  Content of the N
23d0: 45 57 2e 2a 20 74 61 62 6c 65 20 69 6e 20 74 72  EW.* table in tr
23e0: 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  iggers */.  int 
23f0: 72 65 67 4f 6c 64 20 3d 20 30 3b 20 20 20 20 20  regOld = 0;     
2400: 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2410: 20 4f 4c 44 2e 2a 20 74 61 62 6c 65 20 69 6e 20   OLD.* table in 
2420: 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e  triggers */.  in
2430: 74 20 72 65 67 52 6f 77 53 65 74 20 3d 20 30 3b  t regRowSet = 0;
2440: 20 20 20 20 20 2f 2a 20 52 6f 77 73 65 74 20 6f       /* Rowset o
2450: 66 20 72 6f 77 73 20 74 6f 20 62 65 20 75 70 64  f rows to be upd
2460: 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ated */.  int re
2470: 67 4b 65 79 20 3d 20 30 3b 20 20 20 20 20 20 20  gKey = 0;       
2480: 20 2f 2a 20 63 6f 6d 70 6f 73 69 74 65 20 50 52   /* composite PR
2490: 49 4d 41 52 59 20 4b 45 59 20 76 61 6c 75 65 20  IMARY KEY value 
24a0: 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 43  */..  memset(&sC
24b0: 6f 6e 74 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f  ontext, 0, sizeo
24c0: 66 28 73 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20  f(sContext));.  
24d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
24e0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
24f0: 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
2500: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
2510: 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e  oto update_clean
2520: 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  up;.  }.  assert
2530: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
2540: 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  ==1 );..  /* Loc
2550: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 77 68  ate the table wh
2560: 69 63 68 20 77 65 20 77 61 6e 74 20 74 6f 20 75  ich we want to u
2570: 70 64 61 74 65 2e 20 0a 20 20 2a 2f 0a 20 20 70  pdate. .  */.  p
2580: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
2590: 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
25a0: 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  e, pTabList);.  
25b0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
25c0: 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75  to update_cleanu
25d0: 70 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  p;.  iDb = sqlit
25e0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
25f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
2600: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f  ->pSchema);..  /
2610: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20  * Figure out if 
2620: 77 65 20 68 61 76 65 20 61 6e 79 20 74 72 69 67  we have any trig
2630: 67 65 72 73 20 61 6e 64 20 69 66 20 74 68 65 20  gers and if the 
2640: 74 61 62 6c 65 20 62 65 69 6e 67 0a 20 20 2a 2a  table being.  **
2650: 20 75 70 64 61 74 65 64 20 69 73 20 61 20 76 69   updated is a vi
2660: 65 77 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ew..  */.#ifndef
2670: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
2680: 47 47 45 52 0a 20 20 70 54 72 69 67 67 65 72 20  GGER.  pTrigger 
2690: 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
26a0: 73 45 78 69 73 74 28 70 50 61 72 73 65 2c 20 70  sExist(pParse, p
26b0: 54 61 62 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20  Tab, TK_UPDATE, 
26c0: 70 43 68 61 6e 67 65 73 2c 20 26 74 6d 61 73 6b  pChanges, &tmask
26d0: 29 3b 0a 20 20 69 73 56 69 65 77 20 3d 20 70 54  );.  isView = pT
26e0: 61 62 2d 3e 70 53 65 6c 65 63 74 21 3d 30 3b 0a  ab->pSelect!=0;.
26f0: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
2700: 65 72 20 7c 7c 20 74 6d 61 73 6b 3d 3d 30 20 29  er || tmask==0 )
2710: 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ;.#else.# define
2720: 20 70 54 72 69 67 67 65 72 20 30 0a 23 20 64 65   pTrigger 0.# de
2730: 66 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23 20  fine isView 0.# 
2740: 64 65 66 69 6e 65 20 74 6d 61 73 6b 20 30 0a 23  define tmask 0.#
2750: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
2760: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 23 20  ITE_OMIT_VIEW.# 
2770: 75 6e 64 65 66 20 69 73 56 69 65 77 0a 23 20 64  undef isView.# d
2780: 65 66 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23  efine isView 0.#
2790: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
27a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41  LITE_ENABLE_UPDA
27b0: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 0a  TE_DELETE_LIMIT.
27c0: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b    if( !isView ){
27d0: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
27e0: 6c 69 74 65 33 4c 69 6d 69 74 57 68 65 72 65 28  lite3LimitWhere(
27f0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c  .        pParse,
2800: 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
2810: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4c 69  e, pOrderBy, pLi
2820: 6d 69 74 2c 20 22 55 50 44 41 54 45 22 0a 20 20  mit, "UPDATE".  
2830: 20 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42    );.    pOrderB
2840: 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 6d 69  y = 0;.    pLimi
2850: 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  t = 0;.  }.#endi
2860: 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  f..  if( sqlite3
2870: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
2880: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
2890: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64   ){.    goto upd
28a0: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ate_cleanup;.  }
28b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73  .  if( sqlite3Is
28c0: 52 65 61 64 4f 6e 6c 79 28 70 50 61 72 73 65 2c  ReadOnly(pParse,
28d0: 20 70 54 61 62 2c 20 74 6d 61 73 6b 29 20 29 7b   pTab, tmask) ){
28e0: 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65  .    goto update
28f0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
2900: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 63   /* Allocate a c
2910: 75 72 73 6f 72 73 20 66 6f 72 20 74 68 65 20 6d  ursors for the m
2920: 61 69 6e 20 64 61 74 61 62 61 73 65 20 74 61 62  ain database tab
2930: 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69  le and for all i
2940: 6e 64 69 63 65 73 2e 0a 20 20 2a 2a 20 54 68 65  ndices..  ** The
2950: 20 69 6e 64 65 78 20 63 75 72 73 6f 72 73 20 6d   index cursors m
2960: 69 67 68 74 20 6e 6f 74 20 62 65 20 75 73 65 64  ight not be used
2970: 2c 20 62 75 74 20 69 66 20 74 68 65 79 20 61 72  , but if they ar
2980: 65 20 75 73 65 64 20 74 68 65 79 0a 20 20 2a 2a  e used they.  **
2990: 20 6e 65 65 64 20 74 6f 20 6f 63 63 75 72 20 72   need to occur r
29a0: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 64  ight after the d
29b0: 61 74 61 62 61 73 65 20 63 75 72 73 6f 72 2e 20  atabase cursor. 
29c0: 20 53 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   So go ahead and
29d0: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 65  .  ** allocate e
29e0: 6e 6f 75 67 68 20 73 70 61 63 65 2c 20 6a 75 73  nough space, jus
29f0: 74 20 69 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a  t in case..  */.
2a00: 20 20 69 42 61 73 65 43 75 72 20 3d 20 69 44 61    iBaseCur = iDa
2a10: 74 61 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  taCur = pParse->
2a20: 6e 54 61 62 2b 2b 3b 0a 20 20 69 49 64 78 43 75  nTab++;.  iIdxCu
2a30: 72 20 3d 20 69 44 61 74 61 43 75 72 2b 31 3b 0a  r = iDataCur+1;.
2a40: 20 20 70 50 6b 20 3d 20 48 61 73 52 6f 77 69 64    pPk = HasRowid
2a50: 28 70 54 61 62 29 20 3f 20 30 20 3a 20 73 71 6c  (pTab) ? 0 : sql
2a60: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
2a70: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 74 65 73  dex(pTab);.  tes
2a80: 74 63 61 73 65 28 20 70 50 6b 21 3d 30 20 26 26  tcase( pPk!=0 &&
2a90: 20 70 50 6b 21 3d 70 54 61 62 2d 3e 70 49 6e 64   pPk!=pTab->pInd
2aa0: 65 78 20 29 3b 0a 20 20 66 6f 72 28 6e 49 64 78  ex );.  for(nIdx
2ab0: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
2ac0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
2ad0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e  x=pIdx->pNext, n
2ae0: 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  Idx++){.    if( 
2af0: 70 50 6b 3d 3d 70 49 64 78 20 29 7b 0a 20 20 20  pPk==pIdx ){.   
2b00: 20 20 20 69 44 61 74 61 43 75 72 20 3d 20 70 50     iDataCur = pP
2b10: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
2b20: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  }.    pParse->nT
2b30: 61 62 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ab++;.  }.  if( 
2b40: 70 55 70 73 65 72 74 20 29 7b 0a 20 20 20 20 2f  pUpsert ){.    /
2b50: 2a 20 4f 6e 20 61 6e 20 55 50 53 45 52 54 2c 20  * On an UPSERT, 
2b60: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 63  reuse the same c
2b70: 75 72 73 6f 72 73 20 61 6c 72 65 61 64 79 20 6f  ursors already o
2b80: 70 65 6e 65 64 20 62 79 20 49 4e 53 45 52 54 20  pened by INSERT 
2b90: 2a 2f 0a 20 20 20 20 69 44 61 74 61 43 75 72 20  */.    iDataCur 
2ba0: 3d 20 70 55 70 73 65 72 74 2d 3e 69 44 61 74 61  = pUpsert->iData
2bb0: 43 75 72 3b 0a 20 20 20 20 69 49 64 78 43 75 72  Cur;.    iIdxCur
2bc0: 20 3d 20 70 55 70 73 65 72 74 2d 3e 69 49 64 78   = pUpsert->iIdx
2bd0: 43 75 72 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Cur;.    pParse-
2be0: 3e 6e 54 61 62 20 3d 20 69 42 61 73 65 43 75 72  >nTab = iBaseCur
2bf0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
2c00: 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[0].iCursor =
2c10: 20 69 44 61 74 61 43 75 72 3b 0a 0a 20 20 2f 2a   iDataCur;..  /*
2c20: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
2c30: 66 6f 72 20 61 58 52 65 66 5b 5d 2c 20 61 52 65  for aXRef[], aRe
2c40: 67 49 64 78 5b 5d 2c 20 61 6e 64 20 61 54 6f 4f  gIdx[], and aToO
2c50: 70 65 6e 5b 5d 2e 20 20 0a 20 20 2a 2a 20 49 6e  pen[].  .  ** In
2c60: 69 74 69 61 6c 69 7a 65 20 61 58 52 65 66 5b 5d  itialize aXRef[]
2c70: 20 61 6e 64 20 61 54 6f 4f 70 65 6e 5b 5d 20 74   and aToOpen[] t
2c80: 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20  o their default 
2c90: 76 61 6c 75 65 73 2e 0a 20 20 2a 2f 0a 20 20 61  values..  */.  a
2ca0: 58 52 65 66 20 3d 20 73 71 6c 69 74 65 33 44 62  XRef = sqlite3Db
2cb0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
2cc0: 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20 28 70  sizeof(int) * (p
2cd0: 54 61 62 2d 3e 6e 43 6f 6c 2b 6e 49 64 78 29 20  Tab->nCol+nIdx) 
2ce0: 2b 20 6e 49 64 78 2b 32 20 29 3b 0a 20 20 69 66  + nIdx+2 );.  if
2cf0: 28 20 61 58 52 65 66 3d 3d 30 20 29 20 67 6f 74  ( aXRef==0 ) got
2d00: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
2d10: 3b 0a 20 20 61 52 65 67 49 64 78 20 3d 20 61 58  ;.  aRegIdx = aX
2d20: 52 65 66 2b 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  Ref+pTab->nCol;.
2d30: 20 20 61 54 6f 4f 70 65 6e 20 3d 20 28 75 38 2a    aToOpen = (u8*
2d40: 29 28 61 52 65 67 49 64 78 2b 6e 49 64 78 29 3b  )(aRegIdx+nIdx);
2d50: 0a 20 20 6d 65 6d 73 65 74 28 61 54 6f 4f 70 65  .  memset(aToOpe
2d60: 6e 2c 20 31 2c 20 6e 49 64 78 2b 31 29 3b 0a 20  n, 1, nIdx+1);. 
2d70: 20 61 54 6f 4f 70 65 6e 5b 6e 49 64 78 2b 31 5d   aToOpen[nIdx+1]
2d80: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
2d90: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
2da0: 2b 2b 29 20 61 58 52 65 66 5b 69 5d 20 3d 20 2d  ++) aXRef[i] = -
2db0: 31 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  1;..  /* Initial
2dc0: 69 7a 65 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e  ize the name-con
2dd0: 74 65 78 74 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  text */.  memset
2de0: 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
2df0: 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50  (sNC));.  sNC.pP
2e00: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2e10: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
2e20: 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e  pTabList;.  sNC.
2e30: 75 4e 43 2e 70 55 70 73 65 72 74 20 3d 20 70 55  uNC.pUpsert = pU
2e40: 70 73 65 72 74 3b 0a 20 20 73 4e 43 2e 6e 63 46  psert;.  sNC.ncF
2e50: 6c 61 67 73 20 3d 20 4e 43 5f 55 55 70 73 65 72  lags = NC_UUpser
2e60: 74 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  t;..  /* Resolve
2e70: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
2e80: 73 20 69 6e 20 61 6c 6c 20 74 68 65 20 65 78 70  s in all the exp
2e90: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
2ea0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 55 50 44 41    ** of the UPDA
2eb0: 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  TE statement.  A
2ec0: 6c 73 6f 20 66 69 6e 64 20 74 68 65 20 63 6f 6c  lso find the col
2ed0: 75 6d 6e 20 69 6e 64 65 78 0a 20 20 2a 2a 20 66  umn index.  ** f
2ee0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 74  or each column t
2ef0: 6f 20 62 65 20 75 70 64 61 74 65 64 20 69 6e 20  o be updated in 
2f00: 74 68 65 20 70 43 68 61 6e 67 65 73 20 61 72 72  the pChanges arr
2f10: 61 79 2e 20 20 46 6f 72 20 65 61 63 68 0a 20 20  ay.  For each.  
2f20: 2a 2a 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  ** column to be 
2f30: 75 70 64 61 74 65 64 2c 20 6d 61 6b 65 20 73 75  updated, make su
2f40: 72 65 20 77 65 20 68 61 76 65 20 61 75 74 68 6f  re we have autho
2f50: 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 68 61 6e  rization to chan
2f60: 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c  ge.  ** that col
2f70: 75 6d 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 6e 67  umn..  */.  chng
2f80: 52 6f 77 69 64 20 3d 20 63 68 6e 67 50 6b 20 3d  Rowid = chngPk =
2f90: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
2fa0: 3c 70 43 68 61 6e 67 65 73 2d 3e 6e 45 78 70 72  <pChanges->nExpr
2fb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2fc0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
2fd0: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 43  prNames(&sNC, pC
2fe0: 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 70 45 78  hanges->a[i].pEx
2ff0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  pr) ){.      got
3000: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
3010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
3020: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
3030: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
3040: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
3050: 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  p(pTab->aCol[j].
3060: 7a 4e 61 6d 65 2c 20 70 43 68 61 6e 67 65 73 2d  zName, pChanges-
3070: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
3080: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  ){.        if( j
3090: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
30a0: 0a 20 20 20 20 20 20 20 20 20 20 63 68 6e 67 52  .          chngR
30b0: 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  owid = 1;.      
30c0: 20 20 20 20 70 52 6f 77 69 64 45 78 70 72 20 3d      pRowidExpr =
30d0: 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e   pChanges->a[i].
30e0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  pExpr;.        }
30f0: 65 6c 73 65 20 69 66 28 20 70 50 6b 20 26 26 20  else if( pPk && 
3100: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 63  (pTab->aCol[j].c
3110: 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
3120: 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b  G_PRIMKEY)!=0 ){
3130: 0a 20 20 20 20 20 20 20 20 20 20 63 68 6e 67 50  .          chngP
3140: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  k = 1;.        }
3150: 0a 20 20 20 20 20 20 20 20 61 58 52 65 66 5b 6a  .        aXRef[j
3160: 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 62  ] = i;.        b
3170: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3180: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
3190: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
31a0: 20 20 20 69 66 28 20 70 50 6b 3d 3d 30 20 26 26     if( pPk==0 &&
31b0: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
31c0: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a  pChanges->a[i].z
31d0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
31e0: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
31f0: 20 63 68 6e 67 52 6f 77 69 64 20 3d 20 31 3b 0a   chngRowid = 1;.
3200: 20 20 20 20 20 20 20 20 70 52 6f 77 69 64 45 78          pRowidEx
3210: 70 72 20 3d 20 70 43 68 61 6e 67 65 73 2d 3e 61  pr = pChanges->a
3220: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
3230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3240: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3250: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
3260: 20 63 6f 6c 75 6d 6e 3a 20 25 73 22 2c 20 70 43   column: %s", pC
3270: 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  hanges->a[i].zNa
3280: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  me);.        pPa
3290: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
32a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
32b0: 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75  to update_cleanu
32c0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
32d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32e0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
32f0: 4f 4e 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  ON.    {.      i
3300: 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  nt rc;.      rc 
3310: 3d 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  = sqlite3AuthChe
3320: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
3330: 45 5f 55 50 44 41 54 45 2c 20 70 54 61 62 2d 3e  E_UPDATE, pTab->
3340: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3360: 20 20 20 6a 3c 30 20 3f 20 22 52 4f 57 49 44 22     j<0 ? "ROWID"
3370: 20 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   : pTab->aCol[j]
3380: 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  .zName,.        
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
33b0: 2e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20 20 20  .zDbSName);.    
33c0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33d0: 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 20  _DENY ){.       
33e0: 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65   goto update_cle
33f0: 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73  anup;.      }els
3400: 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
3410: 5f 49 47 4e 4f 52 45 20 29 7b 0a 20 20 20 20 20  _IGNORE ){.     
3420: 20 20 20 61 58 52 65 66 5b 6a 5d 20 3d 20 2d 31     aXRef[j] = -1
3430: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3440: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 61 73 73  #endif.  }.  ass
3450: 65 72 74 28 20 28 63 68 6e 67 52 6f 77 69 64 20  ert( (chngRowid 
3460: 26 20 63 68 6e 67 50 6b 29 3d 3d 30 20 29 3b 0a  & chngPk)==0 );.
3470: 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 52 6f    assert( chngRo
3480: 77 69 64 3d 3d 30 20 7c 7c 20 63 68 6e 67 52 6f  wid==0 || chngRo
3490: 77 69 64 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  wid==1 );.  asse
34a0: 72 74 28 20 63 68 6e 67 50 6b 3d 3d 30 20 7c 7c  rt( chngPk==0 ||
34b0: 20 63 68 6e 67 50 6b 3d 3d 31 20 29 3b 0a 20 20   chngPk==1 );.  
34c0: 63 68 6e 67 4b 65 79 20 3d 20 63 68 6e 67 52 6f  chngKey = chngRo
34d0: 77 69 64 20 2b 20 63 68 6e 67 50 6b 3b 0a 0a 20  wid + chngPk;.. 
34e0: 20 2f 2a 20 54 68 65 20 53 45 54 20 65 78 70 72   /* The SET expr
34f0: 65 73 73 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  essions are not 
3500: 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20 69 6e  actually used in
3510: 73 69 64 65 20 74 68 65 20 57 48 45 52 45 20 6c  side the WHERE l
3520: 6f 6f 70 2e 20 20 0a 20 20 2a 2a 20 53 6f 20 72  oop.  .  ** So r
3530: 65 73 65 74 20 74 68 65 20 63 6f 6c 55 73 65 64  eset the colUsed
3540: 20 6d 61 73 6b 2e 20 55 6e 6c 65 73 73 20 74 68   mask. Unless th
3550: 69 73 20 69 73 20 61 20 76 69 72 74 75 61 6c 20  is is a virtual 
3560: 74 61 62 6c 65 2e 20 49 6e 20 74 68 61 74 0a 20  table. In that. 
3570: 20 2a 2a 20 63 61 73 65 2c 20 73 65 74 20 61 6c   ** case, set al
3580: 6c 20 62 69 74 73 20 6f 66 20 74 68 65 20 63 6f  l bits of the co
3590: 6c 55 73 65 64 20 6d 61 73 6b 20 28 74 6f 20 65  lUsed mask (to e
35a0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 76  nsure that the v
35b0: 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c  irtual.  ** tabl
35c0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
35d0: 20 6d 61 6b 65 73 20 61 6c 6c 20 63 6f 6c 75 6d   makes all colum
35e0: 6e 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 20  ns available).. 
35f0: 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 2d 3e   */.  pTabList->
3600: 61 5b 30 5d 2e 63 6f 6c 55 73 65 64 20 3d 20 49  a[0].colUsed = I
3610: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
3620: 20 41 4c 4c 42 49 54 53 20 3a 20 30 3b 0a 0a 20   ALLBITS : 0;.. 
3630: 20 68 61 73 46 4b 20 3d 20 73 71 6c 69 74 65 33   hasFK = sqlite3
3640: 46 6b 52 65 71 75 69 72 65 64 28 70 50 61 72 73  FkRequired(pPars
3650: 65 2c 20 70 54 61 62 2c 20 61 58 52 65 66 2c 20  e, pTab, aXRef, 
3660: 63 68 6e 67 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20  chngKey);..  /* 
3670: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 6e 74  There is one ent
3680: 72 79 20 69 6e 20 74 68 65 20 61 52 65 67 49 64  ry in the aRegId
3690: 78 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 65 61  x[] array for ea
36a0: 63 68 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20  ch index on the 
36b0: 74 61 62 6c 65 0a 20 20 2a 2a 20 62 65 69 6e 67  table.  ** being
36c0: 20 75 70 64 61 74 65 64 2e 20 20 46 69 6c 6c 20   updated.  Fill 
36d0: 69 6e 20 61 52 65 67 49 64 78 5b 5d 20 77 69 74  in aRegIdx[] wit
36e0: 68 20 61 20 72 65 67 69 73 74 65 72 20 6e 75 6d  h a register num
36f0: 62 65 72 20 74 68 61 74 20 77 69 6c 6c 20 68 6f  ber that will ho
3700: 6c 64 0a 20 20 2a 2a 20 74 68 65 20 6b 65 79 20  ld.  ** the key 
3710: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 65 61  for accessing ea
3720: 63 68 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  ch index..  */. 
3730: 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d 70   for(j=0, pIdx=p
3740: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
3750: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
3760: 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  ext, j++){.    i
3770: 6e 74 20 72 65 67 3b 0a 20 20 20 20 69 66 28 20  nt reg;.    if( 
3780: 63 68 6e 67 4b 65 79 20 7c 7c 20 68 61 73 46 4b  chngKey || hasFK
3790: 3e 31 20 7c 7c 20 70 49 64 78 3d 3d 70 50 6b 0a  >1 || pIdx==pPk.
37a0: 20 20 20 20 20 7c 7c 20 69 6e 64 65 78 57 68 65       || indexWhe
37b0: 72 65 43 6c 61 75 73 65 4d 69 67 68 74 43 68 61  reClauseMightCha
37c0: 6e 67 65 28 70 49 64 78 2c 61 58 52 65 66 2c 63  nge(pIdx,aXRef,c
37d0: 68 6e 67 52 6f 77 69 64 29 0a 20 20 20 20 29 7b  hngRowid).    ){
37e0: 0a 20 20 20 20 20 20 72 65 67 20 3d 20 2b 2b 70  .      reg = ++p
37f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
3800: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
3810: 2b 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  += pIdx->nColumn
3820: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3830: 20 20 20 72 65 67 20 3d 20 30 3b 0a 20 20 20 20     reg = 0;.    
3840: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
3850: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29  x->nKeyCol; i++)
3860: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  {.        if( in
3870: 64 65 78 43 6f 6c 75 6d 6e 49 73 42 65 69 6e 67  dexColumnIsBeing
3880: 55 70 64 61 74 65 64 28 70 49 64 78 2c 20 69 2c  Updated(pIdx, i,
3890: 20 61 58 52 65 66 2c 20 63 68 6e 67 52 6f 77 69   aXRef, chngRowi
38a0: 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
38b0: 72 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  reg = ++pParse->
38c0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
38d0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
38e0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
38f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6f 6e           if( (on
3900: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
3910: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  e).           ||
3920: 20 28 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65   (onError==OE_De
3930: 66 61 75 6c 74 20 26 26 20 70 49 64 78 2d 3e 6f  fault && pIdx->o
3940: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
3950: 63 65 29 20 0a 20 20 20 20 20 20 20 20 20 20 29  ce) .          )
3960: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 52  {.            bR
3970: 65 70 6c 61 63 65 20 3d 20 31 3b 0a 20 20 20 20  eplace = 1;.    
3980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3990: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
39a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
39b0: 0a 20 20 20 20 69 66 28 20 72 65 67 3d 3d 30 20  .    if( reg==0 
39c0: 29 20 61 54 6f 4f 70 65 6e 5b 6a 2b 31 5d 20 3d  ) aToOpen[j+1] =
39d0: 20 30 3b 0a 20 20 20 20 61 52 65 67 49 64 78 5b   0;.    aRegIdx[
39e0: 6a 5d 20 3d 20 72 65 67 3b 0a 20 20 7d 0a 20 20  j] = reg;.  }.  
39f0: 69 66 28 20 62 52 65 70 6c 61 63 65 20 29 7b 0a  if( bReplace ){.
3a00: 20 20 20 20 2f 2a 20 49 66 20 52 45 50 4c 41 43      /* If REPLAC
3a10: 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  E conflict resol
3a20: 75 74 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 69  ution might be i
3a30: 6e 76 6f 6b 65 64 2c 20 6f 70 65 6e 20 63 75 72  nvoked, open cur
3a40: 73 6f 72 73 20 6f 6e 20 61 6c 6c 20 0a 20 20 20  sors on all .   
3a50: 20 2a 2a 20 69 6e 64 65 78 65 73 20 69 6e 20 63   ** indexes in c
3a60: 61 73 65 20 74 68 65 79 20 61 72 65 20 6e 65 65  ase they are nee
3a70: 64 65 64 20 74 6f 20 64 65 6c 65 74 65 20 72 65  ded to delete re
3a80: 63 6f 72 64 73 2e 20 20 2a 2f 0a 20 20 20 20 6d  cords.  */.    m
3a90: 65 6d 73 65 74 28 61 54 6f 4f 70 65 6e 2c 20 31  emset(aToOpen, 1
3aa0: 2c 20 6e 49 64 78 2b 31 29 3b 0a 20 20 7d 0a 0a  , nIdx+1);.  }..
3ab0: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
3ac0: 61 74 69 6e 67 20 63 6f 64 65 2e 20 2a 2f 0a 20  ating code. */. 
3ad0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
3ae0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
3af0: 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 75  f( v==0 ) goto u
3b00: 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  pdate_cleanup;. 
3b10: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73   if( pParse->nes
3b20: 74 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  ted==0 ) sqlite3
3b30: 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
3b40: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  (v);.  sqlite3Be
3b50: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
3b60: 6e 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  n(pParse, pTrigg
3b70: 65 72 20 7c 7c 20 68 61 73 46 4b 2c 20 69 44 62  er || hasFK, iDb
3b80: 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
3b90: 65 20 72 65 71 75 69 72 65 64 20 72 65 67 69 73  e required regis
3ba0: 74 65 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 21  ters. */.  if( !
3bb0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
3bc0: 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 53 65 74  ){.    regRowSet
3bd0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
3be0: 6d 3b 0a 20 20 20 20 72 65 67 4f 6c 64 52 6f 77  m;.    regOldRow
3bf0: 69 64 20 3d 20 72 65 67 4e 65 77 52 6f 77 69 64  id = regNewRowid
3c00: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
3c10: 6d 3b 0a 20 20 20 20 69 66 28 20 63 68 6e 67 50  m;.    if( chngP
3c20: 6b 20 7c 7c 20 70 54 72 69 67 67 65 72 20 7c 7c  k || pTrigger ||
3c30: 20 68 61 73 46 4b 20 29 7b 0a 20 20 20 20 20 20   hasFK ){.      
3c40: 72 65 67 4f 6c 64 20 3d 20 70 50 61 72 73 65 2d  regOld = pParse-
3c50: 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
3c60: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
3c70: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20   pTab->nCol;.   
3c80: 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6e 67 4b   }.    if( chngK
3c90: 65 79 20 7c 7c 20 70 54 72 69 67 67 65 72 20 7c  ey || pTrigger |
3ca0: 7c 20 68 61 73 46 4b 20 29 7b 0a 20 20 20 20 20  | hasFK ){.     
3cb0: 20 72 65 67 4e 65 77 52 6f 77 69 64 20 3d 20 2b   regNewRowid = +
3cc0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
3cd0: 20 20 20 7d 0a 20 20 20 20 72 65 67 4e 65 77 20     }.    regNew 
3ce0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
3cf0: 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   1;.    pParse->
3d00: 6e 4d 65 6d 20 2b 3d 20 70 54 61 62 2d 3e 6e 43  nMem += pTab->nC
3d10: 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  ol;.  }..  /* St
3d20: 61 72 74 20 74 68 65 20 76 69 65 77 20 63 6f 6e  art the view con
3d30: 74 65 78 74 2e 20 2a 2f 0a 20 20 69 66 28 20 69  text. */.  if( i
3d40: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 73 71 6c  sView ){.    sql
3d50: 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78 74 50  ite3AuthContextP
3d60: 75 73 68 28 70 50 61 72 73 65 2c 20 26 73 43 6f  ush(pParse, &sCo
3d70: 6e 74 65 78 74 2c 20 70 54 61 62 2d 3e 7a 4e 61  ntext, pTab->zNa
3d80: 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  me);.  }..  /* I
3d90: 66 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  f we are trying 
3da0: 74 6f 20 75 70 64 61 74 65 20 61 20 76 69 65 77  to update a view
3db0: 2c 20 72 65 61 6c 69 7a 65 20 74 68 61 74 20 76  , realize that v
3dc0: 69 65 77 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 6e  iew into.  ** an
3dd0: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
3de0: 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ..  */.#if !defi
3df0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3e00: 56 49 45 57 29 20 26 26 20 21 64 65 66 69 6e 65  VIEW) && !define
3e10: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
3e20: 49 47 47 45 52 29 0a 20 20 69 66 28 20 69 73 56  IGGER).  if( isV
3e30: 69 65 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  iew ){.    sqlit
3e40: 65 33 4d 61 74 65 72 69 61 6c 69 7a 65 56 69 65  e3MaterializeVie
3e50: 77 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  w(pParse, pTab, 
3e60: 0a 20 20 20 20 20 20 20 20 70 57 68 65 72 65 2c  .        pWhere,
3e70: 20 70 4f 72 64 65 72 42 79 2c 20 70 4c 69 6d 69   pOrderBy, pLimi
3e80: 74 2c 20 69 44 61 74 61 43 75 72 0a 20 20 20 20  t, iDataCur.    
3e90: 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20  );.    pOrderBy 
3ea0: 3d 20 30 3b 0a 20 20 20 20 70 4c 69 6d 69 74 20  = 0;.    pLimit 
3eb0: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
3ec0: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68  .  /* Resolve th
3ed0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  e column names i
3ee0: 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73  n all the expres
3ef0: 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20 2a  sions in the.  *
3f00: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  * WHERE clause..
3f10: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
3f20: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
3f30: 65 73 28 26 73 4e 43 2c 20 70 57 68 65 72 65 29  es(&sNC, pWhere)
3f40: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64   ){.    goto upd
3f50: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ate_cleanup;.  }
3f60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3f70: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
3f80: 4c 45 0a 20 20 2f 2a 20 56 69 72 74 75 61 6c 20  LE.  /* Virtual 
3f90: 74 61 62 6c 65 73 20 6d 75 73 74 20 62 65 20 68  tables must be h
3fa0: 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
3fb0: 79 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72  y */.  if( IsVir
3fc0: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
3fd0: 20 20 75 70 64 61 74 65 56 69 72 74 75 61 6c 54    updateVirtualT
3fe0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
3ff0: 62 4c 69 73 74 2c 20 70 54 61 62 2c 20 70 43 68  bList, pTab, pCh
4000: 61 6e 67 65 73 2c 20 70 52 6f 77 69 64 45 78 70  anges, pRowidExp
4010: 72 2c 20 61 58 52 65 66 2c 0a 20 20 20 20 20 20  r, aXRef,.      
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4030: 20 70 57 68 65 72 65 2c 20 6f 6e 45 72 72 6f 72   pWhere, onError
4040: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61  );.    goto upda
4050: 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  te_cleanup;.  }.
4060: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d  #endif..  /* Jum
4070: 70 20 74 6f 20 6c 61 62 65 6c 42 72 65 61 6b 20  p to labelBreak 
4080: 74 6f 20 61 62 61 6e 64 6f 6e 20 66 75 72 74 68  to abandon furth
4090: 65 72 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  er processing of
40a0: 20 74 68 69 73 20 55 50 44 41 54 45 20 2a 2f 0a   this UPDATE */.
40b0: 20 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 20    labelContinue 
40c0: 3d 20 6c 61 62 65 6c 42 72 65 61 6b 20 3d 20 73  = labelBreak = s
40d0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
40e0: 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  bel(pParse);..  
40f0: 2f 2a 20 4e 6f 74 20 61 6e 20 55 50 53 45 52 54  /* Not an UPSERT
4100: 2e 20 20 4e 6f 72 6d 61 6c 20 70 72 6f 63 65 73  .  Normal proces
4110: 73 69 6e 67 2e 20 20 42 65 67 69 6e 20 62 79 0a  sing.  Begin by.
4120: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
4130: 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 75 70 64  the count of upd
4140: 61 74 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 69  ated rows */.  i
4150: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51  f( (db->flags&SQ
4160: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21  LITE_CountRows)!
4170: 3d 30 0a 20 20 20 26 26 20 21 70 50 61 72 73 65  =0.   && !pParse
4180: 2d 3e 70 54 72 69 67 67 65 72 54 61 62 0a 20 20  ->pTriggerTab.  
4190: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 6e 65 73   && !pParse->nes
41a0: 74 65 64 0a 20 20 20 26 26 20 70 55 70 73 65 72  ted.   && pUpser
41b0: 74 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65  t==0.  ){.    re
41c0: 67 52 6f 77 43 6f 75 6e 74 20 3d 20 2b 2b 70 50  gRowCount = ++pP
41d0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
41e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
41f0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
4200: 20 30 2c 20 72 65 67 52 6f 77 43 6f 75 6e 74 29   0, regRowCount)
4210: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 48 61 73  ;.  }..  if( Has
4220: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
4230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4240: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
4250: 20 30 2c 20 72 65 67 52 6f 77 53 65 74 2c 20 72   0, regRowSet, r
4260: 65 67 4f 6c 64 52 6f 77 69 64 29 3b 0a 20 20 7d  egOldRowid);.  }
4270: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
4280: 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 20 20  ( pPk!=0 );.    
4290: 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  nPk = pPk->nKeyC
42a0: 6f 6c 3b 0a 20 20 20 20 69 50 6b 20 3d 20 70 50  ol;.    iPk = pP
42b0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
42c0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
42d0: 3d 20 6e 50 6b 3b 0a 20 20 20 20 72 65 67 4b 65  = nPk;.    regKe
42e0: 79 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  y = ++pParse->nM
42f0: 65 6d 3b 0a 20 20 20 20 69 66 28 20 70 55 70 73  em;.    if( pUps
4300: 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ert==0 ){.      
4310: 69 45 70 68 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iEph = pParse->n
4320: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Tab++;.        s
4330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4340: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
4350: 69 50 6b 2c 20 69 50 6b 2b 6e 50 6b 2d 31 29 3b  iPk, iPk+nPk-1);
4360: 0a 20 20 20 20 20 20 61 64 64 72 4f 70 65 6e 20  .      addrOpen 
4370: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4380: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
4390: 68 65 6d 65 72 61 6c 2c 20 69 45 70 68 2c 20 6e  hemeral, iEph, n
43a0: 50 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Pk);.      sqlit
43b0: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
43c0: 66 6f 28 70 50 61 72 73 65 2c 20 70 50 6b 29 3b  fo(pParse, pPk);
43d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
43e0: 69 66 28 20 70 55 70 73 65 72 74 20 29 7b 0a 20  if( pUpsert ){. 
43f0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
4400: 20 61 6e 20 55 50 53 45 52 54 2c 20 74 68 65 6e   an UPSERT, then
4410: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 68 61 76   all cursors hav
4420: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
4430: 70 65 6e 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  pened by.    ** 
4440: 74 68 65 20 6f 75 74 65 72 20 49 4e 53 45 52 54  the outer INSERT
4450: 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 63 75   and the data cu
4460: 72 73 6f 72 20 73 68 6f 75 6c 64 20 62 65 20 70  rsor should be p
4470: 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 72  ointing at the r
4480: 6f 77 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  ow.    ** that i
4490: 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
44a0: 20 20 53 6f 20 62 79 70 61 73 73 20 74 68 65 20    So bypass the 
44b0: 63 6f 64 65 20 74 68 61 74 20 73 65 61 72 63 68  code that search
44c0: 65 73 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  es for the.    *
44d0: 2a 20 72 6f 77 28 73 29 20 74 6f 20 62 65 20 75  * row(s) to be u
44e0: 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  pdated..    */. 
44f0: 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20     pWInfo = 0;. 
4500: 20 20 20 65 4f 6e 65 50 61 73 73 20 3d 20 4f 4e     eOnePass = ON
4510: 45 50 41 53 53 5f 53 49 4e 47 4c 45 3b 0a 20 20  EPASS_SINGLE;.  
4520: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
4530: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68  alse(pParse, pWh
4540: 65 72 65 2c 20 6c 61 62 65 6c 42 72 65 61 6b 2c  ere, labelBreak,
4550: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
4560: 4c 4c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LL);.  }else{.  
4570: 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
4580: 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 0a 20  atabase scan. . 
4590: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 44 6f 20     **.    ** Do 
45a0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 61 20 73  not consider a s
45b0: 69 6e 67 6c 65 2d 70 61 73 73 20 73 74 72 61 74  ingle-pass strat
45c0: 65 67 79 20 66 6f 72 20 61 20 6d 75 6c 74 69 2d  egy for a multi-
45d0: 72 6f 77 20 75 70 64 61 74 65 20 69 66 0a 20 20  row update if.  
45e0: 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 61    ** there are a
45f0: 6e 79 20 74 72 69 67 67 65 72 73 20 6f 72 20 66  ny triggers or f
4600: 6f 72 65 69 67 6e 20 6b 65 79 73 20 74 6f 20 70  oreign keys to p
4610: 72 6f 63 65 73 73 2c 20 6f 72 20 72 6f 77 73 20  rocess, or rows 
4620: 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 64 65  may.    ** be de
4630: 6c 65 74 65 64 20 61 73 20 61 20 72 65 73 75 6c  leted as a resul
4640: 74 20 6f 66 20 52 45 50 4c 41 43 45 20 63 6f 6e  t of REPLACE con
4650: 66 6c 69 63 74 20 68 61 6e 64 6c 69 6e 67 2e 20  flict handling. 
4660: 41 6e 79 20 6f 66 20 74 68 65 73 65 0a 20 20 20  Any of these.   
4670: 20 2a 2a 20 74 68 69 6e 67 73 20 6d 69 67 68 74   ** things might
4680: 20 64 69 73 74 75 72 62 20 61 20 63 75 72 73 6f   disturb a curso
4690: 72 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20  r being used to 
46a0: 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
46b0: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6f 72   table.    ** or
46c0: 20 69 6e 64 65 78 2c 20 63 61 75 73 69 6e 67 20   index, causing 
46d0: 61 20 73 69 6e 67 6c 65 2d 70 61 73 73 20 61 70  a single-pass ap
46e0: 70 72 6f 61 63 68 20 74 6f 20 6d 61 6c 66 75 6e  proach to malfun
46f0: 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 66  ction.  */.    f
4700: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4f 4e 45  lags = WHERE_ONE
4710: 50 41 53 53 5f 44 45 53 49 52 45 44 7c 57 48 45  PASS_DESIRED|WHE
4720: 52 45 5f 53 45 45 4b 5f 55 4e 49 51 5f 54 41 42  RE_SEEK_UNIQ_TAB
4730: 4c 45 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  LE;.    if( !pPa
4740: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 21  rse->nested && !
4750: 70 54 72 69 67 67 65 72 20 26 26 20 21 68 61 73  pTrigger && !has
4760: 46 4b 20 26 26 20 21 63 68 6e 67 4b 65 79 20 26  FK && !chngKey &
4770: 26 20 21 62 52 65 70 6c 61 63 65 20 29 7b 0a 20  & !bReplace ){. 
4780: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
4790: 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ERE_ONEPASS_MULT
47a0: 49 52 4f 57 3b 0a 20 20 20 20 7d 0a 20 20 20 20  IROW;.    }.    
47b0: 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
47c0: 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
47d0: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
47e0: 65 72 65 2c 20 30 2c 20 30 2c 20 66 6c 61 67 73  ere, 0, 0, flags
47f0: 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  , iIdxCur);.    
4800: 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
4810: 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61  goto update_clea
4820: 6e 75 70 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  nup;.  .    /* A
4830: 20 6f 6e 65 2d 70 61 73 73 20 73 74 72 61 74 65   one-pass strate
4840: 67 79 20 74 68 61 74 20 6d 69 67 68 74 20 75 70  gy that might up
4850: 64 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f  date more than o
4860: 6e 65 20 72 6f 77 20 6d 61 79 20 6e 6f 74 0a 20  ne row may not. 
4870: 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 66     ** be used if
4880: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   any column of t
4890: 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f  he index used fo
48a0: 72 20 74 68 65 20 73 63 61 6e 20 69 73 20 62 65  r the scan is be
48b0: 69 6e 67 0a 20 20 20 20 2a 2a 20 75 70 64 61 74  ing.    ** updat
48c0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
48d0: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  f there is an in
48e0: 64 65 78 20 6f 6e 20 22 62 22 2c 20 73 74 61 74  dex on "b", stat
48f0: 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20  ements like.    
4900: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
4910: 20 63 6f 75 6c 64 20 63 72 65 61 74 65 20 61 6e   could create an
4920: 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 3a 0a   infinite loop:.
4930: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
4940: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 3d  UPDATE t1 SET b=
4950: 62 2b 31 20 57 48 45 52 45 20 62 3e 3f 0a 20 20  b+1 WHERE b>?.  
4960: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 61 6c 6c    **.    ** Fall
4970: 20 62 61 63 6b 20 74 6f 20 4f 4e 45 50 41 53 53   back to ONEPASS
4980: 5f 4f 46 46 20 69 66 20 77 68 65 72 65 2e 63 20  _OFF if where.c 
4990: 68 61 73 20 73 65 6c 65 63 74 65 64 20 61 20 4f  has selected a O
49a0: 4e 45 50 41 53 53 5f 4d 55 4c 54 49 0a 20 20 20  NEPASS_MULTI.   
49b0: 20 2a 2a 20 73 74 72 61 74 65 67 79 20 74 68 61   ** strategy tha
49c0: 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
49d0: 66 6f 72 20 77 68 69 63 68 20 6f 6e 65 20 6f 72  for which one or
49e0: 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 61 72   more columns ar
49f0: 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75  e being.    ** u
4a00: 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20  pdated.  */.    
4a10: 65 4f 6e 65 50 61 73 73 20 3d 20 73 71 6c 69 74  eOnePass = sqlit
4a20: 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73  e3WhereOkOnePass
4a30: 28 70 57 49 6e 66 6f 2c 20 61 69 43 75 72 4f 6e  (pWInfo, aiCurOn
4a40: 65 50 61 73 73 29 3b 0a 20 20 20 20 69 66 28 20  ePass);.    if( 
4a50: 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53  eOnePass!=ONEPAS
4a60: 53 5f 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20  S_SINGLE ){.    
4a70: 20 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72    sqlite3MultiWr
4a80: 69 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ite(pParse);.   
4a90: 20 20 20 69 66 28 20 65 4f 6e 65 50 61 73 73 3d     if( eOnePass=
4aa0: 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 29  =ONEPASS_MULTI )
4ab0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
4ac0: 75 72 20 3d 20 61 69 43 75 72 4f 6e 65 50 61 73  ur = aiCurOnePas
4ad0: 73 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  s[1];.        if
4ae0: 28 20 69 43 75 72 3e 3d 30 20 26 26 20 69 43 75  ( iCur>=0 && iCu
4af0: 72 21 3d 69 44 61 74 61 43 75 72 20 26 26 20 61  r!=iDataCur && a
4b00: 54 6f 4f 70 65 6e 5b 69 43 75 72 2d 69 42 61 73  ToOpen[iCur-iBas
4b10: 65 43 75 72 5d 20 29 7b 0a 20 20 20 20 20 20 20  eCur] ){.       
4b20: 20 20 20 65 4f 6e 65 50 61 73 73 20 3d 20 4f 4e     eOnePass = ON
4b30: 45 50 41 53 53 5f 4f 46 46 3b 0a 20 20 20 20 20  EPASS_OFF;.     
4b40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
4b50: 65 72 74 28 20 69 43 75 72 21 3d 69 44 61 74 61  ert( iCur!=iData
4b60: 43 75 72 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  Cur || !HasRowid
4b70: 28 70 54 61 62 29 20 29 3b 0a 20 20 20 20 20 20  (pTab) );.      
4b80: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
4b90: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
4ba0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64  ) ){.    /* Read
4bb0: 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
4bc0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
4bd0: 20 74 68 65 20 57 48 45 52 45 20 73 63 61 6e 2e   the WHERE scan.
4be0: 20 49 6e 20 4f 4e 45 50 41 53 53 5f 4f 46 46 0a   In ONEPASS_OFF.
4bf0: 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 77 72 69      ** mode, wri
4c00: 74 65 20 74 68 65 20 72 6f 77 69 64 20 69 6e 74  te the rowid int
4c10: 6f 20 74 68 65 20 46 49 46 4f 2e 20 49 6e 20 65  o the FIFO. In e
4c20: 69 74 68 65 72 20 6f 66 20 74 68 65 20 6f 6e 65  ither of the one
4c30: 2d 70 61 73 73 20 6d 6f 64 65 73 2c 0a 20 20 20  -pass modes,.   
4c40: 20 2a 2a 20 6c 65 61 76 65 20 69 74 20 69 6e 20   ** leave it in 
4c50: 72 65 67 69 73 74 65 72 20 72 65 67 4f 6c 64 52  register regOldR
4c60: 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71  owid.  */.    sq
4c70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4c80: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 44 61  v, OP_Rowid, iDa
4c90: 74 61 43 75 72 2c 20 72 65 67 4f 6c 64 52 6f 77  taCur, regOldRow
4ca0: 69 64 29 3b 0a 20 20 20 20 69 66 28 20 65 4f 6e  id);.    if( eOn
4cb0: 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
4cc0: 46 46 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FF ){.      sqli
4cd0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4ce0: 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 2c 20 72   OP_RowSetAdd, r
4cf0: 65 67 52 6f 77 53 65 74 2c 20 72 65 67 4f 6c 64  egRowSet, regOld
4d00: 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Rowid);.    }.  
4d10: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65  }else{.    /* Re
4d20: 61 64 20 74 68 65 20 50 4b 20 6f 66 20 74 68 65  ad the PK of the
4d30: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 74   current row int
4d40: 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  o an array of re
4d50: 67 69 73 74 65 72 73 2e 20 49 6e 0a 20 20 20 20  gisters. In.    
4d60: 2a 2a 20 4f 4e 45 50 41 53 53 5f 4f 46 46 20 6d  ** ONEPASS_OFF m
4d70: 6f 64 65 2c 20 73 65 72 69 61 6c 69 7a 65 20 74  ode, serialize t
4d80: 68 65 20 61 72 72 61 79 20 69 6e 74 6f 20 61 20  he array into a 
4d90: 72 65 63 6f 72 64 20 61 6e 64 20 73 74 6f 72 65  record and store
4da0: 20 69 74 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68   it in.    ** th
4db0: 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
4dc0: 65 2e 20 4f 72 2c 20 69 6e 20 4f 4e 45 50 41 53  e. Or, in ONEPAS
4dd0: 53 5f 53 49 4e 47 4c 45 20 6f 72 20 4d 55 4c 54  S_SINGLE or MULT
4de0: 49 20 6d 6f 64 65 2c 20 63 68 61 6e 67 65 0a 20  I mode, change. 
4df0: 20 20 20 2a 2a 20 74 68 65 20 4f 50 5f 4f 70 65     ** the OP_Ope
4e00: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
4e10: 75 63 74 69 6f 6e 20 74 6f 20 61 20 4e 6f 6f 70  uction to a Noop
4e20: 20 28 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20   (the ephemeral 
4e30: 74 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 69 73  table .    ** is
4e40: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 29 20 61   not required) a
4e50: 6e 64 20 6c 65 61 76 65 20 74 68 65 20 50 4b 20  nd leave the PK 
4e60: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 61 72  fields in the ar
4e70: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
4e80: 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  .  */.    for(i=
4e90: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
4ea0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
4eb0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d  k->aiColumn[i]>=
4ec0: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
4ed0: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
4ee0: 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
4ef0: 61 62 2c 20 69 44 61 74 61 43 75 72 2c 70 50 6b  ab, iDataCur,pPk
4f00: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 2c 69 50  ->aiColumn[i],iP
4f10: 6b 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  k+i);.    }.    
4f20: 69 66 28 20 65 4f 6e 65 50 61 73 73 20 29 7b 0a  if( eOnePass ){.
4f30: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 4f 70        if( addrOp
4f40: 65 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  en ) sqlite3Vdbe
4f50: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
4f60: 61 64 64 72 4f 70 65 6e 29 3b 0a 20 20 20 20 20  addrOpen);.     
4f70: 20 6e 4b 65 79 20 3d 20 6e 50 6b 3b 0a 20 20 20   nKey = nPk;.   
4f80: 20 20 20 72 65 67 4b 65 79 20 3d 20 69 50 6b 3b     regKey = iPk;
4f90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4fa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4fb0: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
4fc0: 63 6f 72 64 2c 20 69 50 6b 2c 20 6e 50 6b 2c 20  cord, iPk, nPk, 
4fd0: 72 65 67 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  regKey,.        
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ff0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
5000: 6e 69 74 79 53 74 72 28 64 62 2c 20 70 50 6b 29  nityStr(db, pPk)
5010: 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 73 71  , nPk);.      sq
5020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
5030: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
5040: 72 74 2c 20 69 45 70 68 2c 20 72 65 67 4b 65 79  rt, iEph, regKey
5050: 2c 20 69 50 6b 2c 20 6e 50 6b 29 3b 0a 20 20 20  , iPk, nPk);.   
5060: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 55   }.  }..  if( pU
5070: 70 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  psert==0 ){.    
5080: 69 66 28 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  if( eOnePass!=ON
5090: 45 50 41 53 53 5f 4d 55 4c 54 49 20 29 7b 0a 20  EPASS_MULTI ){. 
50a0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
50b0: 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
50c0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 21    }.  .    if( !
50d0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
50e0: 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
50f0: 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70  ;.  .      /* Op
5100: 65 6e 20 65 76 65 72 79 20 69 6e 64 65 78 20 74  en every index t
5110: 68 61 74 20 6e 65 65 64 73 20 75 70 64 61 74 69  hat needs updati
5120: 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ng. */.      if(
5130: 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41   eOnePass!=ONEPA
5140: 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  SS_OFF ){.      
5150: 20 20 69 66 28 20 61 69 43 75 72 4f 6e 65 50 61    if( aiCurOnePa
5160: 73 73 5b 30 5d 3e 3d 30 20 29 20 61 54 6f 4f 70  ss[0]>=0 ) aToOp
5170: 65 6e 5b 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  en[aiCurOnePass[
5180: 30 5d 2d 69 42 61 73 65 43 75 72 5d 20 3d 20 30  0]-iBaseCur] = 0
5190: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 69  ;.        if( ai
51a0: 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 3e 3d 30  CurOnePass[1]>=0
51b0: 20 29 20 61 54 6f 4f 70 65 6e 5b 61 69 43 75 72   ) aToOpen[aiCur
51c0: 4f 6e 65 50 61 73 73 5b 31 5d 2d 69 42 61 73 65  OnePass[1]-iBase
51d0: 43 75 72 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cur] = 0;.      
51e0: 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 65  }.  .      if( e
51f0: 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
5200: 5f 4d 55 4c 54 49 20 26 26 20 28 6e 49 64 78 2d  _MULTI && (nIdx-
5210: 28 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  (aiCurOnePass[1]
5220: 3e 3d 30 29 29 3e 30 20 29 7b 0a 20 20 20 20 20  >=0))>0 ){.     
5230: 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
5240: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
5250: 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
5260: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5270: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
5280: 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49  te3OpenTableAndI
5290: 6e 64 69 63 65 73 28 70 50 61 72 73 65 2c 20 70  ndices(pParse, p
52a0: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  Tab, OP_OpenWrit
52b0: 65 2c 20 30 2c 20 69 42 61 73 65 43 75 72 2c 0a  e, 0, iBaseCur,.
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 20 61 54 6f 4f 70 65 6e 2c 20 30 2c 20 30 29 3b   aToOpen, 0, 0);
52f0: 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 4f  .      if( addrO
5300: 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62  nce ) sqlite3Vdb
5310: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
5320: 72 4f 6e 63 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rOnce);.    }.  
5330: 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  .    /* Top of t
5340: 68 65 20 75 70 64 61 74 65 20 6c 6f 6f 70 20 2a  he update loop *
5350: 2f 0a 20 20 20 20 69 66 28 20 65 4f 6e 65 50 61  /.    if( eOnePa
5360: 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss!=ONEPASS_OFF 
5370: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  ){.      if( !is
5380: 56 69 65 77 20 26 26 20 61 69 43 75 72 4f 6e 65  View && aiCurOne
5390: 50 61 73 73 5b 30 5d 21 3d 69 44 61 74 61 43 75  Pass[0]!=iDataCu
53a0: 72 20 26 26 20 61 69 43 75 72 4f 6e 65 50 61 73  r && aiCurOnePas
53b0: 73 5b 31 5d 21 3d 69 44 61 74 61 43 75 72 20 29  s[1]!=iDataCur )
53c0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
53d0: 28 20 70 50 6b 20 29 3b 0a 20 20 20 20 20 20 20  ( pPk );.       
53e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
53f0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
5400: 6f 75 6e 64 2c 20 69 44 61 74 61 43 75 72 2c 20  ound, iDataCur, 
5410: 6c 61 62 65 6c 42 72 65 61 6b 2c 20 72 65 67 4b  labelBreak, regK
5420: 65 79 2c 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  ey,nKey);.      
5430: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
5440: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5450: 20 69 66 28 20 65 4f 6e 65 50 61 73 73 21 3d 4f   if( eOnePass!=O
5460: 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 29 7b  NEPASS_SINGLE ){
5470: 0a 20 20 20 20 20 20 20 20 6c 61 62 65 6c 43 6f  .        labelCo
5480: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
5490: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
54a0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
54b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
54c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
54d0: 75 6c 6c 2c 20 70 50 6b 20 3f 20 72 65 67 4b 65  ull, pPk ? regKe
54e0: 79 20 3a 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c  y : regOldRowid,
54f0: 20 6c 61 62 65 6c 42 72 65 61 6b 29 3b 0a 20 20   labelBreak);.  
5500: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5510: 49 66 28 76 2c 20 70 50 6b 3d 3d 30 29 3b 0a 20  If(v, pPk==0);. 
5520: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5530: 65 49 66 28 76 2c 20 70 50 6b 21 3d 30 29 3b 0a  eIf(v, pPk!=0);.
5540: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
5550: 6b 20 29 7b 0a 20 20 20 20 20 20 6c 61 62 65 6c  k ){.      label
5560: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
5570: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
5580: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
5590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
55a0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
55b0: 45 70 68 2c 20 6c 61 62 65 6c 42 72 65 61 6b 29  Eph, labelBreak)
55c0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
55d0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  );.      addrTop
55e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
55f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
5600: 74 61 2c 20 69 45 70 68 2c 20 72 65 67 4b 65 79  ta, iEph, regKey
5610: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5620: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5630: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 44   OP_NotFound, iD
5640: 61 74 61 43 75 72 2c 20 6c 61 62 65 6c 43 6f 6e  ataCur, labelCon
5650: 74 69 6e 75 65 2c 20 72 65 67 4b 65 79 2c 20 30  tinue, regKey, 0
5660: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5670: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65  erage(v);.    }e
5680: 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 62 65 6c  lse{.      label
5690: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
56a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
56b0: 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 2c 20 72  OP_RowSetRead, r
56c0: 65 67 52 6f 77 53 65 74 2c 6c 61 62 65 6c 42 72  egRowSet,labelBr
56d0: 65 61 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eak,.           
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56f0: 20 20 20 20 72 65 67 4f 6c 64 52 6f 77 69 64 29      regOldRowid)
5700: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
5710: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
5720: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5730: 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
5740: 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 61 62 65  , iDataCur, labe
5750: 6c 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 4f 6c  lContinue, regOl
5760: 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 56  dRowid);.      V
5770: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5780: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
5790: 49 66 20 74 68 65 20 72 6f 77 69 64 20 76 61 6c  If the rowid val
57a0: 75 65 20 77 69 6c 6c 20 63 68 61 6e 67 65 2c 20  ue will change, 
57b0: 73 65 74 20 72 65 67 69 73 74 65 72 20 72 65 67  set register reg
57c0: 4e 65 77 52 6f 77 69 64 20 74 6f 0a 20 20 2a 2a  NewRowid to.  **
57d0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 65 77   contain the new
57e0: 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 20 72   value. If the r
57f0: 6f 77 69 64 20 69 73 20 6e 6f 74 20 62 65 69 6e  owid is not bein
5800: 67 20 6d 6f 64 69 66 69 65 64 2c 0a 20 20 2a 2a  g modified,.  **
5810: 20 74 68 65 6e 20 72 65 67 4e 65 77 52 6f 77 69   then regNewRowi
5820: 64 20 69 73 20 74 68 65 20 73 61 6d 65 20 72 65  d is the same re
5830: 67 69 73 74 65 72 20 61 73 20 72 65 67 4f 6c 64  gister as regOld
5840: 52 6f 77 69 64 2c 20 77 68 69 63 68 20 69 73 0a  Rowid, which is.
5850: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f 70    ** already pop
5860: 75 6c 61 74 65 64 2e 20 20 2a 2f 0a 20 20 61 73  ulated.  */.  as
5870: 73 65 72 74 28 20 63 68 6e 67 4b 65 79 20 7c 7c  sert( chngKey ||
5880: 20 70 54 72 69 67 67 65 72 20 7c 7c 20 68 61 73   pTrigger || has
5890: 46 4b 20 7c 7c 20 72 65 67 4f 6c 64 52 6f 77 69  FK || regOldRowi
58a0: 64 3d 3d 72 65 67 4e 65 77 52 6f 77 69 64 20 29  d==regNewRowid )
58b0: 3b 0a 20 20 69 66 28 20 63 68 6e 67 52 6f 77 69  ;.  if( chngRowi
58c0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
58d0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
58e0: 20 70 52 6f 77 69 64 45 78 70 72 2c 20 72 65 67   pRowidExpr, reg
58f0: 4e 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 73  NewRowid);.    s
5900: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5910: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
5920: 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 20  , regNewRowid); 
5930: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5940: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
5950: 74 65 20 74 68 65 20 6f 6c 64 20 70 72 65 2d 55  te the old pre-U
5960: 50 44 41 54 45 20 63 6f 6e 74 65 6e 74 20 6f 66  PDATE content of
5970: 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 63   the row being c
5980: 68 61 6e 67 65 64 2c 20 69 66 20 74 68 61 74 0a  hanged, if that.
5990: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
59a0: 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   is needed */.  
59b0: 69 66 28 20 63 68 6e 67 50 6b 20 7c 7c 20 68 61  if( chngPk || ha
59c0: 73 46 4b 20 7c 7c 20 70 54 72 69 67 67 65 72 20  sFK || pTrigger 
59d0: 29 7b 0a 20 20 20 20 75 33 32 20 6f 6c 64 6d 61  ){.    u32 oldma
59e0: 73 6b 20 3d 20 28 68 61 73 46 4b 20 3f 20 73 71  sk = (hasFK ? sq
59f0: 6c 69 74 65 33 46 6b 4f 6c 64 6d 61 73 6b 28 70  lite3FkOldmask(p
5a00: 50 61 72 73 65 2c 20 70 54 61 62 29 20 3a 20 30  Parse, pTab) : 0
5a10: 29 3b 0a 20 20 20 20 6f 6c 64 6d 61 73 6b 20 7c  );.    oldmask |
5a20: 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
5a30: 43 6f 6c 6d 61 73 6b 28 70 50 61 72 73 65 2c 20  Colmask(pParse, 
5a40: 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65  .        pTrigge
5a50: 72 2c 20 70 43 68 61 6e 67 65 73 2c 20 30 2c 20  r, pChanges, 0, 
5a60: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 7c 54  TRIGGER_BEFORE|T
5a70: 52 49 47 47 45 52 5f 41 46 54 45 52 2c 20 70 54  RIGGER_AFTER, pT
5a80: 61 62 2c 20 6f 6e 45 72 72 6f 72 0a 20 20 20 20  ab, onError.    
5a90: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
5aa0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
5ab0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 6c  +){.      if( ol
5ac0: 64 6d 61 73 6b 3d 3d 30 78 66 66 66 66 66 66 66  dmask==0xfffffff
5ad0: 66 0a 20 20 20 20 20 20 20 7c 7c 20 28 69 3c 33  f.       || (i<3
5ae0: 32 20 26 26 20 28 6f 6c 64 6d 61 73 6b 20 26 20  2 && (oldmask & 
5af0: 4d 41 53 4b 42 49 54 33 32 28 69 29 29 21 3d 30  MASKBIT32(i))!=0
5b00: 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61  ).       || (pTa
5b10: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c  b->aCol[i].colFl
5b20: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52  ags & COLFLAG_PR
5b30: 49 4d 4b 45 59 29 21 3d 30 0a 20 20 20 20 20 20  IMKEY)!=0.      
5b40: 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
5b50: 61 73 65 28 20 20 6f 6c 64 6d 61 73 6b 21 3d 30  ase(  oldmask!=0
5b60: 78 66 66 66 66 66 66 66 66 20 26 26 20 69 3d 3d  xffffffff && i==
5b70: 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  31 );.        sq
5b80: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
5b90: 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
5ba0: 20 70 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c   pTab, iDataCur,
5bb0: 20 69 2c 20 72 65 67 4f 6c 64 2b 69 29 3b 0a 20   i, regOld+i);. 
5bc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5bd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5be0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
5bf0: 2c 20 30 2c 20 72 65 67 4f 6c 64 2b 69 29 3b 0a  , 0, regOld+i);.
5c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5c10: 20 20 69 66 28 20 63 68 6e 67 52 6f 77 69 64 3d    if( chngRowid=
5c20: 3d 30 20 26 26 20 70 50 6b 3d 3d 30 20 29 7b 0a  =0 && pPk==0 ){.
5c30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5c40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
5c50: 70 79 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c  py, regOldRowid,
5c60: 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b 0a 20   regNewRowid);. 
5c70: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
5c80: 6f 70 75 6c 61 74 65 20 74 68 65 20 61 72 72 61  opulate the arra
5c90: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  y of registers b
5ca0: 65 67 69 6e 6e 69 6e 67 20 61 74 20 72 65 67 4e  eginning at regN
5cb0: 65 77 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a  ew with the new.
5cc0: 20 20 2a 2a 20 72 6f 77 20 64 61 74 61 2e 20 54    ** row data. T
5cd0: 68 69 73 20 61 72 72 61 79 20 69 73 20 75 73 65  his array is use
5ce0: 64 20 74 6f 20 63 68 65 63 6b 20 63 6f 6e 73 74  d to check const
5cf0: 61 6e 74 73 2c 20 63 72 65 61 74 65 20 74 68 65  ants, create the
5d00: 20 6e 65 77 0a 20 20 2a 2a 20 74 61 62 6c 65 20   new.  ** table 
5d10: 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
5d20: 73 2c 20 61 6e 64 20 61 73 20 74 68 65 20 76 61  s, and as the va
5d30: 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 6e 65 77  lues for any new
5d40: 2e 2a 20 72 65 66 65 72 65 6e 63 65 73 0a 20 20  .* references.  
5d50: 2a 2a 20 6d 61 64 65 20 62 79 20 74 72 69 67 67  ** made by trigg
5d60: 65 72 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ers..  **.  ** I
5d70: 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
5d80: 6f 72 20 6d 6f 72 65 20 42 45 46 4f 52 45 20 74  or more BEFORE t
5d90: 72 69 67 67 65 72 73 2c 20 74 68 65 6e 20 64 6f  riggers, then do
5da0: 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68   not populate th
5db0: 65 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73  e.  ** registers
5dc0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5dd0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
5de0: 65 20 28 61 29 20 6e 6f 74 20 6d 6f 64 69 66 69  e (a) not modifi
5df0: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ed by.  ** this 
5e00: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
5e10: 20 61 6e 64 20 28 62 29 20 6e 6f 74 20 61 63 63   and (b) not acc
5e20: 65 73 73 65 64 20 62 79 20 6e 65 77 2e 2a 20 72  essed by new.* r
5e30: 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 0a 20  eferences. The. 
5e40: 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 72   ** values for r
5e50: 65 67 69 73 74 65 72 73 20 6e 6f 74 20 6d 6f 64  egisters not mod
5e60: 69 66 69 65 64 20 62 79 20 74 68 65 20 55 50 44  ified by the UPD
5e70: 41 54 45 20 6d 75 73 74 20 62 65 20 72 65 6c 6f  ATE must be relo
5e80: 61 64 65 64 20 66 72 6f 6d 20 0a 20 20 2a 2a 20  aded from .  ** 
5e90: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 66 74  the database aft
5ea0: 65 72 20 74 68 65 20 42 45 46 4f 52 45 20 74 72  er the BEFORE tr
5eb0: 69 67 67 65 72 73 20 61 72 65 20 66 69 72 65 64  iggers are fired
5ec0: 20 61 6e 79 77 61 79 20 28 61 73 20 74 68 65 20   anyway (as the 
5ed0: 74 72 69 67 67 65 72 20 0a 20 20 2a 2a 20 6d 61  trigger .  ** ma
5ee0: 79 20 68 61 76 65 20 6d 6f 64 69 66 69 65 64 20  y have modified 
5ef0: 74 68 65 6d 29 2e 20 53 6f 20 6e 6f 74 20 6c 6f  them). So not lo
5f00: 61 64 69 6e 67 20 74 68 6f 73 65 20 74 68 61 74  ading those that
5f10: 20 61 72 65 20 6e 6f 74 20 67 6f 69 6e 67 20 74   are not going t
5f20: 6f 0a 20 20 2a 2a 20 62 65 20 75 73 65 64 20 65  o.  ** be used e
5f30: 6c 69 6d 69 6e 61 74 65 73 20 73 6f 6d 65 20 72  liminates some r
5f40: 65 64 75 6e 64 61 6e 74 20 6f 70 63 6f 64 65 73  edundant opcodes
5f50: 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 6d 61 73 6b  ..  */.  newmask
5f60: 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65   = sqlite3Trigge
5f70: 72 43 6f 6c 6d 61 73 6b 28 0a 20 20 20 20 20 20  rColmask(.      
5f80: 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
5f90: 2c 20 70 43 68 61 6e 67 65 73 2c 20 31 2c 20 54  , pChanges, 1, T
5fa0: 52 49 47 47 45 52 5f 42 45 46 4f 52 45 2c 20 70  RIGGER_BEFORE, p
5fb0: 54 61 62 2c 20 6f 6e 45 72 72 6f 72 0a 20 20 29  Tab, onError.  )
5fc0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
5fd0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
5fe0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62  .    if( i==pTab
5ff0: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
6000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6010: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
6020: 2c 20 72 65 67 4e 65 77 2b 69 29 3b 0a 20 20 20  , regNew+i);.   
6030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20   }else{.      j 
6040: 3d 20 61 58 52 65 66 5b 69 5d 3b 0a 20 20 20 20  = aXRef[i];.    
6050: 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20    if( j>=0 ){.  
6060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6070: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
6080: 68 61 6e 67 65 73 2d 3e 61 5b 6a 5d 2e 70 45 78  hanges->a[j].pEx
6090: 70 72 2c 20 72 65 67 4e 65 77 2b 69 29 3b 0a 20  pr, regNew+i);. 
60a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 30       }else if( 0
60b0: 3d 3d 28 74 6d 61 73 6b 26 54 52 49 47 47 45 52  ==(tmask&TRIGGER
60c0: 5f 42 45 46 4f 52 45 29 20 7c 7c 20 69 3e 33 31  _BEFORE) || i>31
60d0: 20 7c 7c 20 28 6e 65 77 6d 61 73 6b 20 26 20 4d   || (newmask & M
60e0: 41 53 4b 42 49 54 33 32 28 69 29 29 20 29 7b 0a  ASKBIT32(i)) ){.
60f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
6100: 62 72 61 6e 63 68 20 6c 6f 61 64 73 20 74 68 65  branch loads the
6110: 20 76 61 6c 75 65 20 6f 66 20 61 20 63 6f 6c 75   value of a colu
6120: 6d 6e 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  mn that will not
6130: 20 62 65 20 63 68 61 6e 67 65 64 20 0a 20 20 20   be changed .   
6140: 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 20 72       ** into a r
6150: 65 67 69 73 74 65 72 2e 20 54 68 69 73 20 69 73  egister. This is
6160: 20 64 6f 6e 65 20 69 66 20 74 68 65 72 65 20 61   done if there a
6170: 72 65 20 6e 6f 20 42 45 46 4f 52 45 20 74 72 69  re no BEFORE tri
6180: 67 67 65 72 73 2c 20 6f 72 0a 20 20 20 20 20 20  ggers, or.      
6190: 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72    ** if there ar
61a0: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 42 45  e one or more BE
61b0: 46 4f 52 45 20 74 72 69 67 67 65 72 73 20 74 68  FORE triggers th
61c0: 61 74 20 75 73 65 20 74 68 69 73 20 76 61 6c 75  at use this valu
61d0: 65 20 76 69 61 0a 20 20 20 20 20 20 20 20 2a 2a  e via.        **
61e0: 20 61 20 6e 65 77 2e 2a 20 72 65 66 65 72 65 6e   a new.* referen
61f0: 63 65 20 69 6e 20 61 20 74 72 69 67 67 65 72 20  ce in a trigger 
6200: 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20  program..       
6210: 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74   */.        test
6220: 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20  case( i==31 );. 
6230: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
6240: 20 69 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20 20   i==32 );.      
6250: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
6260: 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
6270: 65 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61  e(v, pTab, iData
6280: 43 75 72 2c 20 69 2c 20 72 65 67 4e 65 77 2b 69  Cur, i, regNew+i
6290: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
62a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
62b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
62c0: 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 4e 65 77 2b  Null, 0, regNew+
62d0: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
62e0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 65  }.  }..  /* Fire
62f0: 20 61 6e 79 20 42 45 46 4f 52 45 20 55 50 44 41   any BEFORE UPDA
6300: 54 45 20 74 72 69 67 67 65 72 73 2e 20 54 68 69  TE triggers. Thi
6310: 73 20 68 61 70 70 65 6e 73 20 62 65 66 6f 72 65  s happens before
6320: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
6330: 0a 20 20 2a 2a 20 76 65 72 69 66 69 65 64 2e 20  .  ** verified. 
6340: 4f 6e 65 20 63 6f 75 6c 64 20 61 72 67 75 65 20  One could argue 
6350: 74 68 61 74 20 74 68 69 73 20 69 73 20 77 72 6f  that this is wro
6360: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74  ng..  */.  if( t
6370: 6d 61 73 6b 26 54 52 49 47 47 45 52 5f 42 45 46  mask&TRIGGER_BEF
6380: 4f 52 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ORE ){.    sqlit
6390: 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28  e3TableAffinity(
63a0: 76 2c 20 70 54 61 62 2c 20 72 65 67 4e 65 77 29  v, pTab, regNew)
63b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
63c0: 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72  eRowTrigger(pPar
63d0: 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 54 4b  se, pTrigger, TK
63e0: 5f 55 50 44 41 54 45 2c 20 70 43 68 61 6e 67 65  _UPDATE, pChange
63f0: 73 2c 20 0a 20 20 20 20 20 20 20 20 54 52 49 47  s, .        TRIG
6400: 47 45 52 5f 42 45 46 4f 52 45 2c 20 70 54 61 62  GER_BEFORE, pTab
6410: 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c 20 6f  , regOldRowid, o
6420: 6e 45 72 72 6f 72 2c 20 6c 61 62 65 6c 43 6f 6e  nError, labelCon
6430: 74 69 6e 75 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  tinue);..    /* 
6440: 54 68 65 20 72 6f 77 2d 74 72 69 67 67 65 72 20  The row-trigger 
6450: 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64  may have deleted
6460: 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 75   the row being u
6470: 70 64 61 74 65 64 2e 20 49 6e 20 74 68 69 73 0a  pdated. In this.
6480: 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 6a 75 6d      ** case, jum
6490: 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  p to the next ro
64a0: 77 2e 20 4e 6f 20 75 70 64 61 74 65 73 20 6f 72  w. No updates or
64b0: 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73 20   AFTER triggers 
64c0: 61 72 65 20 0a 20 20 20 20 2a 2a 20 72 65 71 75  are .    ** requ
64d0: 69 72 65 64 2e 20 54 68 69 73 20 62 65 68 61 76  ired. This behav
64e0: 69 6f 72 20 2d 20 77 68 61 74 20 68 61 70 70 65  ior - what happe
64f0: 6e 73 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ns when the row 
6500: 62 65 69 6e 67 20 75 70 64 61 74 65 64 0a 20 20  being updated.  
6510: 20 20 2a 2a 20 69 73 20 64 65 6c 65 74 65 64 20    ** is deleted 
6520: 6f 72 20 72 65 6e 61 6d 65 64 20 62 79 20 61 20  or renamed by a 
6530: 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 20 2d  BEFORE trigger -
6540: 20 69 73 20 6c 65 66 74 20 75 6e 64 65 66 69 6e   is left undefin
6550: 65 64 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ed in the.    **
6560: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a   documentation..
6570: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
6580: 50 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Pk ){.      sqli
6590: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
65a0: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
65b0: 20 69 44 61 74 61 43 75 72 2c 20 6c 61 62 65 6c   iDataCur, label
65c0: 43 6f 6e 74 69 6e 75 65 2c 72 65 67 4b 65 79 2c  Continue,regKey,
65d0: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 56 64 62  nKey);.      Vdb
65e0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
65f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
6600: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6610: 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
6620: 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 61 62 65  , iDataCur, labe
6630: 6c 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 4f 6c  lContinue, regOl
6640: 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 56  dRowid);.      V
6650: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6660: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 66      }..    /* Af
6670: 74 65 72 2d 42 45 46 4f 52 45 2d 74 72 69 67 67  ter-BEFORE-trigg
6680: 65 72 2d 72 65 6c 6f 61 64 2d 6c 6f 6f 70 3a 0a  er-reload-loop:.
6690: 20 20 20 20 2a 2a 20 49 66 20 69 74 20 64 69 64      ** If it did
66a0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 20   not delete it, 
66b0: 74 68 65 20 42 45 46 4f 52 45 20 74 72 69 67 67  the BEFORE trigg
66c0: 65 72 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76  er may still hav
66d0: 65 20 6d 6f 64 69 66 69 65 64 20 0a 20 20 20 20  e modified .    
66e0: 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63  ** some of the c
66f0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 72 6f  olumns of the ro
6700: 77 20 62 65 69 6e 67 20 75 70 64 61 74 65 64 2e  w being updated.
6710: 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 73   Load the values
6720: 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 61 6c 6c   for .    ** all
6730: 20 63 6f 6c 75 6d 6e 73 20 6e 6f 74 20 6d 6f 64   columns not mod
6740: 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70 64  ified by the upd
6750: 61 74 65 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ate statement in
6760: 74 6f 20 74 68 65 69 72 20 72 65 67 69 73 74 65  to their registe
6770: 72 73 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  rs.    ** in cas
6780: 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
6790: 6e 65 64 2e 20 4f 6e 6c 79 20 75 6e 6d 6f 64 69  ned. Only unmodi
67a0: 66 69 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  fied columns are
67b0: 20 72 65 6c 6f 61 64 65 64 2e 0a 20 20 20 20 2a   reloaded..    *
67c0: 2a 20 54 68 65 20 76 61 6c 75 65 73 20 63 6f 6d  * The values com
67d0: 70 75 74 65 64 20 66 6f 72 20 6d 6f 64 69 66 69  puted for modifi
67e0: 65 64 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  ed columns use t
67f0: 68 65 20 76 61 6c 75 65 73 20 62 65 66 6f 72 65  he values before
6800: 20 74 68 65 0a 20 20 20 20 2a 2a 20 42 45 46 4f   the.    ** BEFO
6810: 52 45 20 74 72 69 67 67 65 72 20 72 75 6e 73 2e  RE trigger runs.
6820: 20 20 53 65 65 20 74 65 73 74 20 63 61 73 65 20    See test case 
6830: 74 72 69 67 67 65 72 31 2d 31 38 2e 30 20 28 61  trigger1-18.0 (a
6840: 64 64 65 64 20 32 30 31 38 2d 30 34 2d 32 36 29  dded 2018-04-26)
6850: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 20 65  .    ** for an e
6860: 78 61 6d 70 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  xample..    */. 
6870: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
6880: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
6890: 20 20 20 20 20 20 69 66 28 20 61 58 52 65 66 5b        if( aXRef[
68a0: 69 5d 3c 30 20 26 26 20 69 21 3d 70 54 61 62 2d  i]<0 && i!=pTab-
68b0: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
68c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
68d0: 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
68e0: 65 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61  e(v, pTab, iData
68f0: 43 75 72 2c 20 69 2c 20 72 65 67 4e 65 77 2b 69  Cur, i, regNew+i
6900: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6910: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 56  .  }..  if( !isV
6920: 69 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  iew ){.    int a
6930: 64 64 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ddr1 = 0;       
6940: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a   /* Address of j
6950: 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ump instruction 
6960: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 63 6f  */..    /* Do co
6970: 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 73 2e  nstraint checks.
6980: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
6990: 72 65 67 4f 6c 64 52 6f 77 69 64 3e 30 20 29 3b  regOldRowid>0 );
69a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65  .    sqlite3Gene
69b0: 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68  rateConstraintCh
69c0: 65 63 6b 73 28 70 50 61 72 73 65 2c 20 70 54 61  ecks(pParse, pTa
69d0: 62 2c 20 61 52 65 67 49 64 78 2c 20 69 44 61 74  b, aRegIdx, iDat
69e0: 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20  aCur, iIdxCur,. 
69f0: 20 20 20 20 20 20 20 72 65 67 4e 65 77 52 6f 77         regNewRow
6a00: 69 64 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c  id, regOldRowid,
6a10: 20 63 68 6e 67 4b 65 79 2c 20 6f 6e 45 72 72 6f   chngKey, onErro
6a20: 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65  r, labelContinue
6a30: 2c 20 26 62 52 65 70 6c 61 63 65 2c 0a 20 20 20  , &bReplace,.   
6a40: 20 20 20 20 20 61 58 52 65 66 2c 20 30 29 3b 0a       aXRef, 0);.
6a50: 0a 20 20 20 20 2f 2a 20 44 6f 20 46 4b 20 63 6f  .    /* Do FK co
6a60: 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 73 2e  nstraint checks.
6a70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73 46   */.    if( hasF
6a80: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
6a90: 65 33 46 6b 43 68 65 63 6b 28 70 50 61 72 73 65  e3FkCheck(pParse
6aa0: 2c 20 70 54 61 62 2c 20 72 65 67 4f 6c 64 52 6f  , pTab, regOldRo
6ab0: 77 69 64 2c 20 30 2c 20 61 58 52 65 66 2c 20 63  wid, 0, aXRef, c
6ac0: 68 6e 67 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 0a  hngKey);.    }..
6ad0: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
6ae0: 65 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  e index entries 
6af0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6b00: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f  the current reco
6b10: 72 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  rd.  */.    if( 
6b20: 62 52 65 70 6c 61 63 65 20 7c 7c 20 63 68 6e 67  bReplace || chng
6b30: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Key ){.      if(
6b40: 20 70 50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20   pPk ){.        
6b50: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
6b60: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6b70: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 44 61  OP_NotFound, iDa
6b80: 74 61 43 75 72 2c 20 30 2c 20 72 65 67 4b 65 79  taCur, 0, regKey
6b90: 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  , nKey);.      }
6ba0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 64  else{.        ad
6bb0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
6bc0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
6bd0: 74 45 78 69 73 74 73 2c 20 69 44 61 74 61 43 75  tExists, iDataCu
6be0: 72 2c 20 30 2c 20 72 65 67 4f 6c 64 52 6f 77 69  r, 0, regOldRowi
6bf0: 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
6c00: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
6c10: 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20  verTaken(v);.   
6c20: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 65   }.    sqlite3Ge
6c30: 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44 65  nerateRowIndexDe
6c40: 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70 54 61  lete(pParse, pTa
6c50: 62 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49 64  b, iDataCur, iId
6c60: 78 43 75 72 2c 20 61 52 65 67 49 64 78 2c 20 2d  xCur, aRegIdx, -
6c70: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63  1);..    /* If c
6c80: 68 61 6e 67 69 6e 67 20 74 68 65 20 72 6f 77 69  hanging the rowi
6c90: 64 20 76 61 6c 75 65 2c 20 6f 72 20 69 66 20 74  d value, or if t
6ca0: 68 65 72 65 20 61 72 65 20 66 6f 72 65 69 67 6e  here are foreign
6cb0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
6cc0: 0a 20 20 20 20 2a 2a 20 74 6f 20 70 72 6f 63 65  .    ** to proce
6cd0: 73 73 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6f  ss, delete the o
6ce0: 6c 64 20 72 65 63 6f 72 64 2e 20 4f 74 68 65 72  ld record. Other
6cf0: 77 69 73 65 2c 20 61 64 64 20 61 20 6e 6f 6f 70  wise, add a noop
6d00: 20 4f 50 5f 44 65 6c 65 74 65 0a 20 20 20 20 2a   OP_Delete.    *
6d10: 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  * to invoke the 
6d20: 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e  pre-update hook.
6d30: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
6d40: 68 61 74 20 28 72 65 67 4e 65 77 3d 3d 72 65 67  hat (regNew==reg
6d50: 6e 65 77 52 6f 77 69 64 2b 31 29 20 69 73 20 74  newRowid+1) is t
6d60: 72 75 65 20 69 73 20 61 6c 73 6f 20 69 6d 70 6f  rue is also impo
6d70: 72 74 61 6e 74 20 66 6f 72 20 74 68 65 20 0a 20  rtant for the . 
6d80: 20 20 20 2a 2a 20 70 72 65 2d 75 70 64 61 74 65     ** pre-update
6d90: 20 68 6f 6f 6b 2e 20 49 66 20 74 68 65 20 63 61   hook. If the ca
6da0: 6c 6c 65 72 20 69 6e 76 6f 6b 65 73 20 70 72 65  ller invokes pre
6db0: 75 70 64 61 74 65 5f 6e 65 77 28 29 2c 20 74 68  update_new(), th
6dc0: 65 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a  e returned.    *
6dd0: 2a 20 76 61 6c 75 65 20 69 73 20 63 6f 70 69 65  * value is copie
6de0: 64 20 66 72 6f 6d 20 6d 65 6d 6f 72 79 20 63 65  d from memory ce
6df0: 6c 6c 20 28 72 65 67 4e 65 77 52 6f 77 69 64 2b  ll (regNewRowid+
6e00: 31 2b 69 43 6f 6c 29 2c 20 77 68 65 72 65 20 69  1+iCol), where i
6e10: 43 6f 6c 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  Col.    ** is th
6e20: 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 73  e column index s
6e30: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 75  upplied by the u
6e40: 73 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ser..    */.    
6e50: 61 73 73 65 72 74 28 20 72 65 67 4e 65 77 3d 3d  assert( regNew==
6e60: 72 65 67 4e 65 77 52 6f 77 69 64 2b 31 20 29 3b  regNewRowid+1 );
6e70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6e80: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
6e90: 48 4f 4f 4b 0a 20 20 20 20 73 71 6c 69 74 65 33  HOOK.    sqlite3
6ea0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6eb0: 5f 44 65 6c 65 74 65 2c 20 69 44 61 74 61 43 75  _Delete, iDataCu
6ec0: 72 2c 0a 20 20 20 20 20 20 20 20 4f 50 46 4c 41  r,.        OPFLA
6ed0: 47 5f 49 53 55 50 44 41 54 45 20 7c 20 28 28 68  G_ISUPDATE | ((h
6ee0: 61 73 46 4b 3e 31 20 7c 7c 20 63 68 6e 67 4b 65  asFK>1 || chngKe
6ef0: 79 29 20 3f 20 30 20 3a 20 4f 50 46 4c 41 47 5f  y) ? 0 : OPFLAG_
6f00: 49 53 4e 4f 4f 50 29 2c 0a 20 20 20 20 20 20 20  ISNOOP),.       
6f10: 20 72 65 67 4e 65 77 52 6f 77 69 64 0a 20 20 20   regNewRowid.   
6f20: 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4f 6e 65   );.    if( eOne
6f30: 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4d 55  Pass==ONEPASS_MU
6f40: 4c 54 49 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LTI ){.      ass
6f50: 65 72 74 28 20 68 61 73 46 4b 3d 3d 30 20 26 26  ert( hasFK==0 &&
6f60: 20 63 68 6e 67 4b 65 79 3d 3d 30 20 29 3b 0a 20   chngKey==0 );. 
6f70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6f80: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
6f90: 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 29  AG_SAVEPOSITION)
6fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6fb0: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
6fc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6fd0: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
6fe0: 70 54 61 62 2c 20 50 34 5f 54 41 42 4c 45 29 3b  pTab, P4_TABLE);
6ff0: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
7000: 20 69 66 28 20 68 61 73 46 4b 3e 31 20 7c 7c 20   if( hasFK>1 || 
7010: 63 68 6e 67 4b 65 79 20 29 7b 0a 20 20 20 20 20  chngKey ){.     
7020: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7030: 70 32 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p2(v, OP_Delete,
7040: 20 69 44 61 74 61 43 75 72 2c 20 30 29 3b 0a 20   iDataCur, 0);. 
7050: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
7060: 69 66 28 20 62 52 65 70 6c 61 63 65 20 7c 7c 20  if( bReplace || 
7070: 63 68 6e 67 4b 65 79 20 29 7b 0a 20 20 20 20 20  chngKey ){.     
7080: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
7090: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
70a0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 68      }..    if( h
70b0: 61 73 46 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  asFK ){.      sq
70c0: 6c 69 74 65 33 46 6b 43 68 65 63 6b 28 70 50 61  lite3FkCheck(pPa
70d0: 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 72 65  rse, pTab, 0, re
70e0: 67 4e 65 77 52 6f 77 69 64 2c 20 61 58 52 65 66  gNewRowid, aXRef
70f0: 2c 20 63 68 6e 67 4b 65 79 29 3b 0a 20 20 20 20  , chngKey);.    
7100: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 6e 73 65  }.  .    /* Inse
7110: 72 74 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78  rt the new index
7120: 20 65 6e 74 72 69 65 73 20 61 6e 64 20 74 68 65   entries and the
7130: 20 6e 65 77 20 72 65 63 6f 72 64 2e 20 2a 2f 0a   new record. */.
7140: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 6c      sqlite3Compl
7150: 65 74 65 49 6e 73 65 72 74 69 6f 6e 28 0a 20 20  eteInsertion(.  
7160: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 54        pParse, pT
7170: 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49  ab, iDataCur, iI
7180: 64 78 43 75 72 2c 20 72 65 67 4e 65 77 52 6f 77  dxCur, regNewRow
7190: 69 64 2c 20 61 52 65 67 49 64 78 2c 20 0a 20 20  id, aRegIdx, .  
71a0: 20 20 20 20 20 20 4f 50 46 4c 41 47 5f 49 53 55        OPFLAG_ISU
71b0: 50 44 41 54 45 20 7c 20 28 65 4f 6e 65 50 61 73  PDATE | (eOnePas
71c0: 73 3d 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  s==ONEPASS_MULTI
71d0: 20 3f 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f   ? OPFLAG_SAVEPO
71e0: 53 49 54 49 4f 4e 20 3a 20 30 29 2c 20 0a 20 20  SITION : 0), .  
71f0: 20 20 20 20 20 20 30 2c 20 30 0a 20 20 20 20 29        0, 0.    )
7200: 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 61 6e 79  ;..    /* Do any
7210: 20 4f 4e 20 43 41 53 43 41 44 45 2c 20 53 45 54   ON CASCADE, SET
7220: 20 4e 55 4c 4c 20 6f 72 20 53 45 54 20 44 45 46   NULL or SET DEF
7230: 41 55 4c 54 20 6f 70 65 72 61 74 69 6f 6e 73 20  AULT operations 
7240: 72 65 71 75 69 72 65 64 20 74 6f 0a 20 20 20 20  required to.    
7250: 2a 2a 20 68 61 6e 64 6c 65 20 72 6f 77 73 20 28  ** handle rows (
7260: 70 6f 73 73 69 62 6c 79 20 69 6e 20 6f 74 68 65  possibly in othe
7270: 72 20 74 61 62 6c 65 73 29 20 74 68 61 74 20 72  r tables) that r
7280: 65 66 65 72 20 76 69 61 20 61 20 66 6f 72 65 69  efer via a forei
7290: 67 6e 20 6b 65 79 0a 20 20 20 20 2a 2a 20 74 6f  gn key.    ** to
72a0: 20 74 68 65 20 72 6f 77 20 6a 75 73 74 20 75 70   the row just up
72b0: 64 61 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69  dated. */ .    i
72c0: 66 28 20 68 61 73 46 4b 20 29 7b 0a 20 20 20 20  f( hasFK ){.    
72d0: 20 20 73 71 6c 69 74 65 33 46 6b 41 63 74 69 6f    sqlite3FkActio
72e0: 6e 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ns(pParse, pTab,
72f0: 20 70 43 68 61 6e 67 65 73 2c 20 72 65 67 4f 6c   pChanges, regOl
7300: 64 52 6f 77 69 64 2c 20 61 58 52 65 66 2c 20 63  dRowid, aXRef, c
7310: 68 6e 67 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20  hngKey);.    }. 
7320: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
7330: 6e 74 20 74 68 65 20 72 6f 77 20 63 6f 75 6e 74  nt the row count
7340: 65 72 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er .  */.  if( r
7350: 65 67 52 6f 77 43 6f 75 6e 74 20 29 7b 0a 20 20  egRowCount ){.  
7360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7370: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
7380: 2c 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20 31  , regRowCount, 1
7390: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
73a0: 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28  3CodeRowTrigger(
73b0: 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
73c0: 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 70 43 68  , TK_UPDATE, pCh
73d0: 61 6e 67 65 73 2c 20 0a 20 20 20 20 20 20 54 52  anges, .      TR
73e0: 49 47 47 45 52 5f 41 46 54 45 52 2c 20 70 54 61  IGGER_AFTER, pTa
73f0: 62 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c 20  b, regOldRowid, 
7400: 6f 6e 45 72 72 6f 72 2c 20 6c 61 62 65 6c 43 6f  onError, labelCo
7410: 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 2f 2a 20 52  ntinue);..  /* R
7420: 65 70 65 61 74 20 74 68 65 20 61 62 6f 76 65 20  epeat the above 
7430: 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 72 65  with the next re
7440: 63 6f 72 64 20 74 6f 20 62 65 20 75 70 64 61 74  cord to be updat
7450: 65 64 2c 20 75 6e 74 69 6c 0a 20 20 2a 2a 20 61  ed, until.  ** a
7460: 6c 6c 20 72 65 63 6f 72 64 20 73 65 6c 65 63 74  ll record select
7470: 65 64 20 62 79 20 74 68 65 20 57 48 45 52 45 20  ed by the WHERE 
7480: 63 6c 61 75 73 65 20 68 61 76 65 20 62 65 65 6e  clause have been
7490: 20 75 70 64 61 74 65 64 2e 0a 20 20 2a 2f 0a 20   updated..  */. 
74a0: 20 69 66 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f   if( eOnePass==O
74b0: 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 29 7b  NEPASS_SINGLE ){
74c0: 0a 20 20 20 20 2f 2a 20 4e 6f 74 68 69 6e 67 20  .    /* Nothing 
74d0: 74 6f 20 64 6f 20 61 74 20 65 6e 64 2d 6f 66 2d  to do at end-of-
74e0: 6c 6f 6f 70 20 66 6f 72 20 61 20 73 69 6e 67 6c  loop for a singl
74f0: 65 2d 70 61 73 73 20 2a 2f 0a 20 20 7d 65 6c 73  e-pass */.  }els
7500: 65 20 69 66 28 20 65 4f 6e 65 50 61 73 73 3d 3d  e if( eOnePass==
7510: 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 29 7b  ONEPASS_MULTI ){
7520: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7530: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
7540: 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 29 3b 0a  labelContinue);.
7550: 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
7560: 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
7570: 65 6c 73 65 20 69 66 28 20 70 50 6b 20 29 7b 0a  else if( pPk ){.
7580: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
7590: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
75a0: 61 62 65 6c 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  abelContinue);. 
75b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
75c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
75d0: 20 69 45 70 68 2c 20 61 64 64 72 54 6f 70 29 3b   iEph, addrTop);
75e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
75f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
7600: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
7610: 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 29  , labelContinue)
7620: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
7630: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
7640: 76 2c 20 6c 61 62 65 6c 42 72 65 61 6b 29 3b 0a  v, labelBreak);.
7650: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
7660: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
7670: 20 74 61 62 6c 65 20 62 79 20 73 74 6f 72 69 6e   table by storin
7680: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
7690: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 78 69 6d 75   the.  ** maximu
76a0: 6d 20 72 6f 77 69 64 20 63 6f 75 6e 74 65 72 20  m rowid counter 
76b0: 76 61 6c 75 65 73 20 72 65 63 6f 72 64 65 64 20  values recorded 
76c0: 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20  while inserting 
76d0: 69 6e 74 6f 0a 20 20 2a 2a 20 61 75 74 6f 69 6e  into.  ** autoin
76e0: 63 72 65 6d 65 6e 74 20 74 61 62 6c 65 73 2e 0a  crement tables..
76f0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
7700: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 26 26 20  e->nested==0 && 
7710: 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
7720: 54 61 62 3d 3d 30 20 26 26 20 70 55 70 73 65 72  Tab==0 && pUpser
7730: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
7740: 74 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  te3Autoincrement
7750: 45 6e 64 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  End(pParse);.  }
7760: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 74 75  ..  /*.  ** Retu
7770: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
7780: 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20   rows that were 
7790: 63 68 61 6e 67 65 64 2c 20 69 66 20 77 65 20 61  changed, if we a
77a0: 72 65 20 74 72 61 63 6b 69 6e 67 0a 20 20 2a 2a  re tracking.  **
77b0: 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   that informatio
77c0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  n..  */.  if( re
77d0: 67 52 6f 77 43 6f 75 6e 74 20 29 7b 0a 20 20 20  gRowCount ){.   
77e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
77f0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
7800: 6f 77 2c 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c  ow, regRowCount,
7810: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
7820: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
7830: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
7840: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
7850: 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, 0, COLNAME_NA
7860: 4d 45 2c 20 22 72 6f 77 73 20 75 70 64 61 74 65  ME, "rows update
7870: 64 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  d", SQLITE_STATI
7880: 43 29 3b 0a 20 20 7d 0a 0a 75 70 64 61 74 65 5f  C);.  }..update_
7890: 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
78a0: 65 33 41 75 74 68 43 6f 6e 74 65 78 74 50 6f 70  e3AuthContextPop
78b0: 28 26 73 43 6f 6e 74 65 78 74 29 3b 0a 20 20 73  (&sContext);.  s
78c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
78d0: 20 61 58 52 65 66 29 3b 20 2f 2a 20 41 6c 73 6f   aXRef); /* Also
78e0: 20 66 72 65 65 73 20 61 52 65 67 49 64 78 5b 5d   frees aRegIdx[]
78f0: 20 61 6e 64 20 61 54 6f 4f 70 65 6e 5b 5d 20 2a   and aToOpen[] *
7900: 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  /.  sqlite3SrcLi
7910: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  stDelete(db, pTa
7920: 62 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  bList);.  sqlite
7930: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
7940: 64 62 2c 20 70 43 68 61 6e 67 65 73 29 3b 0a 20  db, pChanges);. 
7950: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7960: 74 65 28 64 62 2c 20 70 57 68 65 72 65 29 3b 0a  te(db, pWhere);.
7970: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
7980: 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45  TE_ENABLE_UPDATE
7990: 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20 0a  _DELETE_LIMIT) .
79a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
79b0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 72 64  tDelete(db, pOrd
79c0: 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  erBy);.  sqlite3
79d0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
79e0: 4c 69 6d 69 74 29 3b 0a 23 65 6e 64 69 66 0a 20  Limit);.#endif. 
79f0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 20 4d 61   return;.}./* Ma
7a00: 6b 65 20 73 75 72 65 20 22 69 73 56 69 65 77 22  ke sure "isView"
7a10: 20 61 6e 64 20 6f 74 68 65 72 20 6d 61 63 72 6f   and other macro
7a20: 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65 20  s defined above 
7a30: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 4f  are undefined. O
7a40: 74 68 65 72 77 69 73 65 0a 2a 2a 20 74 68 65 79  therwise.** they
7a50: 20 6d 61 79 20 69 6e 74 65 72 66 65 72 65 20 77   may interfere w
7a60: 69 74 68 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  ith compilation 
7a70: 6f 66 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f  of other functio
7a80: 6e 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 0a  ns in this file.
7a90: 2a 2a 20 28 6f 72 20 69 6e 20 61 6e 6f 74 68 65  ** (or in anothe
7aa0: 72 20 66 69 6c 65 2c 20 69 66 20 74 68 69 73 20  r file, if this 
7ab0: 66 69 6c 65 20 62 65 63 6f 6d 65 73 20 70 61 72  file becomes par
7ac0: 74 20 6f 66 20 74 68 65 20 61 6d 61 6c 67 61 6d  t of the amalgam
7ad0: 61 74 69 6f 6e 29 2e 20 20 2a 2f 0a 23 69 66 64  ation).  */.#ifd
7ae0: 65 66 20 69 73 56 69 65 77 0a 20 23 75 6e 64 65  ef isView. #unde
7af0: 66 20 69 73 56 69 65 77 0a 23 65 6e 64 69 66 0a  f isView.#endif.
7b00: 23 69 66 64 65 66 20 70 54 72 69 67 67 65 72 0a  #ifdef pTrigger.
7b10: 20 23 75 6e 64 65 66 20 70 54 72 69 67 67 65 72   #undef pTrigger
7b20: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
7b30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7b40: 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
7b50: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
7b60: 72 20 61 6e 20 55 50 44 41 54 45 20 6f 66 20 61  r an UPDATE of a
7b70: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
7b80: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
7b90: 74 77 6f 20 70 6f 73 73 69 62 6c 65 20 73 74 72  two possible str
7ba0: 61 74 65 67 69 65 73 20 2d 20 74 68 65 20 64 65  ategies - the de
7bb0: 66 61 75 6c 74 20 61 6e 64 20 74 68 65 20 73 70  fault and the sp
7bc0: 65 63 69 61 6c 20 0a 2a 2a 20 22 6f 6e 65 70 61  ecial .** "onepa
7bd0: 73 73 22 20 73 74 72 61 74 65 67 79 2e 20 4f 6e  ss" strategy. On
7be0: 65 70 61 73 73 20 69 73 20 6f 6e 6c 79 20 75 73  epass is only us
7bf0: 65 64 20 69 66 20 74 68 65 20 76 69 72 74 75 61  ed if the virtua
7c00: 6c 20 74 61 62 6c 65 20 0a 2a 2a 20 69 6d 70 6c  l table .** impl
7c10: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 64 69 63  ementation indic
7c20: 61 74 65 73 20 74 68 61 74 20 70 57 68 65 72 65  ates that pWhere
7c30: 20 6d 61 79 20 6d 61 74 63 68 20 61 74 20 6d 6f   may match at mo
7c40: 73 74 20 6f 6e 65 20 72 6f 77 2e 0a 2a 2a 0a 2a  st one row..**.*
7c50: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 74  * The default st
7c60: 72 61 74 65 67 79 20 69 73 20 74 6f 20 63 72 65  rategy is to cre
7c70: 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
7c80: 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74   table that cont
7c90: 61 69 6e 73 0a 2a 2a 20 66 6f 72 20 65 61 63 68  ains.** for each
7ca0: 20 72 6f 77 20 74 6f 20 62 65 20 63 68 61 6e 67   row to be chang
7cb0: 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 41 29 20  ed:.**.**   (A) 
7cc0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 6f   The original ro
7cd0: 77 69 64 20 6f 66 20 74 68 61 74 20 72 6f 77 2e  wid of that row.
7ce0: 0a 2a 2a 20 20 20 28 42 29 20 20 54 68 65 20 72  .**   (B)  The r
7cf0: 65 76 69 73 65 64 20 72 6f 77 69 64 20 66 6f 72  evised rowid for
7d00: 20 74 68 65 20 72 6f 77 2e 0a 2a 2a 20 20 20 28   the row..**   (
7d10: 43 29 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  C)  The content 
7d20: 6f 66 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  of every column 
7d30: 69 6e 20 74 68 65 20 72 6f 77 2e 0a 2a 2a 0a 2a  in the row..**.*
7d40: 2a 20 54 68 65 6e 20 6c 6f 6f 70 20 74 68 72 6f  * Then loop thro
7d50: 75 67 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ugh the contents
7d60: 20 6f 66 20 74 68 69 73 20 65 70 68 65 6d 65 72   of this ephemer
7d70: 61 6c 20 74 61 62 6c 65 20 65 78 65 63 75 74 69  al table executi
7d80: 6e 67 20 61 0a 2a 2a 20 56 55 70 64 61 74 65 20  ng a.** VUpdate 
7d90: 66 6f 72 20 65 61 63 68 20 72 6f 77 2e 20 57 68  for each row. Wh
7da0: 65 6e 20 66 69 6e 69 73 68 65 64 2c 20 64 72 6f  en finished, dro
7db0: 70 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  p the ephemeral 
7dc0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
7dd0: 20 22 6f 6e 65 70 61 73 73 22 20 73 74 72 61 74   "onepass" strat
7de0: 65 67 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  egy does not use
7df0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
7e00: 62 6c 65 2e 20 49 6e 73 74 65 61 64 2c 20 69 74  ble. Instead, it
7e10: 0a 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 73  .** stores the s
7e20: 61 6d 65 20 76 61 6c 75 65 73 20 28 41 2c 20 42  ame values (A, B
7e30: 20 61 6e 64 20 43 20 61 62 6f 76 65 29 20 69 6e   and C above) in
7e40: 20 61 20 72 65 67 69 73 74 65 72 20 61 72 72 61   a register arra
7e50: 79 20 61 6e 64 0a 2a 2a 20 6d 61 6b 65 73 20 61  y and.** makes a
7e60: 20 73 69 6e 67 6c 65 20 69 6e 76 6f 63 61 74 69   single invocati
7e70: 6f 6e 20 6f 66 20 56 55 70 64 61 74 65 2e 0a 2a  on of VUpdate..*
7e80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
7e90: 64 61 74 65 56 69 72 74 75 61 6c 54 61 62 6c 65  dateVirtualTable
7ea0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7eb0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
7ec0: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
7ed0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
7ee0: 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rc,       /* The
7ef0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
7f00: 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20 2a 2f  o be modified */
7f10: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
7f20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
7f30: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
7f40: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61    ExprList *pCha
7f50: 6e 67 65 73 2c 20 20 2f 2a 20 54 68 65 20 63 6f  nges,  /* The co
7f60: 6c 75 6d 6e 73 20 74 6f 20 63 68 61 6e 67 65 20  lumns to change 
7f70: 69 6e 20 74 68 65 20 55 50 44 41 54 45 20 73 74  in the UPDATE st
7f80: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  atement */.  Exp
7f90: 72 20 2a 70 52 6f 77 69 64 2c 20 20 20 20 20 20  r *pRowid,      
7fa0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
7fb0: 75 73 65 64 20 74 6f 20 72 65 63 6f 6d 70 75 74  used to recomput
7fc0: 65 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  e the rowid */. 
7fd0: 20 69 6e 74 20 2a 61 58 52 65 66 2c 20 20 20 20   int *aXRef,    
7fe0: 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
7ff0: 20 66 72 6f 6d 20 63 6f 6c 75 6d 6e 73 20 6f 66   from columns of
8000: 20 70 54 61 62 20 74 6f 20 65 6e 74 72 69 65 73   pTab to entries
8010: 20 69 6e 20 70 43 68 61 6e 67 65 73 20 2a 2f 0a   in pChanges */.
8020: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
8030: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
8040: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 55 50  clause of the UP
8050: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  DATE statement *
8060: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20  /.  int onError 
8070: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43           /* ON C
8080: 4f 4e 46 4c 49 43 54 20 73 74 72 61 74 65 67 79  ONFLICT strategy
8090: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
80a0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
80b0: 3b 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61  ;  /* Virtual ma
80c0: 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
80d0: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
80e0: 74 20 65 70 68 65 6d 54 61 62 3b 20 20 20 20 20  t ephemTab;     
80f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
8100: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 73   holding the res
8110: 75 6c 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ult of the SELEC
8120: 54 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  T */.  int i;   
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8140: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8150: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
8160: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
8170: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
8180: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ection */.  cons
8190: 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
81a0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
81b0: 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62  ite3GetVTable(db
81c0: 2c 20 70 54 61 62 29 3b 0a 20 20 57 68 65 72 65  , pTab);.  Where
81d0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
81e0: 69 6e 74 20 6e 41 72 67 20 3d 20 32 20 2b 20 70  int nArg = 2 + p
81f0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 20 20 20 20 20  Tab->nCol;      
8200: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
8210: 75 6d 65 6e 74 73 20 74 6f 20 56 55 70 64 61 74  uments to VUpdat
8220: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 72  e */.  int regAr
8230: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
8240: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8250: 72 65 67 69 73 74 65 72 20 69 6e 20 56 55 70 64  register in VUpd
8260: 61 74 65 20 61 72 67 20 61 72 72 61 79 20 2a 2f  ate arg array */
8270: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20  .  int regRec;  
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8290: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 69     /* Register i
82a0: 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d  n which to assem
82b0: 62 6c 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ble record */.  
82c0: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20  int regRowid;   
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82e0: 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
82f0: 65 70 68 65 6d 20 74 61 62 6c 65 20 72 6f 77 69  ephem table rowi
8300: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 73 72 20  d */.  int iCsr 
8310: 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  = pSrc->a[0].iCu
8320: 72 73 6f 72 3b 20 20 2f 2a 20 43 75 72 73 6f 72  rsor;  /* Cursor
8330: 20 75 73 65 64 20 66 6f 72 20 76 69 72 74 75 61   used for virtua
8340: 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
8350: 20 20 69 6e 74 20 61 44 75 6d 6d 79 5b 32 5d 3b    int aDummy[2];
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 2f 2a 20 55 6e 75 73 65 64 20 61 72 67 20    /* Unused arg 
8380: 66 6f 72 20 73 71 6c 69 74 65 33 57 68 65 72 65  for sqlite3Where
8390: 4f 6b 4f 6e 65 50 61 73 73 28 29 20 2a 2f 0a 20  OkOnePass() */. 
83a0: 20 69 6e 74 20 65 4f 6e 65 50 61 73 73 3b 20 20   int eOnePass;  
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
83d0: 6f 6e 65 70 61 73 73 20 73 74 72 61 74 65 67 79  onepass strategy
83e0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20   */.  int addr; 
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
8410: 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   of OP_OpenEphem
8420: 65 72 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  eral */..  /* Al
8430: 6c 6f 63 61 74 65 20 6e 41 72 67 20 72 65 67 69  locate nArg regi
8440: 73 74 65 72 73 20 69 6e 20 77 68 69 63 68 20 74  sters in which t
8450: 6f 20 67 61 74 68 65 72 20 74 68 65 20 61 72 67  o gather the arg
8460: 75 6d 65 6e 74 73 20 66 6f 72 20 56 55 70 64 61  uments for VUpda
8470: 74 65 2e 20 54 68 65 6e 0a 20 20 2a 2a 20 63 72  te. Then.  ** cr
8480: 65 61 74 65 20 61 6e 64 20 6f 70 65 6e 20 74 68  eate and open th
8490: 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
84a0: 65 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72  e in which the r
84b0: 65 63 6f 72 64 73 20 63 72 65 61 74 65 64 20 66  ecords created f
84c0: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 73 65 20 61  rom.  ** these a
84d0: 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65  rguments will be
84e0: 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 73 74 6f   temporarily sto
84f0: 72 65 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  red. */.  assert
8500: 28 20 76 20 29 3b 0a 20 20 65 70 68 65 6d 54 61  ( v );.  ephemTa
8510: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
8520: 2b 2b 3b 0a 20 20 61 64 64 72 3d 20 73 71 6c 69  ++;.  addr= sqli
8530: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8540: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
8550: 6c 2c 20 65 70 68 65 6d 54 61 62 2c 20 6e 41 72  l, ephemTab, nAr
8560: 67 29 3b 0a 20 20 72 65 67 41 72 67 20 3d 20 70  g);.  regArg = p
8570: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
8580: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
8590: 2b 3d 20 6e 41 72 67 3b 0a 20 20 72 65 67 52 65  += nArg;.  regRe
85a0: 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  c = ++pParse->nM
85b0: 65 6d 3b 0a 20 20 72 65 67 52 6f 77 69 64 20 3d  em;.  regRowid =
85c0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
85d0: 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 73 63 61  ..  /* Start sca
85e0: 6e 6e 69 6e 67 20 74 68 65 20 76 69 72 74 75 61  nning the virtua
85f0: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 57 49  l table */.  pWI
8600: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
8610: 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
8620: 70 53 72 63 2c 20 70 57 68 65 72 65 2c 20 30 2c  pSrc, pWhere, 0,
8630: 30 2c 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  0,WHERE_ONEPASS_
8640: 44 45 53 49 52 45 44 2c 30 29 3b 0a 20 20 69 66  DESIRED,0);.  if
8650: 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 72 65  ( pWInfo==0 ) re
8660: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 6f 70 75  turn;..  /* Popu
8670: 6c 61 74 65 20 74 68 65 20 61 72 67 75 6d 65 6e  late the argumen
8680: 74 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a  t registers. */.
8690: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
86a0: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
86b0: 20 20 20 69 66 28 20 61 58 52 65 66 5b 69 5d 3e     if( aXRef[i]>
86c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
86d0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
86e0: 73 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b  se, pChanges->a[
86f0: 61 58 52 65 66 5b 69 5d 5d 2e 70 45 78 70 72 2c  aXRef[i]].pExpr,
8700: 20 72 65 67 41 72 67 2b 32 2b 69 29 3b 0a 20 20   regArg+2+i);.  
8710: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
8720: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8730: 28 76 2c 20 4f 50 5f 56 43 6f 6c 75 6d 6e 2c 20  (v, OP_VColumn, 
8740: 69 43 73 72 2c 20 69 2c 20 72 65 67 41 72 67 2b  iCsr, i, regArg+
8750: 32 2b 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  2+i);.      sqli
8760: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
8770: 76 2c 20 4f 50 46 4c 41 47 5f 4e 4f 43 48 4e 47  v, OPFLAG_NOCHNG
8780: 29 3b 2f 2a 20 45 6e 61 62 6c 65 20 73 71 6c 69  );/* Enable sqli
8790: 74 65 33 5f 76 74 61 62 5f 6e 6f 63 68 61 6e 67  te3_vtab_nochang
87a0: 65 28 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  e() */.    }.  }
87b0: 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  .  if( HasRowid(
87c0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
87d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
87e0: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 73 72  , OP_Rowid, iCsr
87f0: 2c 20 72 65 67 41 72 67 29 3b 0a 20 20 20 20 69  , regArg);.    i
8800: 66 28 20 70 52 6f 77 69 64 20 29 7b 0a 20 20 20  f( pRowid ){.   
8810: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
8820: 64 65 28 70 50 61 72 73 65 2c 20 70 52 6f 77 69  de(pParse, pRowi
8830: 64 2c 20 72 65 67 41 72 67 2b 31 29 3b 0a 20 20  d, regArg+1);.  
8840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
8850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8860: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43  (v, OP_Rowid, iC
8870: 73 72 2c 20 72 65 67 41 72 67 2b 31 29 3b 0a 20  sr, regArg+1);. 
8880: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
8890: 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 20 20 20    Index *pPk;   
88a0: 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  /* PRIMARY KEY i
88b0: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 31 36 20  ndex */.    i16 
88c0: 69 50 6b 3b 20 20 20 20 20 20 2f 2a 20 50 52 49  iPk;      /* PRI
88d0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
88e0: 2a 2f 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  */.    pPk = sql
88f0: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
8900: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 61  dex(pTab);.    a
8910: 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b  ssert( pPk!=0 );
8920: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b  .    assert( pPk
8930: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a  ->nKeyCol==1 );.
8940: 20 20 20 20 69 50 6b 20 3d 20 70 50 6b 2d 3e 61      iPk = pPk->a
8950: 69 43 6f 6c 75 6d 6e 5b 30 5d 3b 0a 20 20 20 20  iColumn[0];.    
8960: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8970: 33 28 76 2c 20 4f 50 5f 56 43 6f 6c 75 6d 6e 2c  3(v, OP_VColumn,
8980: 20 69 43 73 72 2c 20 69 50 6b 2c 20 72 65 67 41   iCsr, iPk, regA
8990: 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
89a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
89b0: 5f 53 43 6f 70 79 2c 20 72 65 67 41 72 67 2b 32  _SCopy, regArg+2
89c0: 2b 69 50 6b 2c 20 72 65 67 41 72 67 2b 31 29 3b  +iPk, regArg+1);
89d0: 0a 20 20 7d 0a 0a 20 20 65 4f 6e 65 50 61 73 73  .  }..  eOnePass
89e0: 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f   = sqlite3WhereO
89f0: 6b 4f 6e 65 50 61 73 73 28 70 57 49 6e 66 6f 2c  kOnePass(pWInfo,
8a00: 20 61 44 75 6d 6d 79 29 3b 0a 0a 20 20 2f 2a 20   aDummy);..  /* 
8a10: 54 68 65 72 65 20 69 73 20 6e 6f 20 4f 4e 45 50  There is no ONEP
8a20: 41 53 53 5f 4d 55 4c 54 49 20 6f 6e 20 76 69 72  ASS_MULTI on vir
8a30: 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tual tables */. 
8a40: 20 61 73 73 65 72 74 28 20 65 4f 6e 65 50 61 73   assert( eOnePas
8a50: 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 7c  s==ONEPASS_OFF |
8a60: 7c 20 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  | eOnePass==ONEP
8a70: 41 53 53 5f 53 49 4e 47 4c 45 20 29 3b 0a 0a 20  ASS_SINGLE );.. 
8a80: 20 69 66 28 20 65 4f 6e 65 50 61 73 73 20 29 7b   if( eOnePass ){
8a90: 0a 20 20 20 20 2f 2a 20 49 66 20 75 73 69 6e 67  .    /* If using
8aa0: 20 74 68 65 20 6f 6e 65 70 61 73 73 20 73 74 72   the onepass str
8ab0: 61 74 65 67 79 2c 20 6e 6f 2d 6f 70 20 6f 75 74  ategy, no-op out
8ac0: 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
8ad0: 6d 65 72 61 6c 20 63 6f 64 65 64 0a 20 20 20 20  meral coded.    
8ae0: 2a 2a 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20  ** above. */.   
8af0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8b00: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
8b10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8b20: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
8b30: 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 7d  lose, iCsr);.  }
8b40: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 72 65  else{.    /* Cre
8b50: 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f  ate a record fro
8b60: 6d 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 72  m the argument r
8b70: 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e 74 73  egister contents
8b80: 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
8b90: 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  nto.    ** the e
8ba0: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20  phemeral table. 
8bb0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 75  */.    sqlite3Mu
8bc0: 6c 74 69 57 72 69 74 65 28 70 50 61 72 73 65 29  ltiWrite(pParse)
8bd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8be0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
8bf0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 41 72 67  keRecord, regArg
8c00: 2c 20 6e 41 72 67 2c 20 72 65 67 52 65 63 29 3b  , nArg, regRec);
8c10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8c20: 45 42 55 47 0a 20 20 20 20 2f 2a 20 53 69 67 6e  EBUG.    /* Sign
8c30: 61 6c 20 61 6e 20 61 73 73 65 72 74 28 29 20 77  al an assert() w
8c40: 69 74 68 69 6e 20 4f 50 5f 4d 61 6b 65 52 65 63  ithin OP_MakeRec
8c50: 6f 72 64 20 74 68 61 74 20 69 74 20 69 73 20 61  ord that it is a
8c60: 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a  llowed to.    **
8c70: 20 61 63 63 65 70 74 20 6e 6f 2d 63 68 61 6e 67   accept no-chang
8c80: 65 20 72 65 63 6f 72 64 73 20 77 69 74 68 20 73  e records with s
8c90: 65 72 69 61 6c 5f 74 79 70 65 20 31 30 20 2a 2f  erial_type 10 */
8ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8cb0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8cc0: 41 47 5f 4e 4f 43 48 4e 47 5f 4d 41 47 49 43 29  AG_NOCHNG_MAGIC)
8cd0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
8ce0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8cf0: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 65  , OP_NewRowid, e
8d00: 70 68 65 6d 54 61 62 2c 20 72 65 67 52 6f 77 69  phemTab, regRowi
8d10: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
8d20: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8d30: 49 6e 73 65 72 74 2c 20 65 70 68 65 6d 54 61 62  Insert, ephemTab
8d40: 2c 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77  , regRec, regRow
8d50: 69 64 29 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28  id);.  }...  if(
8d60: 20 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41   eOnePass==ONEPA
8d70: 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 2f 2a  SS_OFF ){.    /*
8d80: 20 45 6e 64 20 74 68 65 20 76 69 72 74 75 61 6c   End the virtual
8d90: 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
8da0: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
8db0: 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 20  nd(pWInfo);..   
8dc0: 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e 6e   /* Begin scannn
8dd0: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
8de0: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
8df0: 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 73   */.    addr = s
8e00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
8e10: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 65  (v, OP_Rewind, e
8e20: 70 68 65 6d 54 61 62 29 3b 20 56 64 62 65 43 6f  phemTab); VdbeCo
8e30: 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
8e40: 2f 2a 20 45 78 74 72 61 63 74 20 61 72 67 75 6d  /* Extract argum
8e50: 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 63 75  ents from the cu
8e60: 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
8e70: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
8e80: 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 69 6e 76   and .    ** inv
8e90: 6f 6b 65 20 74 68 65 20 56 55 70 64 61 74 65 20  oke the VUpdate 
8ea0: 6d 65 74 68 6f 64 2e 20 20 2a 2f 0a 20 20 20 20  method.  */.    
8eb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
8ec0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
8ed0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8ee0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 65 70 68  , OP_Column, eph
8ef0: 65 6d 54 61 62 2c 20 69 2c 20 72 65 67 41 72 67  emTab, i, regArg
8f00: 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +i);.    }.  }. 
8f10: 20 73 71 6c 69 74 65 33 56 74 61 62 4d 61 6b 65   sqlite3VtabMake
8f20: 57 72 69 74 61 62 6c 65 28 70 50 61 72 73 65 2c  Writable(pParse,
8f30: 20 70 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65   pTab);.  sqlite
8f40: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
8f50: 50 5f 56 55 70 64 61 74 65 2c 20 30 2c 20 6e 41  P_VUpdate, 0, nA
8f60: 72 67 2c 20 72 65 67 41 72 67 2c 20 70 56 54 61  rg, regArg, pVTa
8f70: 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 73  b, P4_VTAB);.  s
8f80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8f90: 50 35 28 76 2c 20 6f 6e 45 72 72 6f 72 3d 3d 4f  P5(v, onError==O
8fa0: 45 5f 44 65 66 61 75 6c 74 20 3f 20 4f 45 5f 41  E_Default ? OE_A
8fb0: 62 6f 72 74 20 3a 20 6f 6e 45 72 72 6f 72 29 3b  bort : onError);
8fc0: 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f  .  sqlite3MayAbo
8fd0: 72 74 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f  rt(pParse);..  /
8fe0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 65 70 68  * End of the eph
8ff0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 73 63 61  emeral table sca
9000: 6e 2e 20 4f 72 2c 20 69 66 20 75 73 69 6e 67 20  n. Or, if using 
9010: 74 68 65 20 6f 6e 65 70 61 73 73 20 73 74 72 61  the onepass stra
9020: 74 65 67 79 2c 0a 20 20 2a 2a 20 6a 75 6d 70 20  tegy,.  ** jump 
9030: 74 6f 20 68 65 72 65 20 69 66 20 74 68 65 20 73  to here if the s
9040: 63 61 6e 20 76 69 73 69 74 65 64 20 7a 65 72 6f  can visited zero
9050: 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 69 66 28 20   rows. */.  if( 
9060: 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
9070: 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 73 71 6c  S_OFF ){.    sql
9080: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9090: 2c 20 4f 50 5f 4e 65 78 74 2c 20 65 70 68 65 6d  , OP_Next, ephem
90a0: 54 61 62 2c 20 61 64 64 72 2b 31 29 3b 20 56 64  Tab, addr+1); Vd
90b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
90c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
90d0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
90e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
90f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
9100: 73 65 2c 20 65 70 68 65 6d 54 61 62 2c 20 30 29  se, ephemTab, 0)
9110: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
9120: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
9130: 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 23 65  WInfo);.  }.}.#e
9140: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9150: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
9160: 20 2a 2f 0a                                       */.