/ Hex Artifact Content
Login

Artifact b25b06e7e2bfccdb200ce2c1f72301485312cf33b50bb5af3f460d58b527a58c:


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 50 72 6f 63 65 73 73 20 61 6e 20 55 50 44 41   Process an UPDA
0d20: 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  TE statement..**
0d30: 0a 2a 2a 20 20 20 55 50 44 41 54 45 20 4f 52 20  .**   UPDATE OR 
0d40: 49 47 4e 4f 52 45 20 74 61 62 6c 65 5f 77 78 79  IGNORE table_wxy
0d50: 7a 20 53 45 54 20 61 3d 62 2c 20 63 3d 64 20 57  z SET a=b, c=d W
0d60: 48 45 52 45 20 65 3c 35 20 41 4e 44 20 66 20 4e  HERE e<5 AND f N
0d70: 4f 54 20 4e 55 4c 4c 3b 0a 2a 2a 20 20 20 20 20  OT NULL;.**     
0d80: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 2f 20 5c       \_______/ \
0d90: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
0da0: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 5c 5f 5f  _____/       \__
0db0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
0dc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 45  *            onE
0dd0: 72 72 6f 72 20 20 20 70 54 61 62 4c 69 73 74 20  rror   pTabList 
0de0: 20 20 20 20 20 70 43 68 61 6e 67 65 73 20 20 20       pChanges   
0df0: 20 20 20 20 20 20 20 20 20 20 70 57 68 65 72 65            pWhere
0e00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0e10: 55 70 64 61 74 65 28 0a 20 20 50 61 72 73 65 20  Update(.  Parse 
0e20: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0e30: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
0e40: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
0e50: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
0e60: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
0e70: 69 6e 20 77 68 69 63 68 20 77 65 20 73 68 6f 75  in which we shou
0e80: 6c 64 20 63 68 61 6e 67 65 20 74 68 69 6e 67 73  ld change things
0e90: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
0ea0: 70 43 68 61 6e 67 65 73 2c 20 20 20 20 2f 2a 20  pChanges,    /* 
0eb0: 54 68 69 6e 67 73 20 74 6f 20 62 65 20 63 68 61  Things to be cha
0ec0: 6e 67 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nged */.  Expr *
0ed0: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
0ee0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
0ef0: 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 6e 75  ause.  May be nu
0f00: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ll */.  int onEr
0f10: 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ror,           /
0f20: 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65 20  * How to handle 
0f30: 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f 72  constraint error
0f40: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
0f50: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a  *pOrderBy,    /*
0f60: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
0f70: 2e 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f  . May be null */
0f80: 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c  .  Expr *pLimit,
0f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
0fa0: 49 54 20 63 6c 61 75 73 65 2e 20 4d 61 79 20 62  IT clause. May b
0fb0: 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 55 70 73 65  e null */.  Upse
0fc0: 72 74 20 2a 70 55 70 73 65 72 74 20 20 20 20 20  rt *pUpsert     
0fd0: 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     /* ON CONFLIC
0fe0: 54 20 63 6c 61 75 73 65 2c 20 6f 72 20 6e 75 6c  T clause, or nul
0ff0: 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  l */.){.  int i,
1000: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
1010: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1020: 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  s */.  Table *pT
1030: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab;           /*
1040: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
1050: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 69 6e   updated */.  in
1060: 74 20 61 64 64 72 54 6f 70 20 3d 20 30 3b 20 20  t addrTop = 0;  
1070: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 69 6e 73       /* VDBE ins
1080: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73  truction address
1090: 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f 66   of the start of
10a0: 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57   the loop */.  W
10b0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
10c0: 3b 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  ;     /* Informa
10d0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57  tion about the W
10e0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
10f0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
1100: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
1110: 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
1120: 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 49 6e 64 65  engine */.  Inde
1130: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
1140: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1150: 67 20 6f 76 65 72 20 69 6e 64 69 63 65 73 20 2a  g over indices *
1160: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 20  /.  Index *pPk; 
1170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1180: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
1190: 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20  dex for WITHOUT 
11a0: 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a  ROWID tables */.
11b0: 20 20 69 6e 74 20 6e 49 64 78 3b 20 20 20 20 20    int nIdx;     
11c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11d0: 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20 74 68  er of indices th
11e0: 61 74 20 6e 65 65 64 20 75 70 64 61 74 69 6e 67  at need updating
11f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 43   */.  int iBaseC
1200: 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur;          /* 
1210: 42 61 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  Base cursor numb
1220: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74  er */.  int iDat
1230: 61 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f  aCur;          /
1240: 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 68 65  * Cursor for the
1250: 20 63 61 6e 6f 6e 69 63 61 6c 20 64 61 74 61 20   canonical data 
1260: 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
1270: 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20 20  IdxCur;         
1280: 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20    /* Cursor for 
1290: 74 68 65 20 66 69 72 73 74 20 69 6e 64 65 78 20  the first index 
12a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12b0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
12c0: 68 65 20 64 61 74 61 62 61 73 65 20 73 74 72 75  he database stru
12d0: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  cture */.  int *
12e0: 61 52 65 67 49 64 78 20 3d 20 30 3b 20 20 20 20  aRegIdx = 0;    
12f0: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
1300: 74 65 72 20 69 6e 20 61 72 72 61 79 20 61 73 73  ter in array ass
1310: 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20 69 6e  igned to each in
1320: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 58  dex */.  int *aX
1330: 52 65 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Ref = 0;        
1340: 2f 2a 20 61 58 52 65 66 5b 69 5d 20 69 73 20 74  /* aXRef[i] is t
1350: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 43 68 61  he index in pCha
1360: 6e 67 65 73 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  nges->a[] of the
1370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1380: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
1390: 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74  expression for t
13a0: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i-th column o
13b0: 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  f the table..   
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 20 20 20 2a 2a 20 61 58 52 65 66 5b 69        ** aXRef[i
13e0: 5d 3d 3d 2d 31 20 69 66 20 74 68 65 20 69 2d 74  ]==-1 if the i-t
13f0: 68 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  h column is not 
1400: 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 20 20 75 38  changed. */.  u8
1410: 20 2a 61 54 6f 4f 70 65 6e 3b 20 20 20 20 20 20   *aToOpen;      
1420: 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 74 61       /* 1 for ta
1430: 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
1440: 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
1450: 0a 20 20 75 38 20 63 68 6e 67 50 6b 3b 20 20 20  .  u8 chngPk;   
1460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 49            /* PRI
1470: 4d 41 52 59 20 4b 45 59 20 63 68 61 6e 67 65 64  MARY KEY changed
1480: 20 69 6e 20 61 20 57 49 54 48 4f 55 54 20 52 4f   in a WITHOUT RO
1490: 57 49 44 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  WID table */.  u
14a0: 38 20 63 68 6e 67 52 6f 77 69 64 3b 20 20 20 20  8 chngRowid;    
14b0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63        /* Rowid c
14c0: 68 61 6e 67 65 64 20 69 6e 20 61 20 6e 6f 72 6d  hanged in a norm
14d0: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 38  al table */.  u8
14e0: 20 63 68 6e 67 4b 65 79 3b 20 20 20 20 20 20 20   chngKey;       
14f0: 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 63       /* Either c
1500: 68 6e 67 50 6b 20 6f 72 20 63 68 6e 67 52 6f 77  hngPk or chngRow
1510: 69 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  id */.  Expr *pR
1520: 6f 77 69 64 45 78 70 72 20 3d 20 30 3b 20 20 2f  owidExpr = 0;  /
1530: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 64 65 66  * Expression def
1540: 69 6e 69 6e 67 20 74 68 65 20 6e 65 77 20 72 65  ining the new re
1550: 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  cord number */. 
1560: 20 41 75 74 68 43 6f 6e 74 65 78 74 20 73 43 6f   AuthContext sCo
1570: 6e 74 65 78 74 3b 20 20 2f 2a 20 54 68 65 20 61  ntext;  /* The a
1580: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 6f 6e  uthorization con
1590: 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  text */.  NameCo
15a0: 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20  ntext sNC;      
15b0: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 2d 63 6f 6e   /* The name-con
15c0: 74 65 78 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  text to resolve 
15d0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 2a  expressions in *
15e0: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
15f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1600: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
1610: 67 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  g the table bein
1620: 67 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 69  g updated */.  i
1630: 6e 74 20 65 4f 6e 65 50 61 73 73 3b 20 20 20 20  nt eOnePass;    
1640: 20 20 20 20 20 20 2f 2a 20 4f 4e 45 50 41 53 53        /* ONEPASS
1650: 5f 58 58 58 20 76 61 6c 75 65 20 66 72 6f 6d 20  _XXX value from 
1660: 77 68 65 72 65 2e 63 20 2a 2f 0a 20 20 69 6e 74  where.c */.  int
1670: 20 68 61 73 46 4b 3b 20 20 20 20 20 20 20 20 20   hasFK;         
1680: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 66      /* True if f
1690: 6f 72 65 69 67 6e 20 6b 65 79 20 70 72 6f 63 65  oreign key proce
16a0: 73 73 69 6e 67 20 69 73 20 72 65 71 75 69 72 65  ssing is require
16b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  d */.  int label
16c0: 42 72 65 61 6b 3b 20 20 20 20 20 20 20 20 2f 2a  Break;        /*
16d0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
16e0: 65 61 6b 20 6f 75 74 20 6f 66 20 55 50 44 41 54  eak out of UPDAT
16f0: 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  E loop */.  int 
1700: 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 3b 20 20  labelContinue;  
1710: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
1720: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 6e 65 78 74  to continue next
1730: 20 73 74 65 70 20 6f 66 20 55 50 44 41 54 45 20   step of UPDATE 
1740: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  loop */.  int fl
1750: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1760: 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71   /* Flags for sq
1770: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1780: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
1790: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
17a0: 52 0a 20 20 69 6e 74 20 69 73 56 69 65 77 3b 20  R.  int isView; 
17b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
17c0: 75 65 20 77 68 65 6e 20 75 70 64 61 74 69 6e 67  ue when updating
17d0: 20 61 20 76 69 65 77 20 28 49 4e 53 54 45 41 44   a view (INSTEAD
17e0: 20 4f 46 20 74 72 69 67 67 65 72 29 20 2a 2f 0a   OF trigger) */.
17f0: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
1800: 67 65 72 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74  ger;     /* List
1810: 20 6f 66 20 74 72 69 67 67 65 72 73 20 6f 6e 20   of triggers on 
1820: 70 54 61 62 2c 20 69 66 20 72 65 71 75 69 72 65  pTab, if require
1830: 64 20 2a 2f 0a 20 20 69 6e 74 20 74 6d 61 73 6b  d */.  int tmask
1840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1850: 20 4d 61 73 6b 20 6f 66 20 54 52 49 47 47 45 52   Mask of TRIGGER
1860: 5f 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52 5f  _BEFORE|TRIGGER_
1870: 41 46 54 45 52 20 2a 2f 0a 23 65 6e 64 69 66 0a  AFTER */.#endif.
1880: 20 20 69 6e 74 20 6e 65 77 6d 61 73 6b 3b 20 20    int newmask;  
1890: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
18a0: 20 6f 66 20 4e 45 57 2e 2a 20 63 6f 6c 75 6d 6e   of NEW.* column
18b0: 73 20 61 63 63 65 73 73 65 64 20 62 79 20 42 45  s accessed by BE
18c0: 46 4f 52 45 20 74 72 69 67 67 65 72 73 20 2a 2f  FORE triggers */
18d0: 0a 20 20 69 6e 74 20 69 45 70 68 20 3d 20 30 3b  .  int iEph = 0;
18e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 70 68            /* Eph
18f0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 68 6f 6c  emeral table hol
1900: 64 69 6e 67 20 61 6c 6c 20 70 72 69 6d 61 72 79  ding all primary
1910: 20 6b 65 79 20 76 61 6c 75 65 73 20 2a 2f 0a 20   key values */. 
1920: 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 20 20   int nKey = 0;  
1930: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1940: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
1950: 20 72 65 67 4b 65 79 20 66 6f 72 20 57 49 54 48   regKey for WITH
1960: 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69  OUT ROWID */.  i
1970: 6e 74 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  nt aiCurOnePass[
1980: 32 5d 3b 20 20 20 2f 2a 20 54 68 65 20 77 72 69  2];   /* The wri
1990: 74 65 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  te cursors opene
19a0: 64 20 62 79 20 57 48 45 52 45 5f 4f 4e 45 50 41  d by WHERE_ONEPA
19b0: 53 53 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  SS */.  int addr
19c0: 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Open = 0;      /
19d0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
19e0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
19f0: 0a 20 20 69 6e 74 20 69 50 6b 20 3d 20 30 3b 20  .  int iPk = 0; 
1a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1a10: 73 74 20 6f 66 20 6e 50 6b 20 63 65 6c 6c 73 20  st of nPk cells 
1a20: 68 6f 6c 64 69 6e 67 20 50 52 49 4d 41 52 59 20  holding PRIMARY 
1a30: 4b 45 59 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  KEY value */.  i
1a40: 31 36 20 6e 50 6b 20 3d 20 30 3b 20 20 20 20 20  16 nPk = 0;     
1a50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1a60: 6f 66 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66  of components of
1a70: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
1a80: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 70 6c 61   */.  int bRepla
1a90: 63 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ce = 0;      /* 
1aa0: 54 72 75 65 20 69 66 20 52 45 50 4c 41 43 45 20  True if REPLACE 
1ab0: 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
1ac0: 69 6f 6e 20 6d 69 67 68 74 20 68 61 70 70 65 6e  ion might happen
1ad0: 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74   */..  /* Regist
1ae0: 65 72 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 20 2a  er Allocations *
1af0: 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 43 6f  /.  int regRowCo
1b00: 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 41 20  unt = 0;   /* A 
1b10: 63 6f 75 6e 74 20 6f 66 20 72 6f 77 73 20 63 68  count of rows ch
1b20: 61 6e 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  anged */.  int r
1b30: 65 67 4f 6c 64 52 6f 77 69 64 20 3d 20 30 3b 20  egOldRowid = 0; 
1b40: 20 20 2f 2a 20 54 68 65 20 6f 6c 64 20 72 6f 77    /* The old row
1b50: 69 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e  id */.  int regN
1b60: 65 77 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 2f  ewRowid = 0;   /
1b70: 2a 20 54 68 65 20 6e 65 77 20 72 6f 77 69 64 20  * The new rowid 
1b80: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 20  */.  int regNew 
1b90: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  = 0;        /* C
1ba0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4e 45  ontent of the NE
1bb0: 57 2e 2a 20 74 61 62 6c 65 20 69 6e 20 74 72 69  W.* table in tri
1bc0: 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 72  ggers */.  int r
1bd0: 65 67 4f 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  egOld = 0;      
1be0: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
1bf0: 4f 4c 44 2e 2a 20 74 61 62 6c 65 20 69 6e 20 74  OLD.* table in t
1c00: 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74  riggers */.  int
1c10: 20 72 65 67 52 6f 77 53 65 74 20 3d 20 30 3b 20   regRowSet = 0; 
1c20: 20 20 20 20 2f 2a 20 52 6f 77 73 65 74 20 6f 66      /* Rowset of
1c30: 20 72 6f 77 73 20 74 6f 20 62 65 20 75 70 64 61   rows to be upda
1c40: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ted */.  int reg
1c50: 4b 65 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Key = 0;        
1c60: 2f 2a 20 63 6f 6d 70 6f 73 69 74 65 20 50 52 49  /* composite PRI
1c70: 4d 41 52 59 20 4b 45 59 20 76 61 6c 75 65 20 2a  MARY KEY value *
1c80: 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 43 6f  /..  memset(&sCo
1c90: 6e 74 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f 66  ntext, 0, sizeof
1ca0: 28 73 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 64  (sContext));.  d
1cb0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1cc0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1cd0: 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
1ce0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
1cf0: 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75  to update_cleanu
1d00: 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  p;.  }.  assert(
1d10: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d   pTabList->nSrc=
1d20: 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  =1 );..  /* Loca
1d30: 74 65 20 74 68 65 20 74 61 62 6c 65 20 77 68 69  te the table whi
1d40: 63 68 20 77 65 20 77 61 6e 74 20 74 6f 20 75 70  ch we want to up
1d50: 64 61 74 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 54  date. .  */.  pT
1d60: 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
1d70: 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
1d80: 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 69  , pTabList);.  i
1d90: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
1da0: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
1db0: 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
1dc0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
1dd0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
1de0: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a  >pSchema);..  /*
1df0: 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20 77   Figure out if w
1e00: 65 20 68 61 76 65 20 61 6e 79 20 74 72 69 67 67  e have any trigg
1e10: 65 72 73 20 61 6e 64 20 69 66 20 74 68 65 20 74  ers and if the t
1e20: 61 62 6c 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20  able being.  ** 
1e30: 75 70 64 61 74 65 64 20 69 73 20 61 20 76 69 65  updated is a vie
1e40: 77 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  w..  */.#ifndef 
1e50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
1e60: 47 45 52 0a 20 20 70 54 72 69 67 67 65 72 20 3d  GER.  pTrigger =
1e70: 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 73   sqlite3Triggers
1e80: 45 78 69 73 74 28 70 50 61 72 73 65 2c 20 70 54  Exist(pParse, pT
1e90: 61 62 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 70  ab, TK_UPDATE, p
1ea0: 43 68 61 6e 67 65 73 2c 20 26 74 6d 61 73 6b 29  Changes, &tmask)
1eb0: 3b 0a 20 20 69 73 56 69 65 77 20 3d 20 70 54 61  ;.  isView = pTa
1ec0: 62 2d 3e 70 53 65 6c 65 63 74 21 3d 30 3b 0a 20  b->pSelect!=0;. 
1ed0: 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
1ee0: 72 20 7c 7c 20 74 6d 61 73 6b 3d 3d 30 20 29 3b  r || tmask==0 );
1ef0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1f00: 70 54 72 69 67 67 65 72 20 30 0a 23 20 64 65 66  pTrigger 0.# def
1f10: 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23 20 64  ine isView 0.# d
1f20: 65 66 69 6e 65 20 74 6d 61 73 6b 20 30 0a 23 65  efine tmask 0.#e
1f30: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1f40: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 23 20 75  TE_OMIT_VIEW.# u
1f50: 6e 64 65 66 20 69 73 56 69 65 77 0a 23 20 64 65  ndef isView.# de
1f60: 66 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23 65  fine isView 0.#e
1f70: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1f80: 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54  ITE_ENABLE_UPDAT
1f90: 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 0a 20  E_DELETE_LIMIT. 
1fa0: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
1fb0: 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
1fc0: 69 74 65 33 4c 69 6d 69 74 57 68 65 72 65 28 0a  ite3LimitWhere(.
1fd0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
1fe0: 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
1ff0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4c 69 6d  , pOrderBy, pLim
2000: 69 74 2c 20 22 55 50 44 41 54 45 22 0a 20 20 20  it, "UPDATE".   
2010: 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   );.    pOrderBy
2020: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 6d 69 74   = 0;.    pLimit
2030: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
2040: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  ..  if( sqlite3V
2050: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
2060: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
2070: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61  ){.    goto upda
2080: 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  te_cleanup;.  }.
2090: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52    if( sqlite3IsR
20a0: 65 61 64 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20  eadOnly(pParse, 
20b0: 70 54 61 62 2c 20 74 6d 61 73 6b 29 20 29 7b 0a  pTab, tmask) ){.
20c0: 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
20d0: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20  cleanup;.  }..  
20e0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 63 75  /* Allocate a cu
20f0: 72 73 6f 72 73 20 66 6f 72 20 74 68 65 20 6d 61  rsors for the ma
2100: 69 6e 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  in database tabl
2110: 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6e  e and for all in
2120: 64 69 63 65 73 2e 0a 20 20 2a 2a 20 54 68 65 20  dices..  ** The 
2130: 69 6e 64 65 78 20 63 75 72 73 6f 72 73 20 6d 69  index cursors mi
2140: 67 68 74 20 6e 6f 74 20 62 65 20 75 73 65 64 2c  ght not be used,
2150: 20 62 75 74 20 69 66 20 74 68 65 79 20 61 72 65   but if they are
2160: 20 75 73 65 64 20 74 68 65 79 0a 20 20 2a 2a 20   used they.  ** 
2170: 6e 65 65 64 20 74 6f 20 6f 63 63 75 72 20 72 69  need to occur ri
2180: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 64 61  ght after the da
2190: 74 61 62 61 73 65 20 63 75 72 73 6f 72 2e 20 20  tabase cursor.  
21a0: 53 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 0a  So go ahead and.
21b0: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 65 6e    ** allocate en
21c0: 6f 75 67 68 20 73 70 61 63 65 2c 20 6a 75 73 74  ough space, just
21d0: 20 69 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20   in case..  */. 
21e0: 20 69 42 61 73 65 43 75 72 20 3d 20 69 44 61 74   iBaseCur = iDat
21f0: 61 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  aCur = pParse->n
2200: 54 61 62 2b 2b 3b 0a 20 20 69 49 64 78 43 75 72  Tab++;.  iIdxCur
2210: 20 3d 20 69 44 61 74 61 43 75 72 2b 31 3b 0a 20   = iDataCur+1;. 
2220: 20 70 50 6b 20 3d 20 48 61 73 52 6f 77 69 64 28   pPk = HasRowid(
2230: 70 54 61 62 29 20 3f 20 30 20 3a 20 73 71 6c 69  pTab) ? 0 : sqli
2240: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
2250: 65 78 28 70 54 61 62 29 3b 0a 20 20 74 65 73 74  ex(pTab);.  test
2260: 63 61 73 65 28 20 70 50 6b 21 3d 30 20 26 26 20  case( pPk!=0 && 
2270: 70 50 6b 21 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pPk!=pTab->pInde
2280: 78 20 29 3b 0a 20 20 66 6f 72 28 6e 49 64 78 3d  x );.  for(nIdx=
2290: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
22a0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
22b0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49  =pIdx->pNext, nI
22c0: 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  dx++){.    if( p
22d0: 50 6b 3d 3d 70 49 64 78 20 29 7b 0a 20 20 20 20  Pk==pIdx ){.    
22e0: 20 20 69 44 61 74 61 43 75 72 20 3d 20 70 50 61    iDataCur = pPa
22f0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 7d  rse->nTab;.    }
2300: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
2310: 62 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  b++;.  }.  if( p
2320: 55 70 73 65 72 74 20 29 7b 0a 20 20 20 20 2f 2a  Upsert ){.    /*
2330: 20 4f 6e 20 61 6e 20 55 50 53 45 52 54 2c 20 72   On an UPSERT, r
2340: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 63 75  euse the same cu
2350: 72 73 6f 72 73 20 61 6c 72 65 61 64 79 20 6f 70  rsors already op
2360: 65 6e 65 64 20 62 79 20 49 4e 53 45 52 54 20 2a  ened by INSERT *
2370: 2f 0a 20 20 20 20 69 44 61 74 61 43 75 72 20 3d  /.    iDataCur =
2380: 20 70 55 70 73 65 72 74 2d 3e 69 44 61 74 61 43   pUpsert->iDataC
2390: 75 72 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20  ur;.    iIdxCur 
23a0: 3d 20 70 55 70 73 65 72 74 2d 3e 69 49 64 78 43  = pUpsert->iIdxC
23b0: 75 72 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ur;.    pParse->
23c0: 6e 54 61 62 20 3d 20 69 42 61 73 65 43 75 72 3b  nTab = iBaseCur;
23d0: 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 2d  .  }.  pTabList-
23e0: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[0].iCursor = 
23f0: 69 44 61 74 61 43 75 72 3b 0a 0a 20 20 2f 2a 20  iDataCur;..  /* 
2400: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
2410: 6f 72 20 61 58 52 65 66 5b 5d 2c 20 61 52 65 67  or aXRef[], aReg
2420: 49 64 78 5b 5d 2c 20 61 6e 64 20 61 54 6f 4f 70  Idx[], and aToOp
2430: 65 6e 5b 5d 2e 20 20 0a 20 20 2a 2a 20 49 6e 69  en[].  .  ** Ini
2440: 74 69 61 6c 69 7a 65 20 61 58 52 65 66 5b 5d 20  tialize aXRef[] 
2450: 61 6e 64 20 61 54 6f 4f 70 65 6e 5b 5d 20 74 6f  and aToOpen[] to
2460: 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76   their default v
2470: 61 6c 75 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 58  alues..  */.  aX
2480: 52 65 66 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ref = sqlite3DbM
2490: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
24a0: 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20 28 70 54  izeof(int) * (pT
24b0: 61 62 2d 3e 6e 43 6f 6c 2b 6e 49 64 78 29 20 2b  ab->nCol+nIdx) +
24c0: 20 6e 49 64 78 2b 32 20 29 3b 0a 20 20 69 66 28   nIdx+2 );.  if(
24d0: 20 61 58 52 65 66 3d 3d 30 20 29 20 67 6f 74 6f   aXRef==0 ) goto
24e0: 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b   update_cleanup;
24f0: 0a 20 20 61 52 65 67 49 64 78 20 3d 20 61 58 52  .  aRegIdx = aXR
2500: 65 66 2b 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  ef+pTab->nCol;. 
2510: 20 61 54 6f 4f 70 65 6e 20 3d 20 28 75 38 2a 29   aToOpen = (u8*)
2520: 28 61 52 65 67 49 64 78 2b 6e 49 64 78 29 3b 0a  (aRegIdx+nIdx);.
2530: 20 20 6d 65 6d 73 65 74 28 61 54 6f 4f 70 65 6e    memset(aToOpen
2540: 2c 20 31 2c 20 6e 49 64 78 2b 31 29 3b 0a 20 20  , 1, nIdx+1);.  
2550: 61 54 6f 4f 70 65 6e 5b 6e 49 64 78 2b 31 5d 20  aToOpen[nIdx+1] 
2560: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
2570: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
2580: 2b 29 20 61 58 52 65 66 5b 69 5d 20 3d 20 2d 31  +) aXRef[i] = -1
2590: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
25a0: 7a 65 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74  ze the name-cont
25b0: 65 78 74 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ext */.  memset(
25c0: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
25d0: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61  sNC));.  sNC.pPa
25e0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
25f0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
2600: 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 75  TabList;.  sNC.u
2610: 4e 43 2e 70 55 70 73 65 72 74 20 3d 20 70 55 70  NC.pUpsert = pUp
2620: 73 65 72 74 3b 0a 20 20 73 4e 43 2e 6e 63 46 6c  sert;.  sNC.ncFl
2630: 61 67 73 20 3d 20 4e 43 5f 55 55 70 73 65 72 74  ags = NC_UUpsert
2640: 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  ;..  /* Resolve 
2650: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
2660: 20 69 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72   in all the expr
2670: 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  essions of the. 
2680: 20 2a 2a 20 6f 66 20 74 68 65 20 55 50 44 41 54   ** of the UPDAT
2690: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 6c  E statement.  Al
26a0: 73 6f 20 66 69 6e 64 20 74 68 65 20 63 6f 6c 75  so find the colu
26b0: 6d 6e 20 69 6e 64 65 78 0a 20 20 2a 2a 20 66 6f  mn index.  ** fo
26c0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 74 6f  r each column to
26d0: 20 62 65 20 75 70 64 61 74 65 64 20 69 6e 20 74   be updated in t
26e0: 68 65 20 70 43 68 61 6e 67 65 73 20 61 72 72 61  he pChanges arra
26f0: 79 2e 20 20 46 6f 72 20 65 61 63 68 0a 20 20 2a  y.  For each.  *
2700: 2a 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 75  * column to be u
2710: 70 64 61 74 65 64 2c 20 6d 61 6b 65 20 73 75 72  pdated, make sur
2720: 65 20 77 65 20 68 61 76 65 20 61 75 74 68 6f 72  e we have author
2730: 69 7a 61 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67  ization to chang
2740: 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75  e.  ** that colu
2750: 6d 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 6e 67 52  mn..  */.  chngR
2760: 6f 77 69 64 20 3d 20 63 68 6e 67 50 6b 20 3d 20  owid = chngPk = 
2770: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
2780: 70 43 68 61 6e 67 65 73 2d 3e 6e 45 78 70 72 3b  pChanges->nExpr;
2790: 20 69 2b 2b 29 7b 0a 23 69 66 20 64 65 66 69 6e   i++){.#if defin
27a0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
27b0: 5f 4e 4f 4f 50 5f 55 50 44 41 54 45 29 20 26 26  _NOOP_UPDATE) &&
27c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
27d0: 5f 4f 4d 49 54 5f 46 4c 41 47 5f 50 52 41 47 4d  _OMIT_FLAG_PRAGM
27e0: 41 53 29 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  AS).    if( db->
27f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e  flags & SQLITE_N
2800: 6f 6f 70 55 70 64 61 74 65 20 29 7b 0a 20 20 20  oopUpdate ){.   
2810: 20 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 20 20     Token x;.    
2820: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
2830: 65 74 65 28 64 62 2c 20 70 43 68 61 6e 67 65 73  ete(db, pChanges
2840: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2850: 20 20 20 20 20 78 2e 7a 20 3d 20 70 43 68 61 6e       x.z = pChan
2860: 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ges->a[i].zName;
2870: 0a 20 20 20 20 20 20 78 2e 6e 20 3d 20 73 71 6c  .      x.n = sql
2880: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 78 2e 7a  ite3Strlen30(x.z
2890: 29 3b 0a 20 20 20 20 20 20 70 43 68 61 6e 67 65  );.      pChange
28a0: 73 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  s->a[i].pExpr =.
28b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28c0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
28d0: 5f 55 50 4c 55 53 2c 20 73 71 6c 69 74 65 33 45  _UPLUS, sqlite3E
28e0: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
28f0: 49 44 2c 20 26 78 2c 20 30 29 2c 20 30 29 3b 0a  ID, &x, 0), 0);.
2900: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
2910: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2920: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
2930: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2940: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
2950: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26  solveExprNames(&
2960: 73 4e 43 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61  sNC, pChanges->a
2970: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
2980: 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
2990: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
29a0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
29b0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
29c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
29d0: 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  3StrICmp(pTab->a
29e0: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 43  Col[j].zName, pC
29f0: 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  hanges->a[i].zNa
2a00: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
2a10: 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69    if( j==pTab->i
2a20: 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  PKey ){.        
2a30: 20 20 63 68 6e 67 52 6f 77 69 64 20 3d 20 31 3b    chngRowid = 1;
2a40: 0a 20 20 20 20 20 20 20 20 20 20 70 52 6f 77 69  .          pRowi
2a50: 64 45 78 70 72 20 3d 20 70 43 68 61 6e 67 65 73  dExpr = pChanges
2a60: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
2a70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2a80: 70 50 6b 20 26 26 20 28 70 54 61 62 2d 3e 61 43  pPk && (pTab->aC
2a90: 6f 6c 5b 6a 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  ol[j].colFlags &
2aa0: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
2ab0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2ac0: 20 20 63 68 6e 67 50 6b 20 3d 20 31 3b 0a 20 20    chngPk = 1;.  
2ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ae0: 61 58 52 65 66 5b 6a 5d 20 3d 20 69 3b 0a 20 20  aXRef[j] = i;.  
2af0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2b10: 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
2b20: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
2b30: 6b 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 49  k==0 && sqlite3I
2b40: 73 52 6f 77 69 64 28 70 43 68 61 6e 67 65 73 2d  sRowid(pChanges-
2b50: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  >a[i].zName) ){.
2b60: 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a          j = -1;.
2b70: 20 20 20 20 20 20 20 20 63 68 6e 67 52 6f 77 69          chngRowi
2b80: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  d = 1;.        p
2b90: 52 6f 77 69 64 45 78 70 72 20 3d 20 70 43 68 61  RowidExpr = pCha
2ba0: 6e 67 65 73 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  nges->a[i].pExpr
2bb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2bc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2bd0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2be0: 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20  no such column: 
2bf0: 25 73 22 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61  %s", pChanges->a
2c00: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
2c10: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
2c20: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
2c30: 20 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65       goto update
2c40: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2c50: 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
2c60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
2c70: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 7b 0a  ORIZATION.    {.
2c80: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
2c90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ca0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
2cb0: 2c 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 2c  , SQLITE_UPDATE,
2cc0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 20 20 20 20 20 20 20 20 20 20 6a 3c 30 20 3f 20            j<0 ? 
2cf0: 22 52 4f 57 49 44 22 20 3a 20 70 54 61 62 2d 3e  "ROWID" : pTab->
2d00: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 0a 20  aCol[j].zName,. 
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d20: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61             db->a
2d30: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
2d40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2d50: 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a  =SQLITE_DENY ){.
2d60: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 75 70 64          goto upd
2d70: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ate_cleanup;.   
2d80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
2d90: 3d 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 20 29  =SQLITE_IGNORE )
2da0: 7b 0a 20 20 20 20 20 20 20 20 61 58 52 65 66 5b  {.        aXRef[
2db0: 6a 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  j] = -1;.      }
2dc0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2dd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 63 68 6e  }.  assert( (chn
2de0: 67 52 6f 77 69 64 20 26 20 63 68 6e 67 50 6b 29  gRowid & chngPk)
2df0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2e00: 20 63 68 6e 67 52 6f 77 69 64 3d 3d 30 20 7c 7c   chngRowid==0 ||
2e10: 20 63 68 6e 67 52 6f 77 69 64 3d 3d 31 20 29 3b   chngRowid==1 );
2e20: 0a 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 50  .  assert( chngP
2e30: 6b 3d 3d 30 20 7c 7c 20 63 68 6e 67 50 6b 3d 3d  k==0 || chngPk==
2e40: 31 20 29 3b 0a 20 20 63 68 6e 67 4b 65 79 20 3d  1 );.  chngKey =
2e50: 20 63 68 6e 67 52 6f 77 69 64 20 2b 20 63 68 6e   chngRowid + chn
2e60: 67 50 6b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  gPk;..  /* The S
2e70: 45 54 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ET expressions a
2e80: 72 65 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  re not actually 
2e90: 75 73 65 64 20 69 6e 73 69 64 65 20 74 68 65 20  used inside the 
2ea0: 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 0a 20 20  WHERE loop.  .  
2eb0: 2a 2a 20 53 6f 20 72 65 73 65 74 20 74 68 65 20  ** So reset the 
2ec0: 63 6f 6c 55 73 65 64 20 6d 61 73 6b 2e 20 55 6e  colUsed mask. Un
2ed0: 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 20 76  less this is a v
2ee0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 49 6e  irtual table. In
2ef0: 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c   that.  ** case,
2f00: 20 73 65 74 20 61 6c 6c 20 62 69 74 73 20 6f 66   set all bits of
2f10: 20 74 68 65 20 63 6f 6c 55 73 65 64 20 6d 61 73   the colUsed mas
2f20: 6b 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 61  k (to ensure tha
2f30: 74 20 74 68 65 20 76 69 72 74 75 61 6c 0a 20 20  t the virtual.  
2f40: 2a 2a 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65  ** table impleme
2f50: 6e 74 61 74 69 6f 6e 20 6d 61 6b 65 73 20 61 6c  ntation makes al
2f60: 6c 20 63 6f 6c 75 6d 6e 73 20 61 76 61 69 6c 61  l columns availa
2f70: 62 6c 65 29 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  ble)..  */.  pTa
2f80: 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 63 6f 6c 55  bList->a[0].colU
2f90: 73 65 64 20 3d 20 49 73 56 69 72 74 75 61 6c 28  sed = IsVirtual(
2fa0: 70 54 61 62 29 20 3f 20 41 4c 4c 42 49 54 53 20  pTab) ? ALLBITS 
2fb0: 3a 20 30 3b 0a 0a 20 20 68 61 73 46 4b 20 3d 20  : 0;..  hasFK = 
2fc0: 73 71 6c 69 74 65 33 46 6b 52 65 71 75 69 72 65  sqlite3FkRequire
2fd0: 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  d(pParse, pTab, 
2fe0: 61 58 52 65 66 2c 20 63 68 6e 67 4b 65 79 29 3b  aXRef, chngKey);
2ff0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20  ..  /* There is 
3000: 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65  one entry in the
3010: 20 61 52 65 67 49 64 78 5b 5d 20 61 72 72 61 79   aRegIdx[] array
3020: 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20   for each index 
3030: 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  on the table.  *
3040: 2a 20 62 65 69 6e 67 20 75 70 64 61 74 65 64 2e  * being updated.
3050: 20 20 46 69 6c 6c 20 69 6e 20 61 52 65 67 49 64    Fill in aRegId
3060: 78 5b 5d 20 77 69 74 68 20 61 20 72 65 67 69 73  x[] with a regis
3070: 74 65 72 20 6e 75 6d 62 65 72 20 74 68 61 74 20  ter number that 
3080: 77 69 6c 6c 20 68 6f 6c 64 0a 20 20 2a 2a 20 74  will hold.  ** t
3090: 68 65 20 6b 65 79 20 66 6f 72 20 61 63 63 65 73  he key for acces
30a0: 73 69 6e 67 20 65 61 63 68 20 69 6e 64 65 78 2e  sing each index.
30b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 49 58 4d 45  .  **.  ** FIXME
30c0: 3a 20 20 42 65 20 73 6d 61 72 74 65 72 20 61 62  :  Be smarter ab
30d0: 6f 75 74 20 6f 6d 69 74 74 69 6e 67 20 69 6e 64  out omitting ind
30e0: 65 78 65 73 20 74 68 61 74 20 75 73 65 20 65 78  exes that use ex
30f0: 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
3100: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78 3d    for(j=0, pIdx=
3110: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
3120: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
3130: 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20  Next, j++){.    
3140: 69 6e 74 20 72 65 67 3b 0a 20 20 20 20 69 66 28  int reg;.    if(
3150: 20 63 68 6e 67 4b 65 79 20 7c 7c 20 68 61 73 46   chngKey || hasF
3160: 4b 3e 31 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61  K>1 || pIdx->pPa
3170: 72 74 49 64 78 57 68 65 72 65 20 7c 7c 20 70 49  rtIdxWhere || pI
3180: 64 78 3d 3d 70 50 6b 20 29 7b 0a 20 20 20 20 20  dx==pPk ){.     
3190: 20 72 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d   reg = ++pParse-
31a0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
31b0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 49 64  rse->nMem += pId
31c0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  x->nColumn;.    
31d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 67  }else{.      reg
31e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
31f0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65  i=0; i<pIdx->nKe
3200: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
3210: 20 20 20 20 69 31 36 20 69 49 64 78 43 6f 6c 20      i16 iIdxCol 
3220: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
3230: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
3240: 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 61 58   iIdxCol<0 || aX
3250: 52 65 66 5b 69 49 64 78 43 6f 6c 5d 3e 3d 30 20  Ref[iIdxCol]>=0 
3260: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 67  ){.          reg
3270: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
3280: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  m;.          pPa
3290: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 49 64  rse->nMem += pId
32a0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  x->nColumn;.    
32b0: 20 20 20 20 20 20 69 66 28 20 28 6f 6e 45 72 72        if( (onErr
32c0: 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 0a  or==OE_Replace).
32d0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 6f             || (o
32e0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
32f0: 6c 74 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72  lt && pIdx->onEr
3300: 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
3310: 20 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20   .          ){. 
3320: 20 20 20 20 20 20 20 20 20 20 20 62 52 65 70 6c             bRepl
3330: 61 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ace = 1;.       
3340: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
3350: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
3360: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3370: 20 20 69 66 28 20 72 65 67 3d 3d 30 20 29 20 61    if( reg==0 ) a
3380: 54 6f 4f 70 65 6e 5b 6a 2b 31 5d 20 3d 20 30 3b  ToOpen[j+1] = 0;
3390: 0a 20 20 20 20 61 52 65 67 49 64 78 5b 6a 5d 20  .    aRegIdx[j] 
33a0: 3d 20 72 65 67 3b 0a 20 20 7d 0a 20 20 69 66 28  = reg;.  }.  if(
33b0: 20 62 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20   bReplace ){.   
33c0: 20 2f 2a 20 49 66 20 52 45 50 4c 41 43 45 20 63   /* If REPLACE c
33d0: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
33e0: 6f 6e 20 6d 69 67 68 74 20 62 65 20 69 6e 76 6f  on might be invo
33f0: 6b 65 64 2c 20 6f 70 65 6e 20 63 75 72 73 6f 72  ked, open cursor
3400: 73 20 6f 6e 20 61 6c 6c 20 0a 20 20 20 20 2a 2a  s on all .    **
3410: 20 69 6e 64 65 78 65 73 20 69 6e 20 63 61 73 65   indexes in case
3420: 20 74 68 65 79 20 61 72 65 20 6e 65 65 64 65 64   they are needed
3430: 20 74 6f 20 64 65 6c 65 74 65 20 72 65 63 6f 72   to delete recor
3440: 64 73 2e 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  ds.  */.    mems
3450: 65 74 28 61 54 6f 4f 70 65 6e 2c 20 31 2c 20 6e  et(aToOpen, 1, n
3460: 49 64 78 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Idx+1);.  }..  /
3470: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
3480: 6e 67 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 76 20  ng code. */.  v 
3490: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
34a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
34b0: 76 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64 61  v==0 ) goto upda
34c0: 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 66  te_cleanup;.  if
34d0: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
34e0: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
34f0: 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 76 29  eCountChanges(v)
3500: 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
3510: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
3520: 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 20  Parse, pTrigger 
3530: 7c 7c 20 68 61 73 46 4b 2c 20 69 44 62 29 3b 0a  || hasFK, iDb);.
3540: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72  .  /* Allocate r
3550: 65 71 75 69 72 65 64 20 72 65 67 69 73 74 65 72  equired register
3560: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 21 49 73 56  s. */.  if( !IsV
3570: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
3580: 20 20 20 20 72 65 67 52 6f 77 53 65 74 20 3d 20      regRowSet = 
3590: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
35a0: 20 20 20 20 72 65 67 4f 6c 64 52 6f 77 69 64 20      regOldRowid 
35b0: 3d 20 72 65 67 4e 65 77 52 6f 77 69 64 20 3d 20  = regNewRowid = 
35c0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
35d0: 20 20 20 20 69 66 28 20 63 68 6e 67 50 6b 20 7c      if( chngPk |
35e0: 7c 20 70 54 72 69 67 67 65 72 20 7c 7c 20 68 61  | pTrigger || ha
35f0: 73 46 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 67  sFK ){.      reg
3600: 4f 6c 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Old = pParse->nM
3610: 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
3620: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 54  arse->nMem += pT
3630: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 7d 0a  ab->nCol;.    }.
3640: 20 20 20 20 69 66 28 20 63 68 6e 67 4b 65 79 20      if( chngKey 
3650: 7c 7c 20 70 54 72 69 67 67 65 72 20 7c 7c 20 68  || pTrigger || h
3660: 61 73 46 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  asFK ){.      re
3670: 67 4e 65 77 52 6f 77 69 64 20 3d 20 2b 2b 70 50  gNewRowid = ++pP
3680: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
3690: 7d 0a 20 20 20 20 72 65 67 4e 65 77 20 3d 20 70  }.    regNew = p
36a0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
36b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
36c0: 6d 20 2b 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  m += pTab->nCol;
36d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 61 72 74  .  }..  /* Start
36e0: 20 74 68 65 20 76 69 65 77 20 63 6f 6e 74 65 78   the view contex
36f0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  t. */.  if( isVi
3700: 65 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ew ){.    sqlite
3710: 33 41 75 74 68 43 6f 6e 74 65 78 74 50 75 73 68  3AuthContextPush
3720: 28 70 50 61 72 73 65 2c 20 26 73 43 6f 6e 74 65  (pParse, &sConte
3730: 78 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  xt, pTab->zName)
3740: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
3750: 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
3760: 75 70 64 61 74 65 20 61 20 76 69 65 77 2c 20 72  update a view, r
3770: 65 61 6c 69 7a 65 20 74 68 61 74 20 76 69 65 77  ealize that view
3780: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 6e 20 65 70   into.  ** an ep
3790: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20  hemeral table.. 
37a0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
37b0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
37c0: 57 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  W) && !defined(S
37d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
37e0: 45 52 29 0a 20 20 69 66 28 20 69 73 56 69 65 77  ER).  if( isView
37f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
3800: 61 74 65 72 69 61 6c 69 7a 65 56 69 65 77 28 70  aterializeView(p
3810: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 0a 20 20  Parse, pTab, .  
3820: 20 20 20 20 20 20 70 57 68 65 72 65 2c 20 70 4f        pWhere, pO
3830: 72 64 65 72 42 79 2c 20 70 4c 69 6d 69 74 2c 20  rderBy, pLimit, 
3840: 69 44 61 74 61 43 75 72 0a 20 20 20 20 29 3b 0a  iDataCur.    );.
3850: 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
3860: 3b 0a 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 30  ;.    pLimit = 0
3870: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
3880: 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63  /* Resolve the c
3890: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 61  olumn names in a
38a0: 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ll the expressio
38b0: 6e 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 57  ns in the.  ** W
38c0: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a  HERE clause..  *
38d0: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52  /.  if( sqlite3R
38e0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
38f0: 26 73 4e 43 2c 20 70 57 68 65 72 65 29 20 29 7b  &sNC, pWhere) ){
3900: 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65  .    goto update
3910: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 23  _cleanup;.  }..#
3920: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3930: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
3940: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
3950: 6c 65 73 20 6d 75 73 74 20 62 65 20 68 61 6e 64  les must be hand
3960: 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20 2a  led separately *
3970: 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
3980: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 75  l(pTab) ){.    u
3990: 70 64 61 74 65 56 69 72 74 75 61 6c 54 61 62 6c  pdateVirtualTabl
39a0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  e(pParse, pTabLi
39b0: 73 74 2c 20 70 54 61 62 2c 20 70 43 68 61 6e 67  st, pTab, pChang
39c0: 65 73 2c 20 70 52 6f 77 69 64 45 78 70 72 2c 20  es, pRowidExpr, 
39d0: 61 58 52 65 66 2c 0a 20 20 20 20 20 20 20 20 20  aXRef,.         
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
39f0: 68 65 72 65 2c 20 6f 6e 45 72 72 6f 72 29 3b 0a  here, onError);.
3a00: 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
3a10: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 23 65 6e  cleanup;.  }.#en
3a20: 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  dif..  /* Jump t
3a30: 6f 20 6c 61 62 65 6c 42 72 65 61 6b 20 74 6f 20  o labelBreak to 
3a40: 61 62 61 6e 64 6f 6e 20 66 75 72 74 68 65 72 20  abandon further 
3a50: 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
3a60: 69 73 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 6c  is UPDATE */.  l
3a70: 61 62 65 6c 43 6f 6e 74 69 6e 75 65 20 3d 20 6c  abelContinue = l
3a80: 61 62 65 6c 42 72 65 61 6b 20 3d 20 73 71 6c 69  abelBreak = sqli
3a90: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
3aa0: 28 76 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 20 61  (v);..  /* Not a
3ab0: 6e 20 55 50 53 45 52 54 2e 20 20 4e 6f 72 6d 61  n UPSERT.  Norma
3ac0: 6c 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 42  l processing.  B
3ad0: 65 67 69 6e 20 62 79 0a 20 20 2a 2a 20 69 6e 69  egin by.  ** ini
3ae0: 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e  tialize the coun
3af0: 74 20 6f 66 20 75 70 64 61 74 65 64 20 72 6f 77  t of updated row
3b00: 73 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e  s */.  if( (db->
3b10: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75  flags&SQLITE_Cou
3b20: 6e 74 52 6f 77 73 29 21 3d 30 0a 20 20 20 26 26  ntRows)!=0.   &&
3b30: 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67   !pParse->pTrigg
3b40: 65 72 54 61 62 0a 20 20 20 26 26 20 21 70 50 61  erTab.   && !pPa
3b50: 72 73 65 2d 3e 6e 65 73 74 65 64 0a 20 20 20 26  rse->nested.   &
3b60: 26 20 70 55 70 73 65 72 74 3d 3d 30 0a 20 20 29  & pUpsert==0.  )
3b70: 7b 0a 20 20 20 20 72 65 67 52 6f 77 43 6f 75 6e  {.    regRowCoun
3b80: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
3b90: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
3ba0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3bb0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52  Integer, 0, regR
3bc0: 6f 77 43 6f 75 6e 74 29 3b 0a 20 20 7d 0a 0a 20  owCount);.  }.. 
3bd0: 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
3be0: 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
3bf0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3c00: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52  OP_Null, 0, regR
3c10: 6f 77 53 65 74 2c 20 72 65 67 4f 6c 64 52 6f 77  owSet, regOldRow
3c20: 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  id);.  }else{.  
3c30: 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30    assert( pPk!=0
3c40: 20 29 3b 0a 20 20 20 20 6e 50 6b 20 3d 20 70 50   );.    nPk = pP
3c50: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  k->nKeyCol;.    
3c60: 69 50 6b 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  iPk = pParse->nM
3c70: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
3c80: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 6b 3b 0a 20  ->nMem += nPk;. 
3c90: 20 20 20 72 65 67 4b 65 79 20 3d 20 2b 2b 70 50     regKey = ++pP
3ca0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
3cb0: 69 66 28 20 70 55 70 73 65 72 74 3d 3d 30 20 29  if( pUpsert==0 )
3cc0: 7b 0a 20 20 20 20 20 20 69 45 70 68 20 3d 20 70  {.      iEph = p
3cd0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
3ce0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
3cf0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
3d00: 75 6c 6c 2c 20 30 2c 20 69 50 6b 2c 20 69 50 6b  ull, 0, iPk, iPk
3d10: 2b 6e 50 6b 2d 31 29 3b 0a 20 20 20 20 20 20 61  +nPk-1);.      a
3d20: 64 64 72 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  ddrOpen = sqlite
3d30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3d40: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
3d50: 20 69 45 70 68 2c 20 6e 50 6b 29 3b 0a 20 20 20   iEph, nPk);.   
3d60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
3d70: 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
3d80: 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 7d 0a 20  e, pPk);.    }. 
3d90: 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 55 70 73   }.  .  if( pUps
3da0: 65 72 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ert ){.    /* If
3db0: 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 53 45   this is an UPSE
3dc0: 52 54 2c 20 74 68 65 6e 20 61 6c 6c 20 63 75 72  RT, then all cur
3dd0: 73 6f 72 73 20 68 61 76 65 20 61 6c 72 65 61 64  sors have alread
3de0: 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 79  y been opened by
3df0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 75 74 65  .    ** the oute
3e00: 72 20 49 4e 53 45 52 54 20 61 6e 64 20 74 68 65  r INSERT and the
3e10: 20 64 61 74 61 20 63 75 72 73 6f 72 20 73 68 6f   data cursor sho
3e20: 75 6c 64 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  uld be pointing 
3e30: 61 74 20 74 68 65 20 72 6f 77 0a 20 20 20 20 2a  at the row.    *
3e40: 2a 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  * that is to be 
3e50: 75 70 64 61 74 65 64 2e 20 20 53 6f 20 62 79 70  updated.  So byp
3e60: 61 73 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ass the code tha
3e70: 74 20 73 65 61 72 63 68 65 73 20 66 6f 72 20 74  t searches for t
3e80: 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77 28 73 29  he.    ** row(s)
3e90: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
3ea0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66      */.    pWInf
3eb0: 6f 20 3d 20 30 3b 0a 20 20 20 20 65 4f 6e 65 50  o = 0;.    eOneP
3ec0: 61 73 73 20 3d 20 4f 4e 45 50 41 53 53 5f 53 49  ass = ONEPASS_SI
3ed0: 4e 47 4c 45 3b 0a 20 20 20 20 73 71 6c 69 74 65  NGLE;.    sqlite
3ee0: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
3ef0: 72 73 65 2c 20 70 57 68 65 72 65 2c 20 6c 61 62  rse, pWhere, lab
3f00: 65 6c 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f  elBreak, SQLITE_
3f10: 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 7d  JUMPIFNULL);.  }
3f20: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 42 65 67  else{.    /* Beg
3f30: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3f40: 73 63 61 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  scan. .    **.  
3f50: 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 73    ** Do not cons
3f60: 69 64 65 72 20 61 20 73 69 6e 67 6c 65 2d 70 61  ider a single-pa
3f70: 73 73 20 73 74 72 61 74 65 67 79 20 66 6f 72 20  ss strategy for 
3f80: 61 20 6d 75 6c 74 69 2d 72 6f 77 20 75 70 64 61  a multi-row upda
3f90: 74 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  te if.    ** the
3fa0: 72 65 20 61 72 65 20 61 6e 79 20 74 72 69 67 67  re are any trigg
3fb0: 65 72 73 20 6f 72 20 66 6f 72 65 69 67 6e 20 6b  ers or foreign k
3fc0: 65 79 73 20 74 6f 20 70 72 6f 63 65 73 73 2c 20  eys to process, 
3fd0: 6f 72 20 72 6f 77 73 20 6d 61 79 0a 20 20 20 20  or rows may.    
3fe0: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 61 73  ** be deleted as
3ff0: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 52 45 50   a result of REP
4000: 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 68 61  LACE conflict ha
4010: 6e 64 6c 69 6e 67 2e 20 41 6e 79 20 6f 66 20 74  ndling. Any of t
4020: 68 65 73 65 0a 20 20 20 20 2a 2a 20 74 68 69 6e  hese.    ** thin
4030: 67 73 20 6d 69 67 68 74 20 64 69 73 74 75 72 62  gs might disturb
4040: 20 61 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20   a cursor being 
4050: 75 73 65 64 20 74 6f 20 73 63 61 6e 20 74 68 72  used to scan thr
4060: 6f 75 67 68 20 74 68 65 20 74 61 62 6c 65 0a 20  ough the table. 
4070: 20 20 20 2a 2a 20 6f 72 20 69 6e 64 65 78 2c 20     ** or index, 
4080: 63 61 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  causing a single
4090: 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74  -pass approach t
40a0: 6f 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 20 20  o malfunction.  
40b0: 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 57  */.    flags = W
40c0: 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
40d0: 49 52 45 44 7c 57 48 45 52 45 5f 53 45 45 4b 5f  IRED|WHERE_SEEK_
40e0: 55 4e 49 51 5f 54 41 42 4c 45 3b 0a 20 20 20 20  UNIQ_TABLE;.    
40f0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73  if( !pParse->nes
4100: 74 65 64 20 26 26 20 21 70 54 72 69 67 67 65 72  ted && !pTrigger
4110: 20 26 26 20 21 68 61 73 46 4b 20 26 26 20 21 63   && !hasFK && !c
4120: 68 6e 67 4b 65 79 20 26 26 20 21 62 52 65 70 6c  hngKey && !bRepl
4130: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 66 6c 61  ace ){.      fla
4140: 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 50  gs |= WHERE_ONEP
4150: 41 53 53 5f 4d 55 4c 54 49 52 4f 57 3b 0a 20 20  ASS_MULTIROW;.  
4160: 20 20 7d 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d    }.    pWInfo =
4170: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
4180: 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
4190: 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 2c 20  ist, pWhere, 0, 
41a0: 30 2c 20 66 6c 61 67 73 2c 20 69 49 64 78 43 75  0, flags, iIdxCu
41b0: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  r);.    if( pWIn
41c0: 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64  fo==0 ) goto upd
41d0: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 0a  ate_cleanup;.  .
41e0: 20 20 20 20 2f 2a 20 41 20 6f 6e 65 2d 70 61 73      /* A one-pas
41f0: 73 20 73 74 72 61 74 65 67 79 20 74 68 61 74 20  s strategy that 
4200: 6d 69 67 68 74 20 75 70 64 61 74 65 20 6d 6f 72  might update mor
4210: 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 6d  e than one row m
4220: 61 79 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 62 65  ay not.    ** be
4230: 20 75 73 65 64 20 69 66 20 61 6e 79 20 63 6f 6c   used if any col
4240: 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
4250: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 73 63   used for the sc
4260: 61 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  an is being.    
4270: 2a 2a 20 75 70 64 61 74 65 64 2e 20 4f 74 68 65  ** updated. Othe
4280: 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20  rwise, if there 
4290: 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22  is an index on "
42a0: 62 22 2c 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  b", statements l
42b0: 69 6b 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  ike.    ** the f
42c0: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75 6c 64 20 63  ollowing could c
42d0: 72 65 61 74 65 20 61 6e 20 69 6e 66 69 6e 69 74  reate an infinit
42e0: 65 20 6c 6f 6f 70 3a 0a 20 20 20 20 2a 2a 0a 20  e loop:.    **. 
42f0: 20 20 20 2a 2a 20 20 20 55 50 44 41 54 45 20 74     **   UPDATE t
4300: 31 20 53 45 54 20 62 3d 62 2b 31 20 57 48 45 52  1 SET b=b+1 WHER
4310: 45 20 62 3e 3f 0a 20 20 20 20 2a 2a 0a 20 20 20  E b>?.    **.   
4320: 20 2a 2a 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f   ** Fall back to
4330: 20 4f 4e 45 50 41 53 53 5f 4f 46 46 20 69 66 20   ONEPASS_OFF if 
4340: 77 68 65 72 65 2e 63 20 68 61 73 20 73 65 6c 65  where.c has sele
4350: 63 74 65 64 20 61 20 4f 4e 45 50 41 53 53 5f 4d  cted a ONEPASS_M
4360: 55 4c 54 49 0a 20 20 20 20 2a 2a 20 73 74 72 61  ULTI.    ** stra
4370: 74 65 67 79 20 74 68 61 74 20 75 73 65 73 20 61  tegy that uses a
4380: 6e 20 69 6e 64 65 78 20 66 6f 72 20 77 68 69 63  n index for whic
4390: 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f  h one or more co
43a0: 6c 75 6d 6e 73 20 61 72 65 20 62 65 69 6e 67 0a  lumns are being.
43b0: 20 20 20 20 2a 2a 20 75 70 64 61 74 65 64 2e 20      ** updated. 
43c0: 20 2a 2f 0a 20 20 20 20 65 4f 6e 65 50 61 73 73   */.    eOnePass
43d0: 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f   = sqlite3WhereO
43e0: 6b 4f 6e 65 50 61 73 73 28 70 57 49 6e 66 6f 2c  kOnePass(pWInfo,
43f0: 20 61 69 43 75 72 4f 6e 65 50 61 73 73 29 3b 0a   aiCurOnePass);.
4400: 20 20 20 20 69 66 28 20 65 4f 6e 65 50 61 73 73      if( eOnePass
4410: 21 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45  !=ONEPASS_SINGLE
4420: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4430: 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61 72  3MultiWrite(pPar
4440: 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  se);.      if( e
4450: 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
4460: 5f 4d 55 4c 54 49 20 29 7b 0a 20 20 20 20 20 20  _MULTI ){.      
4470: 20 20 69 6e 74 20 69 43 75 72 20 3d 20 61 69 43    int iCur = aiC
4480: 75 72 4f 6e 65 50 61 73 73 5b 31 5d 3b 0a 20 20  urOnePass[1];.  
4490: 20 20 20 20 20 20 69 66 28 20 69 43 75 72 3e 3d        if( iCur>=
44a0: 30 20 26 26 20 69 43 75 72 21 3d 69 44 61 74 61  0 && iCur!=iData
44b0: 43 75 72 20 26 26 20 61 54 6f 4f 70 65 6e 5b 69  Cur && aToOpen[i
44c0: 43 75 72 2d 69 42 61 73 65 43 75 72 5d 20 29 7b  Cur-iBaseCur] ){
44d0: 0a 20 20 20 20 20 20 20 20 20 20 65 4f 6e 65 50  .          eOneP
44e0: 61 73 73 20 3d 20 4f 4e 45 50 41 53 53 5f 4f 46  ass = ONEPASS_OF
44f0: 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  F;.        }.   
4500: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 75       assert( iCu
4510: 72 21 3d 69 44 61 74 61 43 75 72 20 7c 7c 20 21  r!=iDataCur || !
4520: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
4530: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4540: 20 20 7d 0a 0a 20 20 69 66 28 20 48 61 73 52 6f    }..  if( HasRo
4550: 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
4560: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77   /* Read the row
4570: 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  id of the curren
4580: 74 20 72 6f 77 20 6f 66 20 74 68 65 20 57 48 45  t row of the WHE
4590: 52 45 20 73 63 61 6e 2e 20 49 6e 20 4f 4e 45 50  RE scan. In ONEP
45a0: 41 53 53 5f 4f 46 46 0a 20 20 20 20 2a 2a 20 6d  ASS_OFF.    ** m
45b0: 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20 72  ode, write the r
45c0: 6f 77 69 64 20 69 6e 74 6f 20 74 68 65 20 46 49  owid into the FI
45d0: 46 4f 2e 20 49 6e 20 65 69 74 68 65 72 20 6f 66  FO. In either of
45e0: 20 74 68 65 20 6f 6e 65 2d 70 61 73 73 20 6d 6f   the one-pass mo
45f0: 64 65 73 2c 0a 20 20 20 20 2a 2a 20 6c 65 61 76  des,.    ** leav
4600: 65 20 69 74 20 69 6e 20 72 65 67 69 73 74 65 72  e it in register
4610: 20 72 65 67 4f 6c 64 52 6f 77 69 64 2e 20 20 2a   regOldRowid.  *
4620: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
4630: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
4640: 77 69 64 2c 20 69 44 61 74 61 43 75 72 2c 20 72  wid, iDataCur, r
4650: 65 67 4f 6c 64 52 6f 77 69 64 29 3b 0a 20 20 20  egOldRowid);.   
4660: 20 69 66 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f   if( eOnePass==O
4670: 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
4680: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4690: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53  ddOp2(v, OP_RowS
46a0: 65 74 41 64 64 2c 20 72 65 67 52 6f 77 53 65 74  etAdd, regRowSet
46b0: 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 29 3b 0a  , regOldRowid);.
46c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
46d0: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 50     /* Read the P
46e0: 4b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  K of the current
46f0: 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72   row into an arr
4700: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ay of registers.
4710: 20 49 6e 0a 20 20 20 20 2a 2a 20 4f 4e 45 50 41   In.    ** ONEPA
4720: 53 53 5f 4f 46 46 20 6d 6f 64 65 2c 20 73 65 72  SS_OFF mode, ser
4730: 69 61 6c 69 7a 65 20 74 68 65 20 61 72 72 61 79  ialize the array
4740: 20 69 6e 74 6f 20 61 20 72 65 63 6f 72 64 20 61   into a record a
4750: 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 0a 20  nd store it in. 
4760: 20 20 20 2a 2a 20 74 68 65 20 65 70 68 65 6d 65     ** the epheme
4770: 72 61 6c 20 74 61 62 6c 65 2e 20 4f 72 2c 20 69  ral table. Or, i
4780: 6e 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45  n ONEPASS_SINGLE
4790: 20 6f 72 20 4d 55 4c 54 49 20 6d 6f 64 65 2c 20   or MULTI mode, 
47a0: 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 74 68  change.    ** th
47b0: 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
47c0: 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  al instruction t
47d0: 6f 20 61 20 4e 6f 6f 70 20 28 74 68 65 20 65 70  o a Noop (the ep
47e0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 0a 20  hemeral table . 
47f0: 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71     ** is not req
4800: 75 69 72 65 64 29 20 61 6e 64 20 6c 65 61 76 65  uired) and leave
4810: 20 74 68 65 20 50 4b 20 66 69 65 6c 64 73 20 69   the PK fields i
4820: 6e 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 72  n the array of r
4830: 65 67 69 73 74 65 72 73 2e 20 20 2a 2f 0a 20 20  egisters.  */.  
4840: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
4850: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
4860: 73 65 72 74 28 20 70 50 6b 2d 3e 61 69 43 6f 6c  sert( pPk->aiCol
4870: 75 6d 6e 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20 20  umn[i]>=0 );.   
4880: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
4890: 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
48a0: 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74  le(v, pTab, iDat
48b0: 61 43 75 72 2c 70 50 6b 2d 3e 61 69 43 6f 6c 75  aCur,pPk->aiColu
48c0: 6d 6e 5b 69 5d 2c 69 50 6b 2b 69 29 3b 0a 20 20  mn[i],iPk+i);.  
48d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 65 4f 6e 65    }.    if( eOne
48e0: 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20 69 66  Pass ){.      if
48f0: 28 20 61 64 64 72 4f 70 65 6e 20 29 20 73 71 6c  ( addrOpen ) sql
4900: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
4910: 4e 6f 6f 70 28 76 2c 20 61 64 64 72 4f 70 65 6e  Noop(v, addrOpen
4920: 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20  );.      nKey = 
4930: 6e 50 6b 3b 0a 20 20 20 20 20 20 72 65 67 4b 65  nPk;.      regKe
4940: 79 20 3d 20 69 50 6b 3b 0a 20 20 20 20 7d 65 6c  y = iPk;.    }el
4950: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
4960: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
4970: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 50  P_MakeRecord, iP
4980: 6b 2c 20 6e 50 6b 2c 20 72 65 67 4b 65 79 2c 0a  k, nPk, regKey,.
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
49b0: 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
49c0: 64 62 2c 20 70 50 6b 29 2c 20 6e 50 6b 29 3b 0a  db, pPk), nPk);.
49d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
49e0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
49f0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 45 70 68  _IdxInsert, iEph
4a00: 2c 20 72 65 67 4b 65 79 2c 20 69 50 6b 2c 20 6e  , regKey, iPk, n
4a10: 50 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pk);.    }.  }..
4a20: 20 20 69 66 28 20 70 55 70 73 65 72 74 3d 3d 30    if( pUpsert==0
4a30: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 6e 65   ){.    if( eOne
4a40: 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4d 55  Pass!=ONEPASS_MU
4a50: 4c 54 49 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  LTI ){.      sql
4a60: 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
4a70: 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  nfo);.    }.  . 
4a80: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
4a90: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
4aa0: 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 0a 20 20 20  Once = 0;.  .   
4ab0: 20 20 20 2f 2a 20 4f 70 65 6e 20 65 76 65 72 79     /* Open every
4ac0: 20 69 6e 64 65 78 20 74 68 61 74 20 6e 65 65 64   index that need
4ad0: 73 20 75 70 64 61 74 69 6e 67 2e 20 2a 2f 0a 20  s updating. */. 
4ae0: 20 20 20 20 20 69 66 28 20 65 4f 6e 65 50 61 73       if( eOnePas
4af0: 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29  s!=ONEPASS_OFF )
4b00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 69  {.        if( ai
4b10: 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 3e 3d 30  CurOnePass[0]>=0
4b20: 20 29 20 61 54 6f 4f 70 65 6e 5b 61 69 43 75 72   ) aToOpen[aiCur
4b30: 4f 6e 65 50 61 73 73 5b 30 5d 2d 69 42 61 73 65  OnePass[0]-iBase
4b40: 43 75 72 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cur] = 0;.      
4b50: 20 20 69 66 28 20 61 69 43 75 72 4f 6e 65 50 61    if( aiCurOnePa
4b60: 73 73 5b 31 5d 3e 3d 30 20 29 20 61 54 6f 4f 70  ss[1]>=0 ) aToOp
4b70: 65 6e 5b 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  en[aiCurOnePass[
4b80: 31 5d 2d 69 42 61 73 65 43 75 72 5d 20 3d 20 30  1]-iBaseCur] = 0
4b90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
4ba0: 20 20 20 69 66 28 20 65 4f 6e 65 50 61 73 73 3d     if( eOnePass=
4bb0: 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 26  =ONEPASS_MULTI &
4bc0: 26 20 28 6e 49 64 78 2d 28 61 69 43 75 72 4f 6e  & (nIdx-(aiCurOn
4bd0: 65 50 61 73 73 5b 31 5d 3e 3d 30 29 29 3e 30 20  ePass[1]>=0))>0 
4be0: 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4f  ){.        addrO
4bf0: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nce = sqlite3Vdb
4c00: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
4c10: 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
4c20: 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
4c30: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
4c40: 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 70  ableAndIndices(p
4c50: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4f 50 5f  Parse, pTab, OP_
4c60: 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 69 42  OpenWrite, 0, iB
4c70: 61 73 65 43 75 72 2c 0a 20 20 20 20 20 20 20 20  aseCur,.        
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 20 20 20 20 20 20 20 20 20 61 54 6f 4f 70 65 6e           aToOpen
4ca0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
4cb0: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
4cc0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
4cd0: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
4ce0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
4cf0: 54 6f 70 20 6f 66 20 74 68 65 20 75 70 64 61 74  Top of the updat
4d00: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66  e loop */.    if
4d10: 28 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  ( eOnePass!=ONEP
4d20: 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ASS_OFF ){.     
4d30: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
4d40: 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 21  aiCurOnePass[0]!
4d50: 3d 69 44 61 74 61 43 75 72 20 26 26 20 61 69 43  =iDataCur && aiC
4d60: 75 72 4f 6e 65 50 61 73 73 5b 31 5d 21 3d 69 44  urOnePass[1]!=iD
4d70: 61 74 61 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ataCur ){.      
4d80: 20 20 61 73 73 65 72 74 28 20 70 50 6b 20 29 3b    assert( pPk );
4d90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4da0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
4db0: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 44   OP_NotFound, iD
4dc0: 61 74 61 43 75 72 2c 20 6c 61 62 65 6c 42 72 65  ataCur, labelBre
4dd0: 61 6b 2c 20 72 65 67 4b 65 79 2c 6e 4b 65 79 29  ak, regKey,nKey)
4de0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
4df0: 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
4e00: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
4e10: 20 20 20 69 66 28 20 65 4f 6e 65 50 61 73 73 21     if( eOnePass!
4e20: 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20  =ONEPASS_SINGLE 
4e30: 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 62 65 6c  ){.        label
4e40: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
4e50: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
4e60: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
4e70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4e80: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
4e90: 2c 20 70 50 6b 20 3f 20 72 65 67 4b 65 79 20 3a  , pPk ? regKey :
4ea0: 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c 20 6c 61   regOldRowid, la
4eb0: 62 65 6c 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  belBreak);.     
4ec0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
4ed0: 76 2c 20 70 50 6b 3d 3d 30 29 3b 0a 20 20 20 20  v, pPk==0);.    
4ee0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4ef0: 28 76 2c 20 70 50 6b 21 3d 30 29 3b 0a 20 20 20  (v, pPk!=0);.   
4f00: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 20 29   }else if( pPk )
4f10: 7b 0a 20 20 20 20 20 20 6c 61 62 65 6c 43 6f 6e  {.      labelCon
4f20: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
4f30: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
4f40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4f50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
4f60: 65 77 69 6e 64 2c 20 69 45 70 68 2c 20 6c 61 62  ewind, iEph, lab
4f70: 65 6c 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f  elBreak); VdbeCo
4f80: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
4f90: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
4fa0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4fb0: 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 45 70 68  OP_RowData, iEph
4fc0: 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20  , regKey);.     
4fd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4fe0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
4ff0: 6f 75 6e 64 2c 20 69 44 61 74 61 43 75 72 2c 20  ound, iDataCur, 
5000: 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 2c 20 72  labelContinue, r
5010: 65 67 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20  egKey, 0);.     
5020: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5030: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5040: 20 20 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65     labelContinue
5050: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
5060: 64 4f 70 33 28 76 2c 20 4f 50 5f 52 6f 77 53 65  dOp3(v, OP_RowSe
5070: 74 52 65 61 64 2c 20 72 65 67 52 6f 77 53 65 74  tRead, regRowSet
5080: 2c 6c 61 62 65 6c 42 72 65 61 6b 2c 0a 20 20 20  ,labelBreak,.   
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4f              regO
50b0: 6c 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  ldRowid);.      
50c0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
50d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
50e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
50f0: 6f 74 45 78 69 73 74 73 2c 20 69 44 61 74 61 43  otExists, iDataC
5100: 75 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75  ur, labelContinu
5110: 65 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 29 3b  e, regOldRowid);
5120: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
5130: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
5140: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72  }..  /* If the r
5150: 6f 77 69 64 20 76 61 6c 75 65 20 77 69 6c 6c 20  owid value will 
5160: 63 68 61 6e 67 65 2c 20 73 65 74 20 72 65 67 69  change, set regi
5170: 73 74 65 72 20 72 65 67 4e 65 77 52 6f 77 69 64  ster regNewRowid
5180: 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   to.  ** contain
5190: 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20   the new value. 
51a0: 49 66 20 74 68 65 20 72 6f 77 69 64 20 69 73 20  If the rowid is 
51b0: 6e 6f 74 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  not being modifi
51c0: 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65  ed,.  ** then re
51d0: 67 4e 65 77 52 6f 77 69 64 20 69 73 20 74 68 65  gNewRowid is the
51e0: 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 20 61   same register a
51f0: 73 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c 20 77  s regOldRowid, w
5200: 68 69 63 68 20 69 73 0a 20 20 2a 2a 20 61 6c 72  hich is.  ** alr
5210: 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 2e 20  eady populated. 
5220: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 68   */.  assert( ch
5230: 6e 67 4b 65 79 20 7c 7c 20 70 54 72 69 67 67 65  ngKey || pTrigge
5240: 72 20 7c 7c 20 68 61 73 46 4b 20 7c 7c 20 72 65  r || hasFK || re
5250: 67 4f 6c 64 52 6f 77 69 64 3d 3d 72 65 67 4e 65  gOldRowid==regNe
5260: 77 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  wRowid );.  if( 
5270: 63 68 6e 67 52 6f 77 69 64 20 29 7b 0a 20 20 20  chngRowid ){.   
5280: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5290: 28 70 50 61 72 73 65 2c 20 70 52 6f 77 69 64 45  (pParse, pRowidE
52a0: 78 70 72 2c 20 72 65 67 4e 65 77 52 6f 77 69 64  xpr, regNewRowid
52b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
52c0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
52d0: 75 73 74 42 65 49 6e 74 2c 20 72 65 67 4e 65 77  ustBeInt, regNew
52e0: 52 6f 77 69 64 29 3b 20 56 64 62 65 43 6f 76 65  Rowid); VdbeCove
52f0: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
5300: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6f  /* Compute the o
5310: 6c 64 20 70 72 65 2d 55 50 44 41 54 45 20 63 6f  ld pre-UPDATE co
5320: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 72 6f 77  ntent of the row
5330: 20 62 65 69 6e 67 20 63 68 61 6e 67 65 64 2c 20   being changed, 
5340: 69 66 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e 66  if that.  ** inf
5350: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64  ormation is need
5360: 65 64 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67  ed */.  if( chng
5370: 50 6b 20 7c 7c 20 68 61 73 46 4b 20 7c 7c 20 70  Pk || hasFK || p
5380: 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 75  Trigger ){.    u
5390: 33 32 20 6f 6c 64 6d 61 73 6b 20 3d 20 28 68 61  32 oldmask = (ha
53a0: 73 46 4b 20 3f 20 73 71 6c 69 74 65 33 46 6b 4f  sFK ? sqlite3FkO
53b0: 6c 64 6d 61 73 6b 28 70 50 61 72 73 65 2c 20 70  ldmask(pParse, p
53c0: 54 61 62 29 20 3a 20 30 29 3b 0a 20 20 20 20 6f  Tab) : 0);.    o
53d0: 6c 64 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65  ldmask |= sqlite
53e0: 33 54 72 69 67 67 65 72 43 6f 6c 6d 61 73 6b 28  3TriggerColmask(
53f0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
5400: 20 70 54 72 69 67 67 65 72 2c 20 70 43 68 61 6e   pTrigger, pChan
5410: 67 65 73 2c 20 30 2c 20 54 52 49 47 47 45 52 5f  ges, 0, TRIGGER_
5420: 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52 5f 41  BEFORE|TRIGGER_A
5430: 46 54 45 52 2c 20 70 54 61 62 2c 20 6f 6e 45 72  FTER, pTab, onEr
5440: 72 6f 72 0a 20 20 20 20 29 3b 0a 20 20 20 20 66  ror.    );.    f
5450: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
5460: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
5470: 20 20 69 66 28 20 6f 6c 64 6d 61 73 6b 3d 3d 30    if( oldmask==0
5480: 78 66 66 66 66 66 66 66 66 0a 20 20 20 20 20 20  xffffffff.      
5490: 20 7c 7c 20 28 69 3c 33 32 20 26 26 20 28 6f 6c   || (i<32 && (ol
54a0: 64 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33  dmask & MASKBIT3
54b0: 32 28 69 29 29 21 3d 30 29 0a 20 20 20 20 20 20  2(i))!=0).      
54c0: 20 7c 7c 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b   || (pTab->aCol[
54d0: 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  i].colFlags & CO
54e0: 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d  LFLAG_PRIMKEY)!=
54f0: 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
5500: 20 20 20 74 65 73 74 63 61 73 65 28 20 20 6f 6c     testcase(  ol
5510: 64 6d 61 73 6b 21 3d 30 78 66 66 66 66 66 66 66  dmask!=0xfffffff
5520: 66 20 26 26 20 69 3d 3d 33 31 20 29 3b 0a 20 20  f && i==31 );.  
5530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5540: 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
5550: 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69  Table(v, pTab, i
5560: 44 61 74 61 43 75 72 2c 20 69 2c 20 72 65 67 4f  DataCur, i, regO
5570: 6c 64 2b 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ld+i);.      }el
5580: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5590: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
55a0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
55b0: 4f 6c 64 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a  Old+i);.      }.
55c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
55d0: 6e 67 52 6f 77 69 64 3d 3d 30 20 26 26 20 70 50  ngRowid==0 && pP
55e0: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  k==0 ){.      sq
55f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5600: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4f  v, OP_Copy, regO
5610: 6c 64 52 6f 77 69 64 2c 20 72 65 67 4e 65 77 52  ldRowid, regNewR
5620: 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  owid);.    }.  }
5630: 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20  ..  /* Populate 
5640: 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65 67  the array of reg
5650: 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
5660: 20 61 74 20 72 65 67 4e 65 77 20 77 69 74 68 20   at regNew with 
5670: 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 72 6f 77  the new.  ** row
5680: 20 64 61 74 61 2e 20 54 68 69 73 20 61 72 72 61   data. This arra
5690: 79 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  y is used to che
56a0: 63 6b 20 63 6f 6e 73 74 61 6e 74 73 2c 20 63 72  ck constants, cr
56b0: 65 61 74 65 20 74 68 65 20 6e 65 77 0a 20 20 2a  eate the new.  *
56c0: 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  * table and inde
56d0: 78 20 72 65 63 6f 72 64 73 2c 20 61 6e 64 20 61  x records, and a
56e0: 73 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72  s the values for
56f0: 20 61 6e 79 20 6e 65 77 2e 2a 20 72 65 66 65 72   any new.* refer
5700: 65 6e 63 65 73 0a 20 20 2a 2a 20 6d 61 64 65 20  ences.  ** made 
5710: 62 79 20 74 72 69 67 67 65 72 73 2e 0a 20 20 2a  by triggers..  *
5720: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20  *.  ** If there 
5730: 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
5740: 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 2c  BEFORE triggers,
5750: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 70 6f 70   then do not pop
5760: 75 6c 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 72  ulate the.  ** r
5770: 65 67 69 73 74 65 72 73 20 61 73 73 6f 63 69 61  egisters associa
5780: 74 65 64 20 77 69 74 68 20 63 6f 6c 75 6d 6e 73  ted with columns
5790: 20 74 68 61 74 20 61 72 65 20 28 61 29 20 6e 6f   that are (a) no
57a0: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 0a 20 20  t modified by.  
57b0: 2a 2a 20 74 68 69 73 20 55 50 44 41 54 45 20 73  ** this UPDATE s
57c0: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 28 62 29  tatement and (b)
57d0: 20 6e 6f 74 20 61 63 63 65 73 73 65 64 20 62 79   not accessed by
57e0: 20 6e 65 77 2e 2a 20 72 65 66 65 72 65 6e 63 65   new.* reference
57f0: 73 2e 20 54 68 65 0a 20 20 2a 2a 20 76 61 6c 75  s. The.  ** valu
5800: 65 73 20 66 6f 72 20 72 65 67 69 73 74 65 72 73  es for registers
5810: 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 20 62 79   not modified by
5820: 20 74 68 65 20 55 50 44 41 54 45 20 6d 75 73 74   the UPDATE must
5830: 20 62 65 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   be reloaded fro
5840: 6d 20 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  m .  ** the data
5850: 62 61 73 65 20 61 66 74 65 72 20 74 68 65 20 42  base after the B
5860: 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 20 61  EFORE triggers a
5870: 72 65 20 66 69 72 65 64 20 61 6e 79 77 61 79 20  re fired anyway 
5880: 28 61 73 20 74 68 65 20 74 72 69 67 67 65 72 20  (as the trigger 
5890: 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 6d  .  ** may have m
58a0: 6f 64 69 66 69 65 64 20 74 68 65 6d 29 2e 20 53  odified them). S
58b0: 6f 20 6e 6f 74 20 6c 6f 61 64 69 6e 67 20 74 68  o not loading th
58c0: 6f 73 65 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ose that are not
58d0: 20 67 6f 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 62   going to.  ** b
58e0: 65 20 75 73 65 64 20 65 6c 69 6d 69 6e 61 74 65  e used eliminate
58f0: 73 20 73 6f 6d 65 20 72 65 64 75 6e 64 61 6e 74  s some redundant
5900: 20 6f 70 63 6f 64 65 73 2e 0a 20 20 2a 2f 0a 20   opcodes..  */. 
5910: 20 6e 65 77 6d 61 73 6b 20 3d 20 73 71 6c 69 74   newmask = sqlit
5920: 65 33 54 72 69 67 67 65 72 43 6f 6c 6d 61 73 6b  e3TriggerColmask
5930: 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2c 20  (.      pParse, 
5940: 70 54 72 69 67 67 65 72 2c 20 70 43 68 61 6e 67  pTrigger, pChang
5950: 65 73 2c 20 31 2c 20 54 52 49 47 47 45 52 5f 42  es, 1, TRIGGER_B
5960: 45 46 4f 52 45 2c 20 70 54 61 62 2c 20 6f 6e 45  EFORE, pTab, onE
5970: 72 72 6f 72 0a 20 20 29 3b 0a 20 20 66 6f 72 28  rror.  );.  for(
5980: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
5990: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
59a0: 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   i==pTab->iPKey 
59b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
59c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
59d0: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 4e 65 77  _Null, 0, regNew
59e0: 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  +i);.    }else{.
59f0: 20 20 20 20 20 20 6a 20 3d 20 61 58 52 65 66 5b        j = aXRef[
5a00: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e  i];.      if( j>
5a10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
5a20: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
5a30: 61 72 73 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e  arse, pChanges->
5a40: 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 72 65 67 4e  a[j].pExpr, regN
5a50: 65 77 2b 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ew+i);.      }el
5a60: 73 65 20 69 66 28 20 30 3d 3d 28 74 6d 61 73 6b  se if( 0==(tmask
5a70: 26 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 29  &TRIGGER_BEFORE)
5a80: 20 7c 7c 20 69 3e 33 31 20 7c 7c 20 28 6e 65 77   || i>31 || (new
5a90: 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32  mask & MASKBIT32
5aa0: 28 69 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (i)) ){.        
5ab0: 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6c  /* This branch l
5ac0: 6f 61 64 73 20 74 68 65 20 76 61 6c 75 65 20 6f  oads the value o
5ad0: 66 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  f a column that 
5ae0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68 61 6e  will not be chan
5af0: 67 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ged .        ** 
5b00: 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
5b10: 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 69 66   This is done if
5b20: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 42 45   there are no BE
5b30: 46 4f 52 45 20 74 72 69 67 67 65 72 73 2c 20 6f  FORE triggers, o
5b40: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  r.        ** if 
5b50: 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72  there are one or
5b60: 20 6d 6f 72 65 20 42 45 46 4f 52 45 20 74 72 69   more BEFORE tri
5b70: 67 67 65 72 73 20 74 68 61 74 20 75 73 65 20 74  ggers that use t
5b80: 68 69 73 20 76 61 6c 75 65 20 76 69 61 0a 20 20  his value via.  
5b90: 20 20 20 20 20 20 2a 2a 20 61 20 6e 65 77 2e 2a        ** a new.*
5ba0: 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20   reference in a 
5bb0: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e  trigger program.
5bc0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
5bd0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
5be0: 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  =31 );.        t
5bf0: 65 73 74 63 61 73 65 28 20 69 3d 3d 33 32 20 29  estcase( i==32 )
5c00: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5c10: 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
5c20: 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20  mnToReg(pParse, 
5c30: 70 54 61 62 2c 20 69 2c 20 69 44 61 74 61 43 75  pTab, i, iDataCu
5c40: 72 2c 20 72 65 67 4e 65 77 2b 69 29 3b 0a 20 20  r, regNew+i);.  
5c50: 20 20 20 20 20 20 69 66 28 20 74 6d 61 73 6b 20        if( tmask 
5c60: 26 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45  & TRIGGER_BEFORE
5c70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
5c80: 20 54 68 69 73 20 76 61 6c 75 65 20 77 69 6c 6c   This value will
5c90: 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64 20 69   be recomputed i
5ca0: 6e 20 41 66 74 65 72 2d 42 45 46 4f 52 45 2d 74  n After-BEFORE-t
5cb0: 72 69 67 67 65 72 2d 72 65 6c 6f 61 64 2d 6c 6f  rigger-reload-lo
5cc0: 6f 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  op.          ** 
5cd0: 62 65 6c 6f 77 2c 20 73 6f 20 6d 61 6b 65 20 73  below, so make s
5ce0: 75 72 65 20 74 68 61 74 20 69 74 20 69 73 20 6e  ure that it is n
5cf0: 6f 74 20 63 61 63 68 65 64 20 61 6e 64 20 72 65  ot cached and re
5d00: 75 73 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  used..          
5d10: 2a 2a 20 54 69 63 6b 65 74 20 64 38 35 66 66 66  ** Ticket d85fff
5d20: 64 36 66 66 65 38 35 36 30 39 32 65 64 38 64 61  d6ffe856092ed8da
5d30: 65 66 61 38 31 31 62 31 65 33 39 39 37 30 36 62  efa811b1e399706b
5d40: 32 38 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  28. */.         
5d50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
5d60: 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
5d70: 72 65 67 4e 65 77 2b 69 2c 20 31 29 3b 0a 20 20  regNew+i, 1);.  
5d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
5d90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5da0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5db0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
5dc0: 67 4e 65 77 2b 69 29 3b 0a 20 20 20 20 20 20 7d  gNew+i);.      }
5dd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
5de0: 20 46 69 72 65 20 61 6e 79 20 42 45 46 4f 52 45   Fire any BEFORE
5df0: 20 55 50 44 41 54 45 20 74 72 69 67 67 65 72 73   UPDATE triggers
5e00: 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 62  . This happens b
5e10: 65 66 6f 72 65 20 63 6f 6e 73 74 72 61 69 6e 74  efore constraint
5e20: 73 20 61 72 65 0a 20 20 2a 2a 20 76 65 72 69 66  s are.  ** verif
5e30: 69 65 64 2e 20 4f 6e 65 20 63 6f 75 6c 64 20 61  ied. One could a
5e40: 72 67 75 65 20 74 68 61 74 20 74 68 69 73 20 69  rgue that this i
5e50: 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20  s wrong..  */.  
5e60: 69 66 28 20 74 6d 61 73 6b 26 54 52 49 47 47 45  if( tmask&TRIGGE
5e70: 52 5f 42 45 46 4f 52 45 20 29 7b 0a 20 20 20 20  R_BEFORE ){.    
5e80: 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69  sqlite3TableAffi
5e90: 6e 69 74 79 28 76 2c 20 70 54 61 62 2c 20 72 65  nity(v, pTab, re
5ea0: 67 4e 65 77 29 3b 0a 20 20 20 20 73 71 6c 69 74  gNew);.    sqlit
5eb0: 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72  e3CodeRowTrigger
5ec0: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
5ed0: 72 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 70 43  r, TK_UPDATE, pC
5ee0: 68 61 6e 67 65 73 2c 20 0a 20 20 20 20 20 20 20  hanges, .       
5ef0: 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 2c   TRIGGER_BEFORE,
5f00: 20 70 54 61 62 2c 20 72 65 67 4f 6c 64 52 6f 77   pTab, regOldRow
5f10: 69 64 2c 20 6f 6e 45 72 72 6f 72 2c 20 6c 61 62  id, onError, lab
5f20: 65 6c 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20  elContinue);..  
5f30: 20 20 2f 2a 20 54 68 65 20 72 6f 77 2d 74 72 69    /* The row-tri
5f40: 67 67 65 72 20 6d 61 79 20 68 61 76 65 20 64 65  gger may have de
5f50: 6c 65 74 65 64 20 74 68 65 20 72 6f 77 20 62 65  leted the row be
5f60: 69 6e 67 20 75 70 64 61 74 65 64 2e 20 49 6e 20  ing updated. In 
5f70: 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 61 73 65  this.    ** case
5f80: 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65  , jump to the ne
5f90: 78 74 20 72 6f 77 2e 20 4e 6f 20 75 70 64 61 74  xt row. No updat
5fa0: 65 73 20 6f 72 20 41 46 54 45 52 20 74 72 69 67  es or AFTER trig
5fb0: 67 65 72 73 20 61 72 65 20 0a 20 20 20 20 2a 2a  gers are .    **
5fc0: 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
5fd0: 62 65 68 61 76 69 6f 72 20 2d 20 77 68 61 74 20  behavior - what 
5fe0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65  happens when the
5ff0: 20 72 6f 77 20 62 65 69 6e 67 20 75 70 64 61 74   row being updat
6000: 65 64 0a 20 20 20 20 2a 2a 20 69 73 20 64 65 6c  ed.    ** is del
6010: 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20  eted or renamed 
6020: 62 79 20 61 20 42 45 46 4f 52 45 20 74 72 69 67  by a BEFORE trig
6030: 67 65 72 20 2d 20 69 73 20 6c 65 66 74 20 75 6e  ger - is left un
6040: 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 0a 20  defined in the. 
6050: 20 20 20 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74     ** documentat
6060: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
6070: 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 20  if( pPk ){.     
6080: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6090: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
60a0: 6f 75 6e 64 2c 20 69 44 61 74 61 43 75 72 2c 20  ound, iDataCur, 
60b0: 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 2c 72 65  labelContinue,re
60c0: 67 4b 65 79 2c 6e 4b 65 79 29 3b 0a 20 20 20 20  gKey,nKey);.    
60d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
60e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
60f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6100: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
6110: 78 69 73 74 73 2c 20 69 44 61 74 61 43 75 72 2c  xists, iDataCur,
6120: 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 2c 20   labelContinue, 
6130: 72 65 67 4f 6c 64 52 6f 77 69 64 29 3b 0a 20 20  regOldRowid);.  
6140: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6150: 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (v);.    }..    
6160: 2f 2a 20 41 66 74 65 72 2d 42 45 46 4f 52 45 2d  /* After-BEFORE-
6170: 74 72 69 67 67 65 72 2d 72 65 6c 6f 61 64 2d 6c  trigger-reload-l
6180: 6f 6f 70 3a 0a 20 20 20 20 2a 2a 20 49 66 20 69  oop:.    ** If i
6190: 74 20 64 69 64 20 6e 6f 74 20 64 65 6c 65 74 65  t did not delete
61a0: 20 69 74 2c 20 74 68 65 20 42 45 46 4f 52 45 20   it, the BEFORE 
61b0: 74 72 69 67 67 65 72 20 6d 61 79 20 73 74 69 6c  trigger may stil
61c0: 6c 20 68 61 76 65 20 6d 6f 64 69 66 69 65 64 20  l have modified 
61d0: 0a 20 20 20 20 2a 2a 20 73 6f 6d 65 20 6f 66 20  .    ** some of 
61e0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
61f0: 68 65 20 72 6f 77 20 62 65 69 6e 67 20 75 70 64  he row being upd
6200: 61 74 65 64 2e 20 4c 6f 61 64 20 74 68 65 20 76  ated. Load the v
6210: 61 6c 75 65 73 20 66 6f 72 20 0a 20 20 20 20 2a  alues for .    *
6220: 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6e 6f  * all columns no
6230: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
6240: 65 20 75 70 64 61 74 65 20 73 74 61 74 65 6d 65  e update stateme
6250: 6e 74 20 69 6e 74 6f 20 74 68 65 69 72 20 72 65  nt into their re
6260: 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 69  gisters.    ** i
6270: 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
6280: 68 61 70 70 65 6e 65 64 2e 20 4f 6e 6c 79 20 75  happened. Only u
6290: 6e 6d 6f 64 69 66 69 65 64 20 63 6f 6c 75 6d 6e  nmodified column
62a0: 73 20 61 72 65 20 72 65 6c 6f 61 64 65 64 2e 0a  s are reloaded..
62b0: 20 20 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65      ** The value
62c0: 73 20 63 6f 6d 70 75 74 65 64 20 66 6f 72 20 6d  s computed for m
62d0: 6f 64 69 66 69 65 64 20 63 6f 6c 75 6d 6e 73 20  odified columns 
62e0: 75 73 65 20 74 68 65 20 76 61 6c 75 65 73 20 62  use the values b
62f0: 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
6300: 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 20   BEFORE trigger 
6310: 72 75 6e 73 2e 20 20 53 65 65 20 74 65 73 74 20  runs.  See test 
6320: 63 61 73 65 20 74 72 69 67 67 65 72 31 2d 31 38  case trigger1-18
6330: 2e 30 20 28 61 64 64 65 64 20 32 30 31 38 2d 30  .0 (added 2018-0
6340: 34 2d 32 36 29 0a 20 20 20 20 2a 2a 20 66 6f 72  4-26).    ** for
6350: 20 61 6e 20 65 78 61 6d 70 6c 65 2e 0a 20 20 20   an example..   
6360: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
6370: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
6380: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
6390: 58 52 65 66 5b 69 5d 3c 30 20 26 26 20 69 21 3d  XRef[i]<0 && i!=
63a0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
63b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
63c0: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
63d0: 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20  fTable(v, pTab, 
63e0: 69 44 61 74 61 43 75 72 2c 20 69 2c 20 72 65 67  iDataCur, i, reg
63f0: 4e 65 77 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a  New+i);.      }.
6400: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
6410: 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
6420: 69 6e 74 20 61 64 64 72 31 20 3d 20 30 3b 20 20  int addr1 = 0;  
6430: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
6440: 20 6f 66 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   of jump instruc
6450: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  tion */..    /* 
6460: 44 6f 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68  Do constraint ch
6470: 65 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73  ecks. */.    ass
6480: 65 72 74 28 20 72 65 67 4f 6c 64 52 6f 77 69 64  ert( regOldRowid
6490: 3e 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >0 );.    sqlite
64a0: 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61  3GenerateConstra
64b0: 69 6e 74 43 68 65 63 6b 73 28 70 50 61 72 73 65  intChecks(pParse
64c0: 2c 20 70 54 61 62 2c 20 61 52 65 67 49 64 78 2c  , pTab, aRegIdx,
64d0: 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43   iDataCur, iIdxC
64e0: 75 72 2c 0a 20 20 20 20 20 20 20 20 72 65 67 4e  ur,.        regN
64f0: 65 77 52 6f 77 69 64 2c 20 72 65 67 4f 6c 64 52  ewRowid, regOldR
6500: 6f 77 69 64 2c 20 63 68 6e 67 4b 65 79 2c 20 6f  owid, chngKey, o
6510: 6e 45 72 72 6f 72 2c 20 6c 61 62 65 6c 43 6f 6e  nError, labelCon
6520: 74 69 6e 75 65 2c 20 26 62 52 65 70 6c 61 63 65  tinue, &bReplace
6530: 2c 0a 20 20 20 20 20 20 20 20 61 58 52 65 66 2c  ,.        aXRef,
6540: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20   0);..    /* Do 
6550: 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68  FK constraint ch
6560: 65 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ecks. */.    if(
6570: 20 68 61 73 46 4b 20 29 7b 0a 20 20 20 20 20 20   hasFK ){.      
6580: 73 71 6c 69 74 65 33 46 6b 43 68 65 63 6b 28 70  sqlite3FkCheck(p
6590: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 72 65 67  Parse, pTab, reg
65a0: 4f 6c 64 52 6f 77 69 64 2c 20 30 2c 20 61 58 52  OldRowid, 0, aXR
65b0: 65 66 2c 20 63 68 6e 67 4b 65 79 29 3b 0a 20 20  ef, chngKey);.  
65c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65    }..    /* Dele
65d0: 74 65 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  te the index ent
65e0: 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
65f0: 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
6600: 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20   record.  */.   
6610: 20 69 66 28 20 62 52 65 70 6c 61 63 65 20 7c 7c   if( bReplace ||
6620: 20 63 68 6e 67 4b 65 79 20 29 7b 0a 20 20 20 20   chngKey ){.    
6630: 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20    if( pPk ){.   
6640: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
6650: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6660: 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
6670: 2c 20 69 44 61 74 61 43 75 72 2c 20 30 2c 20 72  , iDataCur, 0, r
6680: 65 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20  egKey, nKey);.  
6690: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
66a0: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
66b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
66c0: 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 44  OP_NotExists, iD
66d0: 61 74 61 43 75 72 2c 20 30 2c 20 72 65 67 4f 6c  ataCur, 0, regOl
66e0: 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d  dRowid);.      }
66f0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
6700: 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29  ageNeverTaken(v)
6710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6720: 74 65 33 47 65 6e 65 72 61 74 65 52 6f 77 49 6e  te3GenerateRowIn
6730: 64 65 78 44 65 6c 65 74 65 28 70 50 61 72 73 65  dexDelete(pParse
6740: 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43 75 72  , pTab, iDataCur
6750: 2c 20 69 49 64 78 43 75 72 2c 20 61 52 65 67 49  , iIdxCur, aRegI
6760: 64 78 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  dx, -1);..    /*
6770: 20 49 66 20 63 68 61 6e 67 69 6e 67 20 74 68 65   If changing the
6780: 20 72 6f 77 69 64 20 76 61 6c 75 65 2c 20 6f 72   rowid value, or
6790: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66 6f   if there are fo
67a0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
67b0: 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20 74 6f 20  aints.    ** to 
67c0: 70 72 6f 63 65 73 73 2c 20 64 65 6c 65 74 65 20  process, delete 
67d0: 74 68 65 20 6f 6c 64 20 72 65 63 6f 72 64 2e 20  the old record. 
67e0: 4f 74 68 65 72 77 69 73 65 2c 20 61 64 64 20 61  Otherwise, add a
67f0: 20 6e 6f 6f 70 20 4f 50 5f 44 65 6c 65 74 65 0a   noop OP_Delete.
6800: 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65      ** to invoke
6810: 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20   the pre-update 
6820: 68 6f 6f 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  hook..    **.   
6830: 20 2a 2a 20 54 68 61 74 20 28 72 65 67 4e 65 77   ** That (regNew
6840: 3d 3d 72 65 67 6e 65 77 52 6f 77 69 64 2b 31 29  ==regnewRowid+1)
6850: 20 69 73 20 74 72 75 65 20 69 73 20 61 6c 73 6f   is true is also
6860: 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 74   important for t
6870: 68 65 20 0a 20 20 20 20 2a 2a 20 70 72 65 2d 75  he .    ** pre-u
6880: 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74  pdate hook. If t
6890: 68 65 20 63 61 6c 6c 65 72 20 69 6e 76 6f 6b 65  he caller invoke
68a0: 73 20 70 72 65 75 70 64 61 74 65 5f 6e 65 77 28  s preupdate_new(
68b0: 29 2c 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  ), the returned.
68c0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 73 20      ** value is 
68d0: 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 65 6d 6f  copied from memo
68e0: 72 79 20 63 65 6c 6c 20 28 72 65 67 4e 65 77 52  ry cell (regNewR
68f0: 6f 77 69 64 2b 31 2b 69 43 6f 6c 29 2c 20 77 68  owid+1+iCol), wh
6900: 65 72 65 20 69 43 6f 6c 0a 20 20 20 20 2a 2a 20  ere iCol.    ** 
6910: 69 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  is the column in
6920: 64 65 78 20 73 75 70 70 6c 69 65 64 20 62 79 20  dex supplied by 
6930: 74 68 65 20 75 73 65 72 2e 0a 20 20 20 20 2a 2f  the user..    */
6940: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67  .    assert( reg
6950: 4e 65 77 3d 3d 72 65 67 4e 65 77 52 6f 77 69 64  New==regNewRowid
6960: 2b 31 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  +1 );.#ifdef SQL
6970: 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
6980: 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 73 71  DATE_HOOK.    sq
6990: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
69a0: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 44  v, OP_Delete, iD
69b0: 61 74 61 43 75 72 2c 0a 20 20 20 20 20 20 20 20  ataCur,.        
69c0: 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 20  OPFLAG_ISUPDATE 
69d0: 7c 20 28 28 68 61 73 46 4b 3e 31 20 7c 7c 20 63  | ((hasFK>1 || c
69e0: 68 6e 67 4b 65 79 29 20 3f 20 30 20 3a 20 4f 50  hngKey) ? 0 : OP
69f0: 46 4c 41 47 5f 49 53 4e 4f 4f 50 29 2c 0a 20 20  FLAG_ISNOOP),.  
6a00: 20 20 20 20 20 20 72 65 67 4e 65 77 52 6f 77 69        regNewRowi
6a10: 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  d.    );.    if(
6a20: 20 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41   eOnePass==ONEPA
6a30: 53 53 5f 4d 55 4c 54 49 20 29 7b 0a 20 20 20 20  SS_MULTI ){.    
6a40: 20 20 61 73 73 65 72 74 28 20 68 61 73 46 4b 3d    assert( hasFK=
6a50: 3d 30 20 26 26 20 63 68 6e 67 4b 65 79 3d 3d 30  =0 && chngKey==0
6a60: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
6a70: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
6a80: 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49   OPFLAG_SAVEPOSI
6a90: 54 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  TION);.    }.   
6aa0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
6ab0: 73 74 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  sted ){.      sq
6ac0: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
6ad0: 34 28 76 2c 20 70 54 61 62 2c 20 50 34 5f 54 41  4(v, pTab, P4_TA
6ae0: 42 4c 45 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BLE);.    }.#els
6af0: 65 0a 20 20 20 20 69 66 28 20 68 61 73 46 4b 3e  e.    if( hasFK>
6b00: 31 20 7c 7c 20 63 68 6e 67 4b 65 79 20 29 7b 0a  1 || chngKey ){.
6b10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6b20: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
6b30: 6c 65 74 65 2c 20 69 44 61 74 61 43 75 72 2c 20  lete, iDataCur, 
6b40: 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
6b50: 0a 20 20 20 20 69 66 28 20 62 52 65 70 6c 61 63  .    if( bReplac
6b60: 65 20 7c 7c 20 63 68 6e 67 4b 65 79 20 29 7b 0a  e || chngKey ){.
6b70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6b80: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
6b90: 72 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r1);.    }..    
6ba0: 69 66 28 20 68 61 73 46 4b 20 29 7b 0a 20 20 20  if( hasFK ){.   
6bb0: 20 20 20 73 71 6c 69 74 65 33 46 6b 43 68 65 63     sqlite3FkChec
6bc0: 6b 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  k(pParse, pTab, 
6bd0: 30 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 2c 20  0, regNewRowid, 
6be0: 61 58 52 65 66 2c 20 63 68 6e 67 4b 65 79 29 3b  aXRef, chngKey);
6bf0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
6c00: 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
6c10: 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61 6e  index entries an
6c20: 64 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  d the new record
6c30: 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
6c40: 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f  CompleteInsertio
6c50: 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  n(.        pPars
6c60: 65 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43 75  e, pTab, iDataCu
6c70: 72 2c 20 69 49 64 78 43 75 72 2c 20 72 65 67 4e  r, iIdxCur, regN
6c80: 65 77 52 6f 77 69 64 2c 20 61 52 65 67 49 64 78  ewRowid, aRegIdx
6c90: 2c 20 0a 20 20 20 20 20 20 20 20 4f 50 46 4c 41  , .        OPFLA
6ca0: 47 5f 49 53 55 50 44 41 54 45 20 7c 20 28 65 4f  G_ISUPDATE | (eO
6cb0: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
6cc0: 4d 55 4c 54 49 20 3f 20 4f 50 46 4c 41 47 5f 53  MULTI ? OPFLAG_S
6cd0: 41 56 45 50 4f 53 49 54 49 4f 4e 20 3a 20 30 29  AVEPOSITION : 0)
6ce0: 2c 20 0a 20 20 20 20 20 20 20 20 30 2c 20 30 0a  , .        0, 0.
6cf0: 20 20 20 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 44      );..    /* D
6d00: 6f 20 61 6e 79 20 4f 4e 20 43 41 53 43 41 44 45  o any ON CASCADE
6d10: 2c 20 53 45 54 20 4e 55 4c 4c 20 6f 72 20 53 45  , SET NULL or SE
6d20: 54 20 44 45 46 41 55 4c 54 20 6f 70 65 72 61 74  T DEFAULT operat
6d30: 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f  ions required to
6d40: 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 72  .    ** handle r
6d50: 6f 77 73 20 28 70 6f 73 73 69 62 6c 79 20 69 6e  ows (possibly in
6d60: 20 6f 74 68 65 72 20 74 61 62 6c 65 73 29 20 74   other tables) t
6d70: 68 61 74 20 72 65 66 65 72 20 76 69 61 20 61 20  hat refer via a 
6d80: 66 6f 72 65 69 67 6e 20 6b 65 79 0a 20 20 20 20  foreign key.    
6d90: 2a 2a 20 74 6f 20 74 68 65 20 72 6f 77 20 6a 75  ** to the row ju
6da0: 73 74 20 75 70 64 61 74 65 64 2e 20 2a 2f 20 0a  st updated. */ .
6db0: 20 20 20 20 69 66 28 20 68 61 73 46 4b 20 29 7b      if( hasFK ){
6dc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 6b  .      sqlite3Fk
6dd0: 41 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  Actions(pParse, 
6de0: 70 54 61 62 2c 20 70 43 68 61 6e 67 65 73 2c 20  pTab, pChanges, 
6df0: 72 65 67 4f 6c 64 52 6f 77 69 64 2c 20 61 58 52  regOldRowid, aXR
6e00: 65 66 2c 20 63 68 6e 67 4b 65 79 29 3b 0a 20 20  ef, chngKey);.  
6e10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e    }.  }..  /* In
6e20: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 6f 77 20  crement the row 
6e30: 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2f 0a 20 20  counter .  */.  
6e40: 69 66 28 20 72 65 67 52 6f 77 43 6f 75 6e 74 20  if( regRowCount 
6e50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
6e60: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
6e70: 64 64 49 6d 6d 2c 20 72 65 67 52 6f 77 43 6f 75  ddImm, regRowCou
6e80: 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 73  nt, 1);.  }..  s
6e90: 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69  qlite3CodeRowTri
6ea0: 67 67 65 72 28 70 50 61 72 73 65 2c 20 70 54 72  gger(pParse, pTr
6eb0: 69 67 67 65 72 2c 20 54 4b 5f 55 50 44 41 54 45  igger, TK_UPDATE
6ec0: 2c 20 70 43 68 61 6e 67 65 73 2c 20 0a 20 20 20  , pChanges, .   
6ed0: 20 20 20 54 52 49 47 47 45 52 5f 41 46 54 45 52     TRIGGER_AFTER
6ee0: 2c 20 70 54 61 62 2c 20 72 65 67 4f 6c 64 52 6f  , pTab, regOldRo
6ef0: 77 69 64 2c 20 6f 6e 45 72 72 6f 72 2c 20 6c 61  wid, onError, la
6f00: 62 65 6c 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20  belContinue);.. 
6f10: 20 2f 2a 20 52 65 70 65 61 74 20 74 68 65 20 61   /* Repeat the a
6f20: 62 6f 76 65 20 77 69 74 68 20 74 68 65 20 6e 65  bove with the ne
6f30: 78 74 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20  xt record to be 
6f40: 75 70 64 61 74 65 64 2c 20 75 6e 74 69 6c 0a 20  updated, until. 
6f50: 20 2a 2a 20 61 6c 6c 20 72 65 63 6f 72 64 20 73   ** all record s
6f60: 65 6c 65 63 74 65 64 20 62 79 20 74 68 65 20 57  elected by the W
6f70: 48 45 52 45 20 63 6c 61 75 73 65 20 68 61 76 65  HERE clause have
6f80: 20 62 65 65 6e 20 75 70 64 61 74 65 64 2e 0a 20   been updated.. 
6f90: 20 2a 2f 0a 20 20 69 66 28 20 65 4f 6e 65 50 61   */.  if( eOnePa
6fa0: 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47  ss==ONEPASS_SING
6fb0: 4c 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74  LE ){.    /* Not
6fc0: 68 69 6e 67 20 74 6f 20 64 6f 20 61 74 20 65 6e  hing to do at en
6fd0: 64 2d 6f 66 2d 6c 6f 6f 70 20 66 6f 72 20 61 20  d-of-loop for a 
6fe0: 73 69 6e 67 6c 65 2d 70 61 73 73 20 2a 2f 0a 20  single-pass */. 
6ff0: 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 6e 65 50   }else if( eOneP
7000: 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c  ass==ONEPASS_MUL
7010: 54 49 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  TI ){.    sqlite
7020: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
7030: 6c 28 76 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e  l(v, labelContin
7040: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
7050: 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
7060: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
7070: 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
7080: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
7090: 28 76 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75  (v, labelContinu
70a0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
70b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
70c0: 4e 65 78 74 2c 20 69 45 70 68 2c 20 61 64 64 72  Next, iEph, addr
70d0: 54 6f 70 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Top); VdbeCovera
70e0: 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ge(v);.  }else{.
70f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
7100: 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6f 6e 74  oto(v, labelCont
7110: 69 6e 75 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  inue);.  }.  sql
7120: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
7130: 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 42 72 65  abel(v, labelBre
7140: 61 6b 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74  ak);..  /* Updat
7150: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  e the sqlite_seq
7160: 75 65 6e 63 65 20 74 61 62 6c 65 20 62 79 20 73  uence table by s
7170: 74 6f 72 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  toring the conte
7180: 6e 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6d  nt of the.  ** m
7190: 61 78 69 6d 75 6d 20 72 6f 77 69 64 20 63 6f 75  aximum rowid cou
71a0: 6e 74 65 72 20 76 61 6c 75 65 73 20 72 65 63 6f  nter values reco
71b0: 72 64 65 64 20 77 68 69 6c 65 20 69 6e 73 65 72  rded while inser
71c0: 74 69 6e 67 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  ting into.  ** a
71d0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 74 61 62  utoincrement tab
71e0: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
71f0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
7200: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 54 72  0 && pParse->pTr
7210: 69 67 67 65 72 54 61 62 3d 3d 30 20 26 26 20 70  iggerTab==0 && p
7220: 55 70 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Upsert==0 ){.   
7230: 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72   sqlite3Autoincr
7240: 65 6d 65 6e 74 45 6e 64 28 70 50 61 72 73 65 29  ementEnd(pParse)
7250: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
7260: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
7270: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
7280: 77 65 72 65 20 63 68 61 6e 67 65 64 2c 20 69 66  were changed, if
7290: 20 77 65 20 61 72 65 20 74 72 61 63 6b 69 6e 67   we are tracking
72a0: 0a 20 20 2a 2a 20 74 68 61 74 20 69 6e 66 6f 72  .  ** that infor
72b0: 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  mation..  */.  i
72c0: 66 28 20 72 65 67 52 6f 77 43 6f 75 6e 74 20 29  f( regRowCount )
72d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
72e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
72f0: 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 6f 77 43  sultRow, regRowC
7300: 6f 75 6e 74 2c 20 31 29 3b 0a 20 20 20 20 73 71  ount, 1);.    sq
7310: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
7320: 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73  ols(v, 1);.    s
7330: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
7340: 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41  Name(v, 0, COLNA
7350: 4d 45 5f 4e 41 4d 45 2c 20 22 72 6f 77 73 20 75  ME_NAME, "rows u
7360: 70 64 61 74 65 64 22 2c 20 53 51 4c 49 54 45 5f  pdated", SQLITE_
7370: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 0a 75 70  STATIC);.  }..up
7380: 64 61 74 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  date_cleanup:.  
7390: 73 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65  sqlite3AuthConte
73a0: 78 74 50 6f 70 28 26 73 43 6f 6e 74 65 78 74 29  xtPop(&sContext)
73b0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
73c0: 65 28 64 62 2c 20 61 58 52 65 66 29 3b 20 2f 2a  e(db, aXRef); /*
73d0: 20 41 6c 73 6f 20 66 72 65 65 73 20 61 52 65 67   Also frees aReg
73e0: 49 64 78 5b 5d 20 61 6e 64 20 61 54 6f 4f 70 65  Idx[] and aToOpe
73f0: 6e 5b 5d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n[] */.  sqlite3
7400: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
7410: 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 73  , pTabList);.  s
7420: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
7430: 6c 65 74 65 28 64 62 2c 20 70 43 68 61 6e 67 65  lete(db, pChange
7440: 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  s);.  sqlite3Exp
7450: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 68 65  rDelete(db, pWhe
7460: 72 65 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  re);.#if defined
7470: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55  (SQLITE_ENABLE_U
7480: 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d  PDATE_DELETE_LIM
7490: 49 54 29 20 0a 20 20 73 71 6c 69 74 65 33 45 78  IT) .  sqlite3Ex
74a0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
74b0: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71   pOrderBy);.  sq
74c0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
74d0: 64 62 2c 20 70 4c 69 6d 69 74 29 3b 0a 23 65 6e  db, pLimit);.#en
74e0: 64 69 66 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  dif.  return;.}.
74f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 22 69 73  /* Make sure "is
7500: 56 69 65 77 22 20 61 6e 64 20 6f 74 68 65 72 20  View" and other 
7510: 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64 20 61  macros defined a
7520: 62 6f 76 65 20 61 72 65 20 75 6e 64 65 66 69 6e  bove are undefin
7530: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  ed. Otherwise.**
7540: 20 74 68 65 79 20 6d 61 79 20 69 6e 74 65 72 66   they may interf
7550: 65 72 65 20 77 69 74 68 20 63 6f 6d 70 69 6c 61  ere with compila
7560: 74 69 6f 6e 20 6f 66 20 6f 74 68 65 72 20 66 75  tion of other fu
7570: 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  nctions in this 
7580: 66 69 6c 65 0a 2a 2a 20 28 6f 72 20 69 6e 20 61  file.** (or in a
7590: 6e 6f 74 68 65 72 20 66 69 6c 65 2c 20 69 66 20  nother file, if 
75a0: 74 68 69 73 20 66 69 6c 65 20 62 65 63 6f 6d 65  this file become
75b0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 61 6d  s part of the am
75c0: 61 6c 67 61 6d 61 74 69 6f 6e 29 2e 20 20 2a 2f  algamation).  */
75d0: 0a 23 69 66 64 65 66 20 69 73 56 69 65 77 0a 20  .#ifdef isView. 
75e0: 23 75 6e 64 65 66 20 69 73 56 69 65 77 0a 23 65  #undef isView.#e
75f0: 6e 64 69 66 0a 23 69 66 64 65 66 20 70 54 72 69  ndif.#ifdef pTri
7600: 67 67 65 72 0a 20 23 75 6e 64 65 66 20 70 54 72  gger. #undef pTr
7610: 69 67 67 65 72 0a 23 65 6e 64 69 66 0a 0a 23 69  igger.#endif..#i
7620: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7630: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
7640: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
7650: 64 65 20 66 6f 72 20 61 6e 20 55 50 44 41 54 45  de for an UPDATE
7660: 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61   of a virtual ta
7670: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ble..**.** There
7680: 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 6c   are two possibl
7690: 65 20 73 74 72 61 74 65 67 69 65 73 20 2d 20 74  e strategies - t
76a0: 68 65 20 64 65 66 61 75 6c 74 20 61 6e 64 20 74  he default and t
76b0: 68 65 20 73 70 65 63 69 61 6c 20 0a 2a 2a 20 22  he special .** "
76c0: 6f 6e 65 70 61 73 73 22 20 73 74 72 61 74 65 67  onepass" strateg
76d0: 79 2e 20 4f 6e 65 70 61 73 73 20 69 73 20 6f 6e  y. Onepass is on
76e0: 6c 79 20 75 73 65 64 20 69 66 20 74 68 65 20 76  ly used if the v
76f0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 0a 2a 2a  irtual table .**
7700: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
7710: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 70  indicates that p
7720: 57 68 65 72 65 20 6d 61 79 20 6d 61 74 63 68 20  Where may match 
7730: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e  at most one row.
7740: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
7750: 6c 74 20 73 74 72 61 74 65 67 79 20 69 73 20 74  lt strategy is t
7760: 6f 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65  o create an ephe
7770: 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 68 61 74  meral table that
7780: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 66 6f 72   contains.** for
7790: 20 65 61 63 68 20 72 6f 77 20 74 6f 20 62 65 20   each row to be 
77a0: 63 68 61 6e 67 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  changed:.**.**  
77b0: 20 28 41 29 20 20 54 68 65 20 6f 72 69 67 69 6e   (A)  The origin
77c0: 61 6c 20 72 6f 77 69 64 20 6f 66 20 74 68 61 74  al rowid of that
77d0: 20 72 6f 77 2e 0a 2a 2a 20 20 20 28 42 29 20 20   row..**   (B)  
77e0: 54 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 69  The revised rowi
77f0: 64 20 66 6f 72 20 74 68 65 20 72 6f 77 2e 0a 2a  d for the row..*
7800: 2a 20 20 20 28 43 29 20 20 54 68 65 20 63 6f 6e  *   (C)  The con
7810: 74 65 6e 74 20 6f 66 20 65 76 65 72 79 20 63 6f  tent of every co
7820: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 6f 77 2e  lumn in the row.
7830: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 6c 6f 6f 70  .**.** Then loop
7840: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
7850: 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 65 70  tents of this ep
7860: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 65 78  hemeral table ex
7870: 65 63 75 74 69 6e 67 20 61 0a 2a 2a 20 56 55 70  ecuting a.** VUp
7880: 64 61 74 65 20 66 6f 72 20 65 61 63 68 20 72 6f  date for each ro
7890: 77 2e 20 57 68 65 6e 20 66 69 6e 69 73 68 65 64  w. When finished
78a0: 2c 20 64 72 6f 70 20 74 68 65 20 65 70 68 65 6d  , drop the ephem
78b0: 65 72 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  eral table..**.*
78c0: 2a 20 54 68 65 20 22 6f 6e 65 70 61 73 73 22 20  * The "onepass" 
78d0: 73 74 72 61 74 65 67 79 20 64 6f 65 73 20 6e 6f  strategy does no
78e0: 74 20 75 73 65 20 61 6e 20 65 70 68 65 6d 65 72  t use an ephemer
78f0: 61 6c 20 74 61 62 6c 65 2e 20 49 6e 73 74 65 61  al table. Instea
7900: 64 2c 20 69 74 0a 2a 2a 20 73 74 6f 72 65 73 20  d, it.** stores 
7910: 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20  the same values 
7920: 28 41 2c 20 42 20 61 6e 64 20 43 20 61 62 6f 76  (A, B and C abov
7930: 65 29 20 69 6e 20 61 20 72 65 67 69 73 74 65 72  e) in a register
7940: 20 61 72 72 61 79 20 61 6e 64 0a 2a 2a 20 6d 61   array and.** ma
7950: 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 76  kes a single inv
7960: 6f 63 61 74 69 6f 6e 20 6f 66 20 56 55 70 64 61  ocation of VUpda
7970: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
7980: 69 64 20 75 70 64 61 74 65 56 69 72 74 75 61 6c  id updateVirtual
7990: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
79a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
79b0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
79c0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
79d0: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f  t *pSrc,       /
79e0: 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 74 61  * The virtual ta
79f0: 62 6c 65 20 74 6f 20 62 65 20 6d 6f 64 69 66 69  ble to be modifi
7a00: 65 64 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ed */.  Table *p
7a10: 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab,         /* 
7a20: 54 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  The virtual tabl
7a30: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
7a40: 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f 2a 20 54  *pChanges,  /* T
7a50: 68 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 63 68  he columns to ch
7a60: 61 6e 67 65 20 69 6e 20 74 68 65 20 55 50 44 41  ange in the UPDA
7a70: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
7a80: 20 20 45 78 70 72 20 2a 70 52 6f 77 69 64 2c 20    Expr *pRowid, 
7a90: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
7aa0: 73 69 6f 6e 20 75 73 65 64 20 74 6f 20 72 65 63  sion used to rec
7ab0: 6f 6d 70 75 74 65 20 74 68 65 20 72 6f 77 69 64  ompute the rowid
7ac0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 58 52 65 66   */.  int *aXRef
7ad0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  ,          /* Ma
7ae0: 70 70 69 6e 67 20 66 72 6f 6d 20 63 6f 6c 75 6d  pping from colum
7af0: 6e 73 20 6f 66 20 70 54 61 62 20 74 6f 20 65 6e  ns of pTab to en
7b00: 74 72 69 65 73 20 69 6e 20 70 43 68 61 6e 67 65  tries in pChange
7b10: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  s */.  Expr *pWh
7b20: 65 72 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 57  ere,        /* W
7b30: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
7b40: 68 65 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  he UPDATE statem
7b50: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ent */.  int onE
7b60: 72 72 6f 72 20 20 20 20 20 20 20 20 20 20 2f 2a  rror          /*
7b70: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 73 74 72   ON CONFLICT str
7b80: 61 74 65 67 79 20 2a 2f 0a 29 7b 0a 20 20 56 64  ategy */.){.  Vd
7b90: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
7ba0: 70 56 64 62 65 3b 20 20 2f 2a 20 56 69 72 74 75  pVdbe;  /* Virtu
7bb0: 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
7bc0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
7bd0: 0a 20 20 69 6e 74 20 65 70 68 65 6d 54 61 62 3b  .  int ephemTab;
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bf0: 54 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68  Table holding th
7c00: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
7c10: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20  SELECT */.  int 
7c20: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
7c30: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
7c40: 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  unter */.  sqlit
7c50: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7c60: 3e 64 62 3b 20 2f 2a 20 44 61 74 61 62 61 73 65  >db; /* Database
7c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
7c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54   const char *pVT
7c90: 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ab = (const char
7ca0: 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
7cb0: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
7cc0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
7cd0: 6f 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  o;.  int nArg = 
7ce0: 32 20 2b 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  2 + pTab->nCol; 
7cf0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7d00: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 56  f arguments to V
7d10: 55 70 64 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  Update */.  int 
7d20: 72 65 67 41 72 67 3b 20 20 20 20 20 20 20 20 20  regArg;         
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
7d40: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
7d50: 20 56 55 70 64 61 74 65 20 61 72 67 20 61 72 72   VUpdate arg arr
7d60: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ay */.  int regR
7d70: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
7d80: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
7d90: 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ter in which to 
7da0: 61 73 73 65 6d 62 6c 65 20 72 65 63 6f 72 64 20  assemble record 
7db0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  */.  int regRowi
7dc0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
7dd0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
7de0: 20 66 6f 72 20 65 70 68 65 6d 20 74 61 62 6c 65   for ephem table
7df0: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20   rowid */.  int 
7e00: 69 43 73 72 20 3d 20 70 53 72 63 2d 3e 61 5b 30  iCsr = pSrc->a[0
7e10: 5d 2e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20 43  ].iCursor;  /* C
7e20: 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 76  ursor used for v
7e30: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 63 61  irtual table sca
7e40: 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 44 75 6d 6d  n */.  int aDumm
7e50: 79 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  y[2];           
7e60: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
7e70: 20 61 72 67 20 66 6f 72 20 73 71 6c 69 74 65 33   arg for sqlite3
7e80: 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 29  WhereOkOnePass()
7e90: 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6e 65 50 61   */.  int bOnePa
7ea0: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ss;             
7eb0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7ec0: 20 75 73 65 20 6f 6e 65 70 61 73 73 20 73 74 72   use onepass str
7ed0: 61 74 65 67 79 20 2a 2f 0a 20 20 69 6e 74 20 61  ategy */.  int a
7ee0: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
7ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
7f00: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
7f10: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 20 20  Ephemeral */..  
7f20: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 41 72 67  /* Allocate nArg
7f30: 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 77 68   registers in wh
7f40: 69 63 68 20 74 6f 20 67 61 74 68 65 72 20 74 68  ich to gather th
7f50: 65 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  e arguments for 
7f60: 56 55 70 64 61 74 65 2e 20 54 68 65 6e 0a 20 20  VUpdate. Then.  
7f70: 2a 2a 20 63 72 65 61 74 65 20 61 6e 64 20 6f 70  ** create and op
7f80: 65 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  en the ephemeral
7f90: 20 74 61 62 6c 65 20 69 6e 20 77 68 69 63 68 20   table in which 
7fa0: 74 68 65 20 72 65 63 6f 72 64 73 20 63 72 65 61  the records crea
7fb0: 74 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ted from.  ** th
7fc0: 65 73 65 20 61 72 67 75 6d 65 6e 74 73 20 77 69  ese arguments wi
7fd0: 6c 6c 20 62 65 20 74 65 6d 70 6f 72 61 72 69 6c  ll be temporaril
7fe0: 79 20 73 74 6f 72 65 64 2e 20 2a 2f 0a 20 20 61  y stored. */.  a
7ff0: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 65 70  ssert( v );.  ep
8000: 68 65 6d 54 61 62 20 3d 20 70 50 61 72 73 65 2d  hemTab = pParse-
8010: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 61 64 64 72 3d  >nTab++;.  addr=
8020: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8030: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
8040: 65 6d 65 72 61 6c 2c 20 65 70 68 65 6d 54 61 62  emeral, ephemTab
8050: 2c 20 6e 41 72 67 29 3b 0a 20 20 72 65 67 41 72  , nArg);.  regAr
8060: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
8070: 20 2b 20 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e   + 1;.  pParse->
8080: 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b 0a 20 20  nMem += nArg;.  
8090: 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72 73  regRec = ++pPars
80a0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 52 6f  e->nMem;.  regRo
80b0: 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
80c0: 6e 4d 65 6d 3b 0a 0a 20 20 2f 2a 20 53 74 61 72  nMem;..  /* Star
80d0: 74 20 73 63 61 6e 6e 69 6e 67 20 74 68 65 20 76  t scanning the v
80e0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
80f0: 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
8100: 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
8110: 72 73 65 2c 20 70 53 72 63 2c 20 70 57 68 65 72  rse, pSrc, pWher
8120: 65 2c 20 30 2c 30 2c 57 48 45 52 45 5f 4f 4e 45  e, 0,0,WHERE_ONE
8130: 50 41 53 53 5f 44 45 53 49 52 45 44 2c 30 29 3b  PASS_DESIRED,0);
8140: 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30  .  if( pWInfo==0
8150: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
8160: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 61 72   Populate the ar
8170: 67 75 6d 65 6e 74 20 72 65 67 69 73 74 65 72 73  gument registers
8180: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
8190: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
81a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 58 52 65  +){.    if( aXRe
81b0: 66 5b 69 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f[i]>=0 ){.     
81c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
81d0: 28 70 50 61 72 73 65 2c 20 70 43 68 61 6e 67 65  (pParse, pChange
81e0: 73 2d 3e 61 5b 61 58 52 65 66 5b 69 5d 5d 2e 70  s->a[aXRef[i]].p
81f0: 45 78 70 72 2c 20 72 65 67 41 72 67 2b 32 2b 69  Expr, regArg+2+i
8200: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8210: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8220: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56 43 6f 6c  ddOp3(v, OP_VCol
8230: 75 6d 6e 2c 20 69 43 73 72 2c 20 69 2c 20 72 65  umn, iCsr, i, re
8240: 67 41 72 67 2b 32 2b 69 29 3b 0a 20 20 20 20 20  gArg+2+i);.     
8250: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8260: 67 65 50 35 28 76 2c 20 31 29 3b 20 2f 2a 20 45  geP5(v, 1); /* E
8270: 6e 61 62 6c 65 20 73 71 6c 69 74 65 33 5f 76 74  nable sqlite3_vt
8280: 61 62 5f 6e 6f 63 68 61 6e 67 65 28 29 20 2a 2f  ab_nochange() */
8290: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
82a0: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
82b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
82c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
82d0: 6f 77 69 64 2c 20 69 43 73 72 2c 20 72 65 67 41  owid, iCsr, regA
82e0: 72 67 29 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  rg);.    if( pRo
82f0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  wid ){.      sql
8300: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
8310: 72 73 65 2c 20 70 52 6f 77 69 64 2c 20 72 65 67  rse, pRowid, reg
8320: 41 72 67 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73  Arg+1);.    }els
8330: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
8340: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8350: 5f 52 6f 77 69 64 2c 20 69 43 73 72 2c 20 72 65  _Rowid, iCsr, re
8360: 67 41 72 67 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  gArg+1);.    }. 
8370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65   }else{.    Inde
8380: 78 20 2a 70 50 6b 3b 20 20 20 2f 2a 20 50 52 49  x *pPk;   /* PRI
8390: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 2a  MARY KEY index *
83a0: 2f 0a 20 20 20 20 69 31 36 20 69 50 6b 3b 20 20  /.    i16 iPk;  
83b0: 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b      /* PRIMARY K
83c0: 45 59 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20  EY column */.   
83d0: 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72   pPk = sqlite3Pr
83e0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
83f0: 61 62 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ab);.    assert(
8400: 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 20 20 61   pPk!=0 );.    a
8410: 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 4b 65 79  ssert( pPk->nKey
8420: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 69 50  Col==1 );.    iP
8430: 6b 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  k = pPk->aiColum
8440: 6e 5b 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  n[0];.    sqlite
8450: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8460: 50 5f 56 43 6f 6c 75 6d 6e 2c 20 69 43 73 72 2c  P_VColumn, iCsr,
8470: 20 69 50 6b 2c 20 72 65 67 41 72 67 29 3b 0a 20   iPk, regArg);. 
8480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8490: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
84a0: 2c 20 72 65 67 41 72 67 2b 32 2b 69 50 6b 2c 20  , regArg+2+iPk, 
84b0: 72 65 67 41 72 67 2b 31 29 3b 0a 20 20 7d 0a 0a  regArg+1);.  }..
84c0: 20 20 62 4f 6e 65 50 61 73 73 20 3d 20 73 71 6c    bOnePass = sql
84d0: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
84e0: 73 73 28 70 57 49 6e 66 6f 2c 20 61 44 75 6d 6d  ss(pWInfo, aDumm
84f0: 79 29 3b 0a 0a 20 20 69 66 28 20 62 4f 6e 65 50  y);..  if( bOneP
8500: 61 73 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ass ){.    /* If
8510: 20 75 73 69 6e 67 20 74 68 65 20 6f 6e 65 70 61   using the onepa
8520: 73 73 20 73 74 72 61 74 65 67 79 2c 20 6e 6f 2d  ss strategy, no-
8530: 6f 70 20 6f 75 74 20 74 68 65 20 4f 50 5f 4f 70  op out the OP_Op
8540: 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65  enEphemeral code
8550: 64 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20  d.    ** above. 
8560: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
8570: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
8580: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 65 6c 73 65  , addr);.  }else
8590: 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  {.    /* Create 
85a0: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
85b0: 65 20 61 72 67 75 6d 65 6e 74 20 72 65 67 69 73  e argument regis
85c0: 74 65 72 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64  ter contents and
85d0: 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 0a   insert it into.
85e0: 20 20 20 20 2a 2a 20 74 68 65 20 65 70 68 65 6d      ** the ephem
85f0: 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  eral table. */. 
8600: 20 20 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57     sqlite3MultiW
8610: 72 69 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20  rite(pParse);.  
8620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8630: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
8640: 63 6f 72 64 2c 20 72 65 67 41 72 67 2c 20 6e 41  cord, regArg, nA
8650: 72 67 2c 20 72 65 67 52 65 63 29 3b 0a 23 69 66  rg, regRec);.#if
8660: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8670: 0a 20 20 20 20 2f 2a 20 53 69 67 6e 61 6c 20 61  .    /* Signal a
8680: 6e 20 61 73 73 65 72 74 28 29 20 77 69 74 68 69  n assert() withi
8690: 6e 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  n OP_MakeRecord 
86a0: 74 68 61 74 20 69 74 20 69 73 20 61 6c 6c 6f 77  that it is allow
86b0: 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 61 63 63  ed to.    ** acc
86c0: 65 70 74 20 6e 6f 2d 63 68 61 6e 67 65 20 72 65  ept no-change re
86d0: 63 6f 72 64 73 20 77 69 74 68 20 73 65 72 69 61  cords with seria
86e0: 6c 5f 74 79 70 65 20 31 30 20 2a 2f 0a 20 20 20  l_type 10 */.   
86f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8700: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 4e  geP5(v, OPFLAG_N
8710: 4f 43 48 4e 47 5f 4d 41 47 49 43 29 3b 0a 23 65  OCHNG_MAGIC);.#e
8720: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
8730: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8740: 5f 4e 65 77 52 6f 77 69 64 2c 20 65 70 68 65 6d  _NewRowid, ephem
8750: 54 61 62 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Tab, regRowid);.
8760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8770: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
8780: 72 74 2c 20 65 70 68 65 6d 54 61 62 2c 20 72 65  rt, ephemTab, re
8790: 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRec, regRowid);
87a0: 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 62 4f 6e  .  }...  if( bOn
87b0: 65 50 61 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ePass==0 ){.    
87c0: 2f 2a 20 45 6e 64 20 74 68 65 20 76 69 72 74 75  /* End the virtu
87d0: 61 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f  al table scan */
87e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
87f0: 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20  eEnd(pWInfo);.. 
8800: 20 20 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e     /* Begin scan
8810: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  nning through th
8820: 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
8830: 65 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d  e. */.    addr =
8840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8850: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
8860: 20 65 70 68 65 6d 54 61 62 29 3b 20 56 64 62 65   ephemTab); Vdbe
8870: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
8880: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 72 67    /* Extract arg
8890: 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  uments from the 
88a0: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
88b0: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
88c0: 6c 65 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 69  le and .    ** i
88d0: 6e 76 6f 6b 65 20 74 68 65 20 56 55 70 64 61 74  nvoke the VUpdat
88e0: 65 20 6d 65 74 68 6f 64 2e 20 20 2a 2f 0a 20 20  e method.  */.  
88f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
8900: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  g; i++){.      s
8910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8920: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 65  (v, OP_Column, e
8930: 70 68 65 6d 54 61 62 2c 20 69 2c 20 72 65 67 41  phemTab, i, regA
8940: 72 67 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rg+i);.    }.  }
8950: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 4d 61  .  sqlite3VtabMa
8960: 6b 65 57 72 69 74 61 62 6c 65 28 70 50 61 72 73  keWritable(pPars
8970: 65 2c 20 70 54 61 62 29 3b 0a 20 20 73 71 6c 69  e, pTab);.  sqli
8980: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
8990: 20 4f 50 5f 56 55 70 64 61 74 65 2c 20 30 2c 20   OP_VUpdate, 0, 
89a0: 6e 41 72 67 2c 20 72 65 67 41 72 67 2c 20 70 56  nArg, regArg, pV
89b0: 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20  Tab, P4_VTAB);. 
89c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
89d0: 67 65 50 35 28 76 2c 20 6f 6e 45 72 72 6f 72 3d  geP5(v, onError=
89e0: 3d 4f 45 5f 44 65 66 61 75 6c 74 20 3f 20 4f 45  =OE_Default ? OE
89f0: 5f 41 62 6f 72 74 20 3a 20 6f 6e 45 72 72 6f 72  _Abort : onError
8a00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41  );.  sqlite3MayA
8a10: 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 0a 20  bort(pParse);.. 
8a20: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 65   /* End of the e
8a30: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 73  phemeral table s
8a40: 63 61 6e 2e 20 4f 72 2c 20 69 66 20 75 73 69 6e  can. Or, if usin
8a50: 67 20 74 68 65 20 6f 6e 65 70 61 73 73 20 73 74  g the onepass st
8a60: 72 61 74 65 67 79 2c 0a 20 20 2a 2a 20 6a 75 6d  rategy,.  ** jum
8a70: 70 20 74 6f 20 68 65 72 65 20 69 66 20 74 68 65  p to here if the
8a80: 20 73 63 61 6e 20 76 69 73 69 74 65 64 20 7a 65   scan visited ze
8a90: 72 6f 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 69 66  ro rows. */.  if
8aa0: 28 20 62 4f 6e 65 50 61 73 73 3d 3d 30 20 29 7b  ( bOnePass==0 ){
8ab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8ac0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
8ad0: 74 2c 20 65 70 68 65 6d 54 61 62 2c 20 61 64 64  t, ephemTab, add
8ae0: 72 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  r+1); VdbeCovera
8af0: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
8b00: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8b10: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c  , addr);.    sql
8b20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8b30: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 65 70 68 65  , OP_Close, ephe
8b40: 6d 54 61 62 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  mTab, 0);.  }els
8b50: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  e{.    sqlite3Wh
8b60: 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
8b70: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
8b80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
8b90: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a              UALTABLE */.