/ Hex Artifact Content
Login

Artifact 0b973357d88092140531e07ff641139c26fb4380b0b9f5ed98c5f7691b4604d1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 55 50 44 41 54 45 20 73   handle UPDATE s
01d0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69  tatements..*/.#i
01e0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
01f0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
0200: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
0210: 4c 54 41 42 4c 45 0a 2f 2a 20 46 6f 72 77 61 72  LTABLE./* Forwar
0220: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
0240: 61 74 65 56 69 72 74 75 61 6c 54 61 62 6c 65 28  ateVirtualTable(
0250: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0260: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
0270: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
0280: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
0290: 63 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  c,       /* The 
02a0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 6f  virtual table to
02b0: 20 62 65 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a   be modified */.
02c0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
02d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
02e0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
02f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e   ExprList *pChan
0300: 67 65 73 2c 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ges,  /* The col
0310: 75 6d 6e 73 20 74 6f 20 63 68 61 6e 67 65 20 69  umns to change i
0320: 6e 20 74 68 65 20 55 50 44 41 54 45 20 73 74 61  n the UPDATE sta
0330: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  tement */.  Expr
0340: 20 2a 70 52 6f 77 69 64 45 78 70 72 2c 20 20 20   *pRowidExpr,   
0350: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 75   /* Expression u
0360: 73 65 64 20 74 6f 20 72 65 63 6f 6d 70 75 74 65  sed to recompute
0370: 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
0380: 69 6e 74 20 2a 61 58 52 65 66 2c 20 20 20 20 20  int *aXRef,     
0390: 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
03a0: 66 72 6f 6d 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  from columns of 
03b0: 70 54 61 62 20 74 6f 20 65 6e 74 72 69 65 73 20  pTab to entries 
03c0: 69 6e 20 70 43 68 61 6e 67 65 73 20 2a 2f 0a 20  in pChanges */. 
03d0: 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
03e0: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
03f0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 55 50 44  lause of the UPD
0400: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
0410: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20  .  int onError  
0420: 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f          /* ON CO
0430: 4e 46 4c 49 43 54 20 73 74 72 61 74 65 67 79 20  NFLICT strategy 
0440: 2a 2f 0a 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  */.);.#endif /* 
0450: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
0460: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
0470: 2a 2a 20 54 68 65 20 6d 6f 73 74 20 72 65 63 65  ** The most rece
0480: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
0490: 75 63 74 69 6f 6e 20 77 61 73 20 61 6e 20 4f 50  uction was an OP
04a0: 5f 43 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 72 69  _Column to retri
04b0: 65 76 65 20 74 68 65 0a 2a 2a 20 69 2d 74 68 20  eve the.** i-th 
04c0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
04d0: 70 54 61 62 2e 20 54 68 69 73 20 72 6f 75 74 69  pTab. This routi
04e0: 6e 65 20 73 65 74 73 20 74 68 65 20 50 34 20 70  ne sets the P4 p
04f0: 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20  arameter of the 
0500: 0a 2a 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 20 74 6f  .** OP_Column to
0510: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
0520: 75 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a  ue, if any..**.*
0530: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  * The default va
0540: 6c 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  lue of a column 
0550: 69 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  is specified by 
0560: 61 20 44 45 46 41 55 4c 54 20 63 6c 61 75 73 65  a DEFAULT clause
0570: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 6c 75   in the .** colu
0580: 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 54  mn definition. T
0590: 68 69 73 20 77 61 73 20 65 69 74 68 65 72 20 73  his was either s
05a0: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 75  upplied by the u
05b0: 73 65 72 20 77 68 65 6e 20 74 68 65 20 74 61 62  ser when the tab
05c0: 6c 65 0a 2a 2a 20 77 61 73 20 63 72 65 61 74 65  le.** was create
05d0: 64 2c 20 6f 72 20 61 64 64 65 64 20 6c 61 74 65  d, or added late
05e0: 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 64  r to the table d
05f0: 65 66 69 6e 69 74 69 6f 6e 20 62 79 20 61 6e 20  efinition by an 
0600: 41 4c 54 45 52 20 54 41 42 4c 45 0a 2a 2a 20 63  ALTER TABLE.** c
0610: 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 6c  ommand. If the l
0620: 61 74 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  atter, then the 
0630: 72 6f 77 2d 72 65 63 6f 72 64 73 20 69 6e 20 74  row-records in t
0640: 68 65 20 74 61 62 6c 65 20 62 74 72 65 65 20 6f  he table btree o
0650: 6e 20 64 69 73 6b 0a 2a 2a 20 6d 61 79 20 6e 6f  n disk.** may no
0660: 74 20 63 6f 6e 74 61 69 6e 20 61 20 76 61 6c 75  t contain a valu
0670: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
0680: 20 61 6e 64 20 74 68 65 20 64 65 66 61 75 6c 74   and the default
0690: 20 76 61 6c 75 65 2c 20 74 61 6b 65 6e 0a 2a 2a   value, taken.**
06a0: 20 66 72 6f 6d 20 74 68 65 20 50 34 20 70 61 72   from the P4 par
06b0: 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20 4f 50  ameter of the OP
06c0: 5f 43 6f 6c 75 6d 6e 20 69 6e 73 74 72 75 63 74  _Column instruct
06d0: 69 6f 6e 2c 20 69 73 20 72 65 74 75 72 6e 65 64  ion, is returned
06e0: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 49 66 20   instead..** If 
06f0: 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e  the former, then
0700: 20 61 6c 6c 20 72 6f 77 2d 72 65 63 6f 72 64 73   all row-records
0710: 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
0720: 74 6f 20 69 6e 63 6c 75 64 65 20 61 20 76 61 6c  to include a val
0730: 75 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ue.** for the co
0740: 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 50 34 20  lumn and the P4 
0750: 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 72 65 71  value is not req
0760: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6c  uired..**.** Col
0770: 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  umn definitions 
0780: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 41 4c  created by an AL
0790: 54 45 52 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e  TER TABLE comman
07a0: 64 20 6d 61 79 20 6f 6e 6c 79 20 68 61 76 65 20  d may only have 
07b0: 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 64 65 66 61  .** literal defa
07c0: 75 6c 74 20 76 61 6c 75 65 73 20 73 70 65 63 69  ult values speci
07d0: 66 69 65 64 3a 20 61 20 6e 75 6d 62 65 72 2c 20  fied: a number, 
07e0: 6e 75 6c 6c 20 6f 72 20 61 20 73 74 72 69 6e 67  null or a string
07f0: 2e 20 28 49 66 20 61 20 6d 6f 72 65 0a 2a 2a 20  . (If a more.** 
0800: 63 6f 6d 70 6c 69 63 61 74 65 64 20 64 65 66 61  complicated defa
0810: 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 20 76  ult expression v
0820: 61 6c 75 65 20 77 61 73 20 70 72 6f 76 69 64 65  alue was provide
0830: 64 2c 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  d, it is evaluat
0840: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ed .** when the 
0850: 41 4c 54 45 52 20 54 41 42 4c 45 20 69 73 20 65  ALTER TABLE is e
0860: 78 65 63 75 74 65 64 20 61 6e 64 20 6f 6e 65 20  xecuted and one 
0870: 6f 66 20 74 68 65 20 6c 69 74 65 72 61 6c 20 76  of the literal v
0880: 61 6c 75 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  alues written.**
0890: 20 69 6e 74 6f 20 74 68 65 20 73 71 6c 69 74 65   into the sqlite
08a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 29 0a  _master table.).
08b0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 66 6f 72 65 2c  **.** Therefore,
08c0: 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65   the P4 paramete
08d0: 72 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  r is only requir
08e0: 65 64 20 69 66 20 74 68 65 20 64 65 66 61 75 6c  ed if the defaul
08f0: 74 20 76 61 6c 75 65 20 66 6f 72 0a 2a 2a 20 74  t value for.** t
0900: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 61 20 6c  he column is a l
0910: 69 74 65 72 61 6c 20 6e 75 6d 62 65 72 2c 20 73  iteral number, s
0920: 74 72 69 6e 67 20 6f 72 20 6e 75 6c 6c 2e 20 54  tring or null. T
0930: 68 65 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  he sqlite3ValueF
0940: 72 6f 6d 45 78 70 72 28 29 0a 2a 2a 20 66 75 6e  romExpr().** fun
0950: 63 74 69 6f 6e 20 69 73 20 63 61 70 61 62 6c 65  ction is capable
0960: 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67   of transforming
0970: 20 74 68 65 73 65 20 74 79 70 65 73 20 6f 66 20   these types of 
0980: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 74 6f  expressions into
0990: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  .** sqlite3_valu
09a0: 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a  e objects..**.**
09b0: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 52   If parameter iR
09c0: 65 67 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  eg is not negati
09d0: 76 65 2c 20 63 6f 64 65 20 61 6e 20 4f 50 5f 52  ve, code an OP_R
09e0: 65 61 6c 41 66 66 69 6e 69 74 79 20 69 6e 73 74  ealAffinity inst
09f0: 72 75 63 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 72 65  ruction.** on re
0a00: 67 69 73 74 65 72 20 69 52 65 67 2e 20 54 68 69  gister iReg. Thi
0a10: 73 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 61  s is used when a
0a20: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 74  n equivalent int
0a30: 65 67 65 72 20 76 61 6c 75 65 20 69 73 20 0a 2a  eger value is .*
0a40: 2a 20 73 74 6f 72 65 64 20 69 6e 20 70 6c 61 63  * stored in plac
0a50: 65 20 6f 66 20 61 6e 20 38 2d 62 79 74 65 20 66  e of an 8-byte f
0a60: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
0a70: 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  lue in order to 
0a80: 73 61 76 65 20 0a 2a 2a 20 73 70 61 63 65 2e 0a  save .** space..
0a90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
0aa0: 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 56 64 62  olumnDefault(Vdb
0ab0: 65 20 2a 76 2c 20 54 61 62 6c 65 20 2a 70 54 61  e *v, Table *pTa
0ac0: 62 2c 20 69 6e 74 20 69 2c 20 69 6e 74 20 69 52  b, int i, int iR
0ad0: 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  eg){.  assert( p
0ae0: 54 61 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Tab!=0 );.  if( 
0af0: 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29  !pTab->pSelect )
0b00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
0b10: 6c 75 65 20 2a 70 56 61 6c 75 65 20 3d 20 30 3b  lue *pValue = 0;
0b20: 0a 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e  .    u8 enc = EN
0b30: 43 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  C(sqlite3VdbeDb(
0b40: 76 29 29 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  v));.    Column 
0b50: 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61  *pCol = &pTab->a
0b60: 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 56 64 62 65  Col[i];.    Vdbe
0b70: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
0b80: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
0b90: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 29 3b  , pCol->zName));
0ba0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70  .    assert( i<p
0bb0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0bc0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f   sqlite3ValueFro
0bd0: 6d 45 78 70 72 28 73 71 6c 69 74 65 33 56 64 62  mExpr(sqlite3Vdb
0be0: 65 44 62 28 76 29 2c 20 70 43 6f 6c 2d 3e 70 44  eDb(v), pCol->pD
0bf0: 66 6c 74 2c 20 65 6e 63 2c 20 0a 20 20 20 20 20  flt, enc, .     
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c10: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
0c20: 74 79 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20  ty, &pValue);.  
0c30: 20 20 69 66 28 20 70 56 61 6c 75 65 20 29 7b 0a    if( pValue ){.
0c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
0c50: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 56 61  eAppendP4(v, pVa
0c60: 6c 75 65 2c 20 50 34 5f 4d 45 4d 29 3b 0a 20 20  lue, P4_MEM);.  
0c70: 20 20 7d 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20    }.  }.#ifndef 
0c80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
0c90: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 69 66 28  TING_POINT.  if(
0ca0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 61   pTab->aCol[i].a
0cb0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
0cc0: 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20  AFF_REAL ){.    
0cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0ce0: 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
0cf0: 6e 69 74 79 2c 20 69 52 65 67 29 3b 0a 20 20 7d  nity, iReg);.  }
0d00: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
0d10: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
0d20: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20   column iCol of 
0d30: 69 6e 64 65 78 20 70 49 64 78 20 72 65 66 65 72  index pIdx refer
0d40: 65 6e 63 65 73 20 61 6e 79 20 6f 66 20 74 68 65  ences any of the
0d50: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 64 65 66 69  .** columns defi
0d60: 6e 65 64 20 62 79 20 61 58 52 65 66 20 61 6e 64  ned by aXRef and
0d70: 20 63 68 6e 67 52 6f 77 69 64 2e 20 20 52 65 74   chngRowid.  Ret
0d80: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64  urn true if it d
0d90: 6f 65 73 0a 2a 2a 20 61 6e 64 20 66 61 6c 73 65  oes.** and false
0da0: 20 69 66 20 6e 6f 74 2e 20 20 54 68 69 73 20 69   if not.  This i
0db0: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
0dc0: 6e 2e 20 20 46 61 6c 73 65 2d 70 6f 73 69 74 69  n.  False-positi
0dd0: 76 65 73 20 61 72 65 20 61 0a 2a 2a 20 70 65 72  ves are a.** per
0de0: 66 6f 72 6d 61 6e 63 65 20 64 65 67 72 61 64 61  formance degrada
0df0: 74 69 6f 6e 2c 20 62 75 74 20 66 61 6c 73 65 2d  tion, but false-
0e00: 6e 65 67 61 74 69 76 65 73 20 63 61 6e 20 72 65  negatives can re
0e10: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 72 75 70  sult in a corrup
0e20: 74 0a 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 69  t.** index and i
0e30: 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 73  ncorrect answers
0e40: 2e 0a 2a 2a 0a 2a 2a 20 61 58 52 65 66 5b 6a 5d  ..**.** aXRef[j]
0e50: 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 6e 65 67   will be non-neg
0e60: 61 74 69 76 65 20 69 66 20 63 6f 6c 75 6d 6e 20  ative if column 
0e70: 6a 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  j of the origina
0e80: 6c 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 62 65  l table is.** be
0e90: 69 6e 67 20 75 70 64 61 74 65 64 2e 20 20 63 68  ing updated.  ch
0ea0: 6e 67 52 6f 77 69 64 20 77 69 6c 6c 20 62 65 20  ngRowid will be 
0eb0: 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 69  true if the rowi
0ec0: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  d of the table i
0ed0: 73 0a 2a 2a 20 62 65 69 6e 67 20 75 70 64 61 74  s.** being updat
0ee0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
0ef0: 74 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 49 73 42  t indexColumnIsB
0f00: 65 69 6e 67 55 70 64 61 74 65 64 28 0a 20 20 49  eingUpdated(.  I
0f10: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
0f20: 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
0f30: 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
0f40: 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a  iCol,         /*
0f50: 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   Which column of
0f60: 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 68   the index to ch
0f70: 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 58  eck */.  int *aX
0f80: 52 65 66 2c 20 20 20 20 20 20 20 2f 2a 20 61 58  Ref,       /* aX
0f90: 52 65 66 5b 6a 5d 3e 3d 30 20 69 66 20 63 6f 6c  Ref[j]>=0 if col
0fa0: 75 6d 6e 20 6a 20 69 73 20 62 65 69 6e 67 20 75  umn j is being u
0fb0: 70 64 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  pdated */.  int 
0fc0: 63 68 6e 67 52 6f 77 69 64 20 20 20 20 20 2f 2a  chngRowid     /*
0fd0: 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77   true if the row
0fe0: 69 64 20 69 73 20 62 65 69 6e 67 20 75 70 64 61  id is being upda
0ff0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20  ted */.){.  i16 
1000: 69 49 64 78 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  iIdxCol = pIdx->
1010: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a  aiColumn[iCol];.
1020: 20 20 61 73 73 65 72 74 28 20 69 49 64 78 43 6f    assert( iIdxCo
1030: 6c 21 3d 58 4e 5f 52 4f 57 49 44 20 29 3b 20 2f  l!=XN_ROWID ); /
1040: 2a 20 43 61 6e 6e 6f 74 20 69 6e 64 65 78 20 72  * Cannot index r
1050: 6f 77 69 64 20 2a 2f 0a 20 20 69 66 28 20 69 49  owid */.  if( iI
1060: 64 78 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20  dxCol>=0 ){.    
1070: 72 65 74 75 72 6e 20 61 58 52 65 66 5b 69 49 64  return aXRef[iId
1080: 78 43 6f 6c 5d 3e 3d 30 3b 0a 20 20 7d 0a 20 20  xCol]>=0;.  }.  
1090: 61 73 73 65 72 74 28 20 69 49 64 78 43 6f 6c 3d  assert( iIdxCol=
10a0: 3d 58 4e 5f 45 58 50 52 20 29 3b 0a 20 20 61 73  =XN_EXPR );.  as
10b0: 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c  sert( pIdx->aCol
10c0: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  Expr!=0 );.  ass
10d0: 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45  ert( pIdx->aColE
10e0: 78 70 72 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  xpr->a[iCol].pEx
10f0: 70 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  pr!=0 );.  retur
1100: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 66  n sqlite3ExprRef
1110: 65 72 65 6e 63 65 73 55 70 64 61 74 65 64 43 6f  erencesUpdatedCo
1120: 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 43 6f 6c 45  lumn(pIdx->aColE
1130: 78 70 72 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  xpr->a[iCol].pEx
1140: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1170: 61 58 52 65 66 2c 63 68 6e 67 52 6f 77 69 64 29  aXRef,chngRowid)
1180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
1190: 20 74 6f 20 73 65 65 20 69 66 20 69 6e 64 65 78   to see if index
11a0: 20 70 49 64 78 20 69 73 20 61 20 70 61 72 74 69   pIdx is a parti
11b0: 61 6c 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63  al index whose c
11c0: 6f 6e 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 65 78  onditional.** ex
11d0: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 63  pression might c
11e0: 68 61 6e 67 65 20 76 61 6c 75 65 73 20 64 75 65  hange values due
11f0: 20 74 6f 20 61 6e 20 55 50 44 41 54 45 2e 20 20   to an UPDATE.  
1200: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 0a 2a  Return true if.*
1210: 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 73  * the index is s
1220: 75 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67 65  ubject to change
1230: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
1240: 65 20 69 6e 64 65 78 20 69 73 20 67 75 61 72 61  e index is guara
1250: 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75  nteed.** to be u
1260: 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 69 73 20  nchanged.  This 
1270: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
1280: 6f 6e 2e 20 20 46 61 6c 73 65 2d 70 6f 73 69 74  on.  False-posit
1290: 69 76 65 73 20 61 72 65 20 61 0a 2a 2a 20 70 65  ives are a.** pe
12a0: 72 66 6f 72 6d 61 6e 63 65 20 64 65 67 72 61 64  rformance degrad
12b0: 61 74 69 6f 6e 2c 20 62 75 74 20 66 61 6c 73 65  ation, but false
12c0: 2d 6e 65 67 61 74 69 76 65 73 20 63 61 6e 20 72  -negatives can r
12d0: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 72 75  esult in a corru
12e0: 70 74 0a 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20  pt.** index and 
12f0: 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
1300: 73 2e 0a 2a 2a 0a 2a 2a 20 61 58 52 65 66 5b 6a  s..**.** aXRef[j
1310: 5d 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 6e 65  ] will be non-ne
1320: 67 61 74 69 76 65 20 69 66 20 63 6f 6c 75 6d 6e  gative if column
1330: 20 6a 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e   j of the origin
1340: 61 6c 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 62  al table is.** b
1350: 65 69 6e 67 20 75 70 64 61 74 65 64 2e 20 20 63  eing updated.  c
1360: 68 6e 67 52 6f 77 69 64 20 77 69 6c 6c 20 62 65  hngRowid will be
1370: 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77   true if the row
1380: 69 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  id of the table 
1390: 69 73 0a 2a 2a 20 62 65 69 6e 67 20 75 70 64 61  is.** being upda
13a0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
13b0: 6e 74 20 69 6e 64 65 78 57 68 65 72 65 43 6c 61  nt indexWhereCla
13c0: 75 73 65 4d 69 67 68 74 43 68 61 6e 67 65 28 0a  useMightChange(.
13d0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
13e0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
13f0: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
1400: 6e 74 20 2a 61 58 52 65 66 2c 20 20 20 20 20 20  nt *aXRef,      
1410: 20 2f 2a 20 61 58 52 65 66 5b 6a 5d 3e 3d 30 20   /* aXRef[j]>=0 
1420: 69 66 20 63 6f 6c 75 6d 6e 20 6a 20 69 73 20 62  if column j is b
1430: 65 69 6e 67 20 75 70 64 61 74 65 64 20 2a 2f 0a  eing updated */.
1440: 20 20 69 6e 74 20 63 68 6e 67 52 6f 77 69 64 20    int chngRowid 
1450: 20 20 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74      /* true if t
1460: 68 65 20 72 6f 77 69 64 20 69 73 20 62 65 69 6e  he rowid is bein
1470: 67 20 75 70 64 61 74 65 64 20 2a 2f 0a 29 7b 0a  g updated */.){.
1480: 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72    if( pIdx->pPar
1490: 74 49 64 78 57 68 65 72 65 3d 3d 30 20 29 20 72  tIdxWhere==0 ) r
14a0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
14b0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 66  n sqlite3ExprRef
14c0: 65 72 65 6e 63 65 73 55 70 64 61 74 65 64 43 6f  erencesUpdatedCo
14d0: 6c 75 6d 6e 28 70 49 64 78 2d 3e 70 50 61 72 74  lumn(pIdx->pPart
14e0: 49 64 78 57 68 65 72 65 2c 0a 20 20 20 20 20 20  IdxWhere,.      
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 20 20 20 61 58 52 65 66 2c 20 63 68 6e        aXRef, chn
1520: 67 52 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gRowid);.}../*.*
1530: 2a 20 50 72 6f 63 65 73 73 20 61 6e 20 55 50 44  * Process an UPD
1540: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ATE statement..*
1550: 2a 0a 2a 2a 20 20 20 55 50 44 41 54 45 20 4f 52  *.**   UPDATE OR
1560: 20 49 47 4e 4f 52 45 20 74 61 62 6c 65 5f 77 78   IGNORE table_wx
1570: 79 7a 20 53 45 54 20 61 3d 62 2c 20 63 3d 64 20  yz SET a=b, c=d 
1580: 57 48 45 52 45 20 65 3c 35 20 41 4e 44 20 66 20  WHERE e<5 AND f 
1590: 4e 4f 54 20 4e 55 4c 4c 3b 0a 2a 2a 20 20 20 20  NOT NULL;.**    
15a0: 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 2f 20        \_______/ 
15b0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
15c0: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 5c 5f  ______/       \_
15d0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
15e0: 0a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e  .*            on
15f0: 45 72 72 6f 72 20 20 20 70 54 61 62 4c 69 73 74  Error   pTabList
1600: 20 20 20 20 20 20 70 43 68 61 6e 67 65 73 20 20        pChanges  
1610: 20 20 20 20 20 20 20 20 20 20 20 70 57 68 65 72             pWher
1620: 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  e.*/.void sqlite
1630: 33 55 70 64 61 74 65 28 0a 20 20 50 61 72 73 65  3Update(.  Parse
1640: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1650: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1660: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
1670: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
1680: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1690: 20 69 6e 20 77 68 69 63 68 20 77 65 20 73 68 6f   in which we sho
16a0: 75 6c 64 20 63 68 61 6e 67 65 20 74 68 69 6e 67  uld change thing
16b0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
16c0: 2a 70 43 68 61 6e 67 65 73 2c 20 20 20 20 2f 2a  *pChanges,    /*
16d0: 20 54 68 69 6e 67 73 20 74 6f 20 62 65 20 63 68   Things to be ch
16e0: 61 6e 67 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  anged */.  Expr 
16f0: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
1700: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1710: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 6e  lause.  May be n
1720: 75 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ull */.  int onE
1730: 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rror,           
1740: 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65  /* How to handle
1750: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f   constraint erro
1760: 72 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  rs */.  ExprList
1770: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f   *pOrderBy,    /
1780: 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
1790: 65 2e 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a  e. May be null *
17a0: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
17b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  ,          /* LI
17c0: 4d 49 54 20 63 6c 61 75 73 65 2e 20 4d 61 79 20  MIT clause. May 
17d0: 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 55 70 73  be null */.  Ups
17e0: 65 72 74 20 2a 70 55 70 73 65 72 74 20 20 20 20  ert *pUpsert    
17f0: 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49      /* ON CONFLI
1800: 43 54 20 63 6c 61 75 73 65 2c 20 6f 72 20 6e 75  CT clause, or nu
1810: 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ll */.){.  int i
1820: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
1830: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1840: 72 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  rs */.  Table *p
1850: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Tab;           /
1860: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
1870: 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 69  e updated */.  i
1880: 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 30 3b 20  nt addrTop = 0; 
1890: 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 69 6e        /* VDBE in
18a0: 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73  struction addres
18b0: 73 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f  s of the start o
18c0: 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
18d0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
18e0: 6f 3b 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o;     /* Inform
18f0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1900: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1910: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
1920: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1930: 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
1940: 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 49 6e 64   engine */.  Ind
1950: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
1960: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1970: 6e 67 20 6f 76 65 72 20 69 6e 64 69 63 65 73 20  ng over indices 
1980: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b  */.  Index *pPk;
1990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19a0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
19b0: 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54  ndex for WITHOUT
19c0: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
19d0: 0a 20 20 69 6e 74 20 6e 49 64 78 3b 20 20 20 20  .  int nIdx;    
19e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19f0: 62 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20 74  ber of indices t
1a00: 68 61 74 20 6e 65 65 64 20 75 70 64 61 74 69 6e  hat need updatin
1a10: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  g */.  int iBase
1a20: 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur;          /*
1a30: 20 42 61 73 65 20 63 75 72 73 6f 72 20 6e 75 6d   Base cursor num
1a40: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61  ber */.  int iDa
1a50: 74 61 43 75 72 3b 20 20 20 20 20 20 20 20 20 20  taCur;          
1a60: 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 68  /* Cursor for th
1a70: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 64 61 74 61  e canonical data
1a80: 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
1a90: 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20  iIdxCur;        
1aa0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72     /* Cursor for
1ab0: 20 74 68 65 20 66 69 72 73 74 20 69 6e 64 65 78   the first index
1ac0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1ad0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
1ae0: 54 68 65 20 64 61 74 61 62 61 73 65 20 73 74 72  The database str
1af0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
1b00: 2a 61 52 65 67 49 64 78 20 3d 20 30 3b 20 20 20  *aRegIdx = 0;   
1b10: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
1b20: 73 74 65 72 20 69 6e 20 61 72 72 61 79 20 61 73  ster in array as
1b30: 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20 69  signed to each i
1b40: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ndex */.  int *a
1b50: 58 52 65 66 20 3d 20 30 3b 20 20 20 20 20 20 20  XRef = 0;       
1b60: 20 2f 2a 20 61 58 52 65 66 5b 69 5d 20 69 73 20   /* aXRef[i] is 
1b70: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 43 68  the index in pCh
1b80: 61 6e 67 65 73 2d 3e 61 5b 5d 20 6f 66 20 74 68  anges->a[] of th
1b90: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
1ba0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e             ** an
1bb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   expression for 
1bc0: 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20  the i-th column 
1bd0: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 20 20 20 2a 2a 20 61 58 52 65 66 5b         ** aXRef[
1c00: 69 5d 3d 3d 2d 31 20 69 66 20 74 68 65 20 69 2d  i]==-1 if the i-
1c10: 74 68 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  th column is not
1c20: 20 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 20 20 75   changed. */.  u
1c30: 38 20 2a 61 54 6f 4f 70 65 6e 3b 20 20 20 20 20  8 *aToOpen;     
1c40: 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 74        /* 1 for t
1c50: 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65  ables and indice
1c60: 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  s to be opened *
1c70: 2f 0a 20 20 75 38 20 63 68 6e 67 50 6b 3b 20 20  /.  u8 chngPk;  
1c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52             /* PR
1c90: 49 4d 41 52 59 20 4b 45 59 20 63 68 61 6e 67 65  IMARY KEY change
1ca0: 64 20 69 6e 20 61 20 57 49 54 48 4f 55 54 20 52  d in a WITHOUT R
1cb0: 4f 57 49 44 20 74 61 62 6c 65 20 2a 2f 0a 20 20  OWID table */.  
1cc0: 75 38 20 63 68 6e 67 52 6f 77 69 64 3b 20 20 20  u8 chngRowid;   
1cd0: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
1ce0: 63 68 61 6e 67 65 64 20 69 6e 20 61 20 6e 6f 72  changed in a nor
1cf0: 6d 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  mal table */.  u
1d00: 38 20 63 68 6e 67 4b 65 79 3b 20 20 20 20 20 20  8 chngKey;      
1d10: 20 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20        /* Either 
1d20: 63 68 6e 67 50 6b 20 6f 72 20 63 68 6e 67 52 6f  chngPk or chngRo
1d30: 77 69 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  wid */.  Expr *p
1d40: 52 6f 77 69 64 45 78 70 72 20 3d 20 30 3b 20 20  RowidExpr = 0;  
1d50: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 64 65  /* Expression de
1d60: 66 69 6e 69 6e 67 20 74 68 65 20 6e 65 77 20 72  fining the new r
1d70: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a 2f 0a  ecord number */.
1d80: 20 20 41 75 74 68 43 6f 6e 74 65 78 74 20 73 43    AuthContext sC
1d90: 6f 6e 74 65 78 74 3b 20 20 2f 2a 20 54 68 65 20  ontext;  /* The 
1da0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 6f  authorization co
1db0: 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43  ntext */.  NameC
1dc0: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
1dd0: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 2d 63 6f    /* The name-co
1de0: 6e 74 65 78 74 20 74 6f 20 72 65 73 6f 6c 76 65  ntext to resolve
1df0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
1e00: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1e20: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
1e30: 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ng the table bei
1e40: 6e 67 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20  ng updated */.  
1e50: 69 6e 74 20 65 4f 6e 65 50 61 73 73 3b 20 20 20  int eOnePass;   
1e60: 20 20 20 20 20 20 20 2f 2a 20 4f 4e 45 50 41 53         /* ONEPAS
1e70: 53 5f 58 58 58 20 76 61 6c 75 65 20 66 72 6f 6d  S_XXX value from
1e80: 20 77 68 65 72 65 2e 63 20 2a 2f 0a 20 20 69 6e   where.c */.  in
1e90: 74 20 68 61 73 46 4b 3b 20 20 20 20 20 20 20 20  t hasFK;        
1ea0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1eb0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 72 6f 63  foreign key proc
1ec0: 65 73 73 69 6e 67 20 69 73 20 72 65 71 75 69 72  essing is requir
1ed0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  ed */.  int labe
1ee0: 6c 42 72 65 61 6b 3b 20 20 20 20 20 20 20 20 2f  lBreak;        /
1ef0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
1f00: 72 65 61 6b 20 6f 75 74 20 6f 66 20 55 50 44 41  reak out of UPDA
1f10: 54 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  TE loop */.  int
1f20: 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 3b 20   labelContinue; 
1f30: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1f40: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 6e 65 78   to continue nex
1f50: 74 20 73 74 65 70 20 6f 66 20 55 50 44 41 54 45  t step of UPDATE
1f60: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 66   loop */.  int f
1f70: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1f80: 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73    /* Flags for s
1f90: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1fa0: 28 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  () */..#ifndef S
1fb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
1fc0: 45 52 0a 20 20 69 6e 74 20 69 73 56 69 65 77 3b  ER.  int isView;
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fe0: 72 75 65 20 77 68 65 6e 20 75 70 64 61 74 69 6e  rue when updatin
1ff0: 67 20 61 20 76 69 65 77 20 28 49 4e 53 54 45 41  g a view (INSTEA
2000: 44 20 4f 46 20 74 72 69 67 67 65 72 29 20 2a 2f  D OF trigger) */
2010: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
2020: 67 67 65 72 3b 20 20 20 20 20 2f 2a 20 4c 69 73  gger;     /* Lis
2030: 74 20 6f 66 20 74 72 69 67 67 65 72 73 20 6f 6e  t of triggers on
2040: 20 70 54 61 62 2c 20 69 66 20 72 65 71 75 69 72   pTab, if requir
2050: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 6d 61 73  ed */.  int tmas
2060: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
2070: 2a 20 4d 61 73 6b 20 6f 66 20 54 52 49 47 47 45  * Mask of TRIGGE
2080: 52 5f 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52  R_BEFORE|TRIGGER
2090: 5f 41 46 54 45 52 20 2a 2f 0a 23 65 6e 64 69 66  _AFTER */.#endif
20a0: 0a 20 20 69 6e 74 20 6e 65 77 6d 61 73 6b 3b 20  .  int newmask; 
20b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
20c0: 6b 20 6f 66 20 4e 45 57 2e 2a 20 63 6f 6c 75 6d  k of NEW.* colum
20d0: 6e 73 20 61 63 63 65 73 73 65 64 20 62 79 20 42  ns accessed by B
20e0: 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 20 2a  EFORE triggers *
20f0: 2f 0a 20 20 69 6e 74 20 69 45 70 68 20 3d 20 30  /.  int iEph = 0
2100: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 70  ;          /* Ep
2110: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 68 6f  hemeral table ho
2120: 6c 64 69 6e 67 20 61 6c 6c 20 70 72 69 6d 61 72  lding all primar
2130: 79 20 6b 65 79 20 76 61 6c 75 65 73 20 2a 2f 0a  y key values */.
2140: 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 20    int nKey = 0; 
2150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2160: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
2170: 6e 20 72 65 67 4b 65 79 20 66 6f 72 20 57 49 54  n regKey for WIT
2180: 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20  HOUT ROWID */.  
2190: 69 6e 74 20 61 69 43 75 72 4f 6e 65 50 61 73 73  int aiCurOnePass
21a0: 5b 32 5d 3b 20 20 20 2f 2a 20 54 68 65 20 77 72  [2];   /* The wr
21b0: 69 74 65 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  ite cursors open
21c0: 65 64 20 62 79 20 57 48 45 52 45 5f 4f 4e 45 50  ed by WHERE_ONEP
21d0: 41 53 53 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ASS */.  int add
21e0: 72 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  rOpen = 0;      
21f0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
2200: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a  _OpenEphemeral *
2210: 2f 0a 20 20 69 6e 74 20 69 50 6b 20 3d 20 30 3b  /.  int iPk = 0;
2220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2230: 72 73 74 20 6f 66 20 6e 50 6b 20 63 65 6c 6c 73  rst of nPk cells
2240: 20 68 6f 6c 64 69 6e 67 20 50 52 49 4d 41 52 59   holding PRIMARY
2250: 20 4b 45 59 20 76 61 6c 75 65 20 2a 2f 0a 20 20   KEY value */.  
2260: 69 31 36 20 6e 50 6b 20 3d 20 30 3b 20 20 20 20  i16 nPk = 0;    
2270: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2280: 20 6f 66 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f   of components o
2290: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
22a0: 59 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 70 6c  Y */.  int bRepl
22b0: 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ace = 0;      /*
22c0: 20 54 72 75 65 20 69 66 20 52 45 50 4c 41 43 45   True if REPLACE
22d0: 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
22e0: 74 69 6f 6e 20 6d 69 67 68 74 20 68 61 70 70 65  tion might happe
22f0: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73  n */..  /* Regis
2300: 74 65 72 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 20  ter Allocations 
2310: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 43  */.  int regRowC
2320: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 41  ount = 0;   /* A
2330: 20 63 6f 75 6e 74 20 6f 66 20 72 6f 77 73 20 63   count of rows c
2340: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20  hanged */.  int 
2350: 72 65 67 4f 6c 64 52 6f 77 69 64 20 3d 20 30 3b  regOldRowid = 0;
2360: 20 20 20 2f 2a 20 54 68 65 20 6f 6c 64 20 72 6f     /* The old ro
2370: 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  wid */.  int reg
2380: 4e 65 77 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  NewRowid = 0;   
2390: 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 77 69 64  /* The new rowid
23a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77   */.  int regNew
23b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
23c0: 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4e  Content of the N
23d0: 45 57 2e 2a 20 74 61 62 6c 65 20 69 6e 20 74 72  EW.* table in tr
23e0: 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  iggers */.  int 
23f0: 72 65 67 4f 6c 64 20 3d 20 30 3b 20 20 20 20 20  regOld = 0;     
2400: 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2410: 20 4f 4c 44 2e 2a 20 74 61 62 6c 65 20 69 6e 20   OLD.* table in 
2420: 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e  triggers */.  in
2430: 74 20 72 65 67 52 6f 77 53 65 74 20 3d 20 30 3b  t regRowSet = 0;
2440: 20 20 20 20 20 2f 2a 20 52 6f 77 73 65 74 20 6f       /* Rowset o
2450: 66 20 72 6f 77 73 20 74 6f 20 62 65 20 75 70 64  f rows to be upd
2460: 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ated */.  int re
2470: 67 4b 65 79 20 3d 20 30 3b 20 20 20 20 20 20 20  gKey = 0;       
2480: 20 2f 2a 20 63 6f 6d 70 6f 73 69 74 65 20 50 52   /* composite PR
2490: 49 4d 41 52 59 20 4b 45 59 20 76 61 6c 75 65 20  IMARY KEY value 
24a0: 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 43  */..  memset(&sC
24b0: 6f 6e 74 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f  ontext, 0, sizeo
24c0: 66 28 73 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20  f(sContext));.  
24d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
24e0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
24f0: 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
2500: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
2510: 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e  oto update_clean
2520: 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  up;.  }.  assert
2530: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
2540: 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  ==1 );..  /* Loc
2550: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 77 68  ate the table wh
2560: 69 63 68 20 77 65 20 77 61 6e 74 20 74 6f 20 75  ich we want to u
2570: 70 64 61 74 65 2e 20 0a 20 20 2a 2f 0a 20 20 70  pdate. .  */.  p
2580: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
2590: 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
25a0: 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  e, pTabList);.  
25b0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
25c0: 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75  to update_cleanu
25d0: 70 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  p;.  iDb = sqlit
25e0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
25f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
2600: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f  ->pSchema);..  /
2610: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20  * Figure out if 
2620: 77 65 20 68 61 76 65 20 61 6e 79 20 74 72 69 67  we have any trig
2630: 67 65 72 73 20 61 6e 64 20 69 66 20 74 68 65 20  gers and if the 
2640: 74 61 62 6c 65 20 62 65 69 6e 67 0a 20 20 2a 2a  table being.  **
2650: 20 75 70 64 61 74 65 64 20 69 73 20 61 20 76 69   updated is a vi
2660: 65 77 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ew..  */.#ifndef
2670: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
2680: 47 47 45 52 0a 20 20 70 54 72 69 67 67 65 72 20  GGER.  pTrigger 
2690: 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
26a0: 73 45 78 69 73 74 28 70 50 61 72 73 65 2c 20 70  sExist(pParse, p
26b0: 54 61 62 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20  Tab, TK_UPDATE, 
26c0: 70 43 68 61 6e 67 65 73 2c 20 26 74 6d 61 73 6b  pChanges, &tmask
26d0: 29 3b 0a 20 20 69 73 56 69 65 77 20 3d 20 70 54  );.  isView = pT
26e0: 61 62 2d 3e 70 53 65 6c 65 63 74 21 3d 30 3b 0a  ab->pSelect!=0;.
26f0: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
2700: 65 72 20 7c 7c 20 74 6d 61 73 6b 3d 3d 30 20 29  er || tmask==0 )
2710: 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ;.#else.# define
2720: 20 70 54 72 69 67 67 65 72 20 30 0a 23 20 64 65   pTrigger 0.# de
2730: 66 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23 20  fine isView 0.# 
2740: 64 65 66 69 6e 65 20 74 6d 61 73 6b 20 30 0a 23  define tmask 0.#
2750: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
2760: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 23 20  ITE_OMIT_VIEW.# 
2770: 75 6e 64 65 66 20 69 73 56 69 65 77 0a 23 20 64  undef isView.# d
2780: 65 66 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23  efine isView 0.#
2790: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
27a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41  LITE_ENABLE_UPDA
27b0: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 0a  TE_DELETE_LIMIT.
27c0: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b    if( !isView ){
27d0: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
27e0: 6c 69 74 65 33 4c 69 6d 69 74 57 68 65 72 65 28  lite3LimitWhere(
27f0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c  .        pParse,
2800: 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
2810: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4c 69  e, pOrderBy, pLi
2820: 6d 69 74 2c 20 22 55 50 44 41 54 45 22 0a 20 20  mit, "UPDATE".  
2830: 20 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42    );.    pOrderB
2840: 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 6d 69  y = 0;.    pLimi
2850: 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  t = 0;.  }.#endi
2860: 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  f..  if( sqlite3
2870: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
2880: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
2890: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64   ){.    goto upd
28a0: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ate_cleanup;.  }
28b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73  .  if( sqlite3Is
28c0: 52 65 61 64 4f 6e 6c 79 28 70 50 61 72 73 65 2c  ReadOnly(pParse,
28d0: 20 70 54 61 62 2c 20 74 6d 61 73 6b 29 20 29 7b   pTab, tmask) ){
28e0: 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65  .    goto update
28f0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
2900: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 63   /* Allocate a c
2910: 75 72 73 6f 72 73 20 66 6f 72 20 74 68 65 20 6d  ursors for the m
2920: 61 69 6e 20 64 61 74 61 62 61 73 65 20 74 61 62  ain database tab
2930: 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69  le and for all i
2940: 6e 64 69 63 65 73 2e 0a 20 20 2a 2a 20 54 68 65  ndices..  ** The
2950: 20 69 6e 64 65 78 20 63 75 72 73 6f 72 73 20 6d   index cursors m
2960: 69 67 68 74 20 6e 6f 74 20 62 65 20 75 73 65 64  ight not be used
2970: 2c 20 62 75 74 20 69 66 20 74 68 65 79 20 61 72  , but if they ar
2980: 65 20 75 73 65 64 20 74 68 65 79 0a 20 20 2a 2a  e used they.  **
2990: 20 6e 65 65 64 20 74 6f 20 6f 63 63 75 72 20 72   need to occur r
29a0: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 64  ight after the d
29b0: 61 74 61 62 61 73 65 20 63 75 72 73 6f 72 2e 20  atabase cursor. 
29c0: 20 53 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   So go ahead and
29d0: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 65  .  ** allocate e
29e0: 6e 6f 75 67 68 20 73 70 61 63 65 2c 20 6a 75 73  nough space, jus
29f0: 74 20 69 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a  t in case..  */.
2a00: 20 20 69 42 61 73 65 43 75 72 20 3d 20 69 44 61    iBaseCur = iDa
2a10: 74 61 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  taCur = pParse->
2a20: 6e 54 61 62 2b 2b 3b 0a 20 20 69 49 64 78 43 75  nTab++;.  iIdxCu
2a30: 72 20 3d 20 69 44 61 74 61 43 75 72 2b 31 3b 0a  r = iDataCur+1;.
2a40: 20 20 70 50 6b 20 3d 20 48 61 73 52 6f 77 69 64    pPk = HasRowid
2a50: 28 70 54 61 62 29 20 3f 20 30 20 3a 20 73 71 6c  (pTab) ? 0 : sql
2a60: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
2a70: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 74 65 73  dex(pTab);.  tes
2a80: 74 63 61 73 65 28 20 70 50 6b 21 3d 30 20 26 26  tcase( pPk!=0 &&
2a90: 20 70 50 6b 21 3d 70 54 61 62 2d 3e 70 49 6e 64   pPk!=pTab->pInd
2aa0: 65 78 20 29 3b 0a 20 20 66 6f 72 28 6e 49 64 78  ex );.  for(nIdx
2ab0: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
2ac0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
2ad0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e  x=pIdx->pNext, n
2ae0: 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  Idx++){.    if( 
2af0: 70 50 6b 3d 3d 70 49 64 78 20 29 7b 0a 20 20 20  pPk==pIdx ){.   
2b00: 20 20 20 69 44 61 74 61 43 75 72 20 3d 20 70 50     iDataCur = pP
2b10: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
2b20: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  }.    pParse->nT
2b30: 61 62 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ab++;.  }.  if( 
2b40: 70 55 70 73 65 72 74 20 29 7b 0a 20 20 20 20 2f  pUpsert ){.    /
2b50: 2a 20 4f 6e 20 61 6e 20 55 50 53 45 52 54 2c 20  * On an UPSERT, 
2b60: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 63  reuse the same c
2b70: 75 72 73 6f 72 73 20 61 6c 72 65 61 64 79 20 6f  ursors already o
2b80: 70 65 6e 65 64 20 62 79 20 49 4e 53 45 52 54 20  pened by INSERT 
2b90: 2a 2f 0a 20 20 20 20 69 44 61 74 61 43 75 72 20  */.    iDataCur 
2ba0: 3d 20 70 55 70 73 65 72 74 2d 3e 69 44 61 74 61  = pUpsert->iData
2bb0: 43 75 72 3b 0a 20 20 20 20 69 49 64 78 43 75 72  Cur;.    iIdxCur
2bc0: 20 3d 20 70 55 70 73 65 72 74 2d 3e 69 49 64 78   = pUpsert->iIdx
2bd0: 43 75 72 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Cur;.    pParse-
2be0: 3e 6e 54 61 62 20 3d 20 69 42 61 73 65 43 75 72  >nTab = iBaseCur
2bf0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
2c00: 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[0].iCursor =
2c10: 20 69 44 61 74 61 43 75 72 3b 0a 0a 20 20 2f 2a   iDataCur;..  /*
2c20: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
2c30: 66 6f 72 20 61 58 52 65 66 5b 5d 2c 20 61 52 65  for aXRef[], aRe
2c40: 67 49 64 78 5b 5d 2c 20 61 6e 64 20 61 54 6f 4f  gIdx[], and aToO
2c50: 70 65 6e 5b 5d 2e 20 20 0a 20 20 2a 2a 20 49 6e  pen[].  .  ** In
2c60: 69 74 69 61 6c 69 7a 65 20 61 58 52 65 66 5b 5d  itialize aXRef[]
2c70: 20 61 6e 64 20 61 54 6f 4f 70 65 6e 5b 5d 20 74   and aToOpen[] t
2c80: 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20  o their default 
2c90: 76 61 6c 75 65 73 2e 0a 20 20 2a 2f 0a 20 20 61  values..  */.  a
2ca0: 58 52 65 66 20 3d 20 73 71 6c 69 74 65 33 44 62  XRef = sqlite3Db
2cb0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
2cc0: 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20 28 70  sizeof(int) * (p
2cd0: 54 61 62 2d 3e 6e 43 6f 6c 2b 6e 49 64 78 29 20  Tab->nCol+nIdx) 
2ce0: 2b 20 6e 49 64 78 2b 32 20 29 3b 0a 20 20 69 66  + nIdx+2 );.  if
2cf0: 28 20 61 58 52 65 66 3d 3d 30 20 29 20 67 6f 74  ( aXRef==0 ) got
2d00: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
2d10: 3b 0a 20 20 61 52 65 67 49 64 78 20 3d 20 61 58  ;.  aRegIdx = aX
2d20: 52 65 66 2b 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  Ref+pTab->nCol;.
2d30: 20 20 61 54 6f 4f 70 65 6e 20 3d 20 28 75 38 2a    aToOpen = (u8*
2d40: 29 28 61 52 65 67 49 64 78 2b 6e 49 64 78 29 3b  )(aRegIdx+nIdx);
2d50: 0a 20 20 6d 65 6d 73 65 74 28 61 54 6f 4f 70 65  .  memset(aToOpe
2d60: 6e 2c 20 31 2c 20 6e 49 64 78 2b 31 29 3b 0a 20  n, 1, nIdx+1);. 
2d70: 20 61 54 6f 4f 70 65 6e 5b 6e 49 64 78 2b 31 5d   aToOpen[nIdx+1]
2d80: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
2d90: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
2da0: 2b 2b 29 20 61 58 52 65 66 5b 69 5d 20 3d 20 2d  ++) aXRef[i] = -
2db0: 31 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  1;..  /* Initial
2dc0: 69 7a 65 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e  ize the name-con
2dd0: 74 65 78 74 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  text */.  memset
2de0: 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
2df0: 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50  (sNC));.  sNC.pP
2e00: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2e10: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
2e20: 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e  pTabList;.  sNC.
2e30: 75 4e 43 2e 70 55 70 73 65 72 74 20 3d 20 70 55  uNC.pUpsert = pU
2e40: 70 73 65 72 74 3b 0a 20 20 73 4e 43 2e 6e 63 46  psert;.  sNC.ncF
2e50: 6c 61 67 73 20 3d 20 4e 43 5f 55 55 70 73 65 72  lags = NC_UUpser
2e60: 74 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  t;..  /* Resolve
2e70: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
2e80: 73 20 69 6e 20 61 6c 6c 20 74 68 65 20 65 78 70  s in all the exp
2e90: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
2ea0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 55 50 44 41    ** of the UPDA
2eb0: 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  TE statement.  A
2ec0: 6c 73 6f 20 66 69 6e 64 20 74 68 65 20 63 6f 6c  lso find the col
2ed0: 75 6d 6e 20 69 6e 64 65 78 0a 20 20 2a 2a 20 66  umn index.  ** f
2ee0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 74  or each column t
2ef0: 6f 20 62 65 20 75 70 64 61 74 65 64 20 69 6e 20  o be updated in 
2f00: 74 68 65 20 70 43 68 61 6e 67 65 73 20 61 72 72  the pChanges arr
2f10: 61 79 2e 20 20 46 6f 72 20 65 61 63 68 0a 20 20  ay.  For each.  
2f20: 2a 2a 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  ** column to be 
2f30: 75 70 64 61 74 65 64 2c 20 6d 61 6b 65 20 73 75  updated, make su
2f40: 72 65 20 77 65 20 68 61 76 65 20 61 75 74 68 6f  re we have autho
2f50: 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 68 61 6e  rization to chan
2f60: 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c  ge.  ** that col
2f70: 75 6d 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 6e 67  umn..  */.  chng
2f80: 52 6f 77 69 64 20 3d 20 63 68 6e 67 50 6b 20 3d  Rowid = chngPk =
2f90: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
2fa0: 3c 70 43 68 61 6e 67 65 73 2d 3e 6e 45 78 70 72  <pChanges->nExpr
2fb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2fc0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
2fd0: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 43  prNames(&sNC, pC
2fe0: 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 70 45 78  hanges->a[i].pEx
2ff0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  pr) ){.      got
3000: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
3010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
3020: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
3030: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
3040: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
3050: 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  p(pTab->aCol[j].
3060: 7a 4e 61 6d 65 2c 20 70 43 68 61 6e 67 65 73 2d  zName, pChanges-
3070: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
3080: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  ){.        if( j
3090: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
30a0: 0a 20 20 20 20 20 20 20 20 20 20 63 68 6e 67 52  .          chngR
30b0: 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  owid = 1;.      
30c0: 20 20 20 20 70 52 6f 77 69 64 45 78 70 72 20 3d      pRowidExpr =
30d0: 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e   pChanges->a[i].
30e0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  pExpr;.        }
30f0: 65 6c 73 65 20 69 66 28 20 70 50 6b 20 26 26 20  else if( pPk && 
3100: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 63  (pTab->aCol[j].c
3110: 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
3120: 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b  G_PRIMKEY)!=0 ){
3130: 0a 20 20 20 20 20 20 20 20 20 20 63 68 6e 67 50  .          chngP
3140: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  k = 1;.        }
3150: 0a 20 20 20 20 20 20 20 20 61 58 52 65 66 5b 6a  .        aXRef[j
3160: 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 62  ] = i;.        b
3170: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3180: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
3190: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
31a0: 20 20 20 69 66 28 20 70 50 6b 3d 3d 30 20 26 26     if( pPk==0 &&
31b0: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
31c0: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a  pChanges->a[i].z
31d0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
31e0: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
31f0: 20 63 68 6e 67 52 6f 77 69 64 20 3d 20 31 3b 0a   chngRowid = 1;.
3200: 20 20 20 20 20 20 20 20 70 52 6f 77 69 64 45 78          pRowidEx
3210: 70 72 20 3d 20 70 43 68 61 6e 67 65 73 2d 3e 61  pr = pChanges->a
3220: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
3230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3240: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3250: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
3260: 20 63 6f 6c 75 6d 6e 3a 20 25 73 22 2c 20 70 43   column: %s", pC
3270: 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  hanges->a[i].zNa
3280: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  me);.        pPa
3290: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
32a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
32b0: 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75  to update_cleanu
32c0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
32d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32e0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
32f0: 4f 4e 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  ON.    {.      i
3300: 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  nt rc;.      rc 
3310: 3d 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  = sqlite3AuthChe
3320: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
3330: 45 5f 55 50 44 41 54 45 2c 20 70 54 61 62 2d 3e  E_UPDATE, pTab->
3340: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3360: 20 20 20 6a 3c 30 20 3f 20 22 52 4f 57 49 44 22     j<0 ? "ROWID"
3370: 20 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   : pTab->aCol[j]
3380: 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  .zName,.        
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
33b0: 2e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20 20 20 20  .zDbSName);.    
33c0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33d0: 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 20  _DENY ){.       
33e0: 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65   goto update_cle
33f0: 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73  anup;.      }els
3400: 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
3410: 5f 49 47 4e 4f 52 45 20 29 7b 0a 20 20 20 20 20  _IGNORE ){.     
3420: 20 20 20 61 58 52 65 66 5b 6a 5d 20 3d 20 2d 31     aXRef[j] = -1
3430: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3440: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 61 73 73  #endif.  }.  ass
3450: 65 72 74 28 20 28 63 68 6e 67 52 6f 77 69 64 20  ert( (chngRowid 
3460: 26 20 63 68 6e 67 50 6b 29 3d 3d 30 20 29 3b 0a  & chngPk)==0 );.
3470: 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 52 6f    assert( chngRo
3480: 77 69 64 3d 3d 30 20 7c 7c 20 63 68 6e 67 52 6f  wid==0 || chngRo
3490: 77 69 64 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  wid==1 );.  asse
34a0: 72 74 28 20 63 68 6e 67 50 6b 3d 3d 30 20 7c 7c  rt( chngPk==0 ||
34b0: 20 63 68 6e 67 50 6b 3d 3d 31 20 29 3b 0a 20 20   chngPk==1 );.  
34c0: 63 68 6e 67 4b 65 79 20 3d 20 63 68 6e 67 52 6f  chngKey = chngRo
34d0: 77 69 64 20 2b 20 63 68 6e 67 50 6b 3b 0a 0a 20  wid + chngPk;.. 
34e0: 20 2f 2a 20 54 68 65 20 53 45 54 20 65 78 70 72   /* The SET expr
34f0: 65 73 73 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  essions are not 
3500: 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20 69 6e  actually used in
3510: 73 69 64 65 20 74 68 65 20 57 48 45 52 45 20 6c  side the WHERE l
3520: 6f 6f 70 2e 20 20 0a 20 20 2a 2a 20 53 6f 20 72  oop.  .  ** So r
3530: 65 73 65 74 20 74 68 65 20 63 6f 6c 55 73 65 64  eset the colUsed
3540: 20 6d 61 73 6b 2e 20 55 6e 6c 65 73 73 20 74 68   mask. Unless th
3550: 69 73 20 69 73 20 61 20 76 69 72 74 75 61 6c 20  is is a virtual 
3560: 74 61 62 6c 65 2e 20 49 6e 20 74 68 61 74 0a 20  table. In that. 
3570: 20 2a 2a 20 63 61 73 65 2c 20 73 65 74 20 61 6c   ** case, set al
3580: 6c 20 62 69 74 73 20 6f 66 20 74 68 65 20 63 6f  l bits of the co
3590: 6c 55 73 65 64 20 6d 61 73 6b 20 28 74 6f 20 65  lUsed mask (to e
35a0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 76  nsure that the v
35b0: 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c  irtual.  ** tabl
35c0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
35d0: 20 6d 61 6b 65 73 20 61 6c 6c 20 63 6f 6c 75 6d   makes all colum
35e0: 6e 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 20  ns available).. 
35f0: 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 2d 3e   */.  pTabList->
3600: 61 5b 30 5d 2e 63 6f 6c 55 73 65 64 20 3d 20 49  a[0].colUsed = I
3610: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
3620: 20 41 4c 4c 42 49 54 53 20 3a 20 30 3b 0a 0a 20   ALLBITS : 0;.. 
3630: 20 68 61 73 46 4b 20 3d 20 73 71 6c 69 74 65 33   hasFK = sqlite3
3640: 46 6b 52 65 71 75 69 72 65 64 28 70 50 61 72 73  FkRequired(pPars
3650: 65 2c 20 70 54 61 62 2c 20 61 58 52 65 66 2c 20  e, pTab, aXRef, 
3660: 63 68 6e 67 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20  chngKey);..  /* 
3670: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 6e 74  There is one ent
3680: 72 79 20 69 6e 20 74 68 65 20 61 52 65 67 49 64  ry in the aRegId
3690: 78 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 65 61  x[] array for ea
36a0: 63 68 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20  ch index on the 
36b0: 74 61 62 6c 65 0a 20 20 2a 2a 20 62 65 69 6e 67  table.  ** being
36c0: 20 75 70 64 61 74 65 64 2e 20 20 46 69 6c 6c 20   updated.  Fill 
36d0: 69 6e 20 61 52 65 67 49 64 78 5b 5d 20 77 69 74  in aRegIdx[] wit
36e0: 68 20 61 20 72 65 67 69 73 74 65 72 20 6e 75 6d  h a register num
36f0: 62 65 72 20 74 68 61 74 20 77 69 6c 6c 20 68 6f  ber that will ho
3700: 6c 64 0a 20 20 2a 2a 20 74 68 65 20 6b 65 79 20  ld.  ** the key 
3710: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 65 61  for accessing ea
3720: 63 68 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  ch index..  */. 
3730: 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
3740: 5f 52 65 70 6c 61 63 65 20 29 20 62 52 65 70 6c  _Replace ) bRepl
3750: 61 63 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 6a  ace = 1;.  for(j
3760: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
3770: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
3780: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a  x=pIdx->pNext, j
3790: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  ++){.    int reg
37a0: 3b 0a 20 20 20 20 69 66 28 20 63 68 6e 67 4b 65  ;.    if( chngKe
37b0: 79 20 7c 7c 20 68 61 73 46 4b 3e 31 20 7c 7c 20  y || hasFK>1 || 
37c0: 70 49 64 78 3d 3d 70 50 6b 0a 20 20 20 20 20 7c  pIdx==pPk.     |
37d0: 7c 20 69 6e 64 65 78 57 68 65 72 65 43 6c 61 75  | indexWhereClau
37e0: 73 65 4d 69 67 68 74 43 68 61 6e 67 65 28 70 49  seMightChange(pI
37f0: 64 78 2c 61 58 52 65 66 2c 63 68 6e 67 52 6f 77  dx,aXRef,chngRow
3800: 69 64 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  id).    ){.     
3810: 20 72 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d   reg = ++pParse-
3820: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
3830: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 49 64  rse->nMem += pId
3840: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  x->nColumn;.    
3850: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 67  }else{.      reg
3860: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
3870: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65  i=0; i<pIdx->nKe
3880: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
3890: 20 20 20 20 69 66 28 20 69 6e 64 65 78 43 6f 6c      if( indexCol
38a0: 75 6d 6e 49 73 42 65 69 6e 67 55 70 64 61 74 65  umnIsBeingUpdate
38b0: 64 28 70 49 64 78 2c 20 69 2c 20 61 58 52 65 66  d(pIdx, i, aXRef
38c0: 2c 20 63 68 6e 67 52 6f 77 69 64 29 20 29 7b 0a  , chngRowid) ){.
38d0: 20 20 20 20 20 20 20 20 20 20 72 65 67 20 3d 20            reg = 
38e0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
38f0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
3900: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 49 64 78 2d 3e  ->nMem += pIdx->
3910: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  nColumn;.       
3920: 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d     if( onError==
3930: 4f 45 5f 44 65 66 61 75 6c 74 20 26 26 20 70 49  OE_Default && pI
3940: 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
3950: 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
3960: 20 20 20 20 20 20 20 62 52 65 70 6c 61 63 65 20         bReplace 
3970: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
3980: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
3990: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
39a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
39b0: 28 20 72 65 67 3d 3d 30 20 29 20 61 54 6f 4f 70  ( reg==0 ) aToOp
39c0: 65 6e 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 20  en[j+1] = 0;.   
39d0: 20 61 52 65 67 49 64 78 5b 6a 5d 20 3d 20 72 65   aRegIdx[j] = re
39e0: 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 52 65  g;.  }.  if( bRe
39f0: 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 2f 2a 20  place ){.    /* 
3a00: 49 66 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c  If REPLACE confl
3a10: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 6d  ict resolution m
3a20: 69 67 68 74 20 62 65 20 69 6e 76 6f 6b 65 64 2c  ight be invoked,
3a30: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 6f 6e   open cursors on
3a40: 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 64   all .    ** ind
3a50: 65 78 65 73 20 69 6e 20 63 61 73 65 20 74 68 65  exes in case the
3a60: 79 20 61 72 65 20 6e 65 65 64 65 64 20 74 6f 20  y are needed to 
3a70: 64 65 6c 65 74 65 20 72 65 63 6f 72 64 73 2e 20  delete records. 
3a80: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 61   */.    memset(a
3a90: 54 6f 4f 70 65 6e 2c 20 31 2c 20 6e 49 64 78 2b  ToOpen, 1, nIdx+
3aa0: 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  1);.  }..  /* Be
3ab0: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
3ac0: 6f 64 65 2e 20 2a 2f 0a 20 20 76 20 3d 20 73 71  ode. */.  v = sq
3ad0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
3ae0: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
3af0: 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63   ) goto update_c
3b00: 6c 65 61 6e 75 70 3b 0a 20 20 69 66 28 20 70 50  leanup;.  if( pP
3b10: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
3b20: 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  ) sqlite3VdbeCou
3b30: 6e 74 43 68 61 6e 67 65 73 28 76 29 3b 0a 20 20  ntChanges(v);.  
3b40: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
3b50: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
3b60: 65 2c 20 70 54 72 69 67 67 65 72 20 7c 7c 20 68  e, pTrigger || h
3b70: 61 73 46 4b 2c 20 69 44 62 29 3b 0a 0a 20 20 2f  asFK, iDb);..  /
3b80: 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 71 75 69  * Allocate requi
3b90: 72 65 64 20 72 65 67 69 73 74 65 72 73 2e 20 2a  red registers. *
3ba0: 2f 0a 20 20 69 66 28 20 21 49 73 56 69 72 74 75  /.  if( !IsVirtu
3bb0: 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
3bc0: 72 65 67 52 6f 77 53 65 74 20 3d 20 2b 2b 70 50  regRowSet = ++pP
3bd0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
3be0: 72 65 67 4f 6c 64 52 6f 77 69 64 20 3d 20 72 65  regOldRowid = re
3bf0: 67 4e 65 77 52 6f 77 69 64 20 3d 20 2b 2b 70 50  gNewRowid = ++pP
3c00: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
3c10: 69 66 28 20 63 68 6e 67 50 6b 20 7c 7c 20 70 54  if( chngPk || pT
3c20: 72 69 67 67 65 72 20 7c 7c 20 68 61 73 46 4b 20  rigger || hasFK 
3c30: 29 7b 0a 20 20 20 20 20 20 72 65 67 4f 6c 64 20  ){.      regOld 
3c40: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
3c50: 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
3c60: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 54 61 62 2d 3e  ->nMem += pTab->
3c70: 6e 43 6f 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nCol;.    }.    
3c80: 69 66 28 20 63 68 6e 67 4b 65 79 20 7c 7c 20 70  if( chngKey || p
3c90: 54 72 69 67 67 65 72 20 7c 7c 20 68 61 73 46 4b  Trigger || hasFK
3ca0: 20 29 7b 0a 20 20 20 20 20 20 72 65 67 4e 65 77   ){.      regNew
3cb0: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
3cc0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  ->nMem;.    }.  
3cd0: 20 20 72 65 67 4e 65 77 20 3d 20 70 50 61 72 73    regNew = pPars
3ce0: 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
3cf0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
3d00: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d   pTab->nCol;.  }
3d10: 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 74 68 65  ..  /* Start the
3d20: 20 76 69 65 77 20 63 6f 6e 74 65 78 74 2e 20 2a   view context. *
3d30: 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 29  /.  if( isView )
3d40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74  {.    sqlite3Aut
3d50: 68 43 6f 6e 74 65 78 74 50 75 73 68 28 70 50 61  hContextPush(pPa
3d60: 72 73 65 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20  rse, &sContext, 
3d70: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
3d80: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
3d90: 65 20 74 72 79 69 6e 67 20 74 6f 20 75 70 64 61  e trying to upda
3da0: 74 65 20 61 20 76 69 65 77 2c 20 72 65 61 6c 69  te a view, reali
3db0: 7a 65 20 74 68 61 74 20 76 69 65 77 20 69 6e 74  ze that view int
3dc0: 6f 0a 20 20 2a 2a 20 61 6e 20 65 70 68 65 6d 65  o.  ** an epheme
3dd0: 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ral table..  */.
3de0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
3df0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 26  ITE_OMIT_VIEW) &
3e00: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
3e10: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
3e20: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
3e30: 20 20 20 20 73 71 6c 69 74 65 33 4d 61 74 65 72      sqlite3Mater
3e40: 69 61 6c 69 7a 65 56 69 65 77 28 70 50 61 72 73  ializeView(pPars
3e50: 65 2c 20 70 54 61 62 2c 20 0a 20 20 20 20 20 20  e, pTab, .      
3e60: 20 20 70 57 68 65 72 65 2c 20 70 4f 72 64 65 72    pWhere, pOrder
3e70: 42 79 2c 20 70 4c 69 6d 69 74 2c 20 69 44 61 74  By, pLimit, iDat
3e80: 61 43 75 72 0a 20 20 20 20 29 3b 0a 20 20 20 20  aCur.    );.    
3e90: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
3ea0: 20 20 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20    pLimit = 0;.  
3eb0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
3ec0: 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d  esolve the colum
3ed0: 6e 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 74  n names in all t
3ee0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
3ef0: 6e 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45  n the.  ** WHERE
3f00: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
3f10: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
3f20: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
3f30: 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20  , pWhere) ){.   
3f40: 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65   goto update_cle
3f50: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  anup;.  }..#ifnd
3f60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
3f70: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a  IRTUALTABLE.  /*
3f80: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   Virtual tables 
3f90: 6d 75 73 74 20 62 65 20 68 61 6e 64 6c 65 64 20  must be handled 
3fa0: 73 65 70 61 72 61 74 65 6c 79 20 2a 2f 0a 20 20  separately */.  
3fb0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
3fc0: 61 62 29 20 29 7b 0a 20 20 20 20 75 70 64 61 74  ab) ){.    updat
3fd0: 65 56 69 72 74 75 61 6c 54 61 62 6c 65 28 70 50  eVirtualTable(pP
3fe0: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
3ff0: 70 54 61 62 2c 20 70 43 68 61 6e 67 65 73 2c 20  pTab, pChanges, 
4000: 70 52 6f 77 69 64 45 78 70 72 2c 20 61 58 52 65  pRowidExpr, aXRe
4010: 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f,.             
4020: 20 20 20 20 20 20 20 20 20 20 70 57 68 65 72 65            pWhere
4030: 2c 20 6f 6e 45 72 72 6f 72 29 3b 0a 20 20 20 20  , onError);.    
4040: 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61  goto update_clea
4050: 6e 75 70 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nup;.  }.#endif.
4060: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 6c 61  .  /* Jump to la
4070: 62 65 6c 42 72 65 61 6b 20 74 6f 20 61 62 61 6e  belBreak to aban
4080: 64 6f 6e 20 66 75 72 74 68 65 72 20 70 72 6f 63  don further proc
4090: 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20 55  essing of this U
40a0: 50 44 41 54 45 20 2a 2f 0a 20 20 6c 61 62 65 6c  PDATE */.  label
40b0: 43 6f 6e 74 69 6e 75 65 20 3d 20 6c 61 62 65 6c  Continue = label
40c0: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
40d0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
40e0: 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 20  rse);..  /* Not 
40f0: 61 6e 20 55 50 53 45 52 54 2e 20 20 4e 6f 72 6d  an UPSERT.  Norm
4100: 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  al processing.  
4110: 42 65 67 69 6e 20 62 79 0a 20 20 2a 2a 20 69 6e  Begin by.  ** in
4120: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75  itialize the cou
4130: 6e 74 20 6f 66 20 75 70 64 61 74 65 64 20 72 6f  nt of updated ro
4140: 77 73 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d  ws */.  if( (db-
4150: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f  >flags&SQLITE_Co
4160: 75 6e 74 52 6f 77 73 29 21 3d 30 0a 20 20 20 26  untRows)!=0.   &
4170: 26 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67  & !pParse->pTrig
4180: 67 65 72 54 61 62 0a 20 20 20 26 26 20 21 70 50  gerTab.   && !pP
4190: 61 72 73 65 2d 3e 6e 65 73 74 65 64 0a 20 20 20  arse->nested.   
41a0: 26 26 20 70 55 70 73 65 72 74 3d 3d 30 0a 20 20  && pUpsert==0.  
41b0: 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 43 6f 75  ){.    regRowCou
41c0: 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
41d0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
41e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
41f0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
4200: 52 6f 77 43 6f 75 6e 74 29 3b 0a 20 20 7d 0a 0a  RowCount);.  }..
4210: 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
4220: 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
4230: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4240: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
4250: 52 6f 77 53 65 74 2c 20 72 65 67 4f 6c 64 52 6f  RowSet, regOldRo
4260: 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  wid);.  }else{. 
4270: 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d     assert( pPk!=
4280: 30 20 29 3b 0a 20 20 20 20 6e 50 6b 20 3d 20 70  0 );.    nPk = p
4290: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  Pk->nKeyCol;.   
42a0: 20 69 50 6b 20 3d 20 70 50 61 72 73 65 2d 3e 6e   iPk = pParse->n
42b0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
42c0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 6b 3b 0a  e->nMem += nPk;.
42d0: 20 20 20 20 72 65 67 4b 65 79 20 3d 20 2b 2b 70      regKey = ++p
42e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
42f0: 20 69 66 28 20 70 55 70 73 65 72 74 3d 3d 30 20   if( pUpsert==0 
4300: 29 7b 0a 20 20 20 20 20 20 69 45 70 68 20 3d 20  ){.      iEph = 
4310: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
4320: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4330: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4340: 4e 75 6c 6c 2c 20 30 2c 20 69 50 6b 2c 20 69 50  Null, 0, iPk, iP
4350: 6b 2b 6e 50 6b 2d 31 29 3b 0a 20 20 20 20 20 20  k+nPk-1);.      
4360: 61 64 64 72 4f 70 65 6e 20 3d 20 73 71 6c 69 74  addrOpen = sqlit
4370: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4380: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
4390: 2c 20 69 45 70 68 2c 20 6e 50 6b 29 3b 0a 20 20  , iEph, nPk);.  
43a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
43b0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
43c0: 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 7d 0a  se, pPk);.    }.
43d0: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 55 70    }.  .  if( pUp
43e0: 73 65 72 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  sert ){.    /* I
43f0: 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 53  f this is an UPS
4400: 45 52 54 2c 20 74 68 65 6e 20 61 6c 6c 20 63 75  ERT, then all cu
4410: 72 73 6f 72 73 20 68 61 76 65 20 61 6c 72 65 61  rsors have alrea
4420: 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62  dy been opened b
4430: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 75 74  y.    ** the out
4440: 65 72 20 49 4e 53 45 52 54 20 61 6e 64 20 74 68  er INSERT and th
4450: 65 20 64 61 74 61 20 63 75 72 73 6f 72 20 73 68  e data cursor sh
4460: 6f 75 6c 64 20 62 65 20 70 6f 69 6e 74 69 6e 67  ould be pointing
4470: 20 61 74 20 74 68 65 20 72 6f 77 0a 20 20 20 20   at the row.    
4480: 2a 2a 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  ** that is to be
4490: 20 75 70 64 61 74 65 64 2e 20 20 53 6f 20 62 79   updated.  So by
44a0: 70 61 73 73 20 74 68 65 20 63 6f 64 65 20 74 68  pass the code th
44b0: 61 74 20 73 65 61 72 63 68 65 73 20 66 6f 72 20  at searches for 
44c0: 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77 28 73  the.    ** row(s
44d0: 29 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  ) to be updated.
44e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e  .    */.    pWIn
44f0: 66 6f 20 3d 20 30 3b 0a 20 20 20 20 65 4f 6e 65  fo = 0;.    eOne
4500: 50 61 73 73 20 3d 20 4f 4e 45 50 41 53 53 5f 53  Pass = ONEPASS_S
4510: 49 4e 47 4c 45 3b 0a 20 20 20 20 73 71 6c 69 74  INGLE;.    sqlit
4520: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
4530: 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 6c 61  arse, pWhere, la
4540: 62 65 6c 42 72 65 61 6b 2c 20 53 51 4c 49 54 45  belBreak, SQLITE
4550: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
4560: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 42 65  }else{.    /* Be
4570: 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
4580: 20 73 63 61 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20   scan. .    **. 
4590: 20 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e     ** Do not con
45a0: 73 69 64 65 72 20 61 20 73 69 6e 67 6c 65 2d 70  sider a single-p
45b0: 61 73 73 20 73 74 72 61 74 65 67 79 20 66 6f 72  ass strategy for
45c0: 20 61 20 6d 75 6c 74 69 2d 72 6f 77 20 75 70 64   a multi-row upd
45d0: 61 74 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  ate if.    ** th
45e0: 65 72 65 20 61 72 65 20 61 6e 79 20 74 72 69 67  ere are any trig
45f0: 67 65 72 73 20 6f 72 20 66 6f 72 65 69 67 6e 20  gers or foreign 
4600: 6b 65 79 73 20 74 6f 20 70 72 6f 63 65 73 73 2c  keys to process,
4610: 20 6f 72 20 72 6f 77 73 20 6d 61 79 0a 20 20 20   or rows may.   
4620: 20 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 61   ** be deleted a
4630: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 52 45  s a result of RE
4640: 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 68  PLACE conflict h
4650: 61 6e 64 6c 69 6e 67 2e 20 41 6e 79 20 6f 66 20  andling. Any of 
4660: 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 74 68 69  these.    ** thi
4670: 6e 67 73 20 6d 69 67 68 74 20 64 69 73 74 75 72  ngs might distur
4680: 62 20 61 20 63 75 72 73 6f 72 20 62 65 69 6e 67  b a cursor being
4690: 20 75 73 65 64 20 74 6f 20 73 63 61 6e 20 74 68   used to scan th
46a0: 72 6f 75 67 68 20 74 68 65 20 74 61 62 6c 65 0a  rough the table.
46b0: 20 20 20 20 2a 2a 20 6f 72 20 69 6e 64 65 78 2c      ** or index,
46c0: 20 63 61 75 73 69 6e 67 20 61 20 73 69 6e 67 6c   causing a singl
46d0: 65 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  e-pass approach 
46e0: 74 6f 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 20  to malfunction. 
46f0: 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20   */.    flags = 
4700: 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
4710: 53 49 52 45 44 7c 57 48 45 52 45 5f 53 45 45 4b  SIRED|WHERE_SEEK
4720: 5f 55 4e 49 51 5f 54 41 42 4c 45 3b 0a 20 20 20  _UNIQ_TABLE;.   
4730: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
4740: 73 74 65 64 20 26 26 20 21 70 54 72 69 67 67 65  sted && !pTrigge
4750: 72 20 26 26 20 21 68 61 73 46 4b 20 26 26 20 21  r && !hasFK && !
4760: 63 68 6e 67 4b 65 79 20 26 26 20 21 62 52 65 70  chngKey && !bRep
4770: 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 66 6c  lace ){.      fl
4780: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
4790: 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 3b 0a 20  PASS_MULTIROW;. 
47a0: 20 20 20 7d 0a 20 20 20 20 70 57 49 6e 66 6f 20     }.    pWInfo 
47b0: 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
47c0: 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
47d0: 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 2c  List, pWhere, 0,
47e0: 20 30 2c 20 66 6c 61 67 73 2c 20 69 49 64 78 43   0, flags, iIdxC
47f0: 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ur);.    if( pWI
4800: 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70  nfo==0 ) goto up
4810: 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  date_cleanup;.  
4820: 0a 20 20 20 20 2f 2a 20 41 20 6f 6e 65 2d 70 61  .    /* A one-pa
4830: 73 73 20 73 74 72 61 74 65 67 79 20 74 68 61 74  ss strategy that
4840: 20 6d 69 67 68 74 20 75 70 64 61 74 65 20 6d 6f   might update mo
4850: 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20  re than one row 
4860: 6d 61 79 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 62  may not.    ** b
4870: 65 20 75 73 65 64 20 69 66 20 61 6e 79 20 63 6f  e used if any co
4880: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
4890: 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 73  x used for the s
48a0: 63 61 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  can is being.   
48b0: 20 2a 2a 20 75 70 64 61 74 65 64 2e 20 4f 74 68   ** updated. Oth
48c0: 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65  erwise, if there
48d0: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
48e0: 22 62 22 2c 20 73 74 61 74 65 6d 65 6e 74 73 20  "b", statements 
48f0: 6c 69 6b 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  like.    ** the 
4900: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75 6c 64 20  following could 
4910: 63 72 65 61 74 65 20 61 6e 20 69 6e 66 69 6e 69  create an infini
4920: 74 65 20 6c 6f 6f 70 3a 0a 20 20 20 20 2a 2a 0a  te loop:.    **.
4930: 20 20 20 20 2a 2a 20 20 20 55 50 44 41 54 45 20      **   UPDATE 
4940: 74 31 20 53 45 54 20 62 3d 62 2b 31 20 57 48 45  t1 SET b=b+1 WHE
4950: 52 45 20 62 3e 3f 0a 20 20 20 20 2a 2a 0a 20 20  RE b>?.    **.  
4960: 20 20 2a 2a 20 46 61 6c 6c 20 62 61 63 6b 20 74    ** Fall back t
4970: 6f 20 4f 4e 45 50 41 53 53 5f 4f 46 46 20 69 66  o ONEPASS_OFF if
4980: 20 77 68 65 72 65 2e 63 20 68 61 73 20 73 65 6c   where.c has sel
4990: 65 63 74 65 64 20 61 20 4f 4e 45 50 41 53 53 5f  ected a ONEPASS_
49a0: 4d 55 4c 54 49 0a 20 20 20 20 2a 2a 20 73 74 72  MULTI.    ** str
49b0: 61 74 65 67 79 20 74 68 61 74 20 75 73 65 73 20  ategy that uses 
49c0: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 77 68 69  an index for whi
49d0: 63 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  ch one or more c
49e0: 6f 6c 75 6d 6e 73 20 61 72 65 20 62 65 69 6e 67  olumns are being
49f0: 0a 20 20 20 20 2a 2a 20 75 70 64 61 74 65 64 2e  .    ** updated.
4a00: 20 20 2a 2f 0a 20 20 20 20 65 4f 6e 65 50 61 73    */.    eOnePas
4a10: 73 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  s = sqlite3Where
4a20: 4f 6b 4f 6e 65 50 61 73 73 28 70 57 49 6e 66 6f  OkOnePass(pWInfo
4a30: 2c 20 61 69 43 75 72 4f 6e 65 50 61 73 73 29 3b  , aiCurOnePass);
4a40: 0a 20 20 20 20 69 66 28 20 65 4f 6e 65 50 61 73  .    if( eOnePas
4a50: 73 21 3d 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c  s!=ONEPASS_SINGL
4a60: 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
4a70: 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61  e3MultiWrite(pPa
4a80: 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
4a90: 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
4aa0: 53 5f 4d 55 4c 54 49 20 29 7b 0a 20 20 20 20 20  S_MULTI ){.     
4ab0: 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 61 69     int iCur = ai
4ac0: 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 3b 0a 20  CurOnePass[1];. 
4ad0: 20 20 20 20 20 20 20 69 66 28 20 69 43 75 72 3e         if( iCur>
4ae0: 3d 30 20 26 26 20 69 43 75 72 21 3d 69 44 61 74  =0 && iCur!=iDat
4af0: 61 43 75 72 20 26 26 20 61 54 6f 4f 70 65 6e 5b  aCur && aToOpen[
4b00: 69 43 75 72 2d 69 42 61 73 65 43 75 72 5d 20 29  iCur-iBaseCur] )
4b10: 7b 0a 20 20 20 20 20 20 20 20 20 20 65 4f 6e 65  {.          eOne
4b20: 50 61 73 73 20 3d 20 4f 4e 45 50 41 53 53 5f 4f  Pass = ONEPASS_O
4b30: 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  FF;.        }.  
4b40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
4b50: 75 72 21 3d 69 44 61 74 61 43 75 72 20 7c 7c 20  ur!=iDataCur || 
4b60: 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
4b70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4b80: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 48 61 73 52  .  }..  if( HasR
4b90: 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
4ba0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 72 6f    /* Read the ro
4bb0: 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  wid of the curre
4bc0: 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 57 48  nt row of the WH
4bd0: 45 52 45 20 73 63 61 6e 2e 20 49 6e 20 4f 4e 45  ERE scan. In ONE
4be0: 50 41 53 53 5f 4f 46 46 0a 20 20 20 20 2a 2a 20  PASS_OFF.    ** 
4bf0: 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20  mode, write the 
4c00: 72 6f 77 69 64 20 69 6e 74 6f 20 74 68 65 20 46  rowid into the F
4c10: 49 46 4f 2e 20 49 6e 20 65 69 74 68 65 72 20 6f  IFO. In either o
4c20: 66 20 74 68 65 20 6f 6e 65 2d 70 61 73 73 20 6d  f the one-pass m
4c30: 6f 64 65 73 2c 0a 20 20 20 20 2a 2a 20 6c 65 61  odes,.    ** lea
4c40: 76 65 20 69 74 20 69 6e 20 72 65 67 69 73 74 65  ve it in registe
4c50: 72 20 72 65 67 4f 6c 64 52 6f 77 69 64 2e 20 20  r regOldRowid.  
4c60: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
4c70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
4c80: 6f 77 69 64 2c 20 69 44 61 74 61 43 75 72 2c 20  owid, iDataCur, 
4c90: 72 65 67 4f 6c 64 52 6f 77 69 64 29 3b 0a 20 20  regOldRowid);.  
4ca0: 20 20 69 66 28 20 65 4f 6e 65 50 61 73 73 3d 3d    if( eOnePass==
4cb0: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
4cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4cd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
4ce0: 53 65 74 41 64 64 2c 20 72 65 67 52 6f 77 53 65  SetAdd, regRowSe
4cf0: 74 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 29 3b  t, regOldRowid);
4d00: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
4d10: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
4d20: 50 4b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  PK of the curren
4d30: 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72  t row into an ar
4d40: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
4d50: 2e 20 49 6e 0a 20 20 20 20 2a 2a 20 4f 4e 45 50  . In.    ** ONEP
4d60: 41 53 53 5f 4f 46 46 20 6d 6f 64 65 2c 20 73 65  ASS_OFF mode, se
4d70: 72 69 61 6c 69 7a 65 20 74 68 65 20 61 72 72 61  rialize the arra
4d80: 79 20 69 6e 74 6f 20 61 20 72 65 63 6f 72 64 20  y into a record 
4d90: 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 0a  and store it in.
4da0: 20 20 20 20 2a 2a 20 74 68 65 20 65 70 68 65 6d      ** the ephem
4db0: 65 72 61 6c 20 74 61 62 6c 65 2e 20 4f 72 2c 20  eral table. Or, 
4dc0: 69 6e 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c  in ONEPASS_SINGL
4dd0: 45 20 6f 72 20 4d 55 4c 54 49 20 6d 6f 64 65 2c  E or MULTI mode,
4de0: 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 74   change.    ** t
4df0: 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
4e00: 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
4e10: 74 6f 20 61 20 4e 6f 6f 70 20 28 74 68 65 20 65  to a Noop (the e
4e20: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 0a  phemeral table .
4e30: 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 72 65      ** is not re
4e40: 71 75 69 72 65 64 29 20 61 6e 64 20 6c 65 61 76  quired) and leav
4e50: 65 20 74 68 65 20 50 4b 20 66 69 65 6c 64 73 20  e the PK fields 
4e60: 69 6e 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  in the array of 
4e70: 72 65 67 69 73 74 65 72 73 2e 20 20 2a 2f 0a 20  registers.  */. 
4e80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50     for(i=0; i<nP
4e90: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  k; i++){.      a
4ea0: 73 73 65 72 74 28 20 70 50 6b 2d 3e 61 69 43 6f  ssert( pPk->aiCo
4eb0: 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[i]>=0 );.  
4ec0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
4ed0: 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
4ee0: 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 44 61  ble(v, pTab, iDa
4ef0: 74 61 43 75 72 2c 70 50 6b 2d 3e 61 69 43 6f 6c  taCur,pPk->aiCol
4f00: 75 6d 6e 5b 69 5d 2c 69 50 6b 2b 69 29 3b 0a 20  umn[i],iPk+i);. 
4f10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 4f 6e     }.    if( eOn
4f20: 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20 69  ePass ){.      i
4f30: 66 28 20 61 64 64 72 4f 70 65 6e 20 29 20 73 71  f( addrOpen ) sq
4f40: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
4f50: 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 4f 70 65  oNoop(v, addrOpe
4f60: 6e 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d  n);.      nKey =
4f70: 20 6e 50 6b 3b 0a 20 20 20 20 20 20 72 65 67 4b   nPk;.      regK
4f80: 65 79 20 3d 20 69 50 6b 3b 0a 20 20 20 20 7d 65  ey = iPk;.    }e
4f90: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
4fa0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
4fb0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69  OP_MakeRecord, i
4fc0: 50 6b 2c 20 6e 50 6b 2c 20 72 65 67 4b 65 79 2c  Pk, nPk, regKey,
4fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4fe0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4ff0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
5000: 28 64 62 2c 20 70 50 6b 29 2c 20 6e 50 6b 29 3b  (db, pPk), nPk);
5010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5020: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
5030: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 45 70  P_IdxInsert, iEp
5040: 68 2c 20 72 65 67 4b 65 79 2c 20 69 50 6b 2c 20  h, regKey, iPk, 
5050: 6e 50 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nPk);.    }.  }.
5060: 0a 20 20 69 66 28 20 70 55 70 73 65 72 74 3d 3d  .  if( pUpsert==
5070: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 6e  0 ){.    if( eOn
5080: 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4d  ePass!=ONEPASS_M
5090: 55 4c 54 49 20 29 7b 0a 20 20 20 20 20 20 73 71  ULTI ){.      sq
50a0: 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
50b0: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Info);.    }.  .
50c0: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
50d0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
50e0: 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 0a 20 20  rOnce = 0;.  .  
50f0: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 76 65 72      /* Open ever
5100: 79 20 69 6e 64 65 78 20 74 68 61 74 20 6e 65 65  y index that nee
5110: 64 73 20 75 70 64 61 74 69 6e 67 2e 20 2a 2f 0a  ds updating. */.
5120: 20 20 20 20 20 20 69 66 28 20 65 4f 6e 65 50 61        if( eOnePa
5130: 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss!=ONEPASS_OFF 
5140: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
5150: 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 3e 3d  iCurOnePass[0]>=
5160: 30 20 29 20 61 54 6f 4f 70 65 6e 5b 61 69 43 75  0 ) aToOpen[aiCu
5170: 72 4f 6e 65 50 61 73 73 5b 30 5d 2d 69 42 61 73  rOnePass[0]-iBas
5180: 65 43 75 72 5d 20 3d 20 30 3b 0a 20 20 20 20 20  eCur] = 0;.     
5190: 20 20 20 69 66 28 20 61 69 43 75 72 4f 6e 65 50     if( aiCurOneP
51a0: 61 73 73 5b 31 5d 3e 3d 30 20 29 20 61 54 6f 4f  ass[1]>=0 ) aToO
51b0: 70 65 6e 5b 61 69 43 75 72 4f 6e 65 50 61 73 73  pen[aiCurOnePass
51c0: 5b 31 5d 2d 69 42 61 73 65 43 75 72 5d 20 3d 20  [1]-iBaseCur] = 
51d0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  0;.      }.  .  
51e0: 20 20 20 20 69 66 28 20 65 4f 6e 65 50 61 73 73      if( eOnePass
51f0: 3d 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  ==ONEPASS_MULTI 
5200: 26 26 20 28 6e 49 64 78 2d 28 61 69 43 75 72 4f  && (nIdx-(aiCurO
5210: 6e 65 50 61 73 73 5b 31 5d 3e 3d 30 29 29 3e 30  nePass[1]>=0))>0
5220: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72   ){.        addr
5230: 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Once = sqlite3Vd
5240: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
5250: 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
5260: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
5270: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
5280: 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28  TableAndIndices(
5290: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4f 50  pParse, pTab, OP
52a0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 69  _OpenWrite, 0, i
52b0: 42 61 73 65 43 75 72 2c 0a 20 20 20 20 20 20 20  BaseCur,.       
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52d0: 20 20 20 20 20 20 20 20 20 20 61 54 6f 4f 70 65            aToOpe
52e0: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
52f0: 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73  if( addrOnce ) s
5300: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
5310: 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b  re(v, addrOnce);
5320: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
5330: 20 54 6f 70 20 6f 66 20 74 68 65 20 75 70 64 61   Top of the upda
5340: 74 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  te loop */.    i
5350: 66 28 20 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  f( eOnePass!=ONE
5360: 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
5370: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
5380: 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d   aiCurOnePass[0]
5390: 21 3d 69 44 61 74 61 43 75 72 20 26 26 20 61 69  !=iDataCur && ai
53a0: 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 21 3d 69  CurOnePass[1]!=i
53b0: 44 61 74 61 43 75 72 20 29 7b 0a 20 20 20 20 20  DataCur ){.     
53c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 20 29     assert( pPk )
53d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
53e0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
53f0: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69  , OP_NotFound, i
5400: 44 61 74 61 43 75 72 2c 20 6c 61 62 65 6c 42 72  DataCur, labelBr
5410: 65 61 6b 2c 20 72 65 67 4b 65 79 2c 6e 4b 65 79  eak, regKey,nKey
5420: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
5430: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
5440: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 4f    }.      if( eO
5450: 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f  nePass!=ONEPASS_
5460: 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20 20  SINGLE ){.      
5470: 20 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 20    labelContinue 
5480: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
5490: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
54a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
54b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
54c0: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 70 50  v, OP_IsNull, pP
54d0: 6b 20 3f 20 72 65 67 4b 65 79 20 3a 20 72 65 67  k ? regKey : reg
54e0: 4f 6c 64 52 6f 77 69 64 2c 20 6c 61 62 65 6c 42  OldRowid, labelB
54f0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 56 64 62  reak);.      Vdb
5500: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
5510: 50 6b 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64  Pk==0);.      Vd
5520: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
5530: 70 50 6b 21 3d 30 29 3b 0a 20 20 20 20 7d 65 6c  pPk!=0);.    }el
5540: 73 65 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20  se if( pPk ){.  
5550: 20 20 20 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75      labelContinu
5560: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
5570: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
5580: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5590: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
55a0: 52 65 77 69 6e 64 2c 20 69 45 70 68 2c 20 6c 61  Rewind, iEph, la
55b0: 62 65 6c 42 72 65 61 6b 29 3b 20 56 64 62 65 43  belBreak); VdbeC
55c0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
55d0: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
55e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
55f0: 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 45 70   OP_RowData, iEp
5600: 68 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20 20  h, regKey);.    
5610: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5620: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
5630: 46 6f 75 6e 64 2c 20 69 44 61 74 61 43 75 72 2c  Found, iDataCur,
5640: 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 2c 20   labelContinue, 
5650: 72 65 67 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  regKey, 0);.    
5660: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
5670: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
5680: 20 20 20 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75      labelContinu
5690: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
56a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 6f 77 53  ddOp3(v, OP_RowS
56b0: 65 74 52 65 61 64 2c 20 72 65 67 52 6f 77 53 65  etRead, regRowSe
56c0: 74 2c 6c 61 62 65 6c 42 72 65 61 6b 2c 0a 20 20  t,labelBreak,.  
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
56f0: 4f 6c 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  OldRowid);.     
5700: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5710: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5720: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5730: 4e 6f 74 45 78 69 73 74 73 2c 20 69 44 61 74 61  NotExists, iData
5740: 43 75 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e  Cur, labelContin
5750: 75 65 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 29  ue, regOldRowid)
5760: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
5770: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
5780: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
5790: 72 6f 77 69 64 20 76 61 6c 75 65 20 77 69 6c 6c  rowid value will
57a0: 20 63 68 61 6e 67 65 2c 20 73 65 74 20 72 65 67   change, set reg
57b0: 69 73 74 65 72 20 72 65 67 4e 65 77 52 6f 77 69  ister regNewRowi
57c0: 64 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  d to.  ** contai
57d0: 6e 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e  n the new value.
57e0: 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 69 73   If the rowid is
57f0: 20 6e 6f 74 20 62 65 69 6e 67 20 6d 6f 64 69 66   not being modif
5800: 69 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ied,.  ** then r
5810: 65 67 4e 65 77 52 6f 77 69 64 20 69 73 20 74 68  egNewRowid is th
5820: 65 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 20  e same register 
5830: 61 73 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c 20  as regOldRowid, 
5840: 77 68 69 63 68 20 69 73 0a 20 20 2a 2a 20 61 6c  which is.  ** al
5850: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 2e  ready populated.
5860: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63    */.  assert( c
5870: 68 6e 67 4b 65 79 20 7c 7c 20 70 54 72 69 67 67  hngKey || pTrigg
5880: 65 72 20 7c 7c 20 68 61 73 46 4b 20 7c 7c 20 72  er || hasFK || r
5890: 65 67 4f 6c 64 52 6f 77 69 64 3d 3d 72 65 67 4e  egOldRowid==regN
58a0: 65 77 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  ewRowid );.  if(
58b0: 20 63 68 6e 67 52 6f 77 69 64 20 29 7b 0a 20 20   chngRowid ){.  
58c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
58d0: 65 28 70 50 61 72 73 65 2c 20 70 52 6f 77 69 64  e(pParse, pRowid
58e0: 45 78 70 72 2c 20 72 65 67 4e 65 77 52 6f 77 69  Expr, regNewRowi
58f0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
5900: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
5910: 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67 4e 65  MustBeInt, regNe
5920: 77 52 6f 77 69 64 29 3b 20 56 64 62 65 43 6f 76  wRowid); VdbeCov
5930: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
5940: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
5950: 6f 6c 64 20 70 72 65 2d 55 50 44 41 54 45 20 63  old pre-UPDATE c
5960: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 72 6f  ontent of the ro
5970: 77 20 62 65 69 6e 67 20 63 68 61 6e 67 65 64 2c  w being changed,
5980: 20 69 66 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e   if that.  ** in
5990: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65  formation is nee
59a0: 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e  ded */.  if( chn
59b0: 67 50 6b 20 7c 7c 20 68 61 73 46 4b 20 7c 7c 20  gPk || hasFK || 
59c0: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
59d0: 75 33 32 20 6f 6c 64 6d 61 73 6b 20 3d 20 28 68  u32 oldmask = (h
59e0: 61 73 46 4b 20 3f 20 73 71 6c 69 74 65 33 46 6b  asFK ? sqlite3Fk
59f0: 4f 6c 64 6d 61 73 6b 28 70 50 61 72 73 65 2c 20  Oldmask(pParse, 
5a00: 70 54 61 62 29 20 3a 20 30 29 3b 0a 20 20 20 20  pTab) : 0);.    
5a10: 6f 6c 64 6d 61 73 6b 20 7c 3d 20 73 71 6c 69 74  oldmask |= sqlit
5a20: 65 33 54 72 69 67 67 65 72 43 6f 6c 6d 61 73 6b  e3TriggerColmask
5a30: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
5a40: 20 20 70 54 72 69 67 67 65 72 2c 20 70 43 68 61    pTrigger, pCha
5a50: 6e 67 65 73 2c 20 30 2c 20 54 52 49 47 47 45 52  nges, 0, TRIGGER
5a60: 5f 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52 5f  _BEFORE|TRIGGER_
5a70: 41 46 54 45 52 2c 20 70 54 61 62 2c 20 6f 6e 45  AFTER, pTab, onE
5a80: 72 72 6f 72 0a 20 20 20 20 29 3b 0a 20 20 20 20  rror.    );.    
5a90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
5aa0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
5ab0: 20 20 20 69 66 28 20 6f 6c 64 6d 61 73 6b 3d 3d     if( oldmask==
5ac0: 30 78 66 66 66 66 66 66 66 66 0a 20 20 20 20 20  0xffffffff.     
5ad0: 20 20 7c 7c 20 28 69 3c 33 32 20 26 26 20 28 6f    || (i<32 && (o
5ae0: 6c 64 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54  ldmask & MASKBIT
5af0: 33 32 28 69 29 29 21 3d 30 29 0a 20 20 20 20 20  32(i))!=0).     
5b00: 20 20 7c 7c 20 28 70 54 61 62 2d 3e 61 43 6f 6c    || (pTab->aCol
5b10: 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  [i].colFlags & C
5b20: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21  OLFLAG_PRIMKEY)!
5b30: 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
5b40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 20 6f      testcase(  o
5b50: 6c 64 6d 61 73 6b 21 3d 30 78 66 66 66 66 66 66  ldmask!=0xffffff
5b60: 66 66 20 26 26 20 69 3d 3d 33 31 20 29 3b 0a 20  ff && i==31 );. 
5b70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5b80: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
5b90: 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20  fTable(v, pTab, 
5ba0: 69 44 61 74 61 43 75 72 2c 20 69 2c 20 72 65 67  iDataCur, i, reg
5bb0: 4f 6c 64 2b 69 29 3b 0a 20 20 20 20 20 20 7d 65  Old+i);.      }e
5bc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5bd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5be0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
5bf0: 67 4f 6c 64 2b 69 29 3b 0a 20 20 20 20 20 20 7d  gOld+i);.      }
5c00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
5c10: 68 6e 67 52 6f 77 69 64 3d 3d 30 20 26 26 20 70  hngRowid==0 && p
5c20: 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Pk==0 ){.      s
5c30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5c40: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
5c50: 4f 6c 64 52 6f 77 69 64 2c 20 72 65 67 4e 65 77  OldRowid, regNew
5c60: 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Rowid);.    }.  
5c70: 7d 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  }..  /* Populate
5c80: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65   the array of re
5c90: 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e  gisters beginnin
5ca0: 67 20 61 74 20 72 65 67 4e 65 77 20 77 69 74 68  g at regNew with
5cb0: 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 72 6f   the new.  ** ro
5cc0: 77 20 64 61 74 61 2e 20 54 68 69 73 20 61 72 72  w data. This arr
5cd0: 61 79 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ay is used to ch
5ce0: 65 63 6b 20 63 6f 6e 73 74 61 6e 74 73 2c 20 63  eck constants, c
5cf0: 72 65 61 74 65 20 74 68 65 20 6e 65 77 0a 20 20  reate the new.  
5d00: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ** table and ind
5d10: 65 78 20 72 65 63 6f 72 64 73 2c 20 61 6e 64 20  ex records, and 
5d20: 61 73 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  as the values fo
5d30: 72 20 61 6e 79 20 6e 65 77 2e 2a 20 72 65 66 65  r any new.* refe
5d40: 72 65 6e 63 65 73 0a 20 20 2a 2a 20 6d 61 64 65  rences.  ** made
5d50: 20 62 79 20 74 72 69 67 67 65 72 73 2e 0a 20 20   by triggers..  
5d60: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 72 65  **.  ** If there
5d70: 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
5d80: 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73   BEFORE triggers
5d90: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 70 6f  , then do not po
5da0: 70 75 6c 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  pulate the.  ** 
5db0: 72 65 67 69 73 74 65 72 73 20 61 73 73 6f 63 69  registers associ
5dc0: 61 74 65 64 20 77 69 74 68 20 63 6f 6c 75 6d 6e  ated with column
5dd0: 73 20 74 68 61 74 20 61 72 65 20 28 61 29 20 6e  s that are (a) n
5de0: 6f 74 20 6d 6f 64 69 66 69 65 64 20 62 79 0a 20  ot modified by. 
5df0: 20 2a 2a 20 74 68 69 73 20 55 50 44 41 54 45 20   ** this UPDATE 
5e00: 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 28 62  statement and (b
5e10: 29 20 6e 6f 74 20 61 63 63 65 73 73 65 64 20 62  ) not accessed b
5e20: 79 20 6e 65 77 2e 2a 20 72 65 66 65 72 65 6e 63  y new.* referenc
5e30: 65 73 2e 20 54 68 65 0a 20 20 2a 2a 20 76 61 6c  es. The.  ** val
5e40: 75 65 73 20 66 6f 72 20 72 65 67 69 73 74 65 72  ues for register
5e50: 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 20 62  s not modified b
5e60: 79 20 74 68 65 20 55 50 44 41 54 45 20 6d 75 73  y the UPDATE mus
5e70: 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 66 72  t be reloaded fr
5e80: 6f 6d 20 0a 20 20 2a 2a 20 74 68 65 20 64 61 74  om .  ** the dat
5e90: 61 62 61 73 65 20 61 66 74 65 72 20 74 68 65 20  abase after the 
5ea0: 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 20  BEFORE triggers 
5eb0: 61 72 65 20 66 69 72 65 64 20 61 6e 79 77 61 79  are fired anyway
5ec0: 20 28 61 73 20 74 68 65 20 74 72 69 67 67 65 72   (as the trigger
5ed0: 20 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20   .  ** may have 
5ee0: 6d 6f 64 69 66 69 65 64 20 74 68 65 6d 29 2e 20  modified them). 
5ef0: 53 6f 20 6e 6f 74 20 6c 6f 61 64 69 6e 67 20 74  So not loading t
5f00: 68 6f 73 65 20 74 68 61 74 20 61 72 65 20 6e 6f  hose that are no
5f10: 74 20 67 6f 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  t going to.  ** 
5f20: 62 65 20 75 73 65 64 20 65 6c 69 6d 69 6e 61 74  be used eliminat
5f30: 65 73 20 73 6f 6d 65 20 72 65 64 75 6e 64 61 6e  es some redundan
5f40: 74 20 6f 70 63 6f 64 65 73 2e 0a 20 20 2a 2f 0a  t opcodes..  */.
5f50: 20 20 6e 65 77 6d 61 73 6b 20 3d 20 73 71 6c 69    newmask = sqli
5f60: 74 65 33 54 72 69 67 67 65 72 43 6f 6c 6d 61 73  te3TriggerColmas
5f70: 6b 28 0a 20 20 20 20 20 20 70 50 61 72 73 65 2c  k(.      pParse,
5f80: 20 70 54 72 69 67 67 65 72 2c 20 70 43 68 61 6e   pTrigger, pChan
5f90: 67 65 73 2c 20 31 2c 20 54 52 49 47 47 45 52 5f  ges, 1, TRIGGER_
5fa0: 42 45 46 4f 52 45 2c 20 70 54 61 62 2c 20 6f 6e  BEFORE, pTab, on
5fb0: 45 72 72 6f 72 0a 20 20 29 3b 0a 20 20 66 6f 72  Error.  );.  for
5fc0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
5fd0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
5fe0: 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  ( i==pTab->iPKey
5ff0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6000: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6010: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 4e 65  P_Null, 0, regNe
6020: 77 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  w+i);.    }else{
6030: 0a 20 20 20 20 20 20 6a 20 3d 20 61 58 52 65 66  .      j = aXRef
6040: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  [i];.      if( j
6050: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  >=0 ){.        s
6060: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
6070: 50 61 72 73 65 2c 20 70 43 68 61 6e 67 65 73 2d  Parse, pChanges-
6080: 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 72 65 67  >a[j].pExpr, reg
6090: 4e 65 77 2b 69 29 3b 0a 20 20 20 20 20 20 7d 65  New+i);.      }e
60a0: 6c 73 65 20 69 66 28 20 30 3d 3d 28 74 6d 61 73  lse if( 0==(tmas
60b0: 6b 26 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45  k&TRIGGER_BEFORE
60c0: 29 20 7c 7c 20 69 3e 33 31 20 7c 7c 20 28 6e 65  ) || i>31 || (ne
60d0: 77 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33  wmask & MASKBIT3
60e0: 32 28 69 29 29 20 29 7b 0a 20 20 20 20 20 20 20  2(i)) ){.       
60f0: 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
6100: 6c 6f 61 64 73 20 74 68 65 20 76 61 6c 75 65 20  loads the value 
6110: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74  of a column that
6120: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68 61   will not be cha
6130: 6e 67 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  nged .        **
6140: 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
6150: 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 69  . This is done i
6160: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 42  f there are no B
6170: 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 2c 20  EFORE triggers, 
6180: 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  or.        ** if
6190: 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f   there are one o
61a0: 72 20 6d 6f 72 65 20 42 45 46 4f 52 45 20 74 72  r more BEFORE tr
61b0: 69 67 67 65 72 73 20 74 68 61 74 20 75 73 65 20  iggers that use 
61c0: 74 68 69 73 20 76 61 6c 75 65 20 76 69 61 0a 20  this value via. 
61d0: 20 20 20 20 20 20 20 2a 2a 20 61 20 6e 65 77 2e         ** a new.
61e0: 2a 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61  * reference in a
61f0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
6200: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
6210: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
6220: 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
6230: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33 32 20  testcase( i==32 
6240: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6250: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
6260: 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
6270: 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20 69 2c  ab, iDataCur, i,
6280: 20 72 65 67 4e 65 77 2b 69 29 3b 0a 20 20 20 20   regNew+i);.    
6290: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
62a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
62b0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
62c0: 2c 20 72 65 67 4e 65 77 2b 69 29 3b 0a 20 20 20  , regNew+i);.   
62d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
62e0: 20 20 2f 2a 20 46 69 72 65 20 61 6e 79 20 42 45    /* Fire any BE
62f0: 46 4f 52 45 20 55 50 44 41 54 45 20 74 72 69 67  FORE UPDATE trig
6300: 67 65 72 73 2e 20 54 68 69 73 20 68 61 70 70 65  gers. This happe
6310: 6e 73 20 62 65 66 6f 72 65 20 63 6f 6e 73 74 72  ns before constr
6320: 61 69 6e 74 73 20 61 72 65 0a 20 20 2a 2a 20 76  aints are.  ** v
6330: 65 72 69 66 69 65 64 2e 20 4f 6e 65 20 63 6f 75  erified. One cou
6340: 6c 64 20 61 72 67 75 65 20 74 68 61 74 20 74 68  ld argue that th
6350: 69 73 20 69 73 20 77 72 6f 6e 67 2e 0a 20 20 2a  is is wrong..  *
6360: 2f 0a 20 20 69 66 28 20 74 6d 61 73 6b 26 54 52  /.  if( tmask&TR
6370: 49 47 47 45 52 5f 42 45 46 4f 52 45 20 29 7b 0a  IGGER_BEFORE ){.
6380: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
6390: 41 66 66 69 6e 69 74 79 28 76 2c 20 70 54 61 62  Affinity(v, pTab
63a0: 2c 20 72 65 67 4e 65 77 29 3b 0a 20 20 20 20 73  , regNew);.    s
63b0: 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69  qlite3CodeRowTri
63c0: 67 67 65 72 28 70 50 61 72 73 65 2c 20 70 54 72  gger(pParse, pTr
63d0: 69 67 67 65 72 2c 20 54 4b 5f 55 50 44 41 54 45  igger, TK_UPDATE
63e0: 2c 20 70 43 68 61 6e 67 65 73 2c 20 0a 20 20 20  , pChanges, .   
63f0: 20 20 20 20 20 54 52 49 47 47 45 52 5f 42 45 46       TRIGGER_BEF
6400: 4f 52 45 2c 20 70 54 61 62 2c 20 72 65 67 4f 6c  ORE, pTab, regOl
6410: 64 52 6f 77 69 64 2c 20 6f 6e 45 72 72 6f 72 2c  dRowid, onError,
6420: 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 29 3b   labelContinue);
6430: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77  ..    /* The row
6440: 2d 74 72 69 67 67 65 72 20 6d 61 79 20 68 61 76  -trigger may hav
6450: 65 20 64 65 6c 65 74 65 64 20 74 68 65 20 72 6f  e deleted the ro
6460: 77 20 62 65 69 6e 67 20 75 70 64 61 74 65 64 2e  w being updated.
6470: 20 49 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   In this.    ** 
6480: 63 61 73 65 2c 20 6a 75 6d 70 20 74 6f 20 74 68  case, jump to th
6490: 65 20 6e 65 78 74 20 72 6f 77 2e 20 4e 6f 20 75  e next row. No u
64a0: 70 64 61 74 65 73 20 6f 72 20 41 46 54 45 52 20  pdates or AFTER 
64b0: 74 72 69 67 67 65 72 73 20 61 72 65 20 0a 20 20  triggers are .  
64c0: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 54    ** required. T
64d0: 68 69 73 20 62 65 68 61 76 69 6f 72 20 2d 20 77  his behavior - w
64e0: 68 61 74 20 68 61 70 70 65 6e 73 20 77 68 65 6e  hat happens when
64f0: 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 75   the row being u
6500: 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 69 73  pdated.    ** is
6510: 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61   deleted or rena
6520: 6d 65 64 20 62 79 20 61 20 42 45 46 4f 52 45 20  med by a BEFORE 
6530: 74 72 69 67 67 65 72 20 2d 20 69 73 20 6c 65 66  trigger - is lef
6540: 74 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  t undefined in t
6550: 68 65 0a 20 20 20 20 2a 2a 20 64 6f 63 75 6d 65  he.    ** docume
6560: 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ntation..    */.
6570: 20 20 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20      if( pPk ){. 
6580: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6590: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
65a0: 4e 6f 74 46 6f 75 6e 64 2c 20 69 44 61 74 61 43  NotFound, iDataC
65b0: 75 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75  ur, labelContinu
65c0: 65 2c 72 65 67 4b 65 79 2c 6e 4b 65 79 29 3b 0a  e,regKey,nKey);.
65d0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
65e0: 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ge(v);.    }else
65f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6600: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6610: 4e 6f 74 45 78 69 73 74 73 2c 20 69 44 61 74 61  NotExists, iData
6620: 43 75 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e  Cur, labelContin
6630: 75 65 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 29  ue, regOldRowid)
6640: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
6650: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 0a  rage(v);.    }..
6660: 20 20 20 20 2f 2a 20 41 66 74 65 72 2d 42 45 46      /* After-BEF
6670: 4f 52 45 2d 74 72 69 67 67 65 72 2d 72 65 6c 6f  ORE-trigger-relo
6680: 61 64 2d 6c 6f 6f 70 3a 0a 20 20 20 20 2a 2a 20  ad-loop:.    ** 
6690: 49 66 20 69 74 20 64 69 64 20 6e 6f 74 20 64 65  If it did not de
66a0: 6c 65 74 65 20 69 74 2c 20 74 68 65 20 42 45 46  lete it, the BEF
66b0: 4f 52 45 20 74 72 69 67 67 65 72 20 6d 61 79 20  ORE trigger may 
66c0: 73 74 69 6c 6c 20 68 61 76 65 20 6d 6f 64 69 66  still have modif
66d0: 69 65 64 20 0a 20 20 20 20 2a 2a 20 73 6f 6d 65  ied .    ** some
66e0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
66f0: 6f 66 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67  of the row being
6700: 20 75 70 64 61 74 65 64 2e 20 4c 6f 61 64 20 74   updated. Load t
6710: 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 0a 20  he values for . 
6720: 20 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e     ** all column
6730: 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 20 62  s not modified b
6740: 79 20 74 68 65 20 75 70 64 61 74 65 20 73 74 61  y the update sta
6750: 74 65 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 69  tement into thei
6760: 72 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  r registers.    
6770: 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
6780: 68 61 73 20 68 61 70 70 65 6e 65 64 2e 20 4f 6e  has happened. On
6790: 6c 79 20 75 6e 6d 6f 64 69 66 69 65 64 20 63 6f  ly unmodified co
67a0: 6c 75 6d 6e 73 20 61 72 65 20 72 65 6c 6f 61 64  lumns are reload
67b0: 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 76  ed..    ** The v
67c0: 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 66  alues computed f
67d0: 6f 72 20 6d 6f 64 69 66 69 65 64 20 63 6f 6c 75  or modified colu
67e0: 6d 6e 73 20 75 73 65 20 74 68 65 20 76 61 6c 75  mns use the valu
67f0: 65 73 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  es before the.  
6800: 20 20 2a 2a 20 42 45 46 4f 52 45 20 74 72 69 67    ** BEFORE trig
6810: 67 65 72 20 72 75 6e 73 2e 20 20 53 65 65 20 74  ger runs.  See t
6820: 65 73 74 20 63 61 73 65 20 74 72 69 67 67 65 72  est case trigger
6830: 31 2d 31 38 2e 30 20 28 61 64 64 65 64 20 32 30  1-18.0 (added 20
6840: 31 38 2d 30 34 2d 32 36 29 0a 20 20 20 20 2a 2a  18-04-26).    **
6850: 20 66 6f 72 20 61 6e 20 65 78 61 6d 70 6c 65 2e   for an example.
6860: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
6870: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
6880: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
6890: 66 28 20 61 58 52 65 66 5b 69 5d 3c 30 20 26 26  f( aXRef[i]<0 &&
68a0: 20 69 21 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   i!=pTab->iPKey 
68b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
68c0: 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
68d0: 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
68e0: 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20 69 2c  ab, iDataCur, i,
68f0: 20 72 65 67 4e 65 77 2b 69 29 3b 0a 20 20 20 20   regNew+i);.    
6900: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
6910: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
6920: 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20      int addr1 = 
6930: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  0;        /* Add
6940: 72 65 73 73 20 6f 66 20 6a 75 6d 70 20 69 6e 73  ress of jump ins
6950: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20  truction */..   
6960: 20 2f 2a 20 44 6f 20 63 6f 6e 73 74 72 61 69 6e   /* Do constrain
6970: 74 20 63 68 65 63 6b 73 2e 20 2a 2f 0a 20 20 20  t checks. */.   
6980: 20 61 73 73 65 72 74 28 20 72 65 67 4f 6c 64 52   assert( regOldR
6990: 6f 77 69 64 3e 30 20 29 3b 0a 20 20 20 20 73 71  owid>0 );.    sq
69a0: 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e  lite3GenerateCon
69b0: 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 70 50  straintChecks(pP
69c0: 61 72 73 65 2c 20 70 54 61 62 2c 20 61 52 65 67  arse, pTab, aReg
69d0: 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20 69  Idx, iDataCur, i
69e0: 49 64 78 43 75 72 2c 0a 20 20 20 20 20 20 20 20  IdxCur,.        
69f0: 72 65 67 4e 65 77 52 6f 77 69 64 2c 20 72 65 67  regNewRowid, reg
6a00: 4f 6c 64 52 6f 77 69 64 2c 20 63 68 6e 67 4b 65  OldRowid, chngKe
6a10: 79 2c 20 6f 6e 45 72 72 6f 72 2c 20 6c 61 62 65  y, onError, labe
6a20: 6c 43 6f 6e 74 69 6e 75 65 2c 20 26 62 52 65 70  lContinue, &bRep
6a30: 6c 61 63 65 2c 0a 20 20 20 20 20 20 20 20 61 58  lace,.        aX
6a40: 52 65 66 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  Ref, 0);..    /*
6a50: 20 44 6f 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e   Do FK constrain
6a60: 74 20 63 68 65 63 6b 73 2e 20 2a 2f 0a 20 20 20  t checks. */.   
6a70: 20 69 66 28 20 68 61 73 46 4b 20 29 7b 0a 20 20   if( hasFK ){.  
6a80: 20 20 20 20 73 71 6c 69 74 65 33 46 6b 43 68 65      sqlite3FkChe
6a90: 63 6b 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ck(pParse, pTab,
6aa0: 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c 20 30 2c   regOldRowid, 0,
6ab0: 20 61 58 52 65 66 2c 20 63 68 6e 67 4b 65 79 29   aXRef, chngKey)
6ac0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6ad0: 44 65 6c 65 74 65 20 74 68 65 20 69 6e 64 65 78  Delete the index
6ae0: 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
6af0: 74 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72  ted with the cur
6b00: 72 65 6e 74 20 72 65 63 6f 72 64 2e 20 20 2a 2f  rent record.  */
6b10: 0a 20 20 20 20 69 66 28 20 62 52 65 70 6c 61 63  .    if( bReplac
6b20: 65 20 7c 7c 20 63 68 6e 67 4b 65 79 20 29 7b 0a  e || chngKey ){.
6b30: 20 20 20 20 20 20 69 66 28 20 70 50 6b 20 29 7b        if( pPk ){
6b40: 0a 20 20 20 20 20 20 20 20 61 64 64 72 31 20 3d  .        addr1 =
6b50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b60: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
6b70: 6f 75 6e 64 2c 20 69 44 61 74 61 43 75 72 2c 20  ound, iDataCur, 
6b80: 30 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79 29  0, regKey, nKey)
6b90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6ba0: 20 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73         addr1 = s
6bb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6bc0: 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
6bd0: 2c 20 69 44 61 74 61 43 75 72 2c 20 30 2c 20 72  , iDataCur, 0, r
6be0: 65 67 4f 6c 64 52 6f 77 69 64 29 3b 0a 20 20 20  egOldRowid);.   
6bf0: 20 20 20 7d 0a 20 20 20 20 20 20 56 64 62 65 43     }.      VdbeC
6c00: 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
6c10: 6e 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n(v);.    }.    
6c20: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52  sqlite3GenerateR
6c30: 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28 70 50  owIndexDelete(pP
6c40: 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 61 74  arse, pTab, iDat
6c50: 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 20 61  aCur, iIdxCur, a
6c60: 52 65 67 49 64 78 2c 20 2d 31 29 3b 0a 0a 20 20  RegIdx, -1);..  
6c70: 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 69 6e 67    /* If changing
6c80: 20 74 68 65 20 72 6f 77 69 64 20 76 61 6c 75 65   the rowid value
6c90: 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 61 72  , or if there ar
6ca0: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
6cb0: 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a  nstraints.    **
6cc0: 20 74 6f 20 70 72 6f 63 65 73 73 2c 20 64 65 6c   to process, del
6cd0: 65 74 65 20 74 68 65 20 6f 6c 64 20 72 65 63 6f  ete the old reco
6ce0: 72 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  rd. Otherwise, a
6cf0: 64 64 20 61 20 6e 6f 6f 70 20 4f 50 5f 44 65 6c  dd a noop OP_Del
6d00: 65 74 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e  ete.    ** to in
6d10: 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64  voke the pre-upd
6d20: 61 74 65 20 68 6f 6f 6b 2e 0a 20 20 20 20 2a 2a  ate hook..    **
6d30: 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 28 72 65  .    ** That (re
6d40: 67 4e 65 77 3d 3d 72 65 67 6e 65 77 52 6f 77 69  gNew==regnewRowi
6d50: 64 2b 31 29 20 69 73 20 74 72 75 65 20 69 73 20  d+1) is true is 
6d60: 61 6c 73 6f 20 69 6d 70 6f 72 74 61 6e 74 20 66  also important f
6d70: 6f 72 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  or the .    ** p
6d80: 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20  re-update hook. 
6d90: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e  If the caller in
6da0: 76 6f 6b 65 73 20 70 72 65 75 70 64 61 74 65 5f  vokes preupdate_
6db0: 6e 65 77 28 29 2c 20 74 68 65 20 72 65 74 75 72  new(), the retur
6dc0: 6e 65 64 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ned.    ** value
6dd0: 20 69 73 20 63 6f 70 69 65 64 20 66 72 6f 6d 20   is copied from 
6de0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 72 65 67  memory cell (reg
6df0: 4e 65 77 52 6f 77 69 64 2b 31 2b 69 43 6f 6c 29  NewRowid+1+iCol)
6e00: 2c 20 77 68 65 72 65 20 69 43 6f 6c 0a 20 20 20  , where iCol.   
6e10: 20 2a 2a 20 69 73 20 74 68 65 20 63 6f 6c 75 6d   ** is the colum
6e20: 6e 20 69 6e 64 65 78 20 73 75 70 70 6c 69 65 64  n index supplied
6e30: 20 62 79 20 74 68 65 20 75 73 65 72 2e 0a 20 20   by the user..  
6e40: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
6e50: 20 72 65 67 4e 65 77 3d 3d 72 65 67 4e 65 77 52   regNew==regNewR
6e60: 6f 77 69 64 2b 31 20 29 3b 0a 23 69 66 64 65 66  owid+1 );.#ifdef
6e70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
6e80: 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
6e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6ea0: 4f 70 33 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op3(v, OP_Delete
6eb0: 2c 20 69 44 61 74 61 43 75 72 2c 0a 20 20 20 20  , iDataCur,.    
6ec0: 20 20 20 20 4f 50 46 4c 41 47 5f 49 53 55 50 44      OPFLAG_ISUPD
6ed0: 41 54 45 20 7c 20 28 28 68 61 73 46 4b 3e 31 20  ATE | ((hasFK>1 
6ee0: 7c 7c 20 63 68 6e 67 4b 65 79 29 20 3f 20 30 20  || chngKey) ? 0 
6ef0: 3a 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 29  : OPFLAG_ISNOOP)
6f00: 2c 0a 20 20 20 20 20 20 20 20 72 65 67 4e 65 77  ,.        regNew
6f10: 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  Rowid.    );.   
6f20: 20 69 66 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f   if( eOnePass==O
6f30: 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 29 7b 0a  NEPASS_MULTI ){.
6f40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68 61        assert( ha
6f50: 73 46 4b 3d 3d 30 20 26 26 20 63 68 6e 67 4b 65  sFK==0 && chngKe
6f60: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  y==0 );.      sq
6f70: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6f80: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 41 56 45  5(v, OPFLAG_SAVE
6f90: 50 4f 53 49 54 49 4f 4e 29 3b 0a 20 20 20 20 7d  POSITION);.    }
6fa0: 0a 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65  .    if( !pParse
6fb0: 2d 3e 6e 65 73 74 65 64 20 29 7b 0a 20 20 20 20  ->nested ){.    
6fc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
6fd0: 65 6e 64 50 34 28 76 2c 20 70 54 61 62 2c 20 50  endP4(v, pTab, P
6fe0: 34 5f 54 41 42 4c 45 29 3b 0a 20 20 20 20 7d 0a  4_TABLE);.    }.
6ff0: 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 68 61  #else.    if( ha
7000: 73 46 4b 3e 31 20 7c 7c 20 63 68 6e 67 4b 65 79  sFK>1 || chngKey
7010: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7020: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7030: 50 5f 44 65 6c 65 74 65 2c 20 69 44 61 74 61 43  P_Delete, iDataC
7040: 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65  ur, 0);.    }.#e
7050: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 62 52 65  ndif.    if( bRe
7060: 70 6c 61 63 65 20 7c 7c 20 63 68 6e 67 4b 65 79  place || chngKey
7070: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7080: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
7090: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 0a   addr1);.    }..
70a0: 20 20 20 20 69 66 28 20 68 61 73 46 4b 20 29 7b      if( hasFK ){
70b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 6b  .      sqlite3Fk
70c0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 54  Check(pParse, pT
70d0: 61 62 2c 20 30 2c 20 72 65 67 4e 65 77 52 6f 77  ab, 0, regNewRow
70e0: 69 64 2c 20 61 58 52 65 66 2c 20 63 68 6e 67 4b  id, aXRef, chngK
70f0: 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ey);.    }.  .  
7100: 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
7110: 6e 65 77 20 69 6e 64 65 78 20 65 6e 74 72 69 65  new index entrie
7120: 73 20 61 6e 64 20 74 68 65 20 6e 65 77 20 72 65  s and the new re
7130: 63 6f 72 64 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  cord. */.    sql
7140: 69 74 65 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65  ite3CompleteInse
7150: 72 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 70  rtion(.        p
7160: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 61  Parse, pTab, iDa
7170: 74 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 20  taCur, iIdxCur, 
7180: 72 65 67 4e 65 77 52 6f 77 69 64 2c 20 61 52 65  regNewRowid, aRe
7190: 67 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20 4f  gIdx, .        O
71a0: 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 20 7c  PFLAG_ISUPDATE |
71b0: 20 28 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50   (eOnePass==ONEP
71c0: 41 53 53 5f 4d 55 4c 54 49 20 3f 20 4f 50 46 4c  ASS_MULTI ? OPFL
71d0: 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 20  AG_SAVEPOSITION 
71e0: 3a 20 30 29 2c 20 0a 20 20 20 20 20 20 20 20 30  : 0), .        0
71f0: 2c 20 30 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20  , 0.    );..    
7200: 2f 2a 20 44 6f 20 61 6e 79 20 4f 4e 20 43 41 53  /* Do any ON CAS
7210: 43 41 44 45 2c 20 53 45 54 20 4e 55 4c 4c 20 6f  CADE, SET NULL o
7220: 72 20 53 45 54 20 44 45 46 41 55 4c 54 20 6f 70  r SET DEFAULT op
7230: 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65  erations require
7240: 64 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61 6e 64  d to.    ** hand
7250: 6c 65 20 72 6f 77 73 20 28 70 6f 73 73 69 62 6c  le rows (possibl
7260: 79 20 69 6e 20 6f 74 68 65 72 20 74 61 62 6c 65  y in other table
7270: 73 29 20 74 68 61 74 20 72 65 66 65 72 20 76 69  s) that refer vi
7280: 61 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a  a a foreign key.
7290: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 6f      ** to the ro
72a0: 77 20 6a 75 73 74 20 75 70 64 61 74 65 64 2e 20  w just updated. 
72b0: 2a 2f 20 0a 20 20 20 20 69 66 28 20 68 61 73 46  */ .    if( hasF
72c0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
72d0: 65 33 46 6b 41 63 74 69 6f 6e 73 28 70 50 61 72  e3FkActions(pPar
72e0: 73 65 2c 20 70 54 61 62 2c 20 70 43 68 61 6e 67  se, pTab, pChang
72f0: 65 73 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c  es, regOldRowid,
7300: 20 61 58 52 65 66 2c 20 63 68 6e 67 4b 65 79 29   aXRef, chngKey)
7310: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7320: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
7330: 72 6f 77 20 63 6f 75 6e 74 65 72 20 0a 20 20 2a  row counter .  *
7340: 2f 0a 20 20 69 66 28 20 72 65 67 52 6f 77 43 6f  /.  if( regRowCo
7350: 75 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  unt ){.    sqlit
7360: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7370: 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67 52 6f  OP_AddImm, regRo
7380: 77 43 6f 75 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a  wCount, 1);.  }.
7390: 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f  .  sqlite3CodeRo
73a0: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
73b0: 20 70 54 72 69 67 67 65 72 2c 20 54 4b 5f 55 50   pTrigger, TK_UP
73c0: 44 41 54 45 2c 20 70 43 68 61 6e 67 65 73 2c 20  DATE, pChanges, 
73d0: 0a 20 20 20 20 20 20 54 52 49 47 47 45 52 5f 41  .      TRIGGER_A
73e0: 46 54 45 52 2c 20 70 54 61 62 2c 20 72 65 67 4f  FTER, pTab, regO
73f0: 6c 64 52 6f 77 69 64 2c 20 6f 6e 45 72 72 6f 72  ldRowid, onError
7400: 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 29  , labelContinue)
7410: 3b 0a 0a 20 20 2f 2a 20 52 65 70 65 61 74 20 74  ;..  /* Repeat t
7420: 68 65 20 61 62 6f 76 65 20 77 69 74 68 20 74 68  he above with th
7430: 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 74 6f  e next record to
7440: 20 62 65 20 75 70 64 61 74 65 64 2c 20 75 6e 74   be updated, unt
7450: 69 6c 0a 20 20 2a 2a 20 61 6c 6c 20 72 65 63 6f  il.  ** all reco
7460: 72 64 20 73 65 6c 65 63 74 65 64 20 62 79 20 74  rd selected by t
7470: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
7480: 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
7490: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f  d..  */.  if( eO
74a0: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
74b0: 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20 2f 2a  SINGLE ){.    /*
74c0: 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 61   Nothing to do a
74d0: 74 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 66 6f  t end-of-loop fo
74e0: 72 20 61 20 73 69 6e 67 6c 65 2d 70 61 73 73 20  r a single-pass 
74f0: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  */.  }else if( e
7500: 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
7510: 5f 4d 55 4c 54 49 20 29 7b 0a 20 20 20 20 73 71  _MULTI ){.    sq
7520: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
7530: 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6f  Label(v, labelCo
7540: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c  ntinue);.    sql
7550: 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
7560: 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  nfo);.  }else if
7570: 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPk ){.    sql
7580: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
7590: 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6f 6e  abel(v, labelCon
75a0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
75b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
75c0: 20 4f 50 5f 4e 65 78 74 2c 20 69 45 70 68 2c 20   OP_Next, iEph, 
75d0: 61 64 64 72 54 6f 70 29 3b 20 56 64 62 65 43 6f  addrTop); VdbeCo
75e0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c  verage(v);.  }el
75f0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
7600: 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
7610: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 20  Continue);.  }. 
7620: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
7630: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
7640: 6c 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 55  lBreak);..  /* U
7650: 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
7660: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
7670: 62 79 20 73 74 6f 72 69 6e 67 20 74 68 65 20 63  by storing the c
7680: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 20 20  ontent of the.  
7690: 2a 2a 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64  ** maximum rowid
76a0: 20 63 6f 75 6e 74 65 72 20 76 61 6c 75 65 73 20   counter values 
76b0: 72 65 63 6f 72 64 65 64 20 77 68 69 6c 65 20 69  recorded while i
76c0: 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 0a 20 20  nserting into.  
76d0: 2a 2a 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  ** autoincrement
76e0: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
76f0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  if( pParse->nest
7700: 65 64 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  ed==0 && pParse-
7710: 3e 70 54 72 69 67 67 65 72 54 61 62 3d 3d 30 20  >pTriggerTab==0 
7720: 26 26 20 70 55 70 73 65 72 74 3d 3d 30 20 29 7b  && pUpsert==0 ){
7730: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f  .    sqlite3Auto
7740: 69 6e 63 72 65 6d 65 6e 74 45 6e 64 28 70 50 61  incrementEnd(pPa
7750: 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  rse);.  }..  /*.
7760: 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20    ** Return the 
7770: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
7780: 68 61 74 20 77 65 72 65 20 63 68 61 6e 67 65 64  hat were changed
7790: 2c 20 69 66 20 77 65 20 61 72 65 20 74 72 61 63  , if we are trac
77a0: 6b 69 6e 67 0a 20 20 2a 2a 20 74 68 61 74 20 69  king.  ** that i
77b0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f  nformation..  */
77c0: 0a 20 20 69 66 28 20 72 65 67 52 6f 77 43 6f 75  .  if( regRowCou
77d0: 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
77e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
77f0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67  P_ResultRow, reg
7800: 52 6f 77 43 6f 75 6e 74 2c 20 31 29 3b 0a 20 20  RowCount, 1);.  
7810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7820: 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20  NumCols(v, 1);. 
7830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7840: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43  tColName(v, 0, C
7850: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 72 6f  OLNAME_NAME, "ro
7860: 77 73 20 75 70 64 61 74 65 64 22 2c 20 53 51 4c  ws updated", SQL
7870: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d  ITE_STATIC);.  }
7880: 0a 0a 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  ..update_cleanup
7890: 3a 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 43  :.  sqlite3AuthC
78a0: 6f 6e 74 65 78 74 50 6f 70 28 26 73 43 6f 6e 74  ontextPop(&sCont
78b0: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ext);.  sqlite3D
78c0: 62 46 72 65 65 28 64 62 2c 20 61 58 52 65 66 29  bFree(db, aXRef)
78d0: 3b 20 2f 2a 20 41 6c 73 6f 20 66 72 65 65 73 20  ; /* Also frees 
78e0: 61 52 65 67 49 64 78 5b 5d 20 61 6e 64 20 61 54  aRegIdx[] and aT
78f0: 6f 4f 70 65 6e 5b 5d 20 2a 2f 0a 20 20 73 71 6c  oOpen[] */.  sql
7900: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
7910: 65 28 64 62 2c 20 70 54 61 62 4c 69 73 74 29 3b  e(db, pTabList);
7920: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
7930: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 68  stDelete(db, pCh
7940: 61 6e 67 65 73 29 3b 0a 20 20 73 71 6c 69 74 65  anges);.  sqlite
7950: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
7960: 70 57 68 65 72 65 29 3b 0a 23 69 66 20 64 65 66  pWhere);.#if def
7970: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
7980: 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45  LE_UPDATE_DELETE
7990: 5f 4c 49 4d 49 54 29 20 0a 20 20 73 71 6c 69 74  _LIMIT) .  sqlit
79a0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
79b0: 28 64 62 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  (db, pOrderBy);.
79c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
79d0: 65 74 65 28 64 62 2c 20 70 4c 69 6d 69 74 29 3b  ete(db, pLimit);
79e0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
79f0: 3b 0a 7d 0a 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ;.}./* Make sure
7a00: 20 22 69 73 56 69 65 77 22 20 61 6e 64 20 6f 74   "isView" and ot
7a10: 68 65 72 20 6d 61 63 72 6f 73 20 64 65 66 69 6e  her macros defin
7a20: 65 64 20 61 62 6f 76 65 20 61 72 65 20 75 6e 64  ed above are und
7a30: 65 66 69 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  efined. Otherwis
7a40: 65 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 69 6e  e.** they may in
7a50: 74 65 72 66 65 72 65 20 77 69 74 68 20 63 6f 6d  terfere with com
7a60: 70 69 6c 61 74 69 6f 6e 20 6f 66 20 6f 74 68 65  pilation of othe
7a70: 72 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74  r functions in t
7a80: 68 69 73 20 66 69 6c 65 0a 2a 2a 20 28 6f 72 20  his file.** (or 
7a90: 69 6e 20 61 6e 6f 74 68 65 72 20 66 69 6c 65 2c  in another file,
7aa0: 20 69 66 20 74 68 69 73 20 66 69 6c 65 20 62 65   if this file be
7ab0: 63 6f 6d 65 73 20 70 61 72 74 20 6f 66 20 74 68  comes part of th
7ac0: 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 29 2e  e amalgamation).
7ad0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 69 73 56 69    */.#ifdef isVi
7ae0: 65 77 0a 20 23 75 6e 64 65 66 20 69 73 56 69 65  ew. #undef isVie
7af0: 77 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  w.#endif.#ifdef 
7b00: 70 54 72 69 67 67 65 72 0a 20 23 75 6e 64 65 66  pTrigger. #undef
7b10: 20 70 54 72 69 67 67 65 72 0a 23 65 6e 64 69 66   pTrigger.#endif
7b20: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7b30: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7b40: 4c 45 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  LE./*.** Generat
7b50: 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 55 50  e code for an UP
7b60: 44 41 54 45 20 6f 66 20 61 20 76 69 72 74 75 61  DATE of a virtua
7b70: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  l table..**.** T
7b80: 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73  here are two pos
7b90: 73 69 62 6c 65 20 73 74 72 61 74 65 67 69 65 73  sible strategies
7ba0: 20 2d 20 74 68 65 20 64 65 66 61 75 6c 74 20 61   - the default a
7bb0: 6e 64 20 74 68 65 20 73 70 65 63 69 61 6c 20 0a  nd the special .
7bc0: 2a 2a 20 22 6f 6e 65 70 61 73 73 22 20 73 74 72  ** "onepass" str
7bd0: 61 74 65 67 79 2e 20 4f 6e 65 70 61 73 73 20 69  ategy. Onepass i
7be0: 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20 74  s only used if t
7bf0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
7c00: 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74   .** implementat
7c10: 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68  ion indicates th
7c20: 61 74 20 70 57 68 65 72 65 20 6d 61 79 20 6d 61  at pWhere may ma
7c30: 74 63 68 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  tch at most one 
7c40: 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  row..**.** The d
7c50: 65 66 61 75 6c 74 20 73 74 72 61 74 65 67 79 20  efault strategy 
7c60: 69 73 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  is to create an 
7c70: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
7c80: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
7c90: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74 6f   for each row to
7ca0: 20 62 65 20 63 68 61 6e 67 65 64 3a 0a 2a 2a 0a   be changed:.**.
7cb0: 2a 2a 20 20 20 28 41 29 20 20 54 68 65 20 6f 72  **   (A)  The or
7cc0: 69 67 69 6e 61 6c 20 72 6f 77 69 64 20 6f 66 20  iginal rowid of 
7cd0: 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 20 20 28  that row..**   (
7ce0: 42 29 20 20 54 68 65 20 72 65 76 69 73 65 64 20  B)  The revised 
7cf0: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 72 6f  rowid for the ro
7d00: 77 2e 0a 2a 2a 20 20 20 28 43 29 20 20 54 68 65  w..**   (C)  The
7d10: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 65 76 65 72   content of ever
7d20: 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  y column in the 
7d30: 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  row..**.** Then 
7d40: 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  loop through the
7d50: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
7d60: 73 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  s ephemeral tabl
7d70: 65 20 65 78 65 63 75 74 69 6e 67 20 61 0a 2a 2a  e executing a.**
7d80: 20 56 55 70 64 61 74 65 20 66 6f 72 20 65 61 63   VUpdate for eac
7d90: 68 20 72 6f 77 2e 20 57 68 65 6e 20 66 69 6e 69  h row. When fini
7da0: 73 68 65 64 2c 20 64 72 6f 70 20 74 68 65 20 65  shed, drop the e
7db0: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a  phemeral table..
7dc0: 2a 2a 0a 2a 2a 20 54 68 65 20 22 6f 6e 65 70 61  **.** The "onepa
7dd0: 73 73 22 20 73 74 72 61 74 65 67 79 20 64 6f 65  ss" strategy doe
7de0: 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 65 70 68  s not use an eph
7df0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 49 6e  emeral table. In
7e00: 73 74 65 61 64 2c 20 69 74 0a 2a 2a 20 73 74 6f  stead, it.** sto
7e10: 72 65 73 20 74 68 65 20 73 61 6d 65 20 76 61 6c  res the same val
7e20: 75 65 73 20 28 41 2c 20 42 20 61 6e 64 20 43 20  ues (A, B and C 
7e30: 61 62 6f 76 65 29 20 69 6e 20 61 20 72 65 67 69  above) in a regi
7e40: 73 74 65 72 20 61 72 72 61 79 20 61 6e 64 0a 2a  ster array and.*
7e50: 2a 20 6d 61 6b 65 73 20 61 20 73 69 6e 67 6c 65  * makes a single
7e60: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 56   invocation of V
7e70: 55 70 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  Update..*/.stati
7e80: 63 20 76 6f 69 64 20 75 70 64 61 74 65 56 69 72  c void updateVir
7e90: 74 75 61 6c 54 61 62 6c 65 28 0a 20 20 50 61 72  tualTable(.  Par
7ea0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7eb0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
7ec0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
7ed0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
7ee0: 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
7ef0: 6c 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6d 6f  l table to be mo
7f00: 64 69 66 69 65 64 20 2a 2f 0a 20 20 54 61 62 6c  dified */.  Tabl
7f10: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
7f20: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
7f30: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
7f40: 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20  ist *pChanges,  
7f50: 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 74  /* The columns t
7f60: 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20  o change in the 
7f70: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
7f80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 6f 77   */.  Expr *pRow
7f90: 69 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  id,        /* Ex
7fa0: 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 6f  pression used to
7fb0: 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20 72   recompute the r
7fc0: 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  owid */.  int *a
7fd0: 58 52 65 66 2c 20 20 20 20 20 20 20 20 20 20 2f  XRef,          /
7fe0: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 63  * Mapping from c
7ff0: 6f 6c 75 6d 6e 73 20 6f 66 20 70 54 61 62 20 74  olumns of pTab t
8000: 6f 20 65 6e 74 72 69 65 73 20 69 6e 20 70 43 68  o entries in pCh
8010: 61 6e 67 65 73 20 2a 2f 0a 20 20 45 78 70 72 20  anges */.  Expr 
8020: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
8030: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
8040: 6f 66 20 74 68 65 20 55 50 44 41 54 45 20 73 74  of the UPDATE st
8050: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
8060: 20 6f 6e 45 72 72 6f 72 20 20 20 20 20 20 20 20   onError        
8070: 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    /* ON CONFLICT
8080: 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 29 7b 0a   strategy */.){.
8090: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
80a0: 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 56  se->pVdbe;  /* V
80b0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
80c0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
80d0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 70 68 65 6d  n */.  int ephem
80e0: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
80f0: 20 2f 2a 20 54 61 62 6c 65 20 68 6f 6c 64 69 6e   /* Table holdin
8100: 67 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  g the result of 
8110: 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  the SELECT */.  
8120: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
8140: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
8150: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
8160: 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 44 61 74 61  rse->db; /* Data
8170: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
8180: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
8190: 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20  *pVTab = (const 
81a0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 47 65 74  char*)sqlite3Get
81b0: 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
81c0: 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  ;.  WhereInfo *p
81d0: 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 41 72  WInfo;.  int nAr
81e0: 67 20 3d 20 32 20 2b 20 70 54 61 62 2d 3e 6e 43  g = 2 + pTab->nC
81f0: 6f 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ol;      /* Numb
8200: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8210: 74 6f 20 56 55 70 64 61 74 65 20 2a 2f 0a 20 20  to VUpdate */.  
8220: 69 6e 74 20 72 65 67 41 72 67 3b 20 20 20 20 20  int regArg;     
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73 74 65  /* First registe
8250: 72 20 69 6e 20 56 55 70 64 61 74 65 20 61 72 67  r in VUpdate arg
8260: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
8270: 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20  regRec;         
8280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
8290: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
82a0: 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 72 65 63   to assemble rec
82b0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ord */.  int reg
82c0: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
82d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
82e0: 73 74 65 72 20 66 6f 72 20 65 70 68 65 6d 20 74  ster for ephem t
82f0: 61 62 6c 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20  able rowid */.  
8300: 69 6e 74 20 69 43 73 72 20 3d 20 70 53 72 63 2d  int iCsr = pSrc-
8310: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 20 20  >a[0].iCursor;  
8320: 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66  /* Cursor used f
8330: 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
8340: 20 73 63 61 6e 20 2a 2f 0a 20 20 69 6e 74 20 61   scan */.  int a
8350: 44 75 6d 6d 79 5b 32 5d 3b 20 20 20 20 20 20 20  Dummy[2];       
8360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
8370: 75 73 65 64 20 61 72 67 20 66 6f 72 20 73 71 6c  used arg for sql
8380: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
8390: 73 73 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  ss() */.  int eO
83a0: 6e 65 50 61 73 73 3b 20 20 20 20 20 20 20 20 20  nePass;         
83b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
83c0: 65 20 74 6f 20 75 73 65 20 6f 6e 65 70 61 73 73  e to use onepass
83d0: 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 69   strategy */.  i
83e0: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8400: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
8410: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
8420: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
8430: 6e 41 72 67 20 72 65 67 69 73 74 65 72 73 20 69  nArg registers i
8440: 6e 20 77 68 69 63 68 20 74 6f 20 67 61 74 68 65  n which to gathe
8450: 72 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  r the arguments 
8460: 66 6f 72 20 56 55 70 64 61 74 65 2e 20 54 68 65  for VUpdate. The
8470: 6e 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 6e  n.  ** create an
8480: 64 20 6f 70 65 6e 20 74 68 65 20 65 70 68 65 6d  d open the ephem
8490: 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 20 77 68  eral table in wh
84a0: 69 63 68 20 74 68 65 20 72 65 63 6f 72 64 73 20  ich the records 
84b0: 63 72 65 61 74 65 64 20 66 72 6f 6d 0a 20 20 2a  created from.  *
84c0: 2a 20 74 68 65 73 65 20 61 72 67 75 6d 65 6e 74  * these argument
84d0: 73 20 77 69 6c 6c 20 62 65 20 74 65 6d 70 6f 72  s will be tempor
84e0: 61 72 69 6c 79 20 73 74 6f 72 65 64 2e 20 2a 2f  arily stored. */
84f0: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
8500: 20 20 65 70 68 65 6d 54 61 62 20 3d 20 70 50 61    ephemTab = pPa
8510: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 61  rse->nTab++;.  a
8520: 64 64 72 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ddr= sqlite3Vdbe
8530: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
8540: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 65 70 68 65  nEphemeral, ephe
8550: 6d 54 61 62 2c 20 6e 41 72 67 29 3b 0a 20 20 72  mTab, nArg);.  r
8560: 65 67 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e  egArg = pParse->
8570: 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 70 50 61 72  nMem + 1;.  pPar
8580: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67  se->nMem += nArg
8590: 3b 0a 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70  ;.  regRec = ++p
85a0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
85b0: 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
85c0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 2f 2a 20  se->nMem;..  /* 
85d0: 53 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 74  Start scanning t
85e0: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
85f0: 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73   */.  pWInfo = s
8600: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
8610: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 70  (pParse, pSrc, p
8620: 57 68 65 72 65 2c 20 30 2c 30 2c 57 48 45 52 45  Where, 0,0,WHERE
8630: 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
8640: 2c 30 29 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  ,0);.  if( pWInf
8650: 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  o==0 ) return;..
8660: 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
8670: 65 20 61 72 67 75 6d 65 6e 74 20 72 65 67 69 73  e argument regis
8680: 74 65 72 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  ters. */.  for(i
8690: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
86a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
86b0: 61 58 52 65 66 5b 69 5d 3e 3d 30 20 29 7b 0a 20  aXRef[i]>=0 ){. 
86c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
86d0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 68  Code(pParse, pCh
86e0: 61 6e 67 65 73 2d 3e 61 5b 61 58 52 65 66 5b 69  anges->a[aXRef[i
86f0: 5d 5d 2e 70 45 78 70 72 2c 20 72 65 67 41 72 67  ]].pExpr, regArg
8700: 2b 32 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  +2+i);.    }else
8710: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8720: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8730: 56 43 6f 6c 75 6d 6e 2c 20 69 43 73 72 2c 20 69  VColumn, iCsr, i
8740: 2c 20 72 65 67 41 72 67 2b 32 2b 69 29 3b 0a 20  , regArg+2+i);. 
8750: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8760: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8770: 41 47 5f 4e 4f 43 48 4e 47 29 3b 2f 2a 20 45 6e  AG_NOCHNG);/* En
8780: 61 62 6c 65 20 73 71 6c 69 74 65 33 5f 76 74 61  able sqlite3_vta
8790: 62 5f 6e 6f 63 68 61 6e 67 65 28 29 20 2a 2f 0a  b_nochange() */.
87a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
87b0: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
87c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
87d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
87e0: 77 69 64 2c 20 69 43 73 72 2c 20 72 65 67 41 72  wid, iCsr, regAr
87f0: 67 29 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 77  g);.    if( pRow
8800: 69 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  id ){.      sqli
8810: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
8820: 73 65 2c 20 70 52 6f 77 69 64 2c 20 72 65 67 41  se, pRowid, regA
8830: 72 67 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rg+1);.    }else
8840: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8850: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8860: 52 6f 77 69 64 2c 20 69 43 73 72 2c 20 72 65 67  Rowid, iCsr, reg
8870: 41 72 67 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Arg+1);.    }.  
8880: 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78  }else{.    Index
8890: 20 2a 70 50 6b 3b 20 20 20 2f 2a 20 50 52 49 4d   *pPk;   /* PRIM
88a0: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 2a 2f  ARY KEY index */
88b0: 0a 20 20 20 20 69 31 36 20 69 50 6b 3b 20 20 20  .    i16 iPk;   
88c0: 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45     /* PRIMARY KE
88d0: 59 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20  Y column */.    
88e0: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
88f0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
8900: 62 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  b);.    assert( 
8910: 70 50 6b 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  pPk!=0 );.    as
8920: 73 65 72 74 28 20 70 50 6b 2d 3e 6e 4b 65 79 43  sert( pPk->nKeyC
8930: 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 69 50 6b  ol==1 );.    iPk
8940: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
8950: 5b 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  [0];.    sqlite3
8960: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8970: 5f 56 43 6f 6c 75 6d 6e 2c 20 69 43 73 72 2c 20  _VColumn, iCsr, 
8980: 69 50 6b 2c 20 72 65 67 41 72 67 29 3b 0a 20 20  iPk, regArg);.  
8990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
89a0: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
89b0: 20 72 65 67 41 72 67 2b 32 2b 69 50 6b 2c 20 72   regArg+2+iPk, r
89c0: 65 67 41 72 67 2b 31 29 3b 0a 20 20 7d 0a 0a 20  egArg+1);.  }.. 
89d0: 20 65 4f 6e 65 50 61 73 73 20 3d 20 73 71 6c 69   eOnePass = sqli
89e0: 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73  te3WhereOkOnePas
89f0: 73 28 70 57 49 6e 66 6f 2c 20 61 44 75 6d 6d 79  s(pWInfo, aDummy
8a00: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 69  );..  /* There i
8a10: 73 20 6e 6f 20 4f 4e 45 50 41 53 53 5f 4d 55 4c  s no ONEPASS_MUL
8a20: 54 49 20 6f 6e 20 76 69 72 74 75 61 6c 20 74 61  TI on virtual ta
8a30: 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  bles */.  assert
8a40: 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ( eOnePass==ONEP
8a50: 41 53 53 5f 4f 46 46 20 7c 7c 20 65 4f 6e 65 50  ASS_OFF || eOneP
8a60: 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53 49 4e  ass==ONEPASS_SIN
8a70: 47 4c 45 20 29 3b 0a 0a 20 20 69 66 28 20 65 4f  GLE );..  if( eO
8a80: 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20 2f 2a  nePass ){.    /*
8a90: 20 49 66 20 75 73 69 6e 67 20 74 68 65 20 6f 6e   If using the on
8aa0: 65 70 61 73 73 20 73 74 72 61 74 65 67 79 2c 20  epass strategy, 
8ab0: 6e 6f 2d 6f 70 20 6f 75 74 20 74 68 65 20 4f 50  no-op out the OP
8ac0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63  _OpenEphemeral c
8ad0: 6f 64 65 64 0a 20 20 20 20 2a 2a 20 61 62 6f 76  oded.    ** abov
8ae0: 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
8af0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
8b00: 70 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  p(v, addr);.    
8b10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8b20: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
8b30: 43 73 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Csr);.  }else{. 
8b40: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 72     /* Create a r
8b50: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 61  ecord from the a
8b60: 72 67 75 6d 65 6e 74 20 72 65 67 69 73 74 65 72  rgument register
8b70: 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 69 6e   contents and in
8b80: 73 65 72 74 20 69 74 20 69 6e 74 6f 0a 20 20 20  sert it into.   
8b90: 20 2a 2a 20 74 68 65 20 65 70 68 65 6d 65 72 61   ** the ephemera
8ba0: 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  l table. */.    
8bb0: 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
8bc0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73  e(pParse);.    s
8bd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8be0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
8bf0: 64 2c 20 72 65 67 41 72 67 2c 20 6e 41 72 67 2c  d, regArg, nArg,
8c00: 20 72 65 67 52 65 63 29 3b 0a 23 69 66 64 65 66   regRec);.#ifdef
8c10: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8c20: 20 20 2f 2a 20 53 69 67 6e 61 6c 20 61 6e 20 61    /* Signal an a
8c30: 73 73 65 72 74 28 29 20 77 69 74 68 69 6e 20 4f  ssert() within O
8c40: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 74 68 61  P_MakeRecord tha
8c50: 74 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20  t it is allowed 
8c60: 74 6f 0a 20 20 20 20 2a 2a 20 61 63 63 65 70 74  to.    ** accept
8c70: 20 6e 6f 2d 63 68 61 6e 67 65 20 72 65 63 6f 72   no-change recor
8c80: 64 73 20 77 69 74 68 20 73 65 72 69 61 6c 5f 74  ds with serial_t
8c90: 79 70 65 20 31 30 20 2a 2f 0a 20 20 20 20 73 71  ype 10 */.    sq
8ca0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8cb0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 4e 4f 43 48  5(v, OPFLAG_NOCH
8cc0: 4e 47 5f 4d 41 47 49 43 29 3b 0a 23 65 6e 64 69  NG_MAGIC);.#endi
8cd0: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
8ce0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
8cf0: 77 52 6f 77 69 64 2c 20 65 70 68 65 6d 54 61 62  wRowid, ephemTab
8d00: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
8d10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8d20: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
8d30: 20 65 70 68 65 6d 54 61 62 2c 20 72 65 67 52 65   ephemTab, regRe
8d40: 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  c, regRowid);.  
8d50: 7d 0a 0a 0a 20 20 69 66 28 20 65 4f 6e 65 50 61  }...  if( eOnePa
8d60: 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
8d70: 29 7b 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ){.    /* End th
8d80: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
8d90: 73 63 61 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  scan */.    sqli
8da0: 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
8db0: 66 6f 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67  fo);..    /* Beg
8dc0: 69 6e 20 73 63 61 6e 6e 6e 69 6e 67 20 74 68 72  in scannning thr
8dd0: 6f 75 67 68 20 74 68 65 20 65 70 68 65 6d 65 72  ough the ephemer
8de0: 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  al table. */.   
8df0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
8e00: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
8e10: 52 65 77 69 6e 64 2c 20 65 70 68 65 6d 54 61 62  Rewind, ephemTab
8e20: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
8e30: 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72  v);..    /* Extr
8e40: 61 63 74 20 61 72 67 75 6d 65 6e 74 73 20 66 72  act arguments fr
8e50: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  om the current r
8e60: 6f 77 20 6f 66 20 74 68 65 20 65 70 68 65 6d 65  ow of the epheme
8e70: 72 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 0a 20  ral table and . 
8e80: 20 20 20 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65     ** invoke the
8e90: 20 56 55 70 64 61 74 65 20 6d 65 74 68 6f 64 2e   VUpdate method.
8ea0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
8eb0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
8ec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ed0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
8ee0: 6c 75 6d 6e 2c 20 65 70 68 65 6d 54 61 62 2c 20  lumn, ephemTab, 
8ef0: 69 2c 20 72 65 67 41 72 67 2b 69 29 3b 0a 20 20  i, regArg+i);.  
8f00: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
8f10: 33 56 74 61 62 4d 61 6b 65 57 72 69 74 61 62 6c  3VtabMakeWritabl
8f20: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  e(pParse, pTab);
8f30: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
8f40: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 55 70 64 61  dOp4(v, OP_VUpda
8f50: 74 65 2c 20 30 2c 20 6e 41 72 67 2c 20 72 65 67  te, 0, nArg, reg
8f60: 41 72 67 2c 20 70 56 54 61 62 2c 20 50 34 5f 56  Arg, pVTab, P4_V
8f70: 54 41 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  TAB);.  sqlite3V
8f80: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 6f  dbeChangeP5(v, o
8f90: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
8fa0: 6c 74 20 3f 20 4f 45 5f 41 62 6f 72 74 20 3a 20  lt ? OE_Abort : 
8fb0: 6f 6e 45 72 72 6f 72 29 3b 0a 20 20 73 71 6c 69  onError);.  sqli
8fc0: 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
8fd0: 73 65 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f  se);..  /* End o
8fe0: 66 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  f the ephemeral 
8ff0: 74 61 62 6c 65 20 73 63 61 6e 2e 20 4f 72 2c 20  table scan. Or, 
9000: 69 66 20 75 73 69 6e 67 20 74 68 65 20 6f 6e 65  if using the one
9010: 70 61 73 73 20 73 74 72 61 74 65 67 79 2c 0a 20  pass strategy,. 
9020: 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 68 65 72 65   ** jump to here
9030: 20 69 66 20 74 68 65 20 73 63 61 6e 20 76 69 73   if the scan vis
9040: 69 74 65 64 20 7a 65 72 6f 20 72 6f 77 73 2e 20  ited zero rows. 
9050: 2a 2f 0a 20 20 69 66 28 20 65 4f 6e 65 50 61 73  */.  if( eOnePas
9060: 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29  s==ONEPASS_OFF )
9070: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
9080: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
9090: 78 74 2c 20 65 70 68 65 6d 54 61 62 2c 20 61 64  xt, ephemTab, ad
90a0: 64 72 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  dr+1); VdbeCover
90b0: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
90c0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
90d0: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71  v, addr);.    sq
90e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
90f0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 65 70 68  v, OP_Close, eph
9100: 65 6d 54 61 62 2c 20 30 29 3b 0a 20 20 7d 65 6c  emTab, 0);.  }el
9110: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  se{.    sqlite3W
9120: 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
9130: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
9140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
9150: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a           TUALTABLE */.