/ Hex Artifact Content
Login

Artifact f5210fb55d26e20d14d0106c9479a83c63a005b70b1b5291481c48d6dac6fb9f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 55 50 44 41 54 45 20 73   handle UPDATE s
01d0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69  tatements..*/.#i
01e0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
01f0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
0200: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
0210: 4c 54 41 42 4c 45 0a 2f 2a 20 46 6f 72 77 61 72  LTABLE./* Forwar
0220: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
0240: 61 74 65 56 69 72 74 75 61 6c 54 61 62 6c 65 28  ateVirtualTable(
0250: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0260: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
0270: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
0280: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
0290: 63 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  c,       /* The 
02a0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 6f  virtual table to
02b0: 20 62 65 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a   be modified */.
02c0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
02d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
02e0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
02f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e   ExprList *pChan
0300: 67 65 73 2c 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ges,  /* The col
0310: 75 6d 6e 73 20 74 6f 20 63 68 61 6e 67 65 20 69  umns to change i
0320: 6e 20 74 68 65 20 55 50 44 41 54 45 20 73 74 61  n the UPDATE sta
0330: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  tement */.  Expr
0340: 20 2a 70 52 6f 77 69 64 45 78 70 72 2c 20 20 20   *pRowidExpr,   
0350: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 75   /* Expression u
0360: 73 65 64 20 74 6f 20 72 65 63 6f 6d 70 75 74 65  sed to recompute
0370: 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
0380: 69 6e 74 20 2a 61 58 52 65 66 2c 20 20 20 20 20  int *aXRef,     
0390: 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
03a0: 66 72 6f 6d 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  from columns of 
03b0: 70 54 61 62 20 74 6f 20 65 6e 74 72 69 65 73 20  pTab to entries 
03c0: 69 6e 20 70 43 68 61 6e 67 65 73 20 2a 2f 0a 20  in pChanges */. 
03d0: 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
03e0: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
03f0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 55 50 44  lause of the UPD
0400: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
0410: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20  .  int onError  
0420: 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f          /* ON CO
0430: 4e 46 4c 49 43 54 20 73 74 72 61 74 65 67 79 20  NFLICT strategy 
0440: 2a 2f 0a 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  */.);.#endif /* 
0450: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
0460: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
0470: 2a 2a 20 54 68 65 20 6d 6f 73 74 20 72 65 63 65  ** The most rece
0480: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
0490: 75 63 74 69 6f 6e 20 77 61 73 20 61 6e 20 4f 50  uction was an OP
04a0: 5f 43 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 72 69  _Column to retri
04b0: 65 76 65 20 74 68 65 0a 2a 2a 20 69 2d 74 68 20  eve the.** i-th 
04c0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
04d0: 70 54 61 62 2e 20 54 68 69 73 20 72 6f 75 74 69  pTab. This routi
04e0: 6e 65 20 73 65 74 73 20 74 68 65 20 50 34 20 70  ne sets the P4 p
04f0: 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20  arameter of the 
0500: 0a 2a 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 20 74 6f  .** OP_Column to
0510: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
0520: 75 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a  ue, if any..**.*
0530: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  * The default va
0540: 6c 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  lue of a column 
0550: 69 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  is specified by 
0560: 61 20 44 45 46 41 55 4c 54 20 63 6c 61 75 73 65  a DEFAULT clause
0570: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 6c 75   in the .** colu
0580: 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 54  mn definition. T
0590: 68 69 73 20 77 61 73 20 65 69 74 68 65 72 20 73  his was either s
05a0: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 75  upplied by the u
05b0: 73 65 72 20 77 68 65 6e 20 74 68 65 20 74 61 62  ser when the tab
05c0: 6c 65 0a 2a 2a 20 77 61 73 20 63 72 65 61 74 65  le.** was create
05d0: 64 2c 20 6f 72 20 61 64 64 65 64 20 6c 61 74 65  d, or added late
05e0: 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 64  r to the table d
05f0: 65 66 69 6e 69 74 69 6f 6e 20 62 79 20 61 6e 20  efinition by an 
0600: 41 4c 54 45 52 20 54 41 42 4c 45 0a 2a 2a 20 63  ALTER TABLE.** c
0610: 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 6c  ommand. If the l
0620: 61 74 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  atter, then the 
0630: 72 6f 77 2d 72 65 63 6f 72 64 73 20 69 6e 20 74  row-records in t
0640: 68 65 20 74 61 62 6c 65 20 62 74 72 65 65 20 6f  he table btree o
0650: 6e 20 64 69 73 6b 0a 2a 2a 20 6d 61 79 20 6e 6f  n disk.** may no
0660: 74 20 63 6f 6e 74 61 69 6e 20 61 20 76 61 6c 75  t contain a valu
0670: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
0680: 20 61 6e 64 20 74 68 65 20 64 65 66 61 75 6c 74   and the default
0690: 20 76 61 6c 75 65 2c 20 74 61 6b 65 6e 0a 2a 2a   value, taken.**
06a0: 20 66 72 6f 6d 20 74 68 65 20 50 34 20 70 61 72   from the P4 par
06b0: 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20 4f 50  ameter of the OP
06c0: 5f 43 6f 6c 75 6d 6e 20 69 6e 73 74 72 75 63 74  _Column instruct
06d0: 69 6f 6e 2c 20 69 73 20 72 65 74 75 72 6e 65 64  ion, is returned
06e0: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 49 66 20   instead..** If 
06f0: 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e  the former, then
0700: 20 61 6c 6c 20 72 6f 77 2d 72 65 63 6f 72 64 73   all row-records
0710: 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
0720: 74 6f 20 69 6e 63 6c 75 64 65 20 61 20 76 61 6c  to include a val
0730: 75 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ue.** for the co
0740: 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 50 34 20  lumn and the P4 
0750: 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 72 65 71  value is not req
0760: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6c  uired..**.** Col
0770: 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  umn definitions 
0780: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 41 4c  created by an AL
0790: 54 45 52 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e  TER TABLE comman
07a0: 64 20 6d 61 79 20 6f 6e 6c 79 20 68 61 76 65 20  d may only have 
07b0: 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 64 65 66 61  .** literal defa
07c0: 75 6c 74 20 76 61 6c 75 65 73 20 73 70 65 63 69  ult values speci
07d0: 66 69 65 64 3a 20 61 20 6e 75 6d 62 65 72 2c 20  fied: a number, 
07e0: 6e 75 6c 6c 20 6f 72 20 61 20 73 74 72 69 6e 67  null or a string
07f0: 2e 20 28 49 66 20 61 20 6d 6f 72 65 0a 2a 2a 20  . (If a more.** 
0800: 63 6f 6d 70 6c 69 63 61 74 65 64 20 64 65 66 61  complicated defa
0810: 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 20 76  ult expression v
0820: 61 6c 75 65 20 77 61 73 20 70 72 6f 76 69 64 65  alue was provide
0830: 64 2c 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  d, it is evaluat
0840: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ed .** when the 
0850: 41 4c 54 45 52 20 54 41 42 4c 45 20 69 73 20 65  ALTER TABLE is e
0860: 78 65 63 75 74 65 64 20 61 6e 64 20 6f 6e 65 20  xecuted and one 
0870: 6f 66 20 74 68 65 20 6c 69 74 65 72 61 6c 20 76  of the literal v
0880: 61 6c 75 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  alues written.**
0890: 20 69 6e 74 6f 20 74 68 65 20 73 71 6c 69 74 65   into the sqlite
08a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 29 0a  _master table.).
08b0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 66 6f 72 65 2c  **.** Therefore,
08c0: 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65   the P4 paramete
08d0: 72 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  r is only requir
08e0: 65 64 20 69 66 20 74 68 65 20 64 65 66 61 75 6c  ed if the defaul
08f0: 74 20 76 61 6c 75 65 20 66 6f 72 0a 2a 2a 20 74  t value for.** t
0900: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 61 20 6c  he column is a l
0910: 69 74 65 72 61 6c 20 6e 75 6d 62 65 72 2c 20 73  iteral number, s
0920: 74 72 69 6e 67 20 6f 72 20 6e 75 6c 6c 2e 20 54  tring or null. T
0930: 68 65 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  he sqlite3ValueF
0940: 72 6f 6d 45 78 70 72 28 29 0a 2a 2a 20 66 75 6e  romExpr().** fun
0950: 63 74 69 6f 6e 20 69 73 20 63 61 70 61 62 6c 65  ction is capable
0960: 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67   of transforming
0970: 20 74 68 65 73 65 20 74 79 70 65 73 20 6f 66 20   these types of 
0980: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 74 6f  expressions into
0990: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  .** sqlite3_valu
09a0: 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a  e objects..**.**
09b0: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 52   If parameter iR
09c0: 65 67 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  eg is not negati
09d0: 76 65 2c 20 63 6f 64 65 20 61 6e 20 4f 50 5f 52  ve, code an OP_R
09e0: 65 61 6c 41 66 66 69 6e 69 74 79 20 69 6e 73 74  ealAffinity inst
09f0: 72 75 63 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 72 65  ruction.** on re
0a00: 67 69 73 74 65 72 20 69 52 65 67 2e 20 54 68 69  gister iReg. Thi
0a10: 73 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 61  s is used when a
0a20: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 74  n equivalent int
0a30: 65 67 65 72 20 76 61 6c 75 65 20 69 73 20 0a 2a  eger value is .*
0a40: 2a 20 73 74 6f 72 65 64 20 69 6e 20 70 6c 61 63  * stored in plac
0a50: 65 20 6f 66 20 61 6e 20 38 2d 62 79 74 65 20 66  e of an 8-byte f
0a60: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
0a70: 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  lue in order to 
0a80: 73 61 76 65 20 0a 2a 2a 20 73 70 61 63 65 2e 0a  save .** space..
0a90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
0aa0: 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 56 64 62  olumnDefault(Vdb
0ab0: 65 20 2a 76 2c 20 54 61 62 6c 65 20 2a 70 54 61  e *v, Table *pTa
0ac0: 62 2c 20 69 6e 74 20 69 2c 20 69 6e 74 20 69 52  b, int i, int iR
0ad0: 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  eg){.  assert( p
0ae0: 54 61 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Tab!=0 );.  if( 
0af0: 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29  !pTab->pSelect )
0b00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
0b10: 6c 75 65 20 2a 70 56 61 6c 75 65 20 3d 20 30 3b  lue *pValue = 0;
0b20: 0a 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e  .    u8 enc = EN
0b30: 43 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  C(sqlite3VdbeDb(
0b40: 76 29 29 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  v));.    Column 
0b50: 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61  *pCol = &pTab->a
0b60: 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 56 64 62 65  Col[i];.    Vdbe
0b70: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
0b80: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
0b90: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 29 3b  , pCol->zName));
0ba0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70  .    assert( i<p
0bb0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0bc0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f   sqlite3ValueFro
0bd0: 6d 45 78 70 72 28 73 71 6c 69 74 65 33 56 64 62  mExpr(sqlite3Vdb
0be0: 65 44 62 28 76 29 2c 20 70 43 6f 6c 2d 3e 70 44  eDb(v), pCol->pD
0bf0: 66 6c 74 2c 20 65 6e 63 2c 20 0a 20 20 20 20 20  flt, enc, .     
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c10: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
0c20: 74 79 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20  ty, &pValue);.  
0c30: 20 20 69 66 28 20 70 56 61 6c 75 65 20 29 7b 0a    if( pValue ){.
0c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
0c50: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 56 61  eAppendP4(v, pVa
0c60: 6c 75 65 2c 20 50 34 5f 4d 45 4d 29 3b 0a 20 20  lue, P4_MEM);.  
0c70: 20 20 7d 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20    }.  }.#ifndef 
0c80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
0c90: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 69 66 28  TING_POINT.  if(
0ca0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 61   pTab->aCol[i].a
0cb0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
0cc0: 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20  AFF_REAL ){.    
0cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0ce0: 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
0cf0: 6e 69 74 79 2c 20 69 52 65 67 29 3b 0a 20 20 7d  nity, iReg);.  }
0d00: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
0d10: 20 50 72 6f 63 65 73 73 20 61 6e 20 55 50 44 41   Process an UPDA
0d20: 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  TE statement..**
0d30: 0a 2a 2a 20 20 20 55 50 44 41 54 45 20 4f 52 20  .**   UPDATE OR 
0d40: 49 47 4e 4f 52 45 20 74 61 62 6c 65 5f 77 78 79  IGNORE table_wxy
0d50: 7a 20 53 45 54 20 61 3d 62 2c 20 63 3d 64 20 57  z SET a=b, c=d W
0d60: 48 45 52 45 20 65 3c 35 20 41 4e 44 20 66 20 4e  HERE e<5 AND f N
0d70: 4f 54 20 4e 55 4c 4c 3b 0a 2a 2a 20 20 20 20 20  OT NULL;.**     
0d80: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 2f 20 5c       \_______/ \
0d90: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
0da0: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 5c 5f 5f  _____/       \__
0db0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
0dc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 45  *            onE
0dd0: 72 72 6f 72 20 20 20 70 54 61 62 4c 69 73 74 20  rror   pTabList 
0de0: 20 20 20 20 20 70 43 68 61 6e 67 65 73 20 20 20       pChanges   
0df0: 20 20 20 20 20 20 20 20 20 20 70 57 68 65 72 65            pWhere
0e00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0e10: 55 70 64 61 74 65 28 0a 20 20 50 61 72 73 65 20  Update(.  Parse 
0e20: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0e30: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
0e40: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
0e50: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
0e60: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
0e70: 69 6e 20 77 68 69 63 68 20 77 65 20 73 68 6f 75  in which we shou
0e80: 6c 64 20 63 68 61 6e 67 65 20 74 68 69 6e 67 73  ld change things
0e90: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
0ea0: 70 43 68 61 6e 67 65 73 2c 20 20 20 20 2f 2a 20  pChanges,    /* 
0eb0: 54 68 69 6e 67 73 20 74 6f 20 62 65 20 63 68 61  Things to be cha
0ec0: 6e 67 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nged */.  Expr *
0ed0: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
0ee0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
0ef0: 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 6e 75  ause.  May be nu
0f00: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ll */.  int onEr
0f10: 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ror,           /
0f20: 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65 20  * How to handle 
0f30: 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f 72  constraint error
0f40: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
0f50: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a  *pOrderBy,    /*
0f60: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
0f70: 2e 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f  . May be null */
0f80: 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20  .  Expr *pLimit 
0f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
0fa0: 49 54 20 63 6c 61 75 73 65 2e 20 4d 61 79 20 62  IT clause. May b
0fb0: 65 20 6e 75 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69  e null */.){.  i
0fc0: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
0fd0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
0fe0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 54 61 62 6c  unters */.  Tabl
0ff0: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
1000: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
1010: 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f  to be updated */
1020: 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d  .  int addrTop =
1030: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 56 44 42   0;       /* VDB
1040: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  E instruction ad
1050: 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 74 61  dress of the sta
1060: 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  rt of the loop *
1070: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
1080: 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 49 6e  WInfo;     /* In
1090: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
10a0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10b0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d0: 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
10e0: 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
10f0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
1100: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1110: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 69 6e 64 69  ooping over indi
1120: 63 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ces */.  Index *
1130: 70 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPk;            
1140: 2f 2a 20 54 68 65 20 50 52 49 4d 41 52 59 20 4b  /* The PRIMARY K
1150: 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54  EY index for WIT
1160: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1170: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 64 78 3b  s */.  int nIdx;
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1190: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 69 63   Number of indic
11a0: 65 73 20 74 68 61 74 20 6e 65 65 64 20 75 70 64  es that need upd
11b0: 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  ating */.  int i
11c0: 42 61 73 65 43 75 72 3b 20 20 20 20 20 20 20 20  BaseCur;        
11d0: 20 20 2f 2a 20 42 61 73 65 20 63 75 72 73 6f 72    /* Base cursor
11e0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
11f0: 20 69 44 61 74 61 43 75 72 3b 20 20 20 20 20 20   iDataCur;      
1200: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f      /* Cursor fo
1210: 72 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  r the canonical 
1220: 64 61 74 61 20 62 74 72 65 65 20 2a 2f 0a 20 20  data btree */.  
1230: 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
1240: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
1250: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 69   for the first i
1260: 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndex */.  sqlite
1270: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1280: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1290: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
12a0: 69 6e 74 20 2a 61 52 65 67 49 64 78 20 3d 20 30  int *aRegIdx = 0
12b0: 3b 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ;      /* First 
12c0: 72 65 67 69 73 74 65 72 20 69 6e 20 61 72 72 61  register in arra
12d0: 79 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61  y assigned to ea
12e0: 63 68 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ch index */.  in
12f0: 74 20 2a 61 58 52 65 66 20 3d 20 30 3b 20 20 20  t *aXRef = 0;   
1300: 20 20 20 20 20 2f 2a 20 61 58 52 65 66 5b 69 5d       /* aXRef[i]
1310: 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e   is the index in
1320: 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 5d 20 6f   pChanges->a[] o
1330: 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  f the.          
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1350: 2a 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  * an expression 
1360: 66 6f 72 20 74 68 65 20 69 2d 74 68 20 63 6f 6c  for the i-th col
1370: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
1380: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1390: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 58             ** aX
13a0: 52 65 66 5b 69 5d 3d 3d 2d 31 20 69 66 20 74 68  Ref[i]==-1 if th
13b0: 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 69 73  e i-th column is
13c0: 20 6e 6f 74 20 63 68 61 6e 67 65 64 2e 20 2a 2f   not changed. */
13d0: 0a 20 20 75 38 20 2a 61 54 6f 4f 70 65 6e 3b 20  .  u8 *aToOpen; 
13e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 66            /* 1 f
13f0: 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  or tables and in
1400: 64 69 63 65 73 20 74 6f 20 62 65 20 6f 70 65 6e  dices to be open
1410: 65 64 20 2a 2f 0a 20 20 75 38 20 63 68 6e 67 50  ed */.  u8 chngP
1420: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
1430: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 68  * PRIMARY KEY ch
1440: 61 6e 67 65 64 20 69 6e 20 61 20 57 49 54 48 4f  anged in a WITHO
1450: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 2a  UT ROWID table *
1460: 2f 0a 20 20 75 38 20 63 68 6e 67 52 6f 77 69 64  /.  u8 chngRowid
1470: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  ;          /* Ro
1480: 77 69 64 20 63 68 61 6e 67 65 64 20 69 6e 20 61  wid changed in a
1490: 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 20 2a 2f   normal table */
14a0: 0a 20 20 75 38 20 63 68 6e 67 4b 65 79 3b 20 20  .  u8 chngKey;  
14b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 69 74            /* Eit
14c0: 68 65 72 20 63 68 6e 67 50 6b 20 6f 72 20 63 68  her chngPk or ch
14d0: 6e 67 52 6f 77 69 64 20 2a 2f 0a 20 20 45 78 70  ngRowid */.  Exp
14e0: 72 20 2a 70 52 6f 77 69 64 45 78 70 72 20 3d 20  r *pRowidExpr = 
14f0: 30 3b 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f  0;  /* Expressio
1500: 6e 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 6e  n defining the n
1510: 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  ew record number
1520: 20 2a 2f 0a 20 20 41 75 74 68 43 6f 6e 74 65 78   */.  AuthContex
1530: 74 20 73 43 6f 6e 74 65 78 74 3b 20 20 2f 2a 20  t sContext;  /* 
1540: 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  The authorizatio
1550: 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e  n context */.  N
1560: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
1570: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d        /* The nam
1580: 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73  e-context to res
1590: 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73  olve expressions
15a0: 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62   in */.  int iDb
15b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15c0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74  /* Database cont
15d0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
15e0: 20 62 65 69 6e 67 20 75 70 64 61 74 65 64 20 2a   being updated *
15f0: 2f 0a 20 20 69 6e 74 20 65 4f 6e 65 50 61 73 73  /.  int eOnePass
1600: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e  ;          /* ON
1610: 45 50 41 53 53 5f 58 58 58 20 76 61 6c 75 65 20  EPASS_XXX value 
1620: 66 72 6f 6d 20 77 68 65 72 65 2e 63 20 2a 2f 0a  from where.c */.
1630: 20 20 69 6e 74 20 68 61 73 46 4b 3b 20 20 20 20    int hasFK;    
1640: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1650: 20 69 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   if foreign key 
1660: 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 72 65  processing is re
1670: 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
1680: 6c 61 62 65 6c 42 72 65 61 6b 3b 20 20 20 20 20  labelBreak;     
1690: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
16a0: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
16b0: 55 50 44 41 54 45 20 6c 6f 6f 70 20 2a 2f 0a 20  UPDATE loop */. 
16c0: 20 69 6e 74 20 6c 61 62 65 6c 43 6f 6e 74 69 6e   int labelContin
16d0: 75 65 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ue;     /* Jump 
16e0: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
16f0: 20 6e 65 78 74 20 73 74 65 70 20 6f 66 20 55 50   next step of UP
1700: 44 41 54 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  DATE loop */.  i
1710: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
1720: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
1730: 6f 72 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  or sqlite3WhereB
1740: 65 67 69 6e 28 29 20 2a 2f 0a 0a 23 69 66 6e 64  egin() */..#ifnd
1750: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1760: 52 49 47 47 45 52 0a 20 20 69 6e 74 20 69 73 56  RIGGER.  int isV
1770: 69 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  iew;            
1780: 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 75 70 64  /* True when upd
1790: 61 74 69 6e 67 20 61 20 76 69 65 77 20 28 49 4e  ating a view (IN
17a0: 53 54 45 41 44 20 4f 46 20 74 72 69 67 67 65 72  STEAD OF trigger
17b0: 29 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20 2a  ) */.  Trigger *
17c0: 70 54 72 69 67 67 65 72 3b 20 20 20 20 20 2f 2a  pTrigger;     /*
17d0: 20 4c 69 73 74 20 6f 66 20 74 72 69 67 67 65 72   List of trigger
17e0: 73 20 6f 6e 20 70 54 61 62 2c 20 69 66 20 72 65  s on pTab, if re
17f0: 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
1800: 74 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  tmask;          
1810: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 54 52     /* Mask of TR
1820: 49 47 47 45 52 5f 42 45 46 4f 52 45 7c 54 52 49  IGGER_BEFORE|TRI
1830: 47 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 23 65  GGER_AFTER */.#e
1840: 6e 64 69 66 0a 20 20 69 6e 74 20 6e 65 77 6d 61  ndif.  int newma
1850: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sk;           /*
1860: 20 4d 61 73 6b 20 6f 66 20 4e 45 57 2e 2a 20 63   Mask of NEW.* c
1870: 6f 6c 75 6d 6e 73 20 61 63 63 65 73 73 65 64 20  olumns accessed 
1880: 62 79 20 42 45 46 4f 52 45 20 74 72 69 67 67 65  by BEFORE trigge
1890: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 70 68  rs */.  int iEph
18a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
18b0: 2a 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  * Ephemeral tabl
18c0: 65 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 70 72  e holding all pr
18d0: 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 73  imary key values
18e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d   */.  int nKey =
18f0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
1900: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
1910: 74 73 20 69 6e 20 72 65 67 4b 65 79 20 66 6f 72  ts in regKey for
1920: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a   WITHOUT ROWID *
1930: 2f 0a 20 20 69 6e 74 20 61 69 43 75 72 4f 6e 65  /.  int aiCurOne
1940: 50 61 73 73 5b 32 5d 3b 20 20 20 2f 2a 20 54 68  Pass[2];   /* Th
1950: 65 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  e write cursors 
1960: 6f 70 65 6e 65 64 20 62 79 20 57 48 45 52 45 5f  opened by WHERE_
1970: 4f 4e 45 50 41 53 53 20 2a 2f 0a 20 20 69 6e 74  ONEPASS */.  int
1980: 20 61 64 64 72 4f 70 65 6e 20 3d 20 30 3b 20 20   addrOpen = 0;  
1990: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19a0: 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  f OP_OpenEphemer
19b0: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6b 20  al */.  int iPk 
19c0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
19d0: 2a 20 46 69 72 73 74 20 6f 66 20 6e 50 6b 20 63  * First of nPk c
19e0: 65 6c 6c 73 20 68 6f 6c 64 69 6e 67 20 50 52 49  ells holding PRI
19f0: 4d 41 52 59 20 4b 45 59 20 76 61 6c 75 65 20 2a  MARY KEY value *
1a00: 2f 0a 20 20 69 31 36 20 6e 50 6b 20 3d 20 30 3b  /.  i16 nPk = 0;
1a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a20: 6d 62 65 72 20 6f 66 20 63 6f 6d 70 6f 6e 65 6e  mber of componen
1a30: 74 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ts of the PRIMAR
1a40: 59 20 4b 45 59 20 2a 2f 0a 20 20 69 6e 74 20 62  Y KEY */.  int b
1a50: 52 65 70 6c 61 63 65 20 3d 20 30 3b 20 20 20 20  Replace = 0;    
1a60: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 52 45 50    /* True if REP
1a70: 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65  LACE conflict re
1a80: 73 6f 6c 75 74 69 6f 6e 20 6d 69 67 68 74 20 68  solution might h
1a90: 61 70 70 65 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 52  appen */..  /* R
1aa0: 65 67 69 73 74 65 72 20 41 6c 6c 6f 63 61 74 69  egister Allocati
1ab0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ons */.  int reg
1ac0: 52 6f 77 43 6f 75 6e 74 20 3d 20 30 3b 20 20 20  RowCount = 0;   
1ad0: 2f 2a 20 41 20 63 6f 75 6e 74 20 6f 66 20 72 6f  /* A count of ro
1ae0: 77 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ws changed */.  
1af0: 69 6e 74 20 72 65 67 4f 6c 64 52 6f 77 69 64 20  int regOldRowid 
1b00: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 6f 6c  = 0;   /* The ol
1b10: 64 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74  d rowid */.  int
1b20: 20 72 65 67 4e 65 77 52 6f 77 69 64 20 3d 20 30   regNewRowid = 0
1b30: 3b 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72  ;   /* The new r
1b40: 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  owid */.  int re
1b50: 67 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  gNew = 0;       
1b60: 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
1b70: 68 65 20 4e 45 57 2e 2a 20 74 61 62 6c 65 20 69  he NEW.* table i
1b80: 6e 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20  n triggers */.  
1b90: 69 6e 74 20 72 65 67 4f 6c 64 20 3d 20 30 3b 20  int regOld = 0; 
1ba0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
1bb0: 74 20 6f 66 20 4f 4c 44 2e 2a 20 74 61 62 6c 65  t of OLD.* table
1bc0: 20 69 6e 20 74 72 69 67 67 65 72 73 20 2a 2f 0a   in triggers */.
1bd0: 20 20 69 6e 74 20 72 65 67 52 6f 77 53 65 74 20    int regRowSet 
1be0: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73  = 0;     /* Rows
1bf0: 65 74 20 6f 66 20 72 6f 77 73 20 74 6f 20 62 65  et of rows to be
1c00: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 69 6e   updated */.  in
1c10: 74 20 72 65 67 4b 65 79 20 3d 20 30 3b 20 20 20  t regKey = 0;   
1c20: 20 20 20 20 20 2f 2a 20 63 6f 6d 70 6f 73 69 74       /* composit
1c30: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 76 61  e PRIMARY KEY va
1c40: 6c 75 65 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74  lue */..  memset
1c50: 28 26 73 43 6f 6e 74 65 78 74 2c 20 30 2c 20 73  (&sContext, 0, s
1c60: 69 7a 65 6f 66 28 73 43 6f 6e 74 65 78 74 29 29  izeof(sContext))
1c70: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1c80: 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73  >db;.  if( pPars
1c90: 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
1ca0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1cb0: 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63     goto update_c
1cc0: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 61 73  leanup;.  }.  as
1cd0: 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e  sert( pTabList->
1ce0: 6e 53 72 63 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  nSrc==1 );..  /*
1cf0: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
1d00: 65 20 77 68 69 63 68 20 77 65 20 77 61 6e 74 20  e which we want 
1d10: 74 6f 20 75 70 64 61 74 65 2e 20 0a 20 20 2a 2f  to update. .  */
1d20: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
1d30: 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
1d40: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
1d50: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
1d60: 29 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c  ) goto update_cl
1d70: 65 61 6e 75 70 3b 0a 20 20 69 44 62 20 3d 20 73  eanup;.  iDb = s
1d80: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
1d90: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
1da0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
1db0: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1dc0: 20 69 66 20 77 65 20 68 61 76 65 20 61 6e 79 20   if we have any 
1dd0: 74 72 69 67 67 65 72 73 20 61 6e 64 20 69 66 20  triggers and if 
1de0: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 0a  the table being.
1df0: 20 20 2a 2a 20 75 70 64 61 74 65 64 20 69 73 20    ** updated is 
1e00: 61 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 23 69 66  a view..  */.#if
1e10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e20: 5f 54 52 49 47 47 45 52 0a 20 20 70 54 72 69 67  _TRIGGER.  pTrig
1e30: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
1e40: 67 67 65 72 73 45 78 69 73 74 28 70 50 61 72 73  ggersExist(pPars
1e50: 65 2c 20 70 54 61 62 2c 20 54 4b 5f 55 50 44 41  e, pTab, TK_UPDA
1e60: 54 45 2c 20 70 43 68 61 6e 67 65 73 2c 20 26 74  TE, pChanges, &t
1e70: 6d 61 73 6b 29 3b 0a 20 20 69 73 56 69 65 77 20  mask);.  isView 
1e80: 3d 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 21  = pTab->pSelect!
1e90: 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  =0;.  assert( pT
1ea0: 72 69 67 67 65 72 20 7c 7c 20 74 6d 61 73 6b 3d  rigger || tmask=
1eb0: 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65  =0 );.#else.# de
1ec0: 66 69 6e 65 20 70 54 72 69 67 67 65 72 20 30 0a  fine pTrigger 0.
1ed0: 23 20 64 65 66 69 6e 65 20 69 73 56 69 65 77 20  # define isView 
1ee0: 30 0a 23 20 64 65 66 69 6e 65 20 74 6d 61 73 6b  0.# define tmask
1ef0: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   0.#endif.#ifdef
1f00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
1f10: 57 0a 23 20 75 6e 64 65 66 20 69 73 56 69 65 77  W.# undef isView
1f20: 0a 23 20 64 65 66 69 6e 65 20 69 73 56 69 65 77  .# define isView
1f30: 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   0.#endif..#ifde
1f40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f50: 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49  UPDATE_DELETE_LI
1f60: 4d 49 54 0a 20 20 69 66 28 20 21 69 73 56 69 65  MIT.  if( !isVie
1f70: 77 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20  w ){.    pWhere 
1f80: 3d 20 73 71 6c 69 74 65 33 4c 69 6d 69 74 57 68  = sqlite3LimitWh
1f90: 65 72 65 28 0a 20 20 20 20 20 20 20 20 70 50 61  ere(.        pPa
1fa0: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
1fb0: 57 68 65 72 65 2c 20 70 4f 72 64 65 72 42 79 2c  Where, pOrderBy,
1fc0: 20 70 4c 69 6d 69 74 2c 20 22 55 50 44 41 54 45   pLimit, "UPDATE
1fd0: 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 4f 72  ".    );.    pOr
1fe0: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
1ff0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 23  Limit = 0;.  }.#
2000: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c  endif..  if( sql
2010: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
2020: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
2030: 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  Tab) ){.    goto
2040: 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b   update_cleanup;
2050: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2060: 65 33 49 73 52 65 61 64 4f 6e 6c 79 28 70 50 61  e3IsReadOnly(pPa
2070: 72 73 65 2c 20 70 54 61 62 2c 20 74 6d 61 73 6b  rse, pTab, tmask
2080: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 75 70  ) ){.    goto up
2090: 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  date_cleanup;.  
20a0: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
20b0: 20 61 20 63 75 72 73 6f 72 73 20 66 6f 72 20 74   a cursors for t
20c0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
20d0: 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61   table and for a
20e0: 6c 6c 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a 2a  ll indices..  **
20f0: 20 54 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   The index curso
2100: 72 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  rs might not be 
2110: 75 73 65 64 2c 20 62 75 74 20 69 66 20 74 68 65  used, but if the
2120: 79 20 61 72 65 20 75 73 65 64 20 74 68 65 79 0a  y are used they.
2130: 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6f 63 63    ** need to occ
2140: 75 72 20 72 69 67 68 74 20 61 66 74 65 72 20 74  ur right after t
2150: 68 65 20 64 61 74 61 62 61 73 65 20 63 75 72 73  he database curs
2160: 6f 72 2e 20 20 53 6f 20 67 6f 20 61 68 65 61 64  or.  So go ahead
2170: 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61   and.  ** alloca
2180: 74 65 20 65 6e 6f 75 67 68 20 73 70 61 63 65 2c  te enough space,
2190: 20 6a 75 73 74 20 69 6e 20 63 61 73 65 2e 0a 20   just in case.. 
21a0: 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 2d 3e   */.  pTabList->
21b0: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 69  a[0].iCursor = i
21c0: 42 61 73 65 43 75 72 20 3d 20 69 44 61 74 61 43  BaseCur = iDataC
21d0: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
21e0: 62 2b 2b 3b 0a 20 20 69 49 64 78 43 75 72 20 3d  b++;.  iIdxCur =
21f0: 20 69 44 61 74 61 43 75 72 2b 31 3b 0a 20 20 70   iDataCur+1;.  p
2200: 50 6b 20 3d 20 48 61 73 52 6f 77 69 64 28 70 54  Pk = HasRowid(pT
2210: 61 62 29 20 3f 20 30 20 3a 20 73 71 6c 69 74 65  ab) ? 0 : sqlite
2220: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
2230: 28 70 54 61 62 29 3b 0a 20 20 66 6f 72 28 6e 49  (pTab);.  for(nI
2240: 64 78 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d  dx=0, pIdx=pTab-
2250: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
2260: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
2270: 20 6e 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66   nIdx++){.    if
2280: 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e  ( IsPrimaryKeyIn
2290: 64 65 78 28 70 49 64 78 29 20 26 26 20 70 50 6b  dex(pIdx) && pPk
22a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 44 61  !=0 ){.      iDa
22b0: 74 61 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  taCur = pParse->
22c0: 6e 54 61 62 3b 0a 20 20 20 20 20 20 70 54 61 62  nTab;.      pTab
22d0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
22e0: 6f 72 20 3d 20 69 44 61 74 61 43 75 72 3b 0a 20  or = iDataCur;. 
22f0: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
2300: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  >nTab++;.  }..  
2310: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
2320: 65 20 66 6f 72 20 61 58 52 65 66 5b 5d 2c 20 61  e for aXRef[], a
2330: 52 65 67 49 64 78 5b 5d 2c 20 61 6e 64 20 61 54  RegIdx[], and aT
2340: 6f 4f 70 65 6e 5b 5d 2e 20 20 0a 20 20 2a 2a 20  oOpen[].  .  ** 
2350: 49 6e 69 74 69 61 6c 69 7a 65 20 61 58 52 65 66  Initialize aXRef
2360: 5b 5d 20 61 6e 64 20 61 54 6f 4f 70 65 6e 5b 5d  [] and aToOpen[]
2370: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
2380: 74 20 76 61 6c 75 65 73 2e 0a 20 20 2a 2f 0a 20  t values..  */. 
2390: 20 61 58 52 65 66 20 3d 20 73 71 6c 69 74 65 33   aXRef = sqlite3
23a0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
23b0: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20  , sizeof(int) * 
23c0: 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 6e 49 64 78  (pTab->nCol+nIdx
23d0: 29 20 2b 20 6e 49 64 78 2b 32 20 29 3b 0a 20 20  ) + nIdx+2 );.  
23e0: 69 66 28 20 61 58 52 65 66 3d 3d 30 20 29 20 67  if( aXRef==0 ) g
23f0: 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e  oto update_clean
2400: 75 70 3b 0a 20 20 61 52 65 67 49 64 78 20 3d 20  up;.  aRegIdx = 
2410: 61 58 52 65 66 2b 70 54 61 62 2d 3e 6e 43 6f 6c  aXRef+pTab->nCol
2420: 3b 0a 20 20 61 54 6f 4f 70 65 6e 20 3d 20 28 75  ;.  aToOpen = (u
2430: 38 2a 29 28 61 52 65 67 49 64 78 2b 6e 49 64 78  8*)(aRegIdx+nIdx
2440: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 61 54 6f 4f  );.  memset(aToO
2450: 70 65 6e 2c 20 31 2c 20 6e 49 64 78 2b 31 29 3b  pen, 1, nIdx+1);
2460: 0a 20 20 61 54 6f 4f 70 65 6e 5b 6e 49 64 78 2b  .  aToOpen[nIdx+
2470: 31 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  1] = 0;.  for(i=
2480: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
2490: 20 69 2b 2b 29 20 61 58 52 65 66 5b 69 5d 20 3d   i++) aXRef[i] =
24a0: 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69   -1;..  /* Initi
24b0: 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 2d 63  alize the name-c
24c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 6d 65 6d 73  ontext */.  mems
24d0: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
24e0: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e  of(sNC));.  sNC.
24f0: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2500: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
2510: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 0a 20 20 2f  = pTabList;..  /
2520: 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63 6f  * Resolve the co
2530: 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 61 6c  lumn names in al
2540: 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  l the expression
2550: 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 66  s of the.  ** of
2560: 20 74 68 65 20 55 50 44 41 54 45 20 73 74 61 74   the UPDATE stat
2570: 65 6d 65 6e 74 2e 20 20 41 6c 73 6f 20 66 69 6e  ement.  Also fin
2580: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64  d the column ind
2590: 65 78 0a 20 20 2a 2a 20 66 6f 72 20 65 61 63 68  ex.  ** for each
25a0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 75 70   column to be up
25b0: 64 61 74 65 64 20 69 6e 20 74 68 65 20 70 43 68  dated in the pCh
25c0: 61 6e 67 65 73 20 61 72 72 61 79 2e 20 20 46 6f  anges array.  Fo
25d0: 72 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 6c 75  r each.  ** colu
25e0: 6d 6e 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  mn to be updated
25f0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68  , make sure we h
2600: 61 76 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ave authorizatio
2610: 6e 20 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a  n to change.  **
2620: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 0a 20 20   that column..  
2630: 2a 2f 0a 20 20 63 68 6e 67 52 6f 77 69 64 20 3d  */.  chngRowid =
2640: 20 63 68 6e 67 50 6b 20 3d 20 30 3b 0a 20 20 66   chngPk = 0;.  f
2650: 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 61 6e 67  or(i=0; i<pChang
2660: 65 73 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  es->nExpr; i++){
2670: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2680: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
2690: 28 26 73 4e 43 2c 20 70 43 68 61 6e 67 65 73 2d  (&sNC, pChanges-
26a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
26b0: 20 20 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74        goto updat
26c0: 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
26d0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
26e0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
26f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
2700: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
2710: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
2720: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a  pChanges->a[i].z
2730: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
2740: 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d      if( j==pTab-
2750: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
2760: 20 20 20 20 63 68 6e 67 52 6f 77 69 64 20 3d 20      chngRowid = 
2770: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 52 6f  1;.          pRo
2780: 77 69 64 45 78 70 72 20 3d 20 70 43 68 61 6e 67  widExpr = pChang
2790: 65 73 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  es->a[i].pExpr;.
27a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
27b0: 28 20 70 50 6b 20 26 26 20 28 70 54 61 62 2d 3e  ( pPk && (pTab->
27c0: 61 43 6f 6c 5b 6a 5d 2e 63 6f 6c 46 6c 61 67 73  aCol[j].colFlags
27d0: 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b   & COLFLAG_PRIMK
27e0: 45 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EY)!=0 ){.      
27f0: 20 20 20 20 63 68 6e 67 50 6b 20 3d 20 31 3b 0a      chngPk = 1;.
2800: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2810: 20 20 61 58 52 65 66 5b 6a 5d 20 3d 20 69 3b 0a    aXRef[j] = i;.
2820: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2830: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2840: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
2850: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ol ){.      if( 
2860: 70 50 6b 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  pPk==0 && sqlite
2870: 33 49 73 52 6f 77 69 64 28 70 43 68 61 6e 67 65  3IsRowid(pChange
2880: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  s->a[i].zName) )
2890: 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31  {.        j = -1
28a0: 3b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 52 6f  ;.        chngRo
28b0: 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  wid = 1;.       
28c0: 20 70 52 6f 77 69 64 45 78 70 72 20 3d 20 70 43   pRowidExpr = pC
28d0: 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 70 45 78  hanges->a[i].pEx
28e0: 70 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  pr;.      }else{
28f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2900: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2910: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e   "no such column
2920: 3a 20 25 73 22 2c 20 70 43 68 61 6e 67 65 73 2d  : %s", pChanges-
2930: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
2940: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68        pParse->ch
2950: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
2960: 20 20 20 20 20 20 20 67 6f 74 6f 20 75 70 64 61         goto upda
2970: 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  te_cleanup;.    
2980: 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
2990: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
29a0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
29b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
29c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29d0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
29e0: 73 65 2c 20 53 51 4c 49 54 45 5f 55 50 44 41 54  se, SQLITE_UPDAT
29f0: 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  E, pTab->zName,.
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 6a 3c 30 20              j<0 
2a20: 3f 20 22 52 4f 57 49 44 22 20 3a 20 70 54 61 62  ? "ROWID" : pTab
2a30: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
2a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
2a60: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
2a70: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  me);.      if( r
2a80: 63 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29  c==SQLITE_DENY )
2a90: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 75  {.        goto u
2aa0: 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  pdate_cleanup;. 
2ab0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
2ac0: 63 3d 3d 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  c==SQLITE_IGNORE
2ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 58 52 65   ){.        aXRe
2ae0: 66 5b 6a 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  f[j] = -1;.     
2af0: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
2b00: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 63    }.  assert( (c
2b10: 68 6e 67 52 6f 77 69 64 20 26 20 63 68 6e 67 50  hngRowid & chngP
2b20: 6b 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  k)==0 );.  asser
2b30: 74 28 20 63 68 6e 67 52 6f 77 69 64 3d 3d 30 20  t( chngRowid==0 
2b40: 7c 7c 20 63 68 6e 67 52 6f 77 69 64 3d 3d 31 20  || chngRowid==1 
2b50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 68 6e  );.  assert( chn
2b60: 67 50 6b 3d 3d 30 20 7c 7c 20 63 68 6e 67 50 6b  gPk==0 || chngPk
2b70: 3d 3d 31 20 29 3b 0a 20 20 63 68 6e 67 4b 65 79  ==1 );.  chngKey
2b80: 20 3d 20 63 68 6e 67 52 6f 77 69 64 20 2b 20 63   = chngRowid + c
2b90: 68 6e 67 50 6b 3b 0a 0a 20 20 2f 2a 20 54 68 65  hngPk;..  /* The
2ba0: 20 53 45 54 20 65 78 70 72 65 73 73 69 6f 6e 73   SET expressions
2bb0: 20 61 72 65 20 6e 6f 74 20 61 63 74 75 61 6c 6c   are not actuall
2bc0: 79 20 75 73 65 64 20 69 6e 73 69 64 65 20 74 68  y used inside th
2bd0: 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 0a  e WHERE loop.  .
2be0: 20 20 2a 2a 20 53 6f 20 72 65 73 65 74 20 74 68    ** So reset th
2bf0: 65 20 63 6f 6c 55 73 65 64 20 6d 61 73 6b 2e 20  e colUsed mask. 
2c00: 55 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61  Unless this is a
2c10: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
2c20: 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73  In that.  ** cas
2c30: 65 2c 20 73 65 74 20 61 6c 6c 20 62 69 74 73 20  e, set all bits 
2c40: 6f 66 20 74 68 65 20 63 6f 6c 55 73 65 64 20 6d  of the colUsed m
2c50: 61 73 6b 20 28 74 6f 20 65 6e 73 75 72 65 20 74  ask (to ensure t
2c60: 68 61 74 20 74 68 65 20 76 69 72 74 75 61 6c 0a  hat the virtual.
2c70: 20 20 2a 2a 20 74 61 62 6c 65 20 69 6d 70 6c 65    ** table imple
2c80: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 6b 65 73 20  mentation makes 
2c90: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 61 76 61 69  all columns avai
2ca0: 6c 61 62 6c 65 29 2e 0a 20 20 2a 2f 0a 20 20 70  lable)..  */.  p
2cb0: 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 63 6f  TabList->a[0].co
2cc0: 6c 55 73 65 64 20 3d 20 49 73 56 69 72 74 75 61  lUsed = IsVirtua
2cd0: 6c 28 70 54 61 62 29 20 3f 20 41 4c 4c 42 49 54  l(pTab) ? ALLBIT
2ce0: 53 20 3a 20 30 3b 0a 0a 20 20 68 61 73 46 4b 20  S : 0;..  hasFK 
2cf0: 3d 20 73 71 6c 69 74 65 33 46 6b 52 65 71 75 69  = sqlite3FkRequi
2d00: 72 65 64 28 70 50 61 72 73 65 2c 20 70 54 61 62  red(pParse, pTab
2d10: 2c 20 61 58 52 65 66 2c 20 63 68 6e 67 4b 65 79  , aXRef, chngKey
2d20: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 69  );..  /* There i
2d30: 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74  s one entry in t
2d40: 68 65 20 61 52 65 67 49 64 78 5b 5d 20 61 72 72  he aRegIdx[] arr
2d50: 61 79 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  ay for each inde
2d60: 78 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 20  x on the table. 
2d70: 20 2a 2a 20 62 65 69 6e 67 20 75 70 64 61 74 65   ** being update
2d80: 64 2e 20 20 46 69 6c 6c 20 69 6e 20 61 52 65 67  d.  Fill in aReg
2d90: 49 64 78 5b 5d 20 77 69 74 68 20 61 20 72 65 67  Idx[] with a reg
2da0: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 74 68 61  ister number tha
2db0: 74 20 77 69 6c 6c 20 68 6f 6c 64 0a 20 20 2a 2a  t will hold.  **
2dc0: 20 74 68 65 20 6b 65 79 20 66 6f 72 20 61 63 63   the key for acc
2dd0: 65 73 73 69 6e 67 20 65 61 63 68 20 69 6e 64 65  essing each inde
2de0: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 49 58  x..  **.  ** FIX
2df0: 4d 45 3a 20 20 42 65 20 73 6d 61 72 74 65 72 20  ME:  Be smarter 
2e00: 61 62 6f 75 74 20 6f 6d 69 74 74 69 6e 67 20 69  about omitting i
2e10: 6e 64 65 78 65 73 20 74 68 61 74 20 75 73 65 20  ndexes that use 
2e20: 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
2e30: 2f 0a 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64  /.  for(j=0, pId
2e40: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
2e50: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
2e60: 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20  >pNext, j++){.  
2e70: 20 20 69 6e 74 20 72 65 67 3b 0a 20 20 20 20 69    int reg;.    i
2e80: 66 28 20 63 68 6e 67 4b 65 79 20 7c 7c 20 68 61  f( chngKey || ha
2e90: 73 46 4b 3e 31 20 7c 7c 20 70 49 64 78 2d 3e 70  sFK>1 || pIdx->p
2ea0: 50 61 72 74 49 64 78 57 68 65 72 65 20 7c 7c 20  PartIdxWhere || 
2eb0: 70 49 64 78 3d 3d 70 50 6b 20 29 7b 0a 20 20 20  pIdx==pPk ){.   
2ec0: 20 20 20 72 65 67 20 3d 20 2b 2b 70 50 61 72 73     reg = ++pPars
2ed0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
2ee0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2ef0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
2f00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2f10: 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  eg = 0;.      fo
2f20: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
2f30: 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
2f40: 20 20 20 20 20 20 69 31 36 20 69 49 64 78 43 6f        i16 iIdxCo
2f50: 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
2f60: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  mn[i];.        i
2f70: 66 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20  f( iIdxCol<0 || 
2f80: 61 58 52 65 66 5b 69 49 64 78 43 6f 6c 5d 3e 3d  aXRef[iIdxCol]>=
2f90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
2fa0: 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  eg = ++pParse->n
2fb0: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Mem;.          p
2fc0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2fd0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
2fe0: 20 20 20 20 20 20 20 20 69 66 28 20 28 6f 6e 45          if( (onE
2ff0: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
3000: 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
3010: 28 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  (onError==OE_Def
3020: 61 75 6c 74 20 26 26 20 70 49 64 78 2d 3e 6f 6e  ault && pIdx->on
3030: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
3040: 65 29 20 0a 20 20 20 20 20 20 20 20 20 20 29 7b  e) .          ){
3050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 52 65  .            bRe
3060: 70 6c 61 63 65 20 3d 20 31 3b 0a 20 20 20 20 20  place = 1;.     
3070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3080: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3090: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
30a0: 20 20 20 20 69 66 28 20 72 65 67 3d 3d 30 20 29      if( reg==0 )
30b0: 20 61 54 6f 4f 70 65 6e 5b 6a 2b 31 5d 20 3d 20   aToOpen[j+1] = 
30c0: 30 3b 0a 20 20 20 20 61 52 65 67 49 64 78 5b 6a  0;.    aRegIdx[j
30d0: 5d 20 3d 20 72 65 67 3b 0a 20 20 7d 0a 20 20 69  ] = reg;.  }.  i
30e0: 66 28 20 62 52 65 70 6c 61 63 65 20 29 7b 0a 20  f( bReplace ){. 
30f0: 20 20 20 2f 2a 20 49 66 20 52 45 50 4c 41 43 45     /* If REPLACE
3100: 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
3110: 74 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 69 6e  tion might be in
3120: 76 6f 6b 65 64 2c 20 6f 70 65 6e 20 63 75 72 73  voked, open curs
3130: 6f 72 73 20 6f 6e 20 61 6c 6c 20 0a 20 20 20 20  ors on all .    
3140: 2a 2a 20 69 6e 64 65 78 65 73 20 69 6e 20 63 61  ** indexes in ca
3150: 73 65 20 74 68 65 79 20 61 72 65 20 6e 65 65 64  se they are need
3160: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 72 65 63  ed to delete rec
3170: 6f 72 64 73 2e 20 20 2a 2f 0a 20 20 20 20 6d 65  ords.  */.    me
3180: 6d 73 65 74 28 61 54 6f 4f 70 65 6e 2c 20 31 2c  mset(aToOpen, 1,
3190: 20 6e 49 64 78 2b 31 29 3b 0a 20 20 7d 0a 0a 20   nIdx+1);.  }.. 
31a0: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
31b0: 74 69 6e 67 20 63 6f 64 65 2e 20 2a 2f 0a 20 20  ting code. */.  
31c0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
31d0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
31e0: 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70  ( v==0 ) goto up
31f0: 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  date_cleanup;.  
3200: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  if( pParse->nest
3210: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ed==0 ) sqlite3V
3220: 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
3230: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  v);.  sqlite3Beg
3240: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
3250: 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
3260: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
3270: 20 72 65 71 75 69 72 65 64 20 72 65 67 69 73 74   required regist
3280: 65 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 21 49  ers. */.  if( !I
3290: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
32a0: 7b 0a 20 20 20 20 72 65 67 52 6f 77 53 65 74 20  {.    regRowSet 
32b0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
32c0: 3b 0a 20 20 20 20 72 65 67 4f 6c 64 52 6f 77 69  ;.    regOldRowi
32d0: 64 20 3d 20 72 65 67 4e 65 77 52 6f 77 69 64 20  d = regNewRowid 
32e0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
32f0: 3b 0a 20 20 20 20 69 66 28 20 63 68 6e 67 50 6b  ;.    if( chngPk
3300: 20 7c 7c 20 70 54 72 69 67 67 65 72 20 7c 7c 20   || pTrigger || 
3310: 68 61 73 46 4b 20 29 7b 0a 20 20 20 20 20 20 72  hasFK ){.      r
3320: 65 67 4f 6c 64 20 3d 20 70 50 61 72 73 65 2d 3e  egOld = pParse->
3330: 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
3340: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
3350: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  pTab->nCol;.    
3360: 7d 0a 20 20 20 20 69 66 28 20 63 68 6e 67 4b 65  }.    if( chngKe
3370: 79 20 7c 7c 20 70 54 72 69 67 67 65 72 20 7c 7c  y || pTrigger ||
3380: 20 68 61 73 46 4b 20 29 7b 0a 20 20 20 20 20 20   hasFK ){.      
3390: 72 65 67 4e 65 77 52 6f 77 69 64 20 3d 20 2b 2b  regNewRowid = ++
33a0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
33b0: 20 20 7d 0a 20 20 20 20 72 65 67 4e 65 77 20 3d    }.    regNew =
33c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
33d0: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
33e0: 4d 65 6d 20 2b 3d 20 70 54 61 62 2d 3e 6e 43 6f  Mem += pTab->nCo
33f0: 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 61  l;.  }..  /* Sta
3400: 72 74 20 74 68 65 20 76 69 65 77 20 63 6f 6e 74  rt the view cont
3410: 65 78 74 2e 20 2a 2f 0a 20 20 69 66 28 20 69 73  ext. */.  if( is
3420: 56 69 65 77 20 29 7b 0a 20 20 20 20 73 71 6c 69  View ){.    sqli
3430: 74 65 33 41 75 74 68 43 6f 6e 74 65 78 74 50 75  te3AuthContextPu
3440: 73 68 28 70 50 61 72 73 65 2c 20 26 73 43 6f 6e  sh(pParse, &sCon
3450: 74 65 78 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  text, pTab->zNam
3460: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
3470: 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
3480: 6f 20 75 70 64 61 74 65 20 61 20 76 69 65 77 2c  o update a view,
3490: 20 72 65 61 6c 69 7a 65 20 74 68 61 74 20 76 69   realize that vi
34a0: 65 77 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 6e 20  ew into.  ** an 
34b0: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
34c0: 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
34d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
34e0: 49 45 57 29 20 26 26 20 21 64 65 66 69 6e 65 64  IEW) && !defined
34f0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
3500: 47 47 45 52 29 0a 20 20 69 66 28 20 69 73 56 69  GGER).  if( isVi
3510: 65 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ew ){.    sqlite
3520: 33 4d 61 74 65 72 69 61 6c 69 7a 65 56 69 65 77  3MaterializeView
3530: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 0a  (pParse, pTab, .
3540: 20 20 20 20 20 20 20 20 70 57 68 65 72 65 2c 20          pWhere, 
3550: 70 4f 72 64 65 72 42 79 2c 20 70 4c 69 6d 69 74  pOrderBy, pLimit
3560: 2c 20 69 44 61 74 61 43 75 72 0a 20 20 20 20 29  , iDataCur.    )
3570: 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d  ;.    pOrderBy =
3580: 20 30 3b 0a 20 20 20 20 70 4c 69 6d 69 74 20 3d   0;.    pLimit =
3590: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   0;.  }.#endif..
35a0: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    /* Resolve the
35b0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e   column names in
35c0: 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73   all the express
35d0: 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a  ions in the.  **
35e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
35f0: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
3600: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
3610: 73 28 26 73 4e 43 2c 20 70 57 68 65 72 65 29 20  s(&sNC, pWhere) 
3620: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61  ){.    goto upda
3630: 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  te_cleanup;.  }.
3640: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3650: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
3660: 45 0a 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74  E.  /* Virtual t
3670: 61 62 6c 65 73 20 6d 75 73 74 20 62 65 20 68 61  ables must be ha
3680: 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
3690: 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
36a0: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
36b0: 20 75 70 64 61 74 65 56 69 72 74 75 61 6c 54 61   updateVirtualTa
36c0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
36d0: 4c 69 73 74 2c 20 70 54 61 62 2c 20 70 43 68 61  List, pTab, pCha
36e0: 6e 67 65 73 2c 20 70 52 6f 77 69 64 45 78 70 72  nges, pRowidExpr
36f0: 2c 20 61 58 52 65 66 2c 0a 20 20 20 20 20 20 20  , aXRef,.       
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 70 57 68 65 72 65 2c 20 6f 6e 45 72 72 6f 72 29  pWhere, onError)
3720: 3b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74  ;.    goto updat
3730: 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 23  e_cleanup;.  }.#
3740: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74  endif..  /* Init
3750: 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e 74  ialize the count
3760: 20 6f 66 20 75 70 64 61 74 65 64 20 72 6f 77 73   of updated rows
3770: 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 66   */.  if( (db->f
3780: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
3790: 75 6e 74 52 6f 77 73 29 20 26 26 20 21 70 50 61  untRows) && !pPa
37a0: 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
37b0: 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 43 6f   ){.    regRowCo
37c0: 75 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  unt = ++pParse->
37d0: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
37e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
37f0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
3800: 67 52 6f 77 43 6f 75 6e 74 29 3b 0a 20 20 7d 0a  gRowCount);.  }.
3810: 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  .  if( HasRowid(
3820: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
3830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
3840: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
3850: 67 52 6f 77 53 65 74 2c 20 72 65 67 4f 6c 64 52  gRowSet, regOldR
3860: 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  owid);.  }else{.
3870: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 21      assert( pPk!
3880: 3d 30 20 29 3b 0a 20 20 20 20 6e 50 6b 20 3d 20  =0 );.    nPk = 
3890: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  pPk->nKeyCol;.  
38a0: 20 20 69 50 6b 20 3d 20 70 50 61 72 73 65 2d 3e    iPk = pParse->
38b0: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
38c0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 6b 3b  se->nMem += nPk;
38d0: 0a 20 20 20 20 72 65 67 4b 65 79 20 3d 20 2b 2b  .    regKey = ++
38e0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
38f0: 20 20 69 45 70 68 20 3d 20 70 50 61 72 73 65 2d    iEph = pParse-
3900: 3e 6e 54 61 62 2b 2b 3b 0a 0a 20 20 20 20 73 71  >nTab++;..    sq
3910: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
3920: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
3930: 50 6b 2c 20 69 50 6b 2b 6e 50 6b 2d 31 29 3b 0a  Pk, iPk+nPk-1);.
3940: 20 20 20 20 61 64 64 72 4f 70 65 6e 20 3d 20 73      addrOpen = s
3950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3960: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
3970: 65 72 61 6c 2c 20 69 45 70 68 2c 20 6e 50 6b 29  eral, iEph, nPk)
3980: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3990: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
39a0: 61 72 73 65 2c 20 70 50 6b 29 3b 0a 20 20 7d 0a  arse, pPk);.  }.
39b0: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20  .  /* Begin the 
39c0: 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 0a  database scan. .
39d0: 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74    **.  ** Do not
39e0: 20 63 6f 6e 73 69 64 65 72 20 61 20 73 69 6e 67   consider a sing
39f0: 6c 65 2d 70 61 73 73 20 73 74 72 61 74 65 67 79  le-pass strategy
3a00: 20 66 6f 72 20 61 20 6d 75 6c 74 69 2d 72 6f 77   for a multi-row
3a10: 20 75 70 64 61 74 65 20 69 66 0a 20 20 2a 2a 20   update if.  ** 
3a20: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 74 72  there are any tr
3a30: 69 67 67 65 72 73 20 6f 72 20 66 6f 72 65 69 67  iggers or foreig
3a40: 6e 20 6b 65 79 73 20 74 6f 20 70 72 6f 63 65 73  n keys to proces
3a50: 73 2c 20 6f 72 20 72 6f 77 73 20 6d 61 79 0a 20  s, or rows may. 
3a60: 20 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 61   ** be deleted a
3a70: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 52 45  s a result of RE
3a80: 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 68  PLACE conflict h
3a90: 61 6e 64 6c 69 6e 67 2e 20 41 6e 79 20 6f 66 20  andling. Any of 
3aa0: 74 68 65 73 65 0a 20 20 2a 2a 20 74 68 69 6e 67  these.  ** thing
3ab0: 73 20 6d 69 67 68 74 20 64 69 73 74 75 72 62 20  s might disturb 
3ac0: 61 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 75  a cursor being u
3ad0: 73 65 64 20 74 6f 20 73 63 61 6e 20 74 68 72 6f  sed to scan thro
3ae0: 75 67 68 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ugh the table.  
3af0: 2a 2a 20 6f 72 20 69 6e 64 65 78 2c 20 63 61 75  ** or index, cau
3b00: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 2d 70 61  sing a single-pa
3b10: 73 73 20 61 70 70 72 6f 61 63 68 20 74 6f 20 6d  ss approach to m
3b20: 61 6c 66 75 6e 63 74 69 6f 6e 2e 20 20 2a 2f 0a  alfunction.  */.
3b30: 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f    flags = WHERE_
3b40: 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 7c  ONEPASS_DESIRED|
3b50: 57 48 45 52 45 5f 53 45 45 4b 5f 55 4e 49 51 5f  WHERE_SEEK_UNIQ_
3b60: 54 41 42 4c 45 3b 0a 20 20 69 66 28 20 21 70 50  TABLE;.  if( !pP
3b70: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20  arse->nested && 
3b80: 21 70 54 72 69 67 67 65 72 20 26 26 20 21 68 61  !pTrigger && !ha
3b90: 73 46 4b 20 26 26 20 21 63 68 6e 67 4b 65 79 20  sFK && !chngKey 
3ba0: 26 26 20 21 62 52 65 70 6c 61 63 65 20 29 7b 0a  && !bReplace ){.
3bb0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
3bc0: 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  RE_ONEPASS_MULTI
3bd0: 52 4f 57 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  ROW;.  }.  pWInf
3be0: 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
3bf0: 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
3c00: 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
3c10: 30 2c 20 30 2c 20 66 6c 61 67 73 2c 20 69 49 64  0, 0, flags, iId
3c20: 78 43 75 72 29 3b 0a 20 20 69 66 28 20 70 57 49  xCur);.  if( pWI
3c30: 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70  nfo==0 ) goto up
3c40: 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20  date_cleanup;.. 
3c50: 20 2f 2a 20 41 20 6f 6e 65 2d 70 61 73 73 20 73   /* A one-pass s
3c60: 74 72 61 74 65 67 79 20 74 68 61 74 20 6d 69 67  trategy that mig
3c70: 68 74 20 75 70 64 61 74 65 20 6d 6f 72 65 20 74  ht update more t
3c80: 68 61 6e 20 6f 6e 65 20 72 6f 77 20 6d 61 79 20  han one row may 
3c90: 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 75 73 65 64  not.  ** be used
3ca0: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f   if any column o
3cb0: 66 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64  f the index used
3cc0: 20 66 6f 72 20 74 68 65 20 73 63 61 6e 20 69 73   for the scan is
3cd0: 20 62 65 69 6e 67 0a 20 20 2a 2a 20 75 70 64 61   being.  ** upda
3ce0: 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
3cf0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  if there is an i
3d00: 6e 64 65 78 20 6f 6e 20 22 62 22 2c 20 73 74 61  ndex on "b", sta
3d10: 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 2a  tements like.  *
3d20: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
3d30: 63 6f 75 6c 64 20 63 72 65 61 74 65 20 61 6e 20  could create an 
3d40: 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 3a 0a 20  infinite loop:. 
3d50: 20 2a 2a 0a 20 20 2a 2a 20 20 20 55 50 44 41 54   **.  **   UPDAT
3d60: 45 20 74 31 20 53 45 54 20 62 3d 62 2b 31 20 57  E t1 SET b=b+1 W
3d70: 48 45 52 45 20 62 3e 3f 0a 20 20 2a 2a 0a 20 20  HERE b>?.  **.  
3d80: 2a 2a 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20  ** Fall back to 
3d90: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 69 66 20 77  ONEPASS_OFF if w
3da0: 68 65 72 65 2e 63 20 68 61 73 20 73 65 6c 65 63  here.c has selec
3db0: 74 65 64 20 61 20 4f 4e 45 50 41 53 53 5f 4d 55  ted a ONEPASS_MU
3dc0: 4c 54 49 0a 20 20 2a 2a 20 73 74 72 61 74 65 67  LTI.  ** strateg
3dd0: 79 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69  y that uses an i
3de0: 6e 64 65 78 20 66 6f 72 20 77 68 69 63 68 20 6f  ndex for which o
3df0: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d  ne or more colum
3e00: 6e 73 20 61 72 65 20 62 65 69 6e 67 0a 20 20 2a  ns are being.  *
3e10: 2a 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20  * updated.  */. 
3e20: 20 65 4f 6e 65 50 61 73 73 20 3d 20 73 71 6c 69   eOnePass = sqli
3e30: 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73  te3WhereOkOnePas
3e40: 73 28 70 57 49 6e 66 6f 2c 20 61 69 43 75 72 4f  s(pWInfo, aiCurO
3e50: 6e 65 50 61 73 73 29 3b 0a 20 20 69 66 28 20 65  nePass);.  if( e
3e60: 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
3e70: 5f 4d 55 4c 54 49 20 29 7b 0a 20 20 20 20 69 6e  _MULTI ){.    in
3e80: 74 20 69 43 75 72 20 3d 20 61 69 43 75 72 4f 6e  t iCur = aiCurOn
3e90: 65 50 61 73 73 5b 31 5d 3b 0a 20 20 20 20 69 66  ePass[1];.    if
3ea0: 28 20 69 43 75 72 3e 3d 30 20 26 26 20 69 43 75  ( iCur>=0 && iCu
3eb0: 72 21 3d 69 44 61 74 61 43 75 72 20 26 26 20 61  r!=iDataCur && a
3ec0: 54 6f 4f 70 65 6e 5b 69 43 75 72 2d 69 42 61 73  ToOpen[iCur-iBas
3ed0: 65 43 75 72 5d 20 29 7b 0a 20 20 20 20 20 20 65  eCur] ){.      e
3ee0: 4f 6e 65 50 61 73 73 20 3d 20 4f 4e 45 50 41 53  OnePass = ONEPAS
3ef0: 53 5f 4f 46 46 3b 0a 20 20 20 20 7d 0a 20 20 20  S_OFF;.    }.   
3f00: 20 61 73 73 65 72 74 28 20 69 43 75 72 21 3d 69   assert( iCur!=i
3f10: 44 61 74 61 43 75 72 20 7c 7c 20 21 48 61 73 52  DataCur || !HasR
3f20: 6f 77 69 64 28 70 54 61 62 29 20 29 3b 0a 20 20  owid(pTab) );.  
3f30: 7d 0a 20 20 0a 20 20 69 66 28 20 48 61 73 52 6f  }.  .  if( HasRo
3f40: 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
3f50: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77   /* Read the row
3f60: 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  id of the curren
3f70: 74 20 72 6f 77 20 6f 66 20 74 68 65 20 57 48 45  t row of the WHE
3f80: 52 45 20 73 63 61 6e 2e 20 49 6e 20 4f 4e 45 50  RE scan. In ONEP
3f90: 41 53 53 5f 4f 46 46 0a 20 20 20 20 2a 2a 20 6d  ASS_OFF.    ** m
3fa0: 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20 72  ode, write the r
3fb0: 6f 77 69 64 20 69 6e 74 6f 20 74 68 65 20 46 49  owid into the FI
3fc0: 46 4f 2e 20 49 6e 20 65 69 74 68 65 72 20 6f 66  FO. In either of
3fd0: 20 74 68 65 20 6f 6e 65 2d 70 61 73 73 20 6d 6f   the one-pass mo
3fe0: 64 65 73 2c 0a 20 20 20 20 2a 2a 20 6c 65 61 76  des,.    ** leav
3ff0: 65 20 69 74 20 69 6e 20 72 65 67 69 73 74 65 72  e it in register
4000: 20 72 65 67 4f 6c 64 52 6f 77 69 64 2e 20 20 2a   regOldRowid.  *
4010: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
4020: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
4030: 77 69 64 2c 20 69 44 61 74 61 43 75 72 2c 20 72  wid, iDataCur, r
4040: 65 67 4f 6c 64 52 6f 77 69 64 29 3b 0a 20 20 20  egOldRowid);.   
4050: 20 69 66 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f   if( eOnePass==O
4060: 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
4070: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4080: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 53  ddOp2(v, OP_RowS
4090: 65 74 41 64 64 2c 20 72 65 67 52 6f 77 53 65 74  etAdd, regRowSet
40a0: 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 29 3b 0a  , regOldRowid);.
40b0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
40c0: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 50     /* Read the P
40d0: 4b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  K of the current
40e0: 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20 61 72 72   row into an arr
40f0: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ay of registers.
4100: 20 49 6e 0a 20 20 20 20 2a 2a 20 4f 4e 45 50 41   In.    ** ONEPA
4110: 53 53 5f 4f 46 46 20 6d 6f 64 65 2c 20 73 65 72  SS_OFF mode, ser
4120: 69 61 6c 69 7a 65 20 74 68 65 20 61 72 72 61 79  ialize the array
4130: 20 69 6e 74 6f 20 61 20 72 65 63 6f 72 64 20 61   into a record a
4140: 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 0a 20  nd store it in. 
4150: 20 20 20 2a 2a 20 74 68 65 20 65 70 68 65 6d 65     ** the epheme
4160: 72 61 6c 20 74 61 62 6c 65 2e 20 4f 72 2c 20 69  ral table. Or, i
4170: 6e 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45  n ONEPASS_SINGLE
4180: 20 6f 72 20 4d 55 4c 54 49 20 6d 6f 64 65 2c 20   or MULTI mode, 
4190: 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 74 68  change.    ** th
41a0: 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
41b0: 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  al instruction t
41c0: 6f 20 61 20 4e 6f 6f 70 20 28 74 68 65 20 65 70  o a Noop (the ep
41d0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 0a 20  hemeral table . 
41e0: 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71     ** is not req
41f0: 75 69 72 65 64 29 20 61 6e 64 20 6c 65 61 76 65  uired) and leave
4200: 20 74 68 65 20 50 4b 20 66 69 65 6c 64 73 20 69   the PK fields i
4210: 6e 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 72  n the array of r
4220: 65 67 69 73 74 65 72 73 2e 20 20 2a 2f 0a 20 20  egisters.  */.  
4230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
4240: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
4250: 73 65 72 74 28 20 70 50 6b 2d 3e 61 69 43 6f 6c  sert( pPk->aiCol
4260: 75 6d 6e 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20 20  umn[i]>=0 );.   
4270: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
4280: 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
4290: 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74  le(v, pTab, iDat
42a0: 61 43 75 72 2c 70 50 6b 2d 3e 61 69 43 6f 6c 75  aCur,pPk->aiColu
42b0: 6d 6e 5b 69 5d 2c 69 50 6b 2b 69 29 3b 0a 20 20  mn[i],iPk+i);.  
42c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 65 4f 6e 65    }.    if( eOne
42d0: 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20 73 71  Pass ){.      sq
42e0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
42f0: 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 4f 70 65  oNoop(v, addrOpe
4300: 6e 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d  n);.      nKey =
4310: 20 6e 50 6b 3b 0a 20 20 20 20 20 20 72 65 67 4b   nPk;.      regK
4320: 65 79 20 3d 20 69 50 6b 3b 0a 20 20 20 20 7d 65  ey = iPk;.    }e
4330: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
4340: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
4350: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69  OP_MakeRecord, i
4360: 50 6b 2c 20 6e 50 6b 2c 20 72 65 67 4b 65 79 2c  Pk, nPk, regKey,
4370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4380: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4390: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
43a0: 28 64 62 2c 20 70 50 6b 29 2c 20 6e 50 6b 29 3b  (db, pPk), nPk);
43b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
43c0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
43d0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 45 70  P_IdxInsert, iEp
43e0: 68 2c 20 72 65 67 4b 65 79 2c 20 69 50 6b 2c 20  h, regKey, iPk, 
43f0: 6e 50 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nPk);.    }.  }.
4400: 0a 20 20 69 66 28 20 65 4f 6e 65 50 61 73 73 21  .  if( eOnePass!
4410: 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20 29  =ONEPASS_MULTI )
4420: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  {.    sqlite3Whe
4430: 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
4440: 20 7d 0a 0a 20 20 6c 61 62 65 6c 42 72 65 61 6b   }..  labelBreak
4450: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
4460: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66  keLabel(v);.  if
4470: 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20  ( !isView ){.   
4480: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
4490: 30 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  0;..    /* Open 
44a0: 65 76 65 72 79 20 69 6e 64 65 78 20 74 68 61 74  every index that
44b0: 20 6e 65 65 64 73 20 75 70 64 61 74 69 6e 67 2e   needs updating.
44c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 6e 65   */.    if( eOne
44d0: 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass!=ONEPASS_OF
44e0: 46 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  F ){.      if( a
44f0: 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 3e 3d  iCurOnePass[0]>=
4500: 30 20 29 20 61 54 6f 4f 70 65 6e 5b 61 69 43 75  0 ) aToOpen[aiCu
4510: 72 4f 6e 65 50 61 73 73 5b 30 5d 2d 69 42 61 73  rOnePass[0]-iBas
4520: 65 43 75 72 5d 20 3d 20 30 3b 0a 20 20 20 20 20  eCur] = 0;.     
4530: 20 69 66 28 20 61 69 43 75 72 4f 6e 65 50 61 73   if( aiCurOnePas
4540: 73 5b 31 5d 3e 3d 30 20 29 20 61 54 6f 4f 70 65  s[1]>=0 ) aToOpe
4550: 6e 5b 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31  n[aiCurOnePass[1
4560: 5d 2d 69 42 61 73 65 43 75 72 5d 20 3d 20 30 3b  ]-iBaseCur] = 0;
4570: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
4580: 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
4590: 53 5f 4d 55 4c 54 49 20 26 26 20 28 6e 49 64 78  S_MULTI && (nIdx
45a0: 2d 28 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31  -(aiCurOnePass[1
45b0: 5d 3e 3d 30 29 29 3e 30 20 29 7b 0a 20 20 20 20  ]>=0))>0 ){.    
45c0: 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c    addrOnce = sql
45d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
45e0: 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
45f0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4600: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
4610: 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65  enTableAndIndice
4620: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  s(pParse, pTab, 
4630: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
4640: 20 69 42 61 73 65 43 75 72 2c 20 61 54 6f 4f 70   iBaseCur, aToOp
4650: 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  en,.            
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4670: 20 20 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66     0, 0);.    if
4680: 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c  ( addrOnce ) sql
4690: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
46a0: 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20  (v, addrOnce);. 
46b0: 20 7d 0a 0a 20 20 2f 2a 20 54 6f 70 20 6f 66 20   }..  /* Top of 
46c0: 74 68 65 20 75 70 64 61 74 65 20 6c 6f 6f 70 20  the update loop 
46d0: 2a 2f 0a 20 20 69 66 28 20 65 4f 6e 65 50 61 73  */.  if( eOnePas
46e0: 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29  s!=ONEPASS_OFF )
46f0: 7b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  {.    if( !isVie
4700: 77 20 26 26 20 61 69 43 75 72 4f 6e 65 50 61 73  w && aiCurOnePas
4710: 73 5b 30 5d 21 3d 69 44 61 74 61 43 75 72 20 26  s[0]!=iDataCur &
4720: 26 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31  & aiCurOnePass[1
4730: 5d 21 3d 69 44 61 74 61 43 75 72 20 29 7b 0a 20  ]!=iDataCur ){. 
4740: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b       assert( pPk
4750: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4760: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
4770: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69  , OP_NotFound, i
4780: 44 61 74 61 43 75 72 2c 20 6c 61 62 65 6c 42 72  DataCur, labelBr
4790: 65 61 6b 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65  eak, regKey, nKe
47a0: 79 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  y);.      VdbeCo
47b0: 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
47c0: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (v);.    }.    i
47d0: 66 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  f( eOnePass==ONE
47e0: 50 41 53 53 5f 53 49 4e 47 4c 45 20 29 7b 0a 20  PASS_SINGLE ){. 
47f0: 20 20 20 20 20 6c 61 62 65 6c 43 6f 6e 74 69 6e       labelContin
4800: 75 65 20 3d 20 6c 61 62 65 6c 42 72 65 61 6b 3b  ue = labelBreak;
4810: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4820: 20 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 20    labelContinue 
4830: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
4840: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d  eLabel(v);.    }
4850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4860: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
4870: 75 6c 6c 2c 20 70 50 6b 20 3f 20 72 65 67 4b 65  ull, pPk ? regKe
4880: 79 20 3a 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c  y : regOldRowid,
4890: 20 6c 61 62 65 6c 42 72 65 61 6b 29 3b 0a 20 20   labelBreak);.  
48a0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
48b0: 28 76 2c 20 70 50 6b 3d 3d 30 29 3b 0a 20 20 20  (v, pPk==0);.   
48c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
48d0: 76 2c 20 70 50 6b 21 3d 30 29 3b 0a 20 20 7d 65  v, pPk!=0);.  }e
48e0: 6c 73 65 20 69 66 28 20 70 50 6b 20 29 7b 0a 20  lse if( pPk ){. 
48f0: 20 20 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65     labelContinue
4900: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
4910: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
4920: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4930: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
4940: 69 45 70 68 2c 20 6c 61 62 65 6c 42 72 65 61 6b  iEph, labelBreak
4950: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
4960: 76 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20  v);.    addrTop 
4970: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4980: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74  Op2(v, OP_RowDat
4990: 61 2c 20 69 45 70 68 2c 20 72 65 67 4b 65 79 29  a, iEph, regKey)
49a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
49b0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
49c0: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 44 61 74 61  _NotFound, iData
49d0: 43 75 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e  Cur, labelContin
49e0: 75 65 2c 20 72 65 67 4b 65 79 2c 20 30 29 3b 0a  ue, regKey, 0);.
49f0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
4a00: 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
4a10: 20 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 20    labelContinue 
4a20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4a30: 4f 70 33 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74  Op3(v, OP_RowSet
4a40: 52 65 61 64 2c 20 72 65 67 52 6f 77 53 65 74 2c  Read, regRowSet,
4a50: 20 6c 61 62 65 6c 42 72 65 61 6b 2c 0a 20 20 20   labelBreak,.   
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 20 20 20 20 20 20 20 20 20 72 65 67 4f 6c 64            regOld
4a80: 52 6f 77 69 64 29 3b 0a 20 20 20 20 56 64 62 65  Rowid);.    Vdbe
4a90: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4aa0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4ab0: 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
4ac0: 74 73 2c 20 69 44 61 74 61 43 75 72 2c 20 6c 61  ts, iDataCur, la
4ad0: 62 65 6c 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67  belContinue, reg
4ae0: 4f 6c 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 56  OldRowid);.    V
4af0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4b00: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
4b10: 20 72 6f 77 69 64 20 76 61 6c 75 65 20 77 69 6c   rowid value wil
4b20: 6c 20 63 68 61 6e 67 65 2c 20 73 65 74 20 72 65  l change, set re
4b30: 67 69 73 74 65 72 20 72 65 67 4e 65 77 52 6f 77  gister regNewRow
4b40: 69 64 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 74 61  id to.  ** conta
4b50: 69 6e 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  in the new value
4b60: 2e 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 69  . If the rowid i
4b70: 73 20 6e 6f 74 20 62 65 69 6e 67 20 6d 6f 64 69  s not being modi
4b80: 66 69 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  fied,.  ** then 
4b90: 72 65 67 4e 65 77 52 6f 77 69 64 20 69 73 20 74  regNewRowid is t
4ba0: 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65 72  he same register
4bb0: 20 61 73 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c   as regOldRowid,
4bc0: 20 77 68 69 63 68 20 69 73 0a 20 20 2a 2a 20 61   which is.  ** a
4bd0: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
4be0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
4bf0: 63 68 6e 67 4b 65 79 20 7c 7c 20 70 54 72 69 67  chngKey || pTrig
4c00: 67 65 72 20 7c 7c 20 68 61 73 46 4b 20 7c 7c 20  ger || hasFK || 
4c10: 72 65 67 4f 6c 64 52 6f 77 69 64 3d 3d 72 65 67  regOldRowid==reg
4c20: 4e 65 77 52 6f 77 69 64 20 29 3b 0a 20 20 69 66  NewRowid );.  if
4c30: 28 20 63 68 6e 67 52 6f 77 69 64 20 29 7b 0a 20  ( chngRowid ){. 
4c40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
4c50: 64 65 28 70 50 61 72 73 65 2c 20 70 52 6f 77 69  de(pParse, pRowi
4c60: 64 45 78 70 72 2c 20 72 65 67 4e 65 77 52 6f 77  dExpr, regNewRow
4c70: 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  id);.    sqlite3
4c80: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4c90: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67 4e  _MustBeInt, regN
4ca0: 65 77 52 6f 77 69 64 29 3b 20 56 64 62 65 43 6f  ewRowid); VdbeCo
4cb0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
4cc0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
4cd0: 20 6f 6c 64 20 70 72 65 2d 55 50 44 41 54 45 20   old pre-UPDATE 
4ce0: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 72  content of the r
4cf0: 6f 77 20 62 65 69 6e 67 20 63 68 61 6e 67 65 64  ow being changed
4d00: 2c 20 69 66 20 74 68 61 74 0a 20 20 2a 2a 20 69  , if that.  ** i
4d10: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  nformation is ne
4d20: 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 63 68  eded */.  if( ch
4d30: 6e 67 50 6b 20 7c 7c 20 68 61 73 46 4b 20 7c 7c  ngPk || hasFK ||
4d40: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
4d50: 20 75 33 32 20 6f 6c 64 6d 61 73 6b 20 3d 20 28   u32 oldmask = (
4d60: 68 61 73 46 4b 20 3f 20 73 71 6c 69 74 65 33 46  hasFK ? sqlite3F
4d70: 6b 4f 6c 64 6d 61 73 6b 28 70 50 61 72 73 65 2c  kOldmask(pParse,
4d80: 20 70 54 61 62 29 20 3a 20 30 29 3b 0a 20 20 20   pTab) : 0);.   
4d90: 20 6f 6c 64 6d 61 73 6b 20 7c 3d 20 73 71 6c 69   oldmask |= sqli
4da0: 74 65 33 54 72 69 67 67 65 72 43 6f 6c 6d 61 73  te3TriggerColmas
4db0: 6b 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  k(pParse, .     
4dc0: 20 20 20 70 54 72 69 67 67 65 72 2c 20 70 43 68     pTrigger, pCh
4dd0: 61 6e 67 65 73 2c 20 30 2c 20 54 52 49 47 47 45  anges, 0, TRIGGE
4de0: 52 5f 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52  R_BEFORE|TRIGGER
4df0: 5f 41 46 54 45 52 2c 20 70 54 61 62 2c 20 6f 6e  _AFTER, pTab, on
4e00: 45 72 72 6f 72 0a 20 20 20 20 29 3b 0a 20 20 20  Error.    );.   
4e10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
4e20: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
4e30: 20 20 20 20 69 66 28 20 6f 6c 64 6d 61 73 6b 3d      if( oldmask=
4e40: 3d 30 78 66 66 66 66 66 66 66 66 0a 20 20 20 20  =0xffffffff.    
4e50: 20 20 20 7c 7c 20 28 69 3c 33 32 20 26 26 20 28     || (i<32 && (
4e60: 6f 6c 64 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49  oldmask & MASKBI
4e70: 54 33 32 28 69 29 29 21 3d 30 29 0a 20 20 20 20  T32(i))!=0).    
4e80: 20 20 20 7c 7c 20 28 70 54 61 62 2d 3e 61 43 6f     || (pTab->aCo
4e90: 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  l[i].colFlags & 
4ea0: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29  COLFLAG_PRIMKEY)
4eb0: 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  !=0.      ){.   
4ec0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 20       testcase(  
4ed0: 6f 6c 64 6d 61 73 6b 21 3d 30 78 66 66 66 66 66  oldmask!=0xfffff
4ee0: 66 66 66 20 26 26 20 69 3d 3d 33 31 20 29 3b 0a  fff && i==31 );.
4ef0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
4f00: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
4f10: 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
4f20: 20 69 44 61 74 61 43 75 72 2c 20 69 2c 20 72 65   iDataCur, i, re
4f30: 67 4f 6c 64 2b 69 29 3b 0a 20 20 20 20 20 20 7d  gOld+i);.      }
4f40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
4f50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4f60: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
4f70: 65 67 4f 6c 64 2b 69 29 3b 0a 20 20 20 20 20 20  egOld+i);.      
4f80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4f90: 63 68 6e 67 52 6f 77 69 64 3d 3d 30 20 26 26 20  chngRowid==0 && 
4fa0: 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPk==0 ){.      
4fb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4fc0: 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
4fd0: 67 4f 6c 64 52 6f 77 69 64 2c 20 72 65 67 4e 65  gOldRowid, regNe
4fe0: 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20  wRowid);.    }. 
4ff0: 20 7d 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74   }..  /* Populat
5000: 65 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 72  e the array of r
5010: 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
5020: 6e 67 20 61 74 20 72 65 67 4e 65 77 20 77 69 74  ng at regNew wit
5030: 68 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 72  h the new.  ** r
5040: 6f 77 20 64 61 74 61 2e 20 54 68 69 73 20 61 72  ow data. This ar
5050: 72 61 79 20 69 73 20 75 73 65 64 20 74 6f 20 63  ray is used to c
5060: 68 65 63 6b 20 63 6f 6e 73 74 61 6e 74 73 2c 20  heck constants, 
5070: 63 72 65 61 74 65 20 74 68 65 20 6e 65 77 0a 20  create the new. 
5080: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
5090: 64 65 78 20 72 65 63 6f 72 64 73 2c 20 61 6e 64  dex records, and
50a0: 20 61 73 20 74 68 65 20 76 61 6c 75 65 73 20 66   as the values f
50b0: 6f 72 20 61 6e 79 20 6e 65 77 2e 2a 20 72 65 66  or any new.* ref
50c0: 65 72 65 6e 63 65 73 0a 20 20 2a 2a 20 6d 61 64  erences.  ** mad
50d0: 65 20 62 79 20 74 72 69 67 67 65 72 73 2e 0a 20  e by triggers.. 
50e0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 72   **.  ** If ther
50f0: 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  e are one or mor
5100: 65 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72  e BEFORE trigger
5110: 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 70  s, then do not p
5120: 6f 70 75 6c 61 74 65 20 74 68 65 0a 20 20 2a 2a  opulate the.  **
5130: 20 72 65 67 69 73 74 65 72 73 20 61 73 73 6f 63   registers assoc
5140: 69 61 74 65 64 20 77 69 74 68 20 63 6f 6c 75 6d  iated with colum
5150: 6e 73 20 74 68 61 74 20 61 72 65 20 28 61 29 20  ns that are (a) 
5160: 6e 6f 74 20 6d 6f 64 69 66 69 65 64 20 62 79 0a  not modified by.
5170: 20 20 2a 2a 20 74 68 69 73 20 55 50 44 41 54 45    ** this UPDATE
5180: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 28   statement and (
5190: 62 29 20 6e 6f 74 20 61 63 63 65 73 73 65 64 20  b) not accessed 
51a0: 62 79 20 6e 65 77 2e 2a 20 72 65 66 65 72 65 6e  by new.* referen
51b0: 63 65 73 2e 20 54 68 65 0a 20 20 2a 2a 20 76 61  ces. The.  ** va
51c0: 6c 75 65 73 20 66 6f 72 20 72 65 67 69 73 74 65  lues for registe
51d0: 72 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 20  rs not modified 
51e0: 62 79 20 74 68 65 20 55 50 44 41 54 45 20 6d 75  by the UPDATE mu
51f0: 73 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 66  st be reloaded f
5200: 72 6f 6d 20 0a 20 20 2a 2a 20 74 68 65 20 64 61  rom .  ** the da
5210: 74 61 62 61 73 65 20 61 66 74 65 72 20 74 68 65  tabase after the
5220: 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73   BEFORE triggers
5230: 20 61 72 65 20 66 69 72 65 64 20 61 6e 79 77 61   are fired anywa
5240: 79 20 28 61 73 20 74 68 65 20 74 72 69 67 67 65  y (as the trigge
5250: 72 20 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65  r .  ** may have
5260: 20 6d 6f 64 69 66 69 65 64 20 74 68 65 6d 29 2e   modified them).
5270: 20 53 6f 20 6e 6f 74 20 6c 6f 61 64 69 6e 67 20   So not loading 
5280: 74 68 6f 73 65 20 74 68 61 74 20 61 72 65 20 6e  those that are n
5290: 6f 74 20 67 6f 69 6e 67 20 74 6f 0a 20 20 2a 2a  ot going to.  **
52a0: 20 62 65 20 75 73 65 64 20 65 6c 69 6d 69 6e 61   be used elimina
52b0: 74 65 73 20 73 6f 6d 65 20 72 65 64 75 6e 64 61  tes some redunda
52c0: 6e 74 20 6f 70 63 6f 64 65 73 2e 0a 20 20 2a 2f  nt opcodes..  */
52d0: 0a 20 20 6e 65 77 6d 61 73 6b 20 3d 20 73 71 6c  .  newmask = sql
52e0: 69 74 65 33 54 72 69 67 67 65 72 43 6f 6c 6d 61  ite3TriggerColma
52f0: 73 6b 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  sk(.      pParse
5300: 2c 20 70 54 72 69 67 67 65 72 2c 20 70 43 68 61  , pTrigger, pCha
5310: 6e 67 65 73 2c 20 31 2c 20 54 52 49 47 47 45 52  nges, 1, TRIGGER
5320: 5f 42 45 46 4f 52 45 2c 20 70 54 61 62 2c 20 6f  _BEFORE, pTab, o
5330: 6e 45 72 72 6f 72 0a 20 20 29 3b 0a 20 20 66 6f  nError.  );.  fo
5340: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
5350: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
5360: 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  f( i==pTab->iPKe
5370: 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
5380: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5390: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 4e  OP_Null, 0, regN
53a0: 65 77 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ew+i);.    }else
53b0: 7b 0a 20 20 20 20 20 20 6a 20 3d 20 61 58 52 65  {.      j = aXRe
53c0: 66 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  f[i];.      if( 
53d0: 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  j>=0 ){.        
53e0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
53f0: 70 50 61 72 73 65 2c 20 70 43 68 61 6e 67 65 73  pParse, pChanges
5400: 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 72 65  ->a[j].pExpr, re
5410: 67 4e 65 77 2b 69 29 3b 0a 20 20 20 20 20 20 7d  gNew+i);.      }
5420: 65 6c 73 65 20 69 66 28 20 30 3d 3d 28 74 6d 61  else if( 0==(tma
5430: 73 6b 26 54 52 49 47 47 45 52 5f 42 45 46 4f 52  sk&TRIGGER_BEFOR
5440: 45 29 20 7c 7c 20 69 3e 33 31 20 7c 7c 20 28 6e  E) || i>31 || (n
5450: 65 77 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54  ewmask & MASKBIT
5460: 33 32 28 69 29 29 20 29 7b 0a 20 20 20 20 20 20  32(i)) ){.      
5470: 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
5480: 20 6c 6f 61 64 73 20 74 68 65 20 76 61 6c 75 65   loads the value
5490: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61   of a column tha
54a0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68  t will not be ch
54b0: 61 6e 67 65 64 20 0a 20 20 20 20 20 20 20 20 2a  anged .        *
54c0: 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
54d0: 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  r. This is done 
54e0: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
54f0: 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 2c  BEFORE triggers,
5500: 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   or.        ** i
5510: 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
5520: 6f 72 20 6d 6f 72 65 20 42 45 46 4f 52 45 20 74  or more BEFORE t
5530: 72 69 67 67 65 72 73 20 74 68 61 74 20 75 73 65  riggers that use
5540: 20 74 68 69 73 20 76 61 6c 75 65 20 76 69 61 0a   this value via.
5550: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 6e 65 77          ** a new
5560: 2e 2a 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20  .* reference in 
5570: 61 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  a trigger progra
5580: 6d 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  m..        */.  
5590: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
55a0: 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20  i==31 );.       
55b0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33 32   testcase( i==32
55c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
55d0: 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
55e0: 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65  lumnToReg(pParse
55f0: 2c 20 70 54 61 62 2c 20 69 2c 20 69 44 61 74 61  , pTab, i, iData
5600: 43 75 72 2c 20 72 65 67 4e 65 77 2b 69 29 3b 0a  Cur, regNew+i);.
5610: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5620: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5630: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
5640: 6c 2c 20 30 2c 20 72 65 67 4e 65 77 2b 69 29 3b  l, 0, regNew+i);
5650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5660: 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 65 20 61 6e   }..  /* Fire an
5670: 79 20 42 45 46 4f 52 45 20 55 50 44 41 54 45 20  y BEFORE UPDATE 
5680: 74 72 69 67 67 65 72 73 2e 20 54 68 69 73 20 68  triggers. This h
5690: 61 70 70 65 6e 73 20 62 65 66 6f 72 65 20 63 6f  appens before co
56a0: 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20  nstraints are.  
56b0: 2a 2a 20 76 65 72 69 66 69 65 64 2e 20 4f 6e 65  ** verified. One
56c0: 20 63 6f 75 6c 64 20 61 72 67 75 65 20 74 68 61   could argue tha
56d0: 74 20 74 68 69 73 20 69 73 20 77 72 6f 6e 67 2e  t this is wrong.
56e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74 6d 61 73  .  */.  if( tmas
56f0: 6b 26 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45  k&TRIGGER_BEFORE
5700: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
5710: 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
5720: 70 54 61 62 2c 20 72 65 67 4e 65 77 29 3b 0a 20  pTab, regNew);. 
5730: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f     sqlite3CodeRo
5740: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
5750: 20 70 54 72 69 67 67 65 72 2c 20 54 4b 5f 55 50   pTrigger, TK_UP
5760: 44 41 54 45 2c 20 70 43 68 61 6e 67 65 73 2c 20  DATE, pChanges, 
5770: 0a 20 20 20 20 20 20 20 20 54 52 49 47 47 45 52  .        TRIGGER
5780: 5f 42 45 46 4f 52 45 2c 20 70 54 61 62 2c 20 72  _BEFORE, pTab, r
5790: 65 67 4f 6c 64 52 6f 77 69 64 2c 20 6f 6e 45 72  egOldRowid, onEr
57a0: 72 6f 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e  ror, labelContin
57b0: 75 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ue);..    /* The
57c0: 20 72 6f 77 2d 74 72 69 67 67 65 72 20 6d 61 79   row-trigger may
57d0: 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 68   have deleted th
57e0: 65 20 72 6f 77 20 62 65 69 6e 67 20 75 70 64 61  e row being upda
57f0: 74 65 64 2e 20 49 6e 20 74 68 69 73 0a 20 20 20  ted. In this.   
5800: 20 2a 2a 20 63 61 73 65 2c 20 6a 75 6d 70 20 74   ** case, jump t
5810: 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 20  o the next row. 
5820: 4e 6f 20 75 70 64 61 74 65 73 20 6f 72 20 41 46  No updates or AF
5830: 54 45 52 20 74 72 69 67 67 65 72 73 20 61 72 65  TER triggers are
5840: 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65   .    ** require
5850: 64 2e 20 54 68 69 73 20 62 65 68 61 76 69 6f 72  d. This behavior
5860: 20 2d 20 77 68 61 74 20 68 61 70 70 65 6e 73 20   - what happens 
5870: 77 68 65 6e 20 74 68 65 20 72 6f 77 20 62 65 69  when the row bei
5880: 6e 67 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a  ng updated.    *
5890: 2a 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72 20  * is deleted or 
58a0: 72 65 6e 61 6d 65 64 20 62 79 20 61 20 42 45 46  renamed by a BEF
58b0: 4f 52 45 20 74 72 69 67 67 65 72 20 2d 20 69 73  ORE trigger - is
58c0: 20 6c 65 66 74 20 75 6e 64 65 66 69 6e 65 64 20   left undefined 
58d0: 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 6f  in the.    ** do
58e0: 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20  cumentation..   
58f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 6b 20   */.    if( pPk 
5900: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5910: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5920: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 44   OP_NotFound, iD
5930: 61 74 61 43 75 72 2c 20 6c 61 62 65 6c 43 6f 6e  ataCur, labelCon
5940: 74 69 6e 75 65 2c 72 65 67 4b 65 79 2c 6e 4b 65  tinue,regKey,nKe
5950: 79 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  y);.      VdbeCo
5960: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
5970: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
5980: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5990: 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
59a0: 44 61 74 61 43 75 72 2c 20 6c 61 62 65 6c 43 6f  DataCur, labelCo
59b0: 6e 74 69 6e 75 65 2c 20 72 65 67 4f 6c 64 52 6f  ntinue, regOldRo
59c0: 77 69 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65  wid);.      Vdbe
59d0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
59e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 74   }..    /* If it
59f0: 20 64 69 64 20 6e 6f 74 20 64 65 6c 65 74 65 20   did not delete 
5a00: 69 74 2c 20 74 68 65 20 72 6f 77 2d 74 72 69 67  it, the row-trig
5a10: 67 65 72 20 6d 61 79 20 73 74 69 6c 6c 20 68 61  ger may still ha
5a20: 76 65 20 6d 6f 64 69 66 69 65 64 20 0a 20 20 20  ve modified .   
5a30: 20 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20   ** some of the 
5a40: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 72  columns of the r
5a50: 6f 77 20 62 65 69 6e 67 20 75 70 64 61 74 65 64  ow being updated
5a60: 2e 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65  . Load the value
5a70: 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 61 6c  s for .    ** al
5a80: 6c 20 63 6f 6c 75 6d 6e 73 20 6e 6f 74 20 6d 6f  l columns not mo
5a90: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
5aa0: 64 61 74 65 20 73 74 61 74 65 6d 65 6e 74 20 69  date statement i
5ab0: 6e 74 6f 20 74 68 65 69 72 20 0a 20 20 20 20 2a  nto their .    *
5ac0: 2a 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 63  * registers in c
5ad0: 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70  ase this has hap
5ae0: 70 65 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pened..    */.  
5af0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
5b00: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
5b10: 20 20 20 20 20 69 66 28 20 61 58 52 65 66 5b 69       if( aXRef[i
5b20: 5d 3c 30 20 26 26 20 69 21 3d 70 54 61 62 2d 3e  ]<0 && i!=pTab->
5b30: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
5b40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5b50: 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
5b60: 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43  (v, pTab, iDataC
5b70: 75 72 2c 20 69 2c 20 72 65 67 4e 65 77 2b 69 29  ur, i, regNew+i)
5b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5b90: 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 56 69    }..  if( !isVi
5ba0: 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  ew ){.    int ad
5bb0: 64 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  dr1 = 0;        
5bc0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75  /* Address of ju
5bd0: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  mp instruction *
5be0: 2f 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 63 6f 6e  /..    /* Do con
5bf0: 73 74 72 61 69 6e 74 20 63 68 65 63 6b 73 2e 20  straint checks. 
5c00: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  */.    assert( r
5c10: 65 67 4f 6c 64 52 6f 77 69 64 3e 30 20 29 3b 0a  egOldRowid>0 );.
5c20: 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72      sqlite3Gener
5c30: 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
5c40: 63 6b 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  cks(pParse, pTab
5c50: 2c 20 61 52 65 67 49 64 78 2c 20 69 44 61 74 61  , aRegIdx, iData
5c60: 43 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20 20  Cur, iIdxCur,.  
5c70: 20 20 20 20 20 20 72 65 67 4e 65 77 52 6f 77 69        regNewRowi
5c80: 64 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c 20  d, regOldRowid, 
5c90: 63 68 6e 67 4b 65 79 2c 20 6f 6e 45 72 72 6f 72  chngKey, onError
5ca0: 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 2c  , labelContinue,
5cb0: 20 26 62 52 65 70 6c 61 63 65 2c 0a 20 20 20 20   &bReplace,.    
5cc0: 20 20 20 20 61 58 52 65 66 2c 20 30 29 3b 0a 0a      aXRef, 0);..
5cd0: 20 20 20 20 2f 2a 20 44 6f 20 46 4b 20 63 6f 6e      /* Do FK con
5ce0: 73 74 72 61 69 6e 74 20 63 68 65 63 6b 73 2e 20  straint checks. 
5cf0: 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73 46 4b  */.    if( hasFK
5d00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5d10: 33 46 6b 43 68 65 63 6b 28 70 50 61 72 73 65 2c  3FkCheck(pParse,
5d20: 20 70 54 61 62 2c 20 72 65 67 4f 6c 64 52 6f 77   pTab, regOldRow
5d30: 69 64 2c 20 30 2c 20 61 58 52 65 66 2c 20 63 68  id, 0, aXRef, ch
5d40: 6e 67 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 0a 20  ngKey);.    }.. 
5d50: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
5d60: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61   index entries a
5d70: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
5d80: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
5d90: 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  d.  */.    if( b
5da0: 52 65 70 6c 61 63 65 20 7c 7c 20 63 68 6e 67 4b  Replace || chngK
5db0: 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ey ){.      if( 
5dc0: 70 50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  pPk ){.        a
5dd0: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
5de0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
5df0: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 44 61 74  P_NotFound, iDat
5e00: 61 43 75 72 2c 20 30 2c 20 72 65 67 4b 65 79 2c  aCur, 0, regKey,
5e10: 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65   nKey);.      }e
5e20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 64 64  lse{.        add
5e30: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
5e40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
5e50: 45 78 69 73 74 73 2c 20 69 44 61 74 61 43 75 72  Exists, iDataCur
5e60: 2c 20 30 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64  , 0, regOldRowid
5e70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5e80: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
5e90: 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20  erTaken(v);.    
5ea0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e  }.    sqlite3Gen
5eb0: 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44 65 6c  erateRowIndexDel
5ec0: 65 74 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ete(pParse, pTab
5ed0: 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78  , iDataCur, iIdx
5ee0: 43 75 72 2c 20 61 52 65 67 49 64 78 2c 20 2d 31  Cur, aRegIdx, -1
5ef0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 68  );..    /* If ch
5f00: 61 6e 67 69 6e 67 20 74 68 65 20 72 6f 77 69 64  anging the rowid
5f10: 20 76 61 6c 75 65 2c 20 6f 72 20 69 66 20 74 68   value, or if th
5f20: 65 72 65 20 61 72 65 20 66 6f 72 65 69 67 6e 20  ere are foreign 
5f30: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  key constraints.
5f40: 20 20 20 20 2a 2a 20 74 6f 20 70 72 6f 63 65 73      ** to proces
5f50: 73 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6f 6c  s, delete the ol
5f60: 64 20 72 65 63 6f 72 64 2e 20 4f 74 68 65 72 77  d record. Otherw
5f70: 69 73 65 2c 20 61 64 64 20 61 20 6e 6f 6f 70 20  ise, add a noop 
5f80: 4f 50 5f 44 65 6c 65 74 65 0a 20 20 20 20 2a 2a  OP_Delete.    **
5f90: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 70   to invoke the p
5fa0: 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 0a  re-update hook..
5fb0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
5fc0: 61 74 20 28 72 65 67 4e 65 77 3d 3d 72 65 67 6e  at (regNew==regn
5fd0: 65 77 52 6f 77 69 64 2b 31 29 20 69 73 20 74 72  ewRowid+1) is tr
5fe0: 75 65 20 69 73 20 61 6c 73 6f 20 69 6d 70 6f 72  ue is also impor
5ff0: 74 61 6e 74 20 66 6f 72 20 74 68 65 20 0a 20 20  tant for the .  
6000: 20 20 2a 2a 20 70 72 65 2d 75 70 64 61 74 65 20    ** pre-update 
6010: 68 6f 6f 6b 2e 20 49 66 20 74 68 65 20 63 61 6c  hook. If the cal
6020: 6c 65 72 20 69 6e 76 6f 6b 65 73 20 70 72 65 75  ler invokes preu
6030: 70 64 61 74 65 5f 6e 65 77 28 29 2c 20 74 68 65  pdate_new(), the
6040: 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a   returned.    **
6050: 20 76 61 6c 75 65 20 69 73 20 63 6f 70 69 65 64   value is copied
6060: 20 66 72 6f 6d 20 6d 65 6d 6f 72 79 20 63 65 6c   from memory cel
6070: 6c 20 28 72 65 67 4e 65 77 52 6f 77 69 64 2b 31  l (regNewRowid+1
6080: 2b 69 43 6f 6c 29 2c 20 77 68 65 72 65 20 69 43  +iCol), where iC
6090: 6f 6c 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  ol.    ** is the
60a0: 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 73 75   column index su
60b0: 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 75 73  pplied by the us
60c0: 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  er..    */.    a
60d0: 73 73 65 72 74 28 20 72 65 67 4e 65 77 3d 3d 72  ssert( regNew==r
60e0: 65 67 4e 65 77 52 6f 77 69 64 2b 31 20 29 3b 0a  egNewRowid+1 );.
60f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6100: 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
6110: 4f 4f 4b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  OOK.    sqlite3V
6120: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6130: 44 65 6c 65 74 65 2c 20 69 44 61 74 61 43 75 72  Delete, iDataCur
6140: 2c 0a 20 20 20 20 20 20 20 20 4f 50 46 4c 41 47  ,.        OPFLAG
6150: 5f 49 53 55 50 44 41 54 45 20 7c 20 28 28 68 61  _ISUPDATE | ((ha
6160: 73 46 4b 3e 31 20 7c 7c 20 63 68 6e 67 4b 65 79  sFK>1 || chngKey
6170: 29 20 3f 20 30 20 3a 20 4f 50 46 4c 41 47 5f 49  ) ? 0 : OPFLAG_I
6180: 53 4e 4f 4f 50 29 2c 0a 20 20 20 20 20 20 20 20  SNOOP),.        
6190: 72 65 67 4e 65 77 52 6f 77 69 64 0a 20 20 20 20  regNewRowid.    
61a0: 29 3b 0a 20 20 20 20 69 66 28 20 65 4f 6e 65 50  );.    if( eOneP
61b0: 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c  ass==ONEPASS_MUL
61c0: 54 49 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  TI ){.      asse
61d0: 72 74 28 20 68 61 73 46 4b 3d 3d 30 20 26 26 20  rt( hasFK==0 && 
61e0: 63 68 6e 67 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  chngKey==0 );.  
61f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6200: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
6210: 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 29 3b  G_SAVEPOSITION);
6220: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
6230: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
6240: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6250: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
6260: 54 61 62 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a  Tab, P4_TABLE);.
6270: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
6280: 69 66 28 20 68 61 73 46 4b 3e 31 20 7c 7c 20 63  if( hasFK>1 || c
6290: 68 6e 67 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  hngKey ){.      
62a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
62b0: 32 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  2(v, OP_Delete, 
62c0: 69 44 61 74 61 43 75 72 2c 20 30 29 3b 0a 20 20  iDataCur, 0);.  
62d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
62e0: 66 28 20 62 52 65 70 6c 61 63 65 20 7c 7c 20 63  f( bReplace || c
62f0: 68 6e 67 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  hngKey ){.      
6300: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6310: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
6320: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 68 61     }..    if( ha
6330: 73 46 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sFK ){.      sql
6340: 69 74 65 33 46 6b 43 68 65 63 6b 28 70 50 61 72  ite3FkCheck(pPar
6350: 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 72 65 67  se, pTab, 0, reg
6360: 4e 65 77 52 6f 77 69 64 2c 20 61 58 52 65 66 2c  NewRowid, aXRef,
6370: 20 63 68 6e 67 4b 65 79 29 3b 0a 20 20 20 20 7d   chngKey);.    }
6380: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  .  .    /* Inser
6390: 74 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78 20  t the new index 
63a0: 65 6e 74 72 69 65 73 20 61 6e 64 20 74 68 65 20  entries and the 
63b0: 6e 65 77 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20  new record. */. 
63c0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 6c 65     sqlite3Comple
63d0: 74 65 49 6e 73 65 72 74 69 6f 6e 28 0a 20 20 20  teInsertion(.   
63e0: 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 54 61       pParse, pTa
63f0: 62 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49 64  b, iDataCur, iId
6400: 78 43 75 72 2c 20 72 65 67 4e 65 77 52 6f 77 69  xCur, regNewRowi
6410: 64 2c 20 61 52 65 67 49 64 78 2c 20 0a 20 20 20  d, aRegIdx, .   
6420: 20 20 20 20 20 4f 50 46 4c 41 47 5f 49 53 55 50       OPFLAG_ISUP
6430: 44 41 54 45 20 7c 20 28 65 4f 6e 65 50 61 73 73  DATE | (eOnePass
6440: 3d 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  ==ONEPASS_MULTI 
6450: 3f 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53  ? OPFLAG_SAVEPOS
6460: 49 54 49 4f 4e 20 3a 20 30 29 2c 20 0a 20 20 20  ITION : 0), .   
6470: 20 20 20 20 20 30 2c 20 30 0a 20 20 20 20 29 3b       0, 0.    );
6480: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 61 6e 79 20  ..    /* Do any 
6490: 4f 4e 20 43 41 53 43 41 44 45 2c 20 53 45 54 20  ON CASCADE, SET 
64a0: 4e 55 4c 4c 20 6f 72 20 53 45 54 20 44 45 46 41  NULL or SET DEFA
64b0: 55 4c 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 72  ULT operations r
64c0: 65 71 75 69 72 65 64 20 74 6f 0a 20 20 20 20 2a  equired to.    *
64d0: 2a 20 68 61 6e 64 6c 65 20 72 6f 77 73 20 28 70  * handle rows (p
64e0: 6f 73 73 69 62 6c 79 20 69 6e 20 6f 74 68 65 72  ossibly in other
64f0: 20 74 61 62 6c 65 73 29 20 74 68 61 74 20 72 65   tables) that re
6500: 66 65 72 20 76 69 61 20 61 20 66 6f 72 65 69 67  fer via a foreig
6510: 6e 20 6b 65 79 0a 20 20 20 20 2a 2a 20 74 6f 20  n key.    ** to 
6520: 74 68 65 20 72 6f 77 20 6a 75 73 74 20 75 70 64  the row just upd
6530: 61 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66  ated. */ .    if
6540: 28 20 68 61 73 46 4b 20 29 7b 0a 20 20 20 20 20  ( hasFK ){.     
6550: 20 73 71 6c 69 74 65 33 46 6b 41 63 74 69 6f 6e   sqlite3FkAction
6560: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  s(pParse, pTab, 
6570: 70 43 68 61 6e 67 65 73 2c 20 72 65 67 4f 6c 64  pChanges, regOld
6580: 52 6f 77 69 64 2c 20 61 58 52 65 66 2c 20 63 68  Rowid, aXRef, ch
6590: 6e 67 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20  ngKey);.    }.  
65a0: 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
65b0: 74 20 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 65  t the row counte
65c0: 72 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 64  r .  */.  if( (d
65d0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
65e0: 45 5f 43 6f 75 6e 74 52 6f 77 73 29 20 26 26 20  E_CountRows) && 
65f0: 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65  !pParse->pTrigge
6600: 72 54 61 62 29 7b 0a 20 20 20 20 73 71 6c 69 74  rTab){.    sqlit
6610: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6620: 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67 52 6f  OP_AddImm, regRo
6630: 77 43 6f 75 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a  wCount, 1);.  }.
6640: 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f  .  sqlite3CodeRo
6650: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
6660: 20 70 54 72 69 67 67 65 72 2c 20 54 4b 5f 55 50   pTrigger, TK_UP
6670: 44 41 54 45 2c 20 70 43 68 61 6e 67 65 73 2c 20  DATE, pChanges, 
6680: 0a 20 20 20 20 20 20 54 52 49 47 47 45 52 5f 41  .      TRIGGER_A
6690: 46 54 45 52 2c 20 70 54 61 62 2c 20 72 65 67 4f  FTER, pTab, regO
66a0: 6c 64 52 6f 77 69 64 2c 20 6f 6e 45 72 72 6f 72  ldRowid, onError
66b0: 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 29  , labelContinue)
66c0: 3b 0a 0a 20 20 2f 2a 20 52 65 70 65 61 74 20 74  ;..  /* Repeat t
66d0: 68 65 20 61 62 6f 76 65 20 77 69 74 68 20 74 68  he above with th
66e0: 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 74 6f  e next record to
66f0: 20 62 65 20 75 70 64 61 74 65 64 2c 20 75 6e 74   be updated, unt
6700: 69 6c 0a 20 20 2a 2a 20 61 6c 6c 20 72 65 63 6f  il.  ** all reco
6710: 72 64 20 73 65 6c 65 63 74 65 64 20 62 79 20 74  rd selected by t
6720: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
6730: 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
6740: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f  d..  */.  if( eO
6750: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
6760: 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20 2f 2a  SINGLE ){.    /*
6770: 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 61   Nothing to do a
6780: 74 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 66 6f  t end-of-loop fo
6790: 72 20 61 20 73 69 6e 67 6c 65 2d 70 61 73 73 20  r a single-pass 
67a0: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  */.  }else if( e
67b0: 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
67c0: 5f 4d 55 4c 54 49 20 29 7b 0a 20 20 20 20 73 71  _MULTI ){.    sq
67d0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
67e0: 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6f  Label(v, labelCo
67f0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c  ntinue);.    sql
6800: 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
6810: 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  nfo);.  }else if
6820: 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPk ){.    sql
6830: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
6840: 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6f 6e  abel(v, labelCon
6850: 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
6860: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6870: 20 4f 50 5f 4e 65 78 74 2c 20 69 45 70 68 2c 20   OP_Next, iEph, 
6880: 61 64 64 72 54 6f 70 29 3b 20 56 64 62 65 43 6f  addrTop); VdbeCo
6890: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c  verage(v);.  }el
68a0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
68b0: 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
68c0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 20  Continue);.  }. 
68d0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
68e0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
68f0: 6c 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 55  lBreak);..  /* U
6900: 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
6910: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
6920: 62 79 20 73 74 6f 72 69 6e 67 20 74 68 65 20 63  by storing the c
6930: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 20 20  ontent of the.  
6940: 2a 2a 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64  ** maximum rowid
6950: 20 63 6f 75 6e 74 65 72 20 76 61 6c 75 65 73 20   counter values 
6960: 72 65 63 6f 72 64 65 64 20 77 68 69 6c 65 20 69  recorded while i
6970: 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 0a 20 20  nserting into.  
6980: 2a 2a 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  ** autoincrement
6990: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
69a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  if( pParse->nest
69b0: 65 64 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  ed==0 && pParse-
69c0: 3e 70 54 72 69 67 67 65 72 54 61 62 3d 3d 30 20  >pTriggerTab==0 
69d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75  ){.    sqlite3Au
69e0: 74 6f 69 6e 63 72 65 6d 65 6e 74 45 6e 64 28 70  toincrementEnd(p
69f0: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
6a00: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
6a10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
6a20: 20 74 68 61 74 20 77 65 72 65 20 63 68 61 6e 67   that were chang
6a30: 65 64 2e 20 49 66 20 74 68 69 73 20 72 6f 75 74  ed. If this rout
6a40: 69 6e 65 20 69 73 20 0a 20 20 2a 2a 20 67 65 6e  ine is .  ** gen
6a50: 65 72 61 74 69 6e 67 20 63 6f 64 65 20 62 65 63  erating code bec
6a60: 61 75 73 65 20 6f 66 20 61 20 63 61 6c 6c 20 74  ause of a call t
6a70: 6f 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50  o sqlite3NestedP
6a80: 61 72 73 65 28 29 2c 20 64 6f 20 6e 6f 74 0a 20  arse(), do not. 
6a90: 20 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 63   ** invoke the c
6aa0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
6ab0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 64 62  ..  */.  if( (db
6ac0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43  ->flags&SQLITE_C
6ad0: 6f 75 6e 74 52 6f 77 73 29 20 26 26 20 21 70 50  ountRows) && !pP
6ae0: 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
6af0: 62 20 26 26 20 21 70 50 61 72 73 65 2d 3e 6e 65  b && !pParse->ne
6b00: 73 74 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  sted ){.    sqli
6b10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6b20: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
6b30: 65 67 52 6f 77 43 6f 75 6e 74 2c 20 31 29 3b 0a  egRowCount, 1);.
6b40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
6b50: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b  etNumCols(v, 1);
6b60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6b70: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c  SetColName(v, 0,
6b80: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22   COLNAME_NAME, "
6b90: 72 6f 77 73 20 75 70 64 61 74 65 64 22 2c 20 53  rows updated", S
6ba0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
6bb0: 20 7d 0a 0a 75 70 64 61 74 65 5f 63 6c 65 61 6e   }..update_clean
6bc0: 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 41 75 74  up:.  sqlite3Aut
6bd0: 68 43 6f 6e 74 65 78 74 50 6f 70 28 26 73 43 6f  hContextPop(&sCo
6be0: 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65  ntext);.  sqlite
6bf0: 33 44 62 46 72 65 65 28 64 62 2c 20 61 58 52 65  3DbFree(db, aXRe
6c00: 66 29 3b 20 2f 2a 20 41 6c 73 6f 20 66 72 65 65  f); /* Also free
6c10: 73 20 61 52 65 67 49 64 78 5b 5d 20 61 6e 64 20  s aRegIdx[] and 
6c20: 61 54 6f 4f 70 65 6e 5b 5d 20 2a 2f 0a 20 20 73  aToOpen[] */.  s
6c30: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
6c40: 65 74 65 28 64 62 2c 20 70 54 61 62 4c 69 73 74  ete(db, pTabList
6c50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
6c60: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
6c70: 43 68 61 6e 67 65 73 29 3b 0a 20 20 73 71 6c 69  Changes);.  sqli
6c80: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6c90: 2c 20 70 57 68 65 72 65 29 3b 0a 23 69 66 20 64  , pWhere);.#if d
6ca0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
6cb0: 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45  ABLE_UPDATE_DELE
6cc0: 54 45 5f 4c 49 4d 49 54 29 20 0a 20 20 73 71 6c  TE_LIMIT) .  sql
6cd0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
6ce0: 74 65 28 64 62 2c 20 70 4f 72 64 65 72 42 79 29  te(db, pOrderBy)
6cf0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
6d00: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 6d 69 74  elete(db, pLimit
6d10: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
6d20: 72 6e 3b 0a 7d 0a 2f 2a 20 4d 61 6b 65 20 73 75  rn;.}./* Make su
6d30: 72 65 20 22 69 73 56 69 65 77 22 20 61 6e 64 20  re "isView" and 
6d40: 6f 74 68 65 72 20 6d 61 63 72 6f 73 20 64 65 66  other macros def
6d50: 69 6e 65 64 20 61 62 6f 76 65 20 61 72 65 20 75  ined above are u
6d60: 6e 64 65 66 69 6e 65 64 2e 20 4f 74 68 65 72 77  ndefined. Otherw
6d70: 69 73 65 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20  ise.** they may 
6d80: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 63  interfere with c
6d90: 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 6f 74  ompilation of ot
6da0: 68 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  her functions in
6db0: 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 28 6f   this file.** (o
6dc0: 72 20 69 6e 20 61 6e 6f 74 68 65 72 20 66 69 6c  r in another fil
6dd0: 65 2c 20 69 66 20 74 68 69 73 20 66 69 6c 65 20  e, if this file 
6de0: 62 65 63 6f 6d 65 73 20 70 61 72 74 20 6f 66 20  becomes part of 
6df0: 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
6e00: 29 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 69 73  ).  */.#ifdef is
6e10: 56 69 65 77 0a 20 23 75 6e 64 65 66 20 69 73 56  View. #undef isV
6e20: 69 65 77 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  iew.#endif.#ifde
6e30: 66 20 70 54 72 69 67 67 65 72 0a 20 23 75 6e 64  f pTrigger. #und
6e40: 65 66 20 70 54 72 69 67 67 65 72 0a 23 65 6e 64  ef pTrigger.#end
6e50: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
6e60: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
6e70: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ABLE./*.** Gener
6e80: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
6e90: 55 50 44 41 54 45 20 6f 66 20 61 20 76 69 72 74  UPDATE of a virt
6ea0: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
6eb0: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   There are two p
6ec0: 6f 73 73 69 62 6c 65 20 73 74 72 61 74 65 67 69  ossible strategi
6ed0: 65 73 20 2d 20 74 68 65 20 64 65 66 61 75 6c 74  es - the default
6ee0: 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 61 6c   and the special
6ef0: 20 0a 2a 2a 20 22 6f 6e 65 70 61 73 73 22 20 73   .** "onepass" s
6f00: 74 72 61 74 65 67 79 2e 20 4f 6e 65 70 61 73 73  trategy. Onepass
6f10: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66   is only used if
6f20: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
6f30: 6c 65 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  le .** implement
6f40: 61 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20  ation indicates 
6f50: 74 68 61 74 20 70 57 68 65 72 65 20 6d 61 79 20  that pWhere may 
6f60: 6d 61 74 63 68 20 61 74 20 6d 6f 73 74 20 6f 6e  match at most on
6f70: 65 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e row..**.** The
6f80: 20 64 65 66 61 75 6c 74 20 73 74 72 61 74 65 67   default strateg
6f90: 79 20 69 73 20 74 6f 20 63 72 65 61 74 65 20 61  y is to create a
6fa0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
6fb0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
6fc0: 2a 2a 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  ** for each row 
6fd0: 74 6f 20 62 65 20 63 68 61 6e 67 65 64 3a 0a 2a  to be changed:.*
6fe0: 2a 0a 2a 2a 20 20 20 28 41 29 20 20 54 68 65 20  *.**   (A)  The 
6ff0: 6f 72 69 67 69 6e 61 6c 20 72 6f 77 69 64 20 6f  original rowid o
7000: 66 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 20  f that row..**  
7010: 20 28 42 29 20 20 54 68 65 20 72 65 76 69 73 65   (B)  The revise
7020: 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  d rowid for the 
7030: 72 6f 77 2e 0a 2a 2a 20 20 20 28 43 29 20 20 54  row..**   (C)  T
7040: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 65 76  he content of ev
7050: 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ery column in th
7060: 65 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e row..**.** The
7070: 6e 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  n loop through t
7080: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
7090: 68 69 73 20 65 70 68 65 6d 65 72 61 6c 20 74 61  his ephemeral ta
70a0: 62 6c 65 20 65 78 65 63 75 74 69 6e 67 20 61 0a  ble executing a.
70b0: 2a 2a 20 56 55 70 64 61 74 65 20 66 6f 72 20 65  ** VUpdate for e
70c0: 61 63 68 20 72 6f 77 2e 20 57 68 65 6e 20 66 69  ach row. When fi
70d0: 6e 69 73 68 65 64 2c 20 64 72 6f 70 20 74 68 65  nished, drop the
70e0: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
70f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6f 6e 65  ..**.** The "one
7100: 70 61 73 73 22 20 73 74 72 61 74 65 67 79 20 64  pass" strategy d
7110: 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 65  oes not use an e
7120: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20  phemeral table. 
7130: 49 6e 73 74 65 61 64 2c 20 69 74 0a 2a 2a 20 73  Instead, it.** s
7140: 74 6f 72 65 73 20 74 68 65 20 73 61 6d 65 20 76  tores the same v
7150: 61 6c 75 65 73 20 28 41 2c 20 42 20 61 6e 64 20  alues (A, B and 
7160: 43 20 61 62 6f 76 65 29 20 69 6e 20 61 20 72 65  C above) in a re
7170: 67 69 73 74 65 72 20 61 72 72 61 79 20 61 6e 64  gister array and
7180: 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 69 6e 67  .** makes a sing
7190: 6c 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  le invocation of
71a0: 20 56 55 70 64 61 74 65 2e 0a 2a 2f 0a 73 74 61   VUpdate..*/.sta
71b0: 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 56  tic void updateV
71c0: 69 72 74 75 61 6c 54 61 62 6c 65 28 0a 20 20 50  irtualTable(.  P
71d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
71e0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
71f0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
7200: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
7210: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
7220: 75 61 6c 20 74 61 62 6c 65 20 74 6f 20 62 65 20  ual table to be 
7230: 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 54 61  modified */.  Ta
7240: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
7250: 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
7260: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  l table */.  Exp
7270: 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c  rList *pChanges,
7280: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73    /* The columns
7290: 20 74 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68   to change in th
72a0: 65 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  e UPDATE stateme
72b0: 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  nt */.  Expr *pR
72c0: 6f 77 69 64 2c 20 20 20 20 20 20 20 20 2f 2a 20  owid,        /* 
72d0: 45 78 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20  Expression used 
72e0: 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
72f0: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20   rowid */.  int 
7300: 2a 61 58 52 65 66 2c 20 20 20 20 20 20 20 20 20  *aXRef,         
7310: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
7320: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 54 61 62   columns of pTab
7330: 20 74 6f 20 65 6e 74 72 69 65 73 20 69 6e 20 70   to entries in p
7340: 43 68 61 6e 67 65 73 20 2a 2f 0a 20 20 45 78 70  Changes */.  Exp
7350: 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
7360: 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
7370: 65 20 6f 66 20 74 68 65 20 55 50 44 41 54 45 20  e of the UPDATE 
7380: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
7390: 6e 74 20 6f 6e 45 72 72 6f 72 20 20 20 20 20 20  nt onError      
73a0: 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49      /* ON CONFLI
73b0: 43 54 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 29  CT strategy */.)
73c0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
73d0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
73e0: 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   Virtual machine
73f0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
7400: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 70 68  ion */.  int eph
7410: 65 6d 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  emTab;          
7420: 20 20 20 2f 2a 20 54 61 62 6c 65 20 68 6f 6c 64     /* Table hold
7430: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ing the result o
7440: 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a  f the SELECT */.
7450: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
7460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7470: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
7480: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7490: 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 44 61  Parse->db; /* Da
74a0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
74b0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
74c0: 72 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73  r *pVTab = (cons
74d0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 47  t char*)sqlite3G
74e0: 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
74f0: 62 29 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  b);.  WhereInfo 
7500: 2a 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e  *pWInfo;.  int n
7510: 41 72 67 20 3d 20 32 20 2b 20 70 54 61 62 2d 3e  Arg = 2 + pTab->
7520: 6e 43 6f 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 75  nCol;      /* Nu
7530: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
7540: 73 20 74 6f 20 56 55 70 64 61 74 65 20 2a 2f 0a  s to VUpdate */.
7550: 20 20 69 6e 74 20 72 65 67 41 72 67 3b 20 20 20    int regArg;   
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
7580: 74 65 72 20 69 6e 20 56 55 70 64 61 74 65 20 61  ter in VUpdate a
7590: 72 67 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  rg array */.  in
75a0: 74 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20  t regRec;       
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
75c0: 20 52 65 67 69 73 74 65 72 20 69 6e 20 77 68 69   Register in whi
75d0: 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 72  ch to assemble r
75e0: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72  ecord */.  int r
75f0: 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20  egRowid;        
7600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
7610: 67 69 73 74 65 72 20 66 6f 72 20 65 70 68 65 6d  gister for ephem
7620: 20 74 61 62 6c 65 20 72 6f 77 69 64 20 2a 2f 0a   table rowid */.
7630: 20 20 69 6e 74 20 69 43 73 72 20 3d 20 70 53 72    int iCsr = pSr
7640: 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  c->a[0].iCursor;
7650: 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64    /* Cursor used
7660: 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   for virtual tab
7670: 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 69 6e 74  le scan */.  int
7680: 20 61 44 75 6d 6d 79 5b 32 5d 3b 20 20 20 20 20   aDummy[2];     
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
76a0: 55 6e 75 73 65 64 20 61 72 67 20 66 6f 72 20 73  Unused arg for s
76b0: 71 6c 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65  qlite3WhereOkOne
76c0: 50 61 73 73 28 29 20 2a 2f 0a 20 20 69 6e 74 20  Pass() */.  int 
76d0: 62 4f 6e 65 50 61 73 73 3b 20 20 20 20 20 20 20  bOnePass;       
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
76f0: 72 75 65 20 74 6f 20 75 73 65 20 6f 6e 65 70 61  rue to use onepa
7700: 73 73 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20  ss strategy */. 
7710: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
7740: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
7750: 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
7760: 65 20 6e 41 72 67 20 72 65 67 69 73 74 65 72 73  e nArg registers
7770: 20 69 6e 20 77 68 69 63 68 20 74 6f 20 67 61 74   in which to gat
7780: 68 65 72 20 74 68 65 20 61 72 67 75 6d 65 6e 74  her the argument
7790: 73 20 66 6f 72 20 56 55 70 64 61 74 65 2e 20 54  s for VUpdate. T
77a0: 68 65 6e 0a 20 20 2a 2a 20 63 72 65 61 74 65 20  hen.  ** create 
77b0: 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 65 70 68  and open the eph
77c0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 20  emeral table in 
77d0: 77 68 69 63 68 20 74 68 65 20 72 65 63 6f 72 64  which the record
77e0: 73 20 63 72 65 61 74 65 64 20 66 72 6f 6d 0a 20  s created from. 
77f0: 20 2a 2a 20 74 68 65 73 65 20 61 72 67 75 6d 65   ** these argume
7800: 6e 74 73 20 77 69 6c 6c 20 62 65 20 74 65 6d 70  nts will be temp
7810: 6f 72 61 72 69 6c 79 20 73 74 6f 72 65 64 2e 20  orarily stored. 
7820: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  */.  assert( v )
7830: 3b 0a 20 20 65 70 68 65 6d 54 61 62 20 3d 20 70  ;.  ephemTab = p
7840: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
7850: 20 61 64 64 72 3d 20 73 71 6c 69 74 65 33 56 64   addr= sqlite3Vd
7860: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
7870: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 65 70  penEphemeral, ep
7880: 68 65 6d 54 61 62 2c 20 6e 41 72 67 29 3b 0a 20  hemTab, nArg);. 
7890: 20 72 65 67 41 72 67 20 3d 20 70 50 61 72 73 65   regArg = pParse
78a0: 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 70 50  ->nMem + 1;.  pP
78b0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41  arse->nMem += nA
78c0: 72 67 3b 0a 20 20 72 65 67 52 65 63 20 3d 20 2b  rg;.  regRec = +
78d0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
78e0: 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50   regRowid = ++pP
78f0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 2f  arse->nMem;..  /
7900: 2a 20 53 74 61 72 74 20 73 63 61 6e 6e 69 6e 67  * Start scanning
7910: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
7920: 6c 65 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d  le */.  pWInfo =
7930: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
7940: 69 6e 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c  in(pParse, pSrc,
7950: 20 70 57 68 65 72 65 2c 20 30 2c 30 2c 57 48 45   pWhere, 0,0,WHE
7960: 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
7970: 45 44 2c 30 29 3b 0a 20 20 69 66 28 20 70 57 49  ED,0);.  if( pWI
7980: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  nfo==0 ) return;
7990: 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20  ..  /* Populate 
79a0: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 72 65 67  the argument reg
79b0: 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 66 6f 72  isters. */.  for
79c0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
79d0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
79e0: 28 20 61 58 52 65 66 5b 69 5d 3e 3d 30 20 29 7b  ( aXRef[i]>=0 ){
79f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
7a00: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
7a10: 43 68 61 6e 67 65 73 2d 3e 61 5b 61 58 52 65 66  Changes->a[aXRef
7a20: 5b 69 5d 5d 2e 70 45 78 70 72 2c 20 72 65 67 41  [i]].pExpr, regA
7a30: 72 67 2b 32 2b 69 29 3b 0a 20 20 20 20 7d 65 6c  rg+2+i);.    }el
7a40: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
7a50: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7a60: 50 5f 56 43 6f 6c 75 6d 6e 2c 20 69 43 73 72 2c  P_VColumn, iCsr,
7a70: 20 69 2c 20 72 65 67 41 72 67 2b 32 2b 69 29 3b   i, regArg+2+i);
7a80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7a90: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
7aa0: 3b 20 2f 2a 20 45 6e 61 62 6c 65 20 73 71 6c 69  ; /* Enable sqli
7ab0: 74 65 33 5f 76 74 61 62 5f 6e 6f 63 68 61 6e 67  te3_vtab_nochang
7ac0: 65 28 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  e() */.    }.  }
7ad0: 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  .  if( HasRowid(
7ae0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
7af0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7b00: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 73 72  , OP_Rowid, iCsr
7b10: 2c 20 72 65 67 41 72 67 29 3b 0a 20 20 20 20 69  , regArg);.    i
7b20: 66 28 20 70 52 6f 77 69 64 20 29 7b 0a 20 20 20  f( pRowid ){.   
7b30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
7b40: 64 65 28 70 50 61 72 73 65 2c 20 70 52 6f 77 69  de(pParse, pRowi
7b50: 64 2c 20 72 65 67 41 72 67 2b 31 29 3b 0a 20 20  d, regArg+1);.  
7b60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
7b70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7b80: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43  (v, OP_Rowid, iC
7b90: 73 72 2c 20 72 65 67 41 72 67 2b 31 29 3b 0a 20  sr, regArg+1);. 
7ba0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
7bb0: 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 20 20 20    Index *pPk;   
7bc0: 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  /* PRIMARY KEY i
7bd0: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 31 36 20  ndex */.    i16 
7be0: 69 50 6b 3b 20 20 20 20 20 20 2f 2a 20 50 52 49  iPk;      /* PRI
7bf0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
7c00: 2a 2f 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  */.    pPk = sql
7c10: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
7c20: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 61  dex(pTab);.    a
7c30: 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b  ssert( pPk!=0 );
7c40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b  .    assert( pPk
7c50: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a  ->nKeyCol==1 );.
7c60: 20 20 20 20 69 50 6b 20 3d 20 70 50 6b 2d 3e 61      iPk = pPk->a
7c70: 69 43 6f 6c 75 6d 6e 5b 30 5d 3b 0a 20 20 20 20  iColumn[0];.    
7c80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7c90: 33 28 76 2c 20 4f 50 5f 56 43 6f 6c 75 6d 6e 2c  3(v, OP_VColumn,
7ca0: 20 69 43 73 72 2c 20 69 50 6b 2c 20 72 65 67 41   iCsr, iPk, regA
7cb0: 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
7cc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7cd0: 5f 53 43 6f 70 79 2c 20 72 65 67 41 72 67 2b 32  _SCopy, regArg+2
7ce0: 2b 69 50 6b 2c 20 72 65 67 41 72 67 2b 31 29 3b  +iPk, regArg+1);
7cf0: 0a 20 20 7d 0a 0a 20 20 62 4f 6e 65 50 61 73 73  .  }..  bOnePass
7d00: 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f   = sqlite3WhereO
7d10: 6b 4f 6e 65 50 61 73 73 28 70 57 49 6e 66 6f 2c  kOnePass(pWInfo,
7d20: 20 61 44 75 6d 6d 79 29 3b 0a 0a 20 20 69 66 28   aDummy);..  if(
7d30: 20 62 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20   bOnePass ){.   
7d40: 20 2f 2a 20 49 66 20 75 73 69 6e 67 20 74 68 65   /* If using the
7d50: 20 6f 6e 65 70 61 73 73 20 73 74 72 61 74 65 67   onepass strateg
7d60: 79 2c 20 6e 6f 2d 6f 70 20 6f 75 74 20 74 68 65  y, no-op out the
7d70: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
7d80: 6c 20 63 6f 64 65 64 0a 20 20 20 20 2a 2a 20 61  l coded.    ** a
7d90: 62 6f 76 65 2e 20 41 6c 73 6f 2c 20 69 66 20 74  bove. Also, if t
7da0: 68 69 73 20 69 73 20 61 20 74 6f 70 2d 6c 65 76  his is a top-lev
7db0: 65 6c 20 70 61 72 73 65 20 28 6e 6f 74 20 61 20  el parse (not a 
7dc0: 74 72 69 67 67 65 72 29 2c 20 63 6c 65 61 72 20  trigger), clear 
7dd0: 74 68 65 0a 20 20 20 20 2a 2a 20 6d 75 6c 74 69  the.    ** multi
7de0: 2d 77 72 69 74 65 20 66 6c 61 67 20 73 6f 20 74  -write flag so t
7df0: 68 61 74 20 74 68 65 20 56 4d 20 64 6f 65 73 20  hat the VM does 
7e00: 6e 6f 74 20 6f 70 65 6e 20 61 20 73 74 61 74 65  not open a state
7e10: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ment journal */.
7e20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7e30: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
7e40: 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ddr);.    if( sq
7e50: 6c 69 74 65 33 49 73 54 6f 70 6c 65 76 65 6c 28  lite3IsToplevel(
7e60: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20  pParse) ){.     
7e70: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
7e80: 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 20 20 7d  Write = 0;.    }
7e90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
7ea0: 20 43 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   Create a record
7eb0: 20 66 72 6f 6d 20 74 68 65 20 61 72 67 75 6d 65   from the argume
7ec0: 6e 74 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74  nt register cont
7ed0: 65 6e 74 73 20 61 6e 64 20 69 6e 73 65 72 74 20  ents and insert 
7ee0: 69 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74  it into.    ** t
7ef0: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
7f00: 6c 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  le. */.    sqlit
7f10: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7f20: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
7f30: 65 67 41 72 67 2c 20 6e 41 72 67 2c 20 72 65 67  egArg, nArg, reg
7f40: 52 65 63 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Rec);.#ifdef SQL
7f50: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
7f60: 20 53 69 67 6e 61 6c 20 61 6e 20 61 73 73 65 72   Signal an asser
7f70: 74 28 29 20 77 69 74 68 69 6e 20 4f 50 5f 4d 61  t() within OP_Ma
7f80: 6b 65 52 65 63 6f 72 64 20 74 68 61 74 20 69 74  keRecord that it
7f90: 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20   is allowed to. 
7fa0: 20 20 20 2a 2a 20 61 63 63 65 70 74 20 6e 6f 2d     ** accept no-
7fb0: 63 68 61 6e 67 65 20 72 65 63 6f 72 64 73 20 77  change records w
7fc0: 69 74 68 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ith serial_type 
7fd0: 31 30 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  10 */.    sqlite
7fe0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
7ff0: 20 4f 50 46 4c 41 47 5f 4e 4f 43 48 4e 47 5f 4d   OPFLAG_NOCHNG_M
8000: 41 47 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  AGIC);.#endif.  
8010: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8020: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
8030: 69 64 2c 20 65 70 68 65 6d 54 61 62 2c 20 72 65  id, ephemTab, re
8040: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  gRowid);.    sql
8050: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8060: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 65 70 68  , OP_Insert, eph
8070: 65 6d 54 61 62 2c 20 72 65 67 52 65 63 2c 20 72  emTab, regRec, r
8080: 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 0a 0a  egRowid);.  }...
8090: 20 20 69 66 28 20 62 4f 6e 65 50 61 73 73 3d 3d    if( bOnePass==
80a0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 6e 64 20  0 ){.    /* End 
80b0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
80c0: 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 73 71  e scan */.    sq
80d0: 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
80e0: 49 6e 66 6f 29 3b 0a 0a 20 20 20 20 2f 2a 20 42  Info);..    /* B
80f0: 65 67 69 6e 20 73 63 61 6e 6e 6e 69 6e 67 20 74  egin scannning t
8100: 68 72 6f 75 67 68 20 74 68 65 20 65 70 68 65 6d  hrough the ephem
8110: 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  eral table. */. 
8120: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
8130: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
8140: 50 5f 52 65 77 69 6e 64 2c 20 65 70 68 65 6d 54  P_Rewind, ephemT
8150: 61 62 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ab); VdbeCoverag
8160: 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78  e(v);..    /* Ex
8170: 74 72 61 63 74 20 61 72 67 75 6d 65 6e 74 73 20  tract arguments 
8180: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
8190: 20 72 6f 77 20 6f 66 20 74 68 65 20 65 70 68 65   row of the ephe
81a0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 61 6e 64 20  meral table and 
81b0: 0a 20 20 20 20 2a 2a 20 69 6e 76 6f 6b 65 20 74  .    ** invoke t
81c0: 68 65 20 56 55 70 64 61 74 65 20 6d 65 74 68 6f  he VUpdate metho
81d0: 64 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  d.  */.    for(i
81e0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
81f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8200: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8210: 43 6f 6c 75 6d 6e 2c 20 65 70 68 65 6d 54 61 62  Column, ephemTab
8220: 2c 20 69 2c 20 72 65 67 41 72 67 2b 69 29 3b 0a  , i, regArg+i);.
8230: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
8240: 74 65 33 56 74 61 62 4d 61 6b 65 57 72 69 74 61  te3VtabMakeWrita
8250: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
8260: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
8270: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 55 70  AddOp4(v, OP_VUp
8280: 64 61 74 65 2c 20 30 2c 20 6e 41 72 67 2c 20 72  date, 0, nArg, r
8290: 65 67 41 72 67 2c 20 70 56 54 61 62 2c 20 50 34  egArg, pVTab, P4
82a0: 5f 56 54 41 42 29 3b 0a 20 20 73 71 6c 69 74 65  _VTAB);.  sqlite
82b0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
82c0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66   onError==OE_Def
82d0: 61 75 6c 74 20 3f 20 4f 45 5f 41 62 6f 72 74 20  ault ? OE_Abort 
82e0: 3a 20 6f 6e 45 72 72 6f 72 29 3b 0a 20 20 73 71  : onError);.  sq
82f0: 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
8300: 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64  arse);..  /* End
8310: 20 6f 66 20 74 68 65 20 65 70 68 65 6d 65 72 61   of the ephemera
8320: 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 4f 72  l table scan. Or
8330: 2c 20 69 66 20 75 73 69 6e 67 20 74 68 65 20 6f  , if using the o
8340: 6e 65 70 61 73 73 20 73 74 72 61 74 65 67 79 2c  nepass strategy,
8350: 0a 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 68 65  .  ** jump to he
8360: 72 65 20 69 66 20 74 68 65 20 73 63 61 6e 20 76  re if the scan v
8370: 69 73 69 74 65 64 20 7a 65 72 6f 20 72 6f 77 73  isited zero rows
8380: 2e 20 2a 2f 0a 20 20 69 66 28 20 62 4f 6e 65 50  . */.  if( bOneP
8390: 61 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ass==0 ){.    sq
83a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
83b0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 65 70 68 65  v, OP_Next, ephe
83c0: 6d 54 61 62 2c 20 61 64 64 72 2b 31 29 3b 20 56  mTab, addr+1); V
83d0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
83e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
83f0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
8400: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8410: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
8420: 6f 73 65 2c 20 65 70 68 65 6d 54 61 62 2c 20 30  ose, ephemTab, 0
8430: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8440: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
8450: 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 23  pWInfo);.  }.}.#
8460: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8470: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
8480: 45 20 2a 2f 0a                                   E */.