/ Hex Artifact Content
Login

Artifact ce478c8ad297833d1acc825891e35d82a99f5986cfce1e92f44c3b0d54670114:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 55 50 44 41 54 45 20 73   handle UPDATE s
01d0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 69  tatements..*/.#i
01e0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
01f0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
0200: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
0210: 4c 54 41 42 4c 45 0a 2f 2a 20 46 6f 72 77 61 72  LTABLE./* Forwar
0220: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
0230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
0240: 61 74 65 56 69 72 74 75 61 6c 54 61 62 6c 65 28  ateVirtualTable(
0250: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0260: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
0270: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
0280: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
0290: 63 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  c,       /* The 
02a0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 6f  virtual table to
02b0: 20 62 65 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a   be modified */.
02c0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
02d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
02e0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
02f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e   ExprList *pChan
0300: 67 65 73 2c 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ges,  /* The col
0310: 75 6d 6e 73 20 74 6f 20 63 68 61 6e 67 65 20 69  umns to change i
0320: 6e 20 74 68 65 20 55 50 44 41 54 45 20 73 74 61  n the UPDATE sta
0330: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  tement */.  Expr
0340: 20 2a 70 52 6f 77 69 64 45 78 70 72 2c 20 20 20   *pRowidExpr,   
0350: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 75   /* Expression u
0360: 73 65 64 20 74 6f 20 72 65 63 6f 6d 70 75 74 65  sed to recompute
0370: 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
0380: 69 6e 74 20 2a 61 58 52 65 66 2c 20 20 20 20 20  int *aXRef,     
0390: 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
03a0: 66 72 6f 6d 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  from columns of 
03b0: 70 54 61 62 20 74 6f 20 65 6e 74 72 69 65 73 20  pTab to entries 
03c0: 69 6e 20 70 43 68 61 6e 67 65 73 20 2a 2f 0a 20  in pChanges */. 
03d0: 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
03e0: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
03f0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 55 50 44  lause of the UPD
0400: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
0410: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20  .  int onError  
0420: 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f          /* ON CO
0430: 4e 46 4c 49 43 54 20 73 74 72 61 74 65 67 79 20  NFLICT strategy 
0440: 2a 2f 0a 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  */.);.#endif /* 
0450: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
0460: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
0470: 2a 2a 20 54 68 65 20 6d 6f 73 74 20 72 65 63 65  ** The most rece
0480: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
0490: 75 63 74 69 6f 6e 20 77 61 73 20 61 6e 20 4f 50  uction was an OP
04a0: 5f 43 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 72 69  _Column to retri
04b0: 65 76 65 20 74 68 65 0a 2a 2a 20 69 2d 74 68 20  eve the.** i-th 
04c0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
04d0: 70 54 61 62 2e 20 54 68 69 73 20 72 6f 75 74 69  pTab. This routi
04e0: 6e 65 20 73 65 74 73 20 74 68 65 20 50 34 20 70  ne sets the P4 p
04f0: 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20  arameter of the 
0500: 0a 2a 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 20 74 6f  .** OP_Column to
0510: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
0520: 75 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a  ue, if any..**.*
0530: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  * The default va
0540: 6c 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  lue of a column 
0550: 69 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  is specified by 
0560: 61 20 44 45 46 41 55 4c 54 20 63 6c 61 75 73 65  a DEFAULT clause
0570: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 6c 75   in the .** colu
0580: 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 54  mn definition. T
0590: 68 69 73 20 77 61 73 20 65 69 74 68 65 72 20 73  his was either s
05a0: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 75  upplied by the u
05b0: 73 65 72 20 77 68 65 6e 20 74 68 65 20 74 61 62  ser when the tab
05c0: 6c 65 0a 2a 2a 20 77 61 73 20 63 72 65 61 74 65  le.** was create
05d0: 64 2c 20 6f 72 20 61 64 64 65 64 20 6c 61 74 65  d, or added late
05e0: 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 64  r to the table d
05f0: 65 66 69 6e 69 74 69 6f 6e 20 62 79 20 61 6e 20  efinition by an 
0600: 41 4c 54 45 52 20 54 41 42 4c 45 0a 2a 2a 20 63  ALTER TABLE.** c
0610: 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 6c  ommand. If the l
0620: 61 74 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  atter, then the 
0630: 72 6f 77 2d 72 65 63 6f 72 64 73 20 69 6e 20 74  row-records in t
0640: 68 65 20 74 61 62 6c 65 20 62 74 72 65 65 20 6f  he table btree o
0650: 6e 20 64 69 73 6b 0a 2a 2a 20 6d 61 79 20 6e 6f  n disk.** may no
0660: 74 20 63 6f 6e 74 61 69 6e 20 61 20 76 61 6c 75  t contain a valu
0670: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
0680: 20 61 6e 64 20 74 68 65 20 64 65 66 61 75 6c 74   and the default
0690: 20 76 61 6c 75 65 2c 20 74 61 6b 65 6e 0a 2a 2a   value, taken.**
06a0: 20 66 72 6f 6d 20 74 68 65 20 50 34 20 70 61 72   from the P4 par
06b0: 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20 4f 50  ameter of the OP
06c0: 5f 43 6f 6c 75 6d 6e 20 69 6e 73 74 72 75 63 74  _Column instruct
06d0: 69 6f 6e 2c 20 69 73 20 72 65 74 75 72 6e 65 64  ion, is returned
06e0: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 49 66 20   instead..** If 
06f0: 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e  the former, then
0700: 20 61 6c 6c 20 72 6f 77 2d 72 65 63 6f 72 64 73   all row-records
0710: 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
0720: 74 6f 20 69 6e 63 6c 75 64 65 20 61 20 76 61 6c  to include a val
0730: 75 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ue.** for the co
0740: 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 50 34 20  lumn and the P4 
0750: 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 72 65 71  value is not req
0760: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6c  uired..**.** Col
0770: 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  umn definitions 
0780: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 41 4c  created by an AL
0790: 54 45 52 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e  TER TABLE comman
07a0: 64 20 6d 61 79 20 6f 6e 6c 79 20 68 61 76 65 20  d may only have 
07b0: 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 64 65 66 61  .** literal defa
07c0: 75 6c 74 20 76 61 6c 75 65 73 20 73 70 65 63 69  ult values speci
07d0: 66 69 65 64 3a 20 61 20 6e 75 6d 62 65 72 2c 20  fied: a number, 
07e0: 6e 75 6c 6c 20 6f 72 20 61 20 73 74 72 69 6e 67  null or a string
07f0: 2e 20 28 49 66 20 61 20 6d 6f 72 65 0a 2a 2a 20  . (If a more.** 
0800: 63 6f 6d 70 6c 69 63 61 74 65 64 20 64 65 66 61  complicated defa
0810: 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 20 76  ult expression v
0820: 61 6c 75 65 20 77 61 73 20 70 72 6f 76 69 64 65  alue was provide
0830: 64 2c 20 69 74 20 69 73 20 65 76 61 6c 75 61 74  d, it is evaluat
0840: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ed .** when the 
0850: 41 4c 54 45 52 20 54 41 42 4c 45 20 69 73 20 65  ALTER TABLE is e
0860: 78 65 63 75 74 65 64 20 61 6e 64 20 6f 6e 65 20  xecuted and one 
0870: 6f 66 20 74 68 65 20 6c 69 74 65 72 61 6c 20 76  of the literal v
0880: 61 6c 75 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  alues written.**
0890: 20 69 6e 74 6f 20 74 68 65 20 73 71 6c 69 74 65   into the sqlite
08a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 29 0a  _master table.).
08b0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 66 6f 72 65 2c  **.** Therefore,
08c0: 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65   the P4 paramete
08d0: 72 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  r is only requir
08e0: 65 64 20 69 66 20 74 68 65 20 64 65 66 61 75 6c  ed if the defaul
08f0: 74 20 76 61 6c 75 65 20 66 6f 72 0a 2a 2a 20 74  t value for.** t
0900: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 61 20 6c  he column is a l
0910: 69 74 65 72 61 6c 20 6e 75 6d 62 65 72 2c 20 73  iteral number, s
0920: 74 72 69 6e 67 20 6f 72 20 6e 75 6c 6c 2e 20 54  tring or null. T
0930: 68 65 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  he sqlite3ValueF
0940: 72 6f 6d 45 78 70 72 28 29 0a 2a 2a 20 66 75 6e  romExpr().** fun
0950: 63 74 69 6f 6e 20 69 73 20 63 61 70 61 62 6c 65  ction is capable
0960: 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67   of transforming
0970: 20 74 68 65 73 65 20 74 79 70 65 73 20 6f 66 20   these types of 
0980: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 74 6f  expressions into
0990: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  .** sqlite3_valu
09a0: 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a  e objects..**.**
09b0: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 52   If parameter iR
09c0: 65 67 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  eg is not negati
09d0: 76 65 2c 20 63 6f 64 65 20 61 6e 20 4f 50 5f 52  ve, code an OP_R
09e0: 65 61 6c 41 66 66 69 6e 69 74 79 20 69 6e 73 74  ealAffinity inst
09f0: 72 75 63 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 72 65  ruction.** on re
0a00: 67 69 73 74 65 72 20 69 52 65 67 2e 20 54 68 69  gister iReg. Thi
0a10: 73 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 61  s is used when a
0a20: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 74  n equivalent int
0a30: 65 67 65 72 20 76 61 6c 75 65 20 69 73 20 0a 2a  eger value is .*
0a40: 2a 20 73 74 6f 72 65 64 20 69 6e 20 70 6c 61 63  * stored in plac
0a50: 65 20 6f 66 20 61 6e 20 38 2d 62 79 74 65 20 66  e of an 8-byte f
0a60: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
0a70: 6c 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  lue in order to 
0a80: 73 61 76 65 20 0a 2a 2a 20 73 70 61 63 65 2e 0a  save .** space..
0a90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
0aa0: 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 56 64 62  olumnDefault(Vdb
0ab0: 65 20 2a 76 2c 20 54 61 62 6c 65 20 2a 70 54 61  e *v, Table *pTa
0ac0: 62 2c 20 69 6e 74 20 69 2c 20 69 6e 74 20 69 52  b, int i, int iR
0ad0: 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  eg){.  assert( p
0ae0: 54 61 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Tab!=0 );.  if( 
0af0: 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29  !pTab->pSelect )
0b00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
0b10: 6c 75 65 20 2a 70 56 61 6c 75 65 20 3d 20 30 3b  lue *pValue = 0;
0b20: 0a 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e  .    u8 enc = EN
0b30: 43 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  C(sqlite3VdbeDb(
0b40: 76 29 29 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  v));.    Column 
0b50: 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61  *pCol = &pTab->a
0b60: 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 56 64 62 65  Col[i];.    Vdbe
0b70: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
0b80: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
0b90: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 29 3b  , pCol->zName));
0ba0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70  .    assert( i<p
0bb0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0bc0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f   sqlite3ValueFro
0bd0: 6d 45 78 70 72 28 73 71 6c 69 74 65 33 56 64 62  mExpr(sqlite3Vdb
0be0: 65 44 62 28 76 29 2c 20 70 43 6f 6c 2d 3e 70 44  eDb(v), pCol->pD
0bf0: 66 6c 74 2c 20 65 6e 63 2c 20 0a 20 20 20 20 20  flt, enc, .     
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c10: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
0c20: 74 79 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20 20  ty, &pValue);.  
0c30: 20 20 69 66 28 20 70 56 61 6c 75 65 20 29 7b 0a    if( pValue ){.
0c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
0c50: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 56 61  eAppendP4(v, pVa
0c60: 6c 75 65 2c 20 50 34 5f 4d 45 4d 29 3b 0a 20 20  lue, P4_MEM);.  
0c70: 20 20 7d 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20    }.  }.#ifndef 
0c80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
0c90: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 69 66 28  TING_POINT.  if(
0ca0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 61   pTab->aCol[i].a
0cb0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
0cc0: 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20  AFF_REAL ){.    
0cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0ce0: 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  1(v, OP_RealAffi
0cf0: 6e 69 74 79 2c 20 69 52 65 67 29 3b 0a 20 20 7d  nity, iReg);.  }
0d00: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
0d10: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
0d20: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20   column iCol of 
0d30: 69 6e 64 65 78 20 70 49 64 78 20 72 65 66 65 72  index pIdx refer
0d40: 65 6e 63 65 73 20 61 6e 79 20 6f 66 20 74 68 65  ences any of the
0d50: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 64 65 66 69  .** columns defi
0d60: 6e 65 64 20 62 79 20 61 58 52 65 66 20 61 6e 64  ned by aXRef and
0d70: 20 63 68 6e 67 52 6f 77 69 64 2e 20 20 52 65 74   chngRowid.  Ret
0d80: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64  urn true if it d
0d90: 6f 65 73 0a 2a 2a 20 61 6e 64 20 66 61 6c 73 65  oes.** and false
0da0: 20 69 66 20 6e 6f 74 2e 20 20 54 68 69 73 20 69   if not.  This i
0db0: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
0dc0: 6e 2e 20 20 46 61 6c 73 65 2d 70 6f 73 69 74 69  n.  False-positi
0dd0: 76 65 73 20 61 72 65 20 61 0a 2a 2a 20 70 65 72  ves are a.** per
0de0: 66 6f 72 6d 61 6e 63 65 20 64 65 67 72 61 64 61  formance degrada
0df0: 74 69 6f 6e 2c 20 62 75 74 20 66 61 6c 73 65 2d  tion, but false-
0e00: 6e 65 67 61 74 69 76 65 73 20 63 61 6e 20 72 65  negatives can re
0e10: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 72 75 70  sult in a corrup
0e20: 74 0a 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 69  t.** index and i
0e30: 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 73  ncorrect answers
0e40: 2e 0a 2a 2a 0a 2a 2a 20 61 58 52 65 66 5b 6a 5d  ..**.** aXRef[j]
0e50: 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 6e 65 67   will be non-neg
0e60: 61 74 69 76 65 20 69 66 20 63 6f 6c 75 6d 6e 20  ative if column 
0e70: 6a 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  j of the origina
0e80: 6c 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 62 65  l table is.** be
0e90: 69 6e 67 20 75 70 64 61 74 65 64 2e 20 20 63 68  ing updated.  ch
0ea0: 6e 67 52 6f 77 69 64 20 77 69 6c 6c 20 62 65 20  ngRowid will be 
0eb0: 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77 69  true if the rowi
0ec0: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  d of the table i
0ed0: 73 0a 2a 2a 20 62 65 69 6e 67 20 75 70 64 61 74  s.** being updat
0ee0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
0ef0: 74 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 49 73 42  t indexColumnIsB
0f00: 65 69 6e 67 55 70 64 61 74 65 64 28 0a 20 20 49  eingUpdated(.  I
0f10: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
0f20: 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
0f30: 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
0f40: 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a  iCol,         /*
0f50: 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   Which column of
0f60: 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 68   the index to ch
0f70: 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 58  eck */.  int *aX
0f80: 52 65 66 2c 20 20 20 20 20 20 20 2f 2a 20 61 58  Ref,       /* aX
0f90: 52 65 66 5b 6a 5d 3e 3d 30 20 69 66 20 63 6f 6c  Ref[j]>=0 if col
0fa0: 75 6d 6e 20 6a 20 69 73 20 62 65 69 6e 67 20 75  umn j is being u
0fb0: 70 64 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  pdated */.  int 
0fc0: 63 68 6e 67 52 6f 77 69 64 20 20 20 20 20 2f 2a  chngRowid     /*
0fd0: 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77   true if the row
0fe0: 69 64 20 69 73 20 62 65 69 6e 67 20 75 70 64 61  id is being upda
0ff0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 31 36 20  ted */.){.  i16 
1000: 69 49 64 78 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  iIdxCol = pIdx->
1010: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a  aiColumn[iCol];.
1020: 20 20 61 73 73 65 72 74 28 20 69 49 64 78 43 6f    assert( iIdxCo
1030: 6c 21 3d 58 4e 5f 52 4f 57 49 44 20 29 3b 20 2f  l!=XN_ROWID ); /
1040: 2a 20 43 61 6e 6e 6f 74 20 69 6e 64 65 78 20 72  * Cannot index r
1050: 6f 77 69 64 20 2a 2f 0a 20 20 69 66 28 20 69 49  owid */.  if( iI
1060: 64 78 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20  dxCol>=0 ){.    
1070: 72 65 74 75 72 6e 20 61 58 52 65 66 5b 69 49 64  return aXRef[iId
1080: 78 43 6f 6c 5d 3e 3d 30 3b 0a 20 20 7d 0a 20 20  xCol]>=0;.  }.  
1090: 61 73 73 65 72 74 28 20 69 49 64 78 43 6f 6c 3d  assert( iIdxCol=
10a0: 3d 58 4e 5f 45 58 50 52 20 29 3b 0a 20 20 61 73  =XN_EXPR );.  as
10b0: 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c  sert( pIdx->aCol
10c0: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  Expr!=0 );.  ass
10d0: 65 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45  ert( pIdx->aColE
10e0: 78 70 72 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  xpr->a[iCol].pEx
10f0: 70 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  pr!=0 );.  retur
1100: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 66  n sqlite3ExprRef
1110: 65 72 65 6e 63 65 73 55 70 64 61 74 65 64 43 6f  erencesUpdatedCo
1120: 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 43 6f 6c 45  lumn(pIdx->aColE
1130: 78 70 72 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  xpr->a[iCol].pEx
1140: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1170: 61 58 52 65 66 2c 63 68 6e 67 52 6f 77 69 64 29  aXRef,chngRowid)
1180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
1190: 20 74 6f 20 73 65 65 20 69 66 20 69 6e 64 65 78   to see if index
11a0: 20 70 49 64 78 20 69 73 20 61 20 70 61 72 74 69   pIdx is a parti
11b0: 61 6c 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63  al index whose c
11c0: 6f 6e 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 65 78  onditional.** ex
11d0: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 63  pression might c
11e0: 68 61 6e 67 65 20 76 61 6c 75 65 73 20 64 75 65  hange values due
11f0: 20 74 6f 20 61 6e 20 55 50 44 41 54 45 2e 20 20   to an UPDATE.  
1200: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 0a 2a  Return true if.*
1210: 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 73  * the index is s
1220: 75 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67 65  ubject to change
1230: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
1240: 65 20 69 6e 64 65 78 20 69 73 20 67 75 61 72 61  e index is guara
1250: 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75  nteed.** to be u
1260: 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 69 73 20  nchanged.  This 
1270: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
1280: 6f 6e 2e 20 20 46 61 6c 73 65 2d 70 6f 73 69 74  on.  False-posit
1290: 69 76 65 73 20 61 72 65 20 61 0a 2a 2a 20 70 65  ives are a.** pe
12a0: 72 66 6f 72 6d 61 6e 63 65 20 64 65 67 72 61 64  rformance degrad
12b0: 61 74 69 6f 6e 2c 20 62 75 74 20 66 61 6c 73 65  ation, but false
12c0: 2d 6e 65 67 61 74 69 76 65 73 20 63 61 6e 20 72  -negatives can r
12d0: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 72 75  esult in a corru
12e0: 70 74 0a 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20  pt.** index and 
12f0: 69 6e 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  incorrect answer
1300: 73 2e 0a 2a 2a 0a 2a 2a 20 61 58 52 65 66 5b 6a  s..**.** aXRef[j
1310: 5d 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 6e 65  ] will be non-ne
1320: 67 61 74 69 76 65 20 69 66 20 63 6f 6c 75 6d 6e  gative if column
1330: 20 6a 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e   j of the origin
1340: 61 6c 20 74 61 62 6c 65 20 69 73 0a 2a 2a 20 62  al table is.** b
1350: 65 69 6e 67 20 75 70 64 61 74 65 64 2e 20 20 63  eing updated.  c
1360: 68 6e 67 52 6f 77 69 64 20 77 69 6c 6c 20 62 65  hngRowid will be
1370: 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f 77   true if the row
1380: 69 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  id of the table 
1390: 69 73 0a 2a 2a 20 62 65 69 6e 67 20 75 70 64 61  is.** being upda
13a0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
13b0: 6e 74 20 69 6e 64 65 78 57 68 65 72 65 43 6c 61  nt indexWhereCla
13c0: 75 73 65 4d 69 67 68 74 43 68 61 6e 67 65 28 0a  useMightChange(.
13d0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
13e0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
13f0: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
1400: 6e 74 20 2a 61 58 52 65 66 2c 20 20 20 20 20 20  nt *aXRef,      
1410: 20 2f 2a 20 61 58 52 65 66 5b 6a 5d 3e 3d 30 20   /* aXRef[j]>=0 
1420: 69 66 20 63 6f 6c 75 6d 6e 20 6a 20 69 73 20 62  if column j is b
1430: 65 69 6e 67 20 75 70 64 61 74 65 64 20 2a 2f 0a  eing updated */.
1440: 20 20 69 6e 74 20 63 68 6e 67 52 6f 77 69 64 20    int chngRowid 
1450: 20 20 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74      /* true if t
1460: 68 65 20 72 6f 77 69 64 20 69 73 20 62 65 69 6e  he rowid is bein
1470: 67 20 75 70 64 61 74 65 64 20 2a 2f 0a 29 7b 0a  g updated */.){.
1480: 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72    if( pIdx->pPar
1490: 74 49 64 78 57 68 65 72 65 3d 3d 30 20 29 20 72  tIdxWhere==0 ) r
14a0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
14b0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 66  n sqlite3ExprRef
14c0: 65 72 65 6e 63 65 73 55 70 64 61 74 65 64 43 6f  erencesUpdatedCo
14d0: 6c 75 6d 6e 28 70 49 64 78 2d 3e 70 50 61 72 74  lumn(pIdx->pPart
14e0: 49 64 78 57 68 65 72 65 2c 0a 20 20 20 20 20 20  IdxWhere,.      
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 20 20 20 61 58 52 65 66 2c 20 63 68 6e        aXRef, chn
1520: 67 52 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gRowid);.}../*.*
1530: 2a 20 50 72 6f 63 65 73 73 20 61 6e 20 55 50 44  * Process an UPD
1540: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ATE statement..*
1550: 2a 0a 2a 2a 20 20 20 55 50 44 41 54 45 20 4f 52  *.**   UPDATE OR
1560: 20 49 47 4e 4f 52 45 20 74 61 62 6c 65 5f 77 78   IGNORE table_wx
1570: 79 7a 20 53 45 54 20 61 3d 62 2c 20 63 3d 64 20  yz SET a=b, c=d 
1580: 57 48 45 52 45 20 65 3c 35 20 41 4e 44 20 66 20  WHERE e<5 AND f 
1590: 4e 4f 54 20 4e 55 4c 4c 3b 0a 2a 2a 20 20 20 20  NOT NULL;.**    
15a0: 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 2f 20        \_______/ 
15b0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
15c0: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 5c 5f  ______/       \_
15d0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
15e0: 0a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e  .*            on
15f0: 45 72 72 6f 72 20 20 20 70 54 61 62 4c 69 73 74  Error   pTabList
1600: 20 20 20 20 20 20 70 43 68 61 6e 67 65 73 20 20        pChanges  
1610: 20 20 20 20 20 20 20 20 20 20 20 70 57 68 65 72             pWher
1620: 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  e.*/.void sqlite
1630: 33 55 70 64 61 74 65 28 0a 20 20 50 61 72 73 65  3Update(.  Parse
1640: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1650: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1660: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
1670: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
1680: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1690: 20 69 6e 20 77 68 69 63 68 20 77 65 20 73 68 6f   in which we sho
16a0: 75 6c 64 20 63 68 61 6e 67 65 20 74 68 69 6e 67  uld change thing
16b0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
16c0: 2a 70 43 68 61 6e 67 65 73 2c 20 20 20 20 2f 2a  *pChanges,    /*
16d0: 20 54 68 69 6e 67 73 20 74 6f 20 62 65 20 63 68   Things to be ch
16e0: 61 6e 67 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  anged */.  Expr 
16f0: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
1700: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1710: 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 6e  lause.  May be n
1720: 75 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ull */.  int onE
1730: 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rror,           
1740: 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65  /* How to handle
1750: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f   constraint erro
1760: 72 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  rs */.  ExprList
1770: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f   *pOrderBy,    /
1780: 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
1790: 65 2e 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a  e. May be null *
17a0: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
17b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  ,          /* LI
17c0: 4d 49 54 20 63 6c 61 75 73 65 2e 20 4d 61 79 20  MIT clause. May 
17d0: 62 65 20 6e 75 6c 6c 20 2a 2f 0a 20 20 55 70 73  be null */.  Ups
17e0: 65 72 74 20 2a 70 55 70 73 65 72 74 20 20 20 20  ert *pUpsert    
17f0: 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49      /* ON CONFLI
1800: 43 54 20 63 6c 61 75 73 65 2c 20 6f 72 20 6e 75  CT clause, or nu
1810: 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ll */.){.  int i
1820: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
1830: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1840: 72 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  rs */.  Table *p
1850: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Tab;           /
1860: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
1870: 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 69  e updated */.  i
1880: 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 30 3b 20  nt addrTop = 0; 
1890: 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 69 6e        /* VDBE in
18a0: 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73  struction addres
18b0: 73 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f  s of the start o
18c0: 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
18d0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
18e0: 6f 3b 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o;     /* Inform
18f0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1900: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1910: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
1920: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1930: 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
1940: 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 49 6e 64   engine */.  Ind
1950: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
1960: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1970: 6e 67 20 6f 76 65 72 20 69 6e 64 69 63 65 73 20  ng over indices 
1980: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b  */.  Index *pPk;
1990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19a0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
19b0: 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54  ndex for WITHOUT
19c0: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
19d0: 0a 20 20 69 6e 74 20 6e 49 64 78 3b 20 20 20 20  .  int nIdx;    
19e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19f0: 62 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20 74  ber of indices t
1a00: 68 61 74 20 6e 65 65 64 20 75 70 64 61 74 69 6e  hat need updatin
1a10: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 49  g */.  int nAllI
1a20: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dx;           /*
1a30: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1a40: 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e   indexes */.  in
1a50: 74 20 69 42 61 73 65 43 75 72 3b 20 20 20 20 20  t iBaseCur;     
1a60: 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63 75 72       /* Base cur
1a70: 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  sor number */.  
1a80: 69 6e 74 20 69 44 61 74 61 43 75 72 3b 20 20 20  int iDataCur;   
1a90: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
1aa0: 20 66 6f 72 20 74 68 65 20 63 61 6e 6f 6e 69 63   for the canonic
1ab0: 61 6c 20 64 61 74 61 20 62 74 72 65 65 20 2a 2f  al data btree */
1ac0: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20  .  int iIdxCur; 
1ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1ae0: 73 6f 72 20 66 6f 72 20 74 68 65 20 66 69 72 73  sor for the firs
1af0: 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c  t index */.  sql
1b00: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
1b10: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1b20: 61 73 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ase structure */
1b30: 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64 78 20  .  int *aRegIdx 
1b40: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 52 65 67  = 0;      /* Reg
1b50: 69 73 74 65 72 73 20 66 6f 72 20 74 6f 20 65 61  isters for to ea
1b60: 63 68 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65  ch index and the
1b70: 20 6d 61 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20   main table */. 
1b80: 20 69 6e 74 20 2a 61 58 52 65 66 20 3d 20 30 3b   int *aXRef = 0;
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 61 58 52 65 66          /* aXRef
1ba0: 5b 69 5d 20 69 73 20 74 68 65 20 69 6e 64 65 78  [i] is the index
1bb0: 20 69 6e 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b   in pChanges->a[
1bc0: 5d 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  ] of the.       
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 20 2a 2a 20 61 6e 20 65 78 70 72 65 73 73 69    ** an expressi
1bf0: 6f 6e 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20  on for the i-th 
1c00: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
1c10: 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ble..           
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1c30: 20 61 58 52 65 66 5b 69 5d 3d 3d 2d 31 20 69 66   aXRef[i]==-1 if
1c40: 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   the i-th column
1c50: 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2e   is not changed.
1c60: 20 2a 2f 0a 20 20 75 38 20 2a 61 54 6f 4f 70 65   */.  u8 *aToOpe
1c70: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
1c80: 31 20 66 6f 72 20 74 61 62 6c 65 73 20 61 6e 64  1 for tables and
1c90: 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 6f   indices to be o
1ca0: 70 65 6e 65 64 20 2a 2f 0a 20 20 75 38 20 63 68  pened */.  u8 ch
1cb0: 6e 67 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20  ngPk;           
1cc0: 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    /* PRIMARY KEY
1cd0: 20 63 68 61 6e 67 65 64 20 69 6e 20 61 20 57 49   changed in a WI
1ce0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1cf0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 6e 67 52 6f  e */.  u8 chngRo
1d00: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  wid;          /*
1d10: 20 52 6f 77 69 64 20 63 68 61 6e 67 65 64 20 69   Rowid changed i
1d20: 6e 20 61 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65  n a normal table
1d30: 20 2a 2f 0a 20 20 75 38 20 63 68 6e 67 4b 65 79   */.  u8 chngKey
1d40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1d50: 45 69 74 68 65 72 20 63 68 6e 67 50 6b 20 6f 72  Either chngPk or
1d60: 20 63 68 6e 67 52 6f 77 69 64 20 2a 2f 0a 20 20   chngRowid */.  
1d70: 45 78 70 72 20 2a 70 52 6f 77 69 64 45 78 70 72  Expr *pRowidExpr
1d80: 20 3d 20 30 3b 20 20 2f 2a 20 45 78 70 72 65 73   = 0;  /* Expres
1d90: 73 69 6f 6e 20 64 65 66 69 6e 69 6e 67 20 74 68  sion defining th
1da0: 65 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d  e new record num
1db0: 62 65 72 20 2a 2f 0a 20 20 41 75 74 68 43 6f 6e  ber */.  AuthCon
1dc0: 74 65 78 74 20 73 43 6f 6e 74 65 78 74 3b 20 20  text sContext;  
1dd0: 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  /* The authoriza
1de0: 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  tion context */.
1df0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
1e00: 43 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C;       /* The 
1e10: 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20  name-context to 
1e20: 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69  resolve expressi
1e30: 6f 6e 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  ons in */.  int 
1e40: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
1e50: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1e60: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
1e70: 62 6c 65 20 62 65 69 6e 67 20 75 70 64 61 74 65  ble being update
1e80: 64 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 6e 65 50  d */.  int eOneP
1e90: 61 73 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ass;          /*
1ea0: 20 4f 4e 45 50 41 53 53 5f 58 58 58 20 76 61 6c   ONEPASS_XXX val
1eb0: 75 65 20 66 72 6f 6d 20 77 68 65 72 65 2e 63 20  ue from where.c 
1ec0: 2a 2f 0a 20 20 69 6e 74 20 68 61 73 46 4b 3b 20  */.  int hasFK; 
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ee0: 72 75 65 20 69 66 20 66 6f 72 65 69 67 6e 20 6b  rue if foreign k
1ef0: 65 79 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ey processing is
1f00: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
1f10: 6e 74 20 6c 61 62 65 6c 42 72 65 61 6b 3b 20 20  nt labelBreak;  
1f20: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
1f30: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
1f40: 6f 66 20 55 50 44 41 54 45 20 6c 6f 6f 70 20 2a  of UPDATE loop *
1f50: 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6f 6e  /.  int labelCon
1f60: 74 69 6e 75 65 3b 20 20 20 20 20 2f 2a 20 4a 75  tinue;     /* Ju
1f70: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
1f80: 6e 75 65 20 6e 65 78 74 20 73 74 65 70 20 6f 66  nue next step of
1f90: 20 55 50 44 41 54 45 20 6c 6f 6f 70 20 2a 2f 0a   UPDATE loop */.
1fa0: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
1fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1fc0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 57 68 65  s for sqlite3Whe
1fd0: 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 0a 23 69  reBegin() */..#i
1fe0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ff0: 54 5f 54 52 49 47 47 45 52 0a 20 20 69 6e 74 20  T_TRIGGER.  int 
2000: 69 73 56 69 65 77 3b 20 20 20 20 20 20 20 20 20  isView;         
2010: 20 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20     /* True when 
2020: 75 70 64 61 74 69 6e 67 20 61 20 76 69 65 77 20  updating a view 
2030: 28 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67  (INSTEAD OF trig
2040: 67 65 72 29 20 2a 2f 0a 20 20 54 72 69 67 67 65  ger) */.  Trigge
2050: 72 20 2a 70 54 72 69 67 67 65 72 3b 20 20 20 20  r *pTrigger;    
2060: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 72 69 67   /* List of trig
2070: 67 65 72 73 20 6f 6e 20 70 54 61 62 2c 20 69 66  gers on pTab, if
2080: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
2090: 6e 74 20 74 6d 61 73 6b 3b 20 20 20 20 20 20 20  nt tmask;       
20a0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
20b0: 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 7c   TRIGGER_BEFORE|
20c0: 54 52 49 47 47 45 52 5f 41 46 54 45 52 20 2a 2f  TRIGGER_AFTER */
20d0: 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 65  .#endif.  int ne
20e0: 77 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  wmask;          
20f0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4e 45 57 2e   /* Mask of NEW.
2100: 2a 20 63 6f 6c 75 6d 6e 73 20 61 63 63 65 73 73  * columns access
2110: 65 64 20 62 79 20 42 45 46 4f 52 45 20 74 72 69  ed by BEFORE tri
2120: 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ggers */.  int i
2130: 45 70 68 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Eph = 0;        
2140: 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c 20 74    /* Ephemeral t
2150: 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  able holding all
2160: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c   primary key val
2170: 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  ues */.  int nKe
2180: 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
2190: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
21a0: 6d 65 6e 74 73 20 69 6e 20 72 65 67 4b 65 79 20  ments in regKey 
21b0: 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
21c0: 44 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 75 72  D */.  int aiCur
21d0: 4f 6e 65 50 61 73 73 5b 32 5d 3b 20 20 20 2f 2a  OnePass[2];   /*
21e0: 20 54 68 65 20 77 72 69 74 65 20 63 75 72 73 6f   The write curso
21f0: 72 73 20 6f 70 65 6e 65 64 20 62 79 20 57 48 45  rs opened by WHE
2200: 52 45 5f 4f 4e 45 50 41 53 53 20 2a 2f 0a 20 20  RE_ONEPASS */.  
2210: 69 6e 74 20 61 64 64 72 4f 70 65 6e 20 3d 20 30  int addrOpen = 0
2220: 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
2230: 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
2240: 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  meral */.  int i
2250: 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pk = 0;         
2260: 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 6e 50    /* First of nP
2270: 6b 20 63 65 6c 6c 73 20 68 6f 6c 64 69 6e 67 20  k cells holding 
2280: 50 52 49 4d 41 52 59 20 4b 45 59 20 76 61 6c 75  PRIMARY KEY valu
2290: 65 20 2a 2f 0a 20 20 69 31 36 20 6e 50 6b 20 3d  e */.  i16 nPk =
22a0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
22b0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 70 6f   Number of compo
22c0: 6e 65 6e 74 73 20 6f 66 20 74 68 65 20 50 52 49  nents of the PRI
22d0: 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 69 6e  MARY KEY */.  in
22e0: 74 20 62 52 65 70 6c 61 63 65 20 3d 20 30 3b 20  t bReplace = 0; 
22f0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2300: 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74  REPLACE conflict
2310: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 6d 69 67 68   resolution migh
2320: 74 20 68 61 70 70 65 6e 20 2a 2f 0a 0a 20 20 2f  t happen */..  /
2330: 2a 20 52 65 67 69 73 74 65 72 20 41 6c 6c 6f 63  * Register Alloc
2340: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ations */.  int 
2350: 72 65 67 52 6f 77 43 6f 75 6e 74 20 3d 20 30 3b  regRowCount = 0;
2360: 20 20 20 2f 2a 20 41 20 63 6f 75 6e 74 20 6f 66     /* A count of
2370: 20 72 6f 77 73 20 63 68 61 6e 67 65 64 20 2a 2f   rows changed */
2380: 0a 20 20 69 6e 74 20 72 65 67 4f 6c 64 52 6f 77  .  int regOldRow
2390: 69 64 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  id = 0;   /* The
23a0: 20 6f 6c 64 20 72 6f 77 69 64 20 2a 2f 0a 20 20   old rowid */.  
23b0: 69 6e 74 20 72 65 67 4e 65 77 52 6f 77 69 64 20  int regNewRowid 
23c0: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 6e 65  = 0;   /* The ne
23d0: 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74  w rowid */.  int
23e0: 20 72 65 67 4e 65 77 20 3d 20 30 3b 20 20 20 20   regNew = 0;    
23f0: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
2400: 66 20 74 68 65 20 4e 45 57 2e 2a 20 74 61 62 6c  f the NEW.* tabl
2410: 65 20 69 6e 20 74 72 69 67 67 65 72 73 20 2a 2f  e in triggers */
2420: 0a 20 20 69 6e 74 20 72 65 67 4f 6c 64 20 3d 20  .  int regOld = 
2430: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  0;        /* Con
2440: 74 65 6e 74 20 6f 66 20 4f 4c 44 2e 2a 20 74 61  tent of OLD.* ta
2450: 62 6c 65 20 69 6e 20 74 72 69 67 67 65 72 73 20  ble in triggers 
2460: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 53  */.  int regRowS
2470: 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 52  et = 0;     /* R
2480: 6f 77 73 65 74 20 6f 66 20 72 6f 77 73 20 74 6f  owset of rows to
2490: 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20   be updated */. 
24a0: 20 69 6e 74 20 72 65 67 4b 65 79 20 3d 20 30 3b   int regKey = 0;
24b0: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 6f          /* compo
24c0: 73 69 74 65 20 50 52 49 4d 41 52 59 20 4b 45 59  site PRIMARY KEY
24d0: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6d 65 6d   value */..  mem
24e0: 73 65 74 28 26 73 43 6f 6e 74 65 78 74 2c 20 30  set(&sContext, 0
24f0: 2c 20 73 69 7a 65 6f 66 28 73 43 6f 6e 74 65 78  , sizeof(sContex
2500: 74 29 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  t));.  db = pPar
2510: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50  se->db;.  if( pP
2520: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
2530: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2540: 7b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74  {.    goto updat
2550: 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
2560: 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73   assert( pTabLis
2570: 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 0a 20  t->nSrc==1 );.. 
2580: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74   /* Locate the t
2590: 61 62 6c 65 20 77 68 69 63 68 20 77 65 20 77 61  able which we wa
25a0: 6e 74 20 74 6f 20 75 70 64 61 74 65 2e 20 0a 20  nt to update. . 
25b0: 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   */.  pTab = sql
25c0: 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
25d0: 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  p(pParse, pTabLi
25e0: 73 74 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  st);.  if( pTab=
25f0: 3d 30 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65  =0 ) goto update
2600: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 44 62 20  _cleanup;.  iDb 
2610: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2620: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
2630: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
2640: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
2650: 6f 75 74 20 69 66 20 77 65 20 68 61 76 65 20 61  out if we have a
2660: 6e 79 20 74 72 69 67 67 65 72 73 20 61 6e 64 20  ny triggers and 
2670: 69 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  if the table bei
2680: 6e 67 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  ng.  ** updated 
2690: 69 73 20 61 20 76 69 65 77 2e 0a 20 20 2a 2f 0a  is a view..  */.
26a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26b0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 70 54  MIT_TRIGGER.  pT
26c0: 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33  rigger = sqlite3
26d0: 54 72 69 67 67 65 72 73 45 78 69 73 74 28 70 50  TriggersExist(pP
26e0: 61 72 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f 55  arse, pTab, TK_U
26f0: 50 44 41 54 45 2c 20 70 43 68 61 6e 67 65 73 2c  PDATE, pChanges,
2700: 20 26 74 6d 61 73 6b 29 3b 0a 20 20 69 73 56 69   &tmask);.  isVi
2710: 65 77 20 3d 20 70 54 61 62 2d 3e 70 53 65 6c 65  ew = pTab->pSele
2720: 63 74 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28  ct!=0;.  assert(
2730: 20 70 54 72 69 67 67 65 72 20 7c 7c 20 74 6d 61   pTrigger || tma
2740: 73 6b 3d 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 23  sk==0 );.#else.#
2750: 20 64 65 66 69 6e 65 20 70 54 72 69 67 67 65 72   define pTrigger
2760: 20 30 0a 23 20 64 65 66 69 6e 65 20 69 73 56 69   0.# define isVi
2770: 65 77 20 30 0a 23 20 64 65 66 69 6e 65 20 74 6d  ew 0.# define tm
2780: 61 73 6b 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ask 0.#endif.#if
2790: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27a0: 56 49 45 57 0a 23 20 75 6e 64 65 66 20 69 73 56  VIEW.# undef isV
27b0: 69 65 77 0a 23 20 64 65 66 69 6e 65 20 69 73 56  iew.# define isV
27c0: 69 65 77 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69  iew 0.#endif..#i
27d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
27e0: 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45  LE_UPDATE_DELETE
27f0: 5f 4c 49 4d 49 54 0a 20 20 69 66 28 20 21 69 73  _LIMIT.  if( !is
2800: 56 69 65 77 20 29 7b 0a 20 20 20 20 70 57 68 65  View ){.    pWhe
2810: 72 65 20 3d 20 73 71 6c 69 74 65 33 4c 69 6d 69  re = sqlite3Limi
2820: 74 57 68 65 72 65 28 0a 20 20 20 20 20 20 20 20  tWhere(.        
2830: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2840: 2c 20 70 57 68 65 72 65 2c 20 70 4f 72 64 65 72  , pWhere, pOrder
2850: 42 79 2c 20 70 4c 69 6d 69 74 2c 20 22 55 50 44  By, pLimit, "UPD
2860: 41 54 45 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  ATE".    );.    
2870: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2880: 20 20 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20    pLimit = 0;.  
2890: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
28a0: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
28b0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
28c0: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
28d0: 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e  oto update_clean
28e0: 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  up;.  }.  if( sq
28f0: 6c 69 74 65 33 49 73 52 65 61 64 4f 6e 6c 79 28  lite3IsReadOnly(
2900: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 74 6d  pParse, pTab, tm
2910: 61 73 6b 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ask) ){.    goto
2920: 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b   update_cleanup;
2930: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
2940: 61 74 65 20 61 20 63 75 72 73 6f 72 73 20 66 6f  ate a cursors fo
2950: 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
2960: 61 73 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f  ase table and fo
2970: 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 0a 20  r all indices.. 
2980: 20 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 63 75   ** The index cu
2990: 72 73 6f 72 73 20 6d 69 67 68 74 20 6e 6f 74 20  rsors might not 
29a0: 62 65 20 75 73 65 64 2c 20 62 75 74 20 69 66 20  be used, but if 
29b0: 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74 68  they are used th
29c0: 65 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  ey.  ** need to 
29d0: 6f 63 63 75 72 20 72 69 67 68 74 20 61 66 74 65  occur right afte
29e0: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  r the database c
29f0: 75 72 73 6f 72 2e 20 20 53 6f 20 67 6f 20 61 68  ursor.  So go ah
2a00: 65 61 64 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  ead and.  ** all
2a10: 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 73 70 61  ocate enough spa
2a20: 63 65 2c 20 6a 75 73 74 20 69 6e 20 63 61 73 65  ce, just in case
2a30: 2e 0a 20 20 2a 2f 0a 20 20 69 42 61 73 65 43 75  ..  */.  iBaseCu
2a40: 72 20 3d 20 69 44 61 74 61 43 75 72 20 3d 20 70  r = iDataCur = p
2a50: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2a60: 20 69 49 64 78 43 75 72 20 3d 20 69 44 61 74 61   iIdxCur = iData
2a70: 43 75 72 2b 31 3b 0a 20 20 70 50 6b 20 3d 20 48  Cur+1;.  pPk = H
2a80: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 3f 20  asRowid(pTab) ? 
2a90: 30 20 3a 20 73 71 6c 69 74 65 33 50 72 69 6d 61  0 : sqlite3Prima
2aa0: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
2ab0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2ac0: 6b 21 3d 30 20 26 26 20 70 50 6b 21 3d 70 54 61  k!=0 && pPk!=pTa
2ad0: 62 2d 3e 70 49 6e 64 65 78 20 29 3b 0a 20 20 66  b->pIndex );.  f
2ae0: 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49 64 78 3d  or(nIdx=0, pIdx=
2af0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
2b00: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
2b10: 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29 7b 0a 20  Next, nIdx++){. 
2b20: 20 20 20 69 66 28 20 70 50 6b 3d 3d 70 49 64 78     if( pPk==pIdx
2b30: 20 29 7b 0a 20 20 20 20 20 20 69 44 61 74 61 43   ){.      iDataC
2b40: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
2b50: 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  b;.    }.    pPa
2b60: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d  rse->nTab++;.  }
2b70: 0a 20 20 69 66 28 20 70 55 70 73 65 72 74 20 29  .  if( pUpsert )
2b80: 7b 0a 20 20 20 20 2f 2a 20 4f 6e 20 61 6e 20 55  {.    /* On an U
2b90: 50 53 45 52 54 2c 20 72 65 75 73 65 20 74 68 65  PSERT, reuse the
2ba0: 20 73 61 6d 65 20 63 75 72 73 6f 72 73 20 61 6c   same cursors al
2bb0: 72 65 61 64 79 20 6f 70 65 6e 65 64 20 62 79 20  ready opened by 
2bc0: 49 4e 53 45 52 54 20 2a 2f 0a 20 20 20 20 69 44  INSERT */.    iD
2bd0: 61 74 61 43 75 72 20 3d 20 70 55 70 73 65 72 74  ataCur = pUpsert
2be0: 2d 3e 69 44 61 74 61 43 75 72 3b 0a 20 20 20 20  ->iDataCur;.    
2bf0: 69 49 64 78 43 75 72 20 3d 20 70 55 70 73 65 72  iIdxCur = pUpser
2c00: 74 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  t->iIdxCur;.    
2c10: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69  pParse->nTab = i
2c20: 42 61 73 65 43 75 72 3b 0a 20 20 7d 0a 20 20 70  BaseCur;.  }.  p
2c30: 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
2c40: 75 72 73 6f 72 20 3d 20 69 44 61 74 61 43 75 72  ursor = iDataCur
2c50: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
2c60: 20 73 70 61 63 65 20 66 6f 72 20 61 58 52 65 66   space for aXRef
2c70: 5b 5d 2c 20 61 52 65 67 49 64 78 5b 5d 2c 20 61  [], aRegIdx[], a
2c80: 6e 64 20 61 54 6f 4f 70 65 6e 5b 5d 2e 20 20 0a  nd aToOpen[].  .
2c90: 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    ** Initialize 
2ca0: 61 58 52 65 66 5b 5d 20 61 6e 64 20 61 54 6f 4f  aXRef[] and aToO
2cb0: 70 65 6e 5b 5d 20 74 6f 20 74 68 65 69 72 20 64  pen[] to their d
2cc0: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2e 0a 20  efault values.. 
2cd0: 20 2a 2f 0a 20 20 61 58 52 65 66 20 3d 20 73 71   */.  aXRef = sq
2ce0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
2cf0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  NN(db, sizeof(in
2d00: 74 29 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c  t) * (pTab->nCol
2d10: 2b 6e 49 64 78 2b 31 29 20 2b 20 6e 49 64 78 2b  +nIdx+1) + nIdx+
2d20: 32 20 29 3b 0a 20 20 69 66 28 20 61 58 52 65 66  2 );.  if( aXRef
2d30: 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64 61 74  ==0 ) goto updat
2d40: 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 61 52 65  e_cleanup;.  aRe
2d50: 67 49 64 78 20 3d 20 61 58 52 65 66 2b 70 54 61  gIdx = aXRef+pTa
2d60: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 61 54 6f 4f 70  b->nCol;.  aToOp
2d70: 65 6e 20 3d 20 28 75 38 2a 29 28 61 52 65 67 49  en = (u8*)(aRegI
2d80: 64 78 2b 6e 49 64 78 2b 31 29 3b 0a 20 20 6d 65  dx+nIdx+1);.  me
2d90: 6d 73 65 74 28 61 54 6f 4f 70 65 6e 2c 20 31 2c  mset(aToOpen, 1,
2da0: 20 6e 49 64 78 2b 31 29 3b 0a 20 20 61 54 6f 4f   nIdx+1);.  aToO
2db0: 70 65 6e 5b 6e 49 64 78 2b 31 5d 20 3d 20 30 3b  pen[nIdx+1] = 0;
2dc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
2dd0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 20 61  ab->nCol; i++) a
2de0: 58 52 65 66 5b 69 5d 20 3d 20 2d 31 3b 0a 0a 20  XRef[i] = -1;.. 
2df0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2e00: 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20  he name-context 
2e10: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  */.  memset(&sNC
2e20: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
2e30: 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20  );.  sNC.pParse 
2e40: 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e  = pParse;.  sNC.
2e50: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
2e60: 69 73 74 3b 0a 20 20 73 4e 43 2e 75 4e 43 2e 70  ist;.  sNC.uNC.p
2e70: 55 70 73 65 72 74 20 3d 20 70 55 70 73 65 72 74  Upsert = pUpsert
2e80: 3b 0a 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20  ;.  sNC.ncFlags 
2e90: 3d 20 4e 43 5f 55 55 70 73 65 72 74 3b 0a 0a 20  = NC_UUpsert;.. 
2ea0: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
2eb0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20  column names in 
2ec0: 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69  all the expressi
2ed0: 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ons of the.  ** 
2ee0: 6f 66 20 74 68 65 20 55 50 44 41 54 45 20 73 74  of the UPDATE st
2ef0: 61 74 65 6d 65 6e 74 2e 20 20 41 6c 73 6f 20 66  atement.  Also f
2f00: 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ind the column i
2f10: 6e 64 65 78 0a 20 20 2a 2a 20 66 6f 72 20 65 61  ndex.  ** for ea
2f20: 63 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  ch column to be 
2f30: 75 70 64 61 74 65 64 20 69 6e 20 74 68 65 20 70  updated in the p
2f40: 43 68 61 6e 67 65 73 20 61 72 72 61 79 2e 20 20  Changes array.  
2f50: 46 6f 72 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f  For each.  ** co
2f60: 6c 75 6d 6e 20 74 6f 20 62 65 20 75 70 64 61 74  lumn to be updat
2f70: 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 77 65  ed, make sure we
2f80: 20 68 61 76 65 20 61 75 74 68 6f 72 69 7a 61 74   have authorizat
2f90: 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 0a 20 20  ion to change.  
2fa0: 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 0a  ** that column..
2fb0: 20 20 2a 2f 0a 20 20 63 68 6e 67 52 6f 77 69 64    */.  chngRowid
2fc0: 20 3d 20 63 68 6e 67 50 6b 20 3d 20 30 3b 0a 20   = chngPk = 0;. 
2fd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 61   for(i=0; i<pCha
2fe0: 6e 67 65 73 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  nges->nExpr; i++
2ff0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
3000: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
3010: 65 73 28 26 73 4e 43 2c 20 70 43 68 61 6e 67 65  es(&sNC, pChange
3020: 73 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  s->a[i].pExpr) )
3030: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 75 70 64  {.      goto upd
3040: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ate_cleanup;.   
3050: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20   }.    for(j=0; 
3060: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
3070: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
3080: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
3090: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
30a0: 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d  , pChanges->a[i]
30b0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
30c0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
30d0: 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
30e0: 20 20 20 20 20 20 63 68 6e 67 52 6f 77 69 64 20        chngRowid 
30f0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
3100: 52 6f 77 69 64 45 78 70 72 20 3d 20 70 43 68 61  RowidExpr = pCha
3110: 6e 67 65 73 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  nges->a[i].pExpr
3120: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
3130: 69 66 28 20 70 50 6b 20 26 26 20 28 70 54 61 62  if( pPk && (pTab
3140: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 63 6f 6c 46 6c 61  ->aCol[j].colFla
3150: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49  gs & COLFLAG_PRI
3160: 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MKEY)!=0 ){.    
3170: 20 20 20 20 20 20 63 68 6e 67 50 6b 20 3d 20 31        chngPk = 1
3180: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3190: 20 20 20 20 61 58 52 65 66 5b 6a 5d 20 3d 20 69      aXRef[j] = i
31a0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
31b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
31c0: 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
31d0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  nCol ){.      if
31e0: 28 20 70 50 6b 3d 3d 30 20 26 26 20 73 71 6c 69  ( pPk==0 && sqli
31f0: 74 65 33 49 73 52 6f 77 69 64 28 70 43 68 61 6e  te3IsRowid(pChan
3200: 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ges->a[i].zName)
3210: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   ){.        j = 
3220: 2d 31 3b 0a 20 20 20 20 20 20 20 20 63 68 6e 67  -1;.        chng
3230: 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Rowid = 1;.     
3240: 20 20 20 70 52 6f 77 69 64 45 78 70 72 20 3d 20     pRowidExpr = 
3250: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 70  pChanges->a[i].p
3260: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Expr;.      }els
3270: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
3280: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
3290: 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75  e, "no such colu
32a0: 6d 6e 3a 20 25 73 22 2c 20 70 43 68 61 6e 67 65  mn: %s", pChange
32b0: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  s->a[i].zName);.
32c0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
32d0: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
32e0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 75 70  .        goto up
32f0: 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  date_cleanup;.  
3300: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
3310: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3320: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
3330: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63    {.      int rc
3340: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
3350: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
3360: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 55 50 44  arse, SQLITE_UPD
3370: 41 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ATE, pTab->zName
3380: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 3c                j<
33a0: 30 20 3f 20 22 52 4f 57 49 44 22 20 3a 20 70 54  0 ? "ROWID" : pT
33b0: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
33c0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
33e0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
33f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
3400: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59   rc==SQLITE_DENY
3410: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
3420: 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b   update_cleanup;
3430: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
3440: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 47 4e 4f   rc==SQLITE_IGNO
3450: 52 45 20 29 7b 0a 20 20 20 20 20 20 20 20 61 58  RE ){.        aX
3460: 52 65 66 5b 6a 5d 20 3d 20 2d 31 3b 0a 20 20 20  Ref[j] = -1;.   
3470: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
3480: 66 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  f.  }.  assert( 
3490: 28 63 68 6e 67 52 6f 77 69 64 20 26 20 63 68 6e  (chngRowid & chn
34a0: 67 50 6b 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  gPk)==0 );.  ass
34b0: 65 72 74 28 20 63 68 6e 67 52 6f 77 69 64 3d 3d  ert( chngRowid==
34c0: 30 20 7c 7c 20 63 68 6e 67 52 6f 77 69 64 3d 3d  0 || chngRowid==
34d0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  1 );.  assert( c
34e0: 68 6e 67 50 6b 3d 3d 30 20 7c 7c 20 63 68 6e 67  hngPk==0 || chng
34f0: 50 6b 3d 3d 31 20 29 3b 0a 20 20 63 68 6e 67 4b  Pk==1 );.  chngK
3500: 65 79 20 3d 20 63 68 6e 67 52 6f 77 69 64 20 2b  ey = chngRowid +
3510: 20 63 68 6e 67 50 6b 3b 0a 0a 20 20 2f 2a 20 54   chngPk;..  /* T
3520: 68 65 20 53 45 54 20 65 78 70 72 65 73 73 69 6f  he SET expressio
3530: 6e 73 20 61 72 65 20 6e 6f 74 20 61 63 74 75 61  ns are not actua
3540: 6c 6c 79 20 75 73 65 64 20 69 6e 73 69 64 65 20  lly used inside 
3550: 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20  the WHERE loop. 
3560: 20 0a 20 20 2a 2a 20 53 6f 20 72 65 73 65 74 20   .  ** So reset 
3570: 74 68 65 20 63 6f 6c 55 73 65 64 20 6d 61 73 6b  the colUsed mask
3580: 2e 20 55 6e 6c 65 73 73 20 74 68 69 73 20 69 73  . Unless this is
3590: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
35a0: 2e 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63  . In that.  ** c
35b0: 61 73 65 2c 20 73 65 74 20 61 6c 6c 20 62 69 74  ase, set all bit
35c0: 73 20 6f 66 20 74 68 65 20 63 6f 6c 55 73 65 64  s of the colUsed
35d0: 20 6d 61 73 6b 20 28 74 6f 20 65 6e 73 75 72 65   mask (to ensure
35e0: 20 74 68 61 74 20 74 68 65 20 76 69 72 74 75 61   that the virtua
35f0: 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 6d 70  l.  ** table imp
3600: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 6b 65  lementation make
3610: 73 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 61 76  s all columns av
3620: 61 69 6c 61 62 6c 65 29 2e 0a 20 20 2a 2f 0a 20  ailable)..  */. 
3630: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
3640: 63 6f 6c 55 73 65 64 20 3d 20 49 73 56 69 72 74  colUsed = IsVirt
3650: 75 61 6c 28 70 54 61 62 29 20 3f 20 41 4c 4c 42  ual(pTab) ? ALLB
3660: 49 54 53 20 3a 20 30 3b 0a 0a 20 20 68 61 73 46  ITS : 0;..  hasF
3670: 4b 20 3d 20 73 71 6c 69 74 65 33 46 6b 52 65 71  K = sqlite3FkReq
3680: 75 69 72 65 64 28 70 50 61 72 73 65 2c 20 70 54  uired(pParse, pT
3690: 61 62 2c 20 61 58 52 65 66 2c 20 63 68 6e 67 4b  ab, aXRef, chngK
36a0: 65 79 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65  ey);..  /* There
36b0: 20 69 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e   is one entry in
36c0: 20 74 68 65 20 61 52 65 67 49 64 78 5b 5d 20 61   the aRegIdx[] a
36d0: 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 69 6e  rray for each in
36e0: 64 65 78 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  dex on the table
36f0: 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 70 64 61  .  ** being upda
3700: 74 65 64 2e 20 20 46 69 6c 6c 20 69 6e 20 61 52  ted.  Fill in aR
3710: 65 67 49 64 78 5b 5d 20 77 69 74 68 20 61 20 72  egIdx[] with a r
3720: 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 74  egister number t
3730: 68 61 74 20 77 69 6c 6c 20 68 6f 6c 64 0a 20 20  hat will hold.  
3740: 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 61  ** the key for a
3750: 63 63 65 73 73 69 6e 67 20 65 61 63 68 20 69 6e  ccessing each in
3760: 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  dex..  */.  if( 
3770: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
3780: 61 63 65 20 29 20 62 52 65 70 6c 61 63 65 20 3d  ace ) bReplace =
3790: 20 31 3b 0a 20 20 66 6f 72 28 6e 41 6c 6c 49 64   1;.  for(nAllId
37a0: 78 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  x=0, pIdx=pTab->
37b0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
37c0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
37d0: 6e 41 6c 6c 49 64 78 2b 2b 29 7b 0a 20 20 20 20  nAllIdx++){.    
37e0: 69 6e 74 20 72 65 67 3b 0a 20 20 20 20 69 66 28  int reg;.    if(
37f0: 20 63 68 6e 67 4b 65 79 20 7c 7c 20 68 61 73 46   chngKey || hasF
3800: 4b 3e 31 20 7c 7c 20 70 49 64 78 3d 3d 70 50 6b  K>1 || pIdx==pPk
3810: 0a 20 20 20 20 20 7c 7c 20 69 6e 64 65 78 57 68  .     || indexWh
3820: 65 72 65 43 6c 61 75 73 65 4d 69 67 68 74 43 68  ereClauseMightCh
3830: 61 6e 67 65 28 70 49 64 78 2c 61 58 52 65 66 2c  ange(pIdx,aXRef,
3840: 63 68 6e 67 52 6f 77 69 64 29 0a 20 20 20 20 29  chngRowid).    )
3850: 7b 0a 20 20 20 20 20 20 72 65 67 20 3d 20 2b 2b  {.      reg = ++
3860: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
3870: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
3880: 20 2b 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   += pIdx->nColum
3890: 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  n;.    }else{.  
38a0: 20 20 20 20 72 65 67 20 3d 20 30 3b 0a 20 20 20      reg = 0;.   
38b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
38c0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  dx->nKeyCol; i++
38d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
38e0: 6e 64 65 78 43 6f 6c 75 6d 6e 49 73 42 65 69 6e  ndexColumnIsBein
38f0: 67 55 70 64 61 74 65 64 28 70 49 64 78 2c 20 69  gUpdated(pIdx, i
3900: 2c 20 61 58 52 65 66 2c 20 63 68 6e 67 52 6f 77  , aXRef, chngRow
3910: 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  id) ){.         
3920: 20 72 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d   reg = ++pParse-
3930: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
3940: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
3950: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
3960: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e            if( on
3970: 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
3980: 74 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72  t && pIdx->onErr
3990: 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or==OE_Replace )
39a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 52  {.            bR
39b0: 65 70 6c 61 63 65 20 3d 20 31 3b 0a 20 20 20 20  eplace = 1;.    
39c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
39d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
39e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
39f0: 0a 20 20 20 20 69 66 28 20 72 65 67 3d 3d 30 20  .    if( reg==0 
3a00: 29 20 61 54 6f 4f 70 65 6e 5b 6e 41 6c 6c 49 64  ) aToOpen[nAllId
3a10: 78 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 61 52  x+1] = 0;.    aR
3a20: 65 67 49 64 78 5b 6e 41 6c 6c 49 64 78 5d 20 3d  egIdx[nAllIdx] =
3a30: 20 72 65 67 3b 0a 20 20 7d 0a 20 20 61 52 65 67   reg;.  }.  aReg
3a40: 49 64 78 5b 6e 41 6c 6c 49 64 78 5d 20 3d 20 2b  Idx[nAllIdx] = +
3a50: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
3a60: 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72  /* Register stor
3a70: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 72 65  ing the table re
3a80: 63 6f 72 64 20 2a 2f 0a 20 20 69 66 28 20 62 52  cord */.  if( bR
3a90: 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 2f 2a  eplace ){.    /*
3aa0: 20 49 66 20 52 45 50 4c 41 43 45 20 63 6f 6e 66   If REPLACE conf
3ab0: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
3ac0: 6d 69 67 68 74 20 62 65 20 69 6e 76 6f 6b 65 64  might be invoked
3ad0: 2c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 6f  , open cursors o
3ae0: 6e 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 69 6e  n all .    ** in
3af0: 64 65 78 65 73 20 69 6e 20 63 61 73 65 20 74 68  dexes in case th
3b00: 65 79 20 61 72 65 20 6e 65 65 64 65 64 20 74 6f  ey are needed to
3b10: 20 64 65 6c 65 74 65 20 72 65 63 6f 72 64 73 2e   delete records.
3b20: 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
3b30: 61 54 6f 4f 70 65 6e 2c 20 31 2c 20 6e 49 64 78  aToOpen, 1, nIdx
3b40: 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  +1);.  }..  /* B
3b50: 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
3b60: 63 6f 64 65 2e 20 2a 2f 0a 20 20 76 20 3d 20 73  code. */.  v = s
3b70: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
3b80: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
3b90: 30 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65 5f  0 ) goto update_
3ba0: 63 6c 65 61 6e 75 70 3b 0a 20 20 69 66 28 20 70  cleanup;.  if( p
3bb0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
3bc0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f   ) sqlite3VdbeCo
3bd0: 75 6e 74 43 68 61 6e 67 65 73 28 76 29 3b 0a 20  untChanges(v);. 
3be0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
3bf0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
3c00: 73 65 2c 20 70 54 72 69 67 67 65 72 20 7c 7c 20  se, pTrigger || 
3c10: 68 61 73 46 4b 2c 20 69 44 62 29 3b 0a 0a 20 20  hasFK, iDb);..  
3c20: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 71 75  /* Allocate requ
3c30: 69 72 65 64 20 72 65 67 69 73 74 65 72 73 2e 20  ired registers. 
3c40: 2a 2f 0a 20 20 69 66 28 20 21 49 73 56 69 72 74  */.  if( !IsVirt
3c50: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
3c60: 20 2f 2a 20 46 6f 72 20 6e 6f 77 2c 20 72 65 67   /* For now, reg
3c70: 52 6f 77 53 65 74 20 61 6e 64 20 61 52 65 67 49  RowSet and aRegI
3c80: 64 78 5b 6e 41 6c 6c 49 64 78 5d 20 73 68 61 72  dx[nAllIdx] shar
3c90: 65 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73  e the same regis
3ca0: 74 65 72 2e 0a 20 20 20 20 2a 2a 20 49 66 20 72  ter..    ** If r
3cb0: 65 67 52 6f 77 53 65 74 20 74 75 72 6e 73 20 6f  egRowSet turns o
3cc0: 75 74 20 74 6f 20 62 65 20 6e 65 65 64 65 64 2c  ut to be needed,
3cd0: 20 74 68 65 6e 20 61 52 65 67 49 64 78 5b 6e 41   then aRegIdx[nA
3ce0: 6c 6c 49 64 78 5d 20 77 69 6c 6c 20 62 65 0a 20  llIdx] will be. 
3cf0: 20 20 20 2a 2a 20 72 65 61 6c 6c 6f 63 61 74 65     ** reallocate
3d00: 64 2e 20 20 61 52 65 67 49 64 78 5b 6e 41 6c 6c  d.  aRegIdx[nAll
3d10: 49 64 78 5d 20 69 73 20 74 68 65 20 72 65 67 69  Idx] is the regi
3d20: 73 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  ster in which th
3d30: 65 20 6d 61 69 6e 0a 20 20 20 20 2a 2a 20 74 61  e main.    ** ta
3d40: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 77 72  ble record is wr
3d50: 69 74 74 65 6e 2e 20 20 72 65 67 52 6f 77 53 65  itten.  regRowSe
3d60: 74 20 68 6f 6c 64 73 20 74 68 65 20 52 6f 77 53  t holds the RowS
3d70: 65 74 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  et for the.    *
3d80: 2a 20 74 77 6f 2d 70 61 73 73 20 75 70 64 61 74  * two-pass updat
3d90: 65 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a  e algorithm. */.
3da0: 20 20 20 20 61 73 73 65 72 74 28 20 61 52 65 67      assert( aReg
3db0: 49 64 78 5b 6e 41 6c 6c 49 64 78 5d 3d 3d 70 50  Idx[nAllIdx]==pP
3dc0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
3dd0: 20 20 72 65 67 52 6f 77 53 65 74 20 3d 20 61 52    regRowSet = aR
3de0: 65 67 49 64 78 5b 6e 41 6c 6c 49 64 78 5d 3b 0a  egIdx[nAllIdx];.
3df0: 20 20 20 20 72 65 67 4f 6c 64 52 6f 77 69 64 20      regOldRowid 
3e00: 3d 20 72 65 67 4e 65 77 52 6f 77 69 64 20 3d 20  = regNewRowid = 
3e10: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
3e20: 20 20 20 20 69 66 28 20 63 68 6e 67 50 6b 20 7c      if( chngPk |
3e30: 7c 20 70 54 72 69 67 67 65 72 20 7c 7c 20 68 61  | pTrigger || ha
3e40: 73 46 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 67  sFK ){.      reg
3e50: 4f 6c 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Old = pParse->nM
3e60: 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
3e70: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 54  arse->nMem += pT
3e80: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 7d 0a  ab->nCol;.    }.
3e90: 20 20 20 20 69 66 28 20 63 68 6e 67 4b 65 79 20      if( chngKey 
3ea0: 7c 7c 20 70 54 72 69 67 67 65 72 20 7c 7c 20 68  || pTrigger || h
3eb0: 61 73 46 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  asFK ){.      re
3ec0: 67 4e 65 77 52 6f 77 69 64 20 3d 20 2b 2b 70 50  gNewRowid = ++pP
3ed0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
3ee0: 7d 0a 20 20 20 20 72 65 67 4e 65 77 20 3d 20 70  }.    regNew = p
3ef0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
3f00: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
3f10: 6d 20 2b 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  m += pTab->nCol;
3f20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 61 72 74  .  }..  /* Start
3f30: 20 74 68 65 20 76 69 65 77 20 63 6f 6e 74 65 78   the view contex
3f40: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  t. */.  if( isVi
3f50: 65 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ew ){.    sqlite
3f60: 33 41 75 74 68 43 6f 6e 74 65 78 74 50 75 73 68  3AuthContextPush
3f70: 28 70 50 61 72 73 65 2c 20 26 73 43 6f 6e 74 65  (pParse, &sConte
3f80: 78 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  xt, pTab->zName)
3f90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
3fa0: 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
3fb0: 75 70 64 61 74 65 20 61 20 76 69 65 77 2c 20 72  update a view, r
3fc0: 65 61 6c 69 7a 65 20 74 68 61 74 20 76 69 65 77  ealize that view
3fd0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 6e 20 65 70   into.  ** an ep
3fe0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20  hemeral table.. 
3ff0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
4000: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
4010: 57 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  W) && !defined(S
4020: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
4030: 45 52 29 0a 20 20 69 66 28 20 69 73 56 69 65 77  ER).  if( isView
4040: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
4050: 61 74 65 72 69 61 6c 69 7a 65 56 69 65 77 28 70  aterializeView(p
4060: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 0a 20 20  Parse, pTab, .  
4070: 20 20 20 20 20 20 70 57 68 65 72 65 2c 20 70 4f        pWhere, pO
4080: 72 64 65 72 42 79 2c 20 70 4c 69 6d 69 74 2c 20  rderBy, pLimit, 
4090: 69 44 61 74 61 43 75 72 0a 20 20 20 20 29 3b 0a  iDataCur.    );.
40a0: 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
40b0: 3b 0a 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 30  ;.    pLimit = 0
40c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
40d0: 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63  /* Resolve the c
40e0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 61  olumn names in a
40f0: 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ll the expressio
4100: 6e 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 57  ns in the.  ** W
4110: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a  HERE clause..  *
4120: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52  /.  if( sqlite3R
4130: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
4140: 26 73 4e 43 2c 20 70 57 68 65 72 65 29 20 29 7b  &sNC, pWhere) ){
4150: 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65  .    goto update
4160: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 23  _cleanup;.  }..#
4170: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4180: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
4190: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
41a0: 6c 65 73 20 6d 75 73 74 20 62 65 20 68 61 6e 64  les must be hand
41b0: 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20 2a  led separately *
41c0: 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
41d0: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 75  l(pTab) ){.    u
41e0: 70 64 61 74 65 56 69 72 74 75 61 6c 54 61 62 6c  pdateVirtualTabl
41f0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  e(pParse, pTabLi
4200: 73 74 2c 20 70 54 61 62 2c 20 70 43 68 61 6e 67  st, pTab, pChang
4210: 65 73 2c 20 70 52 6f 77 69 64 45 78 70 72 2c 20  es, pRowidExpr, 
4220: 61 58 52 65 66 2c 0a 20 20 20 20 20 20 20 20 20  aXRef,.         
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
4240: 68 65 72 65 2c 20 6f 6e 45 72 72 6f 72 29 3b 0a  here, onError);.
4250: 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
4260: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 23 65 6e  cleanup;.  }.#en
4270: 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  dif..  /* Jump t
4280: 6f 20 6c 61 62 65 6c 42 72 65 61 6b 20 74 6f 20  o labelBreak to 
4290: 61 62 61 6e 64 6f 6e 20 66 75 72 74 68 65 72 20  abandon further 
42a0: 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
42b0: 69 73 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 6c  is UPDATE */.  l
42c0: 61 62 65 6c 43 6f 6e 74 69 6e 75 65 20 3d 20 6c  abelContinue = l
42d0: 61 62 65 6c 42 72 65 61 6b 20 3d 20 73 71 6c 69  abelBreak = sqli
42e0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
42f0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
4300: 4e 6f 74 20 61 6e 20 55 50 53 45 52 54 2e 20 20  Not an UPSERT.  
4310: 4e 6f 72 6d 61 6c 20 70 72 6f 63 65 73 73 69 6e  Normal processin
4320: 67 2e 20 20 42 65 67 69 6e 20 62 79 0a 20 20 2a  g.  Begin by.  *
4330: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * initialize the
4340: 20 63 6f 75 6e 74 20 6f 66 20 75 70 64 61 74 65   count of update
4350: 64 20 72 6f 77 73 20 2a 2f 0a 20 20 69 66 28 20  d rows */.  if( 
4360: 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  (db->flags&SQLIT
4370: 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d 30 0a  E_CountRows)!=0.
4380: 20 20 20 26 26 20 21 70 50 61 72 73 65 2d 3e 70     && !pParse->p
4390: 54 72 69 67 67 65 72 54 61 62 0a 20 20 20 26 26  TriggerTab.   &&
43a0: 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   !pParse->nested
43b0: 0a 20 20 20 26 26 20 70 55 70 73 65 72 74 3d 3d  .   && pUpsert==
43c0: 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 67 52 6f  0.  ){.    regRo
43d0: 77 43 6f 75 6e 74 20 3d 20 2b 2b 70 50 61 72 73  wCount = ++pPars
43e0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
43f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4400: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
4410: 20 72 65 67 52 6f 77 43 6f 75 6e 74 29 3b 0a 20   regRowCount);. 
4420: 20 7d 0a 0a 20 20 69 66 28 20 48 61 73 52 6f 77   }..  if( HasRow
4430: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
4440: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4450: 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
4460: 20 72 65 67 52 6f 77 53 65 74 2c 20 72 65 67 4f   regRowSet, regO
4470: 6c 64 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73  ldRowid);.  }els
4480: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
4490: 50 6b 21 3d 30 20 29 3b 0a 20 20 20 20 6e 50 6b  Pk!=0 );.    nPk
44a0: 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
44b0: 0a 20 20 20 20 69 50 6b 20 3d 20 70 50 61 72 73  .    iPk = pPars
44c0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
44d0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
44e0: 50 6b 3b 0a 20 20 20 20 72 65 67 4b 65 79 20 3d  Pk;.    regKey =
44f0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
4500: 0a 20 20 20 20 69 66 28 20 70 55 70 73 65 72 74  .    if( pUpsert
4510: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 45 70  ==0 ){.      iEp
4520: 68 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  h = pParse->nTab
4530: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ++;.        sqli
4540: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4550: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 50 6b   OP_Null, 0, iPk
4560: 2c 20 69 50 6b 2b 6e 50 6b 2d 31 29 3b 0a 20 20  , iPk+nPk-1);.  
4570: 20 20 20 20 61 64 64 72 4f 70 65 6e 20 3d 20 73      addrOpen = s
4580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4590: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
45a0: 65 72 61 6c 2c 20 69 45 70 68 2c 20 6e 50 6b 29  eral, iEph, nPk)
45b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
45c0: 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
45d0: 70 50 61 72 73 65 2c 20 70 50 6b 29 3b 0a 20 20  pParse, pPk);.  
45e0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
45f0: 20 70 55 70 73 65 72 74 20 29 7b 0a 20 20 20 20   pUpsert ){.    
4600: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
4610: 20 55 50 53 45 52 54 2c 20 74 68 65 6e 20 61 6c   UPSERT, then al
4620: 6c 20 63 75 72 73 6f 72 73 20 68 61 76 65 20 61  l cursors have a
4630: 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
4640: 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65  ed by.    ** the
4650: 20 6f 75 74 65 72 20 49 4e 53 45 52 54 20 61 6e   outer INSERT an
4660: 64 20 74 68 65 20 64 61 74 61 20 63 75 72 73 6f  d the data curso
4670: 72 20 73 68 6f 75 6c 64 20 62 65 20 70 6f 69 6e  r should be poin
4680: 74 69 6e 67 20 61 74 20 74 68 65 20 72 6f 77 0a  ting at the row.
4690: 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 74      ** that is t
46a0: 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20 20 53  o be updated.  S
46b0: 6f 20 62 79 70 61 73 73 20 74 68 65 20 63 6f 64  o bypass the cod
46c0: 65 20 74 68 61 74 20 73 65 61 72 63 68 65 73 20  e that searches 
46d0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  for the.    ** r
46e0: 6f 77 28 73 29 20 74 6f 20 62 65 20 75 70 64 61  ow(s) to be upda
46f0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
4700: 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  pWInfo = 0;.    
4710: 65 4f 6e 65 50 61 73 73 20 3d 20 4f 4e 45 50 41  eOnePass = ONEPA
4720: 53 53 5f 53 49 4e 47 4c 45 3b 0a 20 20 20 20 73  SS_SINGLE;.    s
4730: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
4740: 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  e(pParse, pWhere
4750: 2c 20 6c 61 62 65 6c 42 72 65 61 6b 2c 20 53 51  , labelBreak, SQ
4760: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
4770: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
4780: 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
4790: 62 61 73 65 20 73 63 61 6e 2e 20 0a 20 20 20 20  base scan. .    
47a0: 2a 2a 0a 20 20 20 20 2a 2a 20 44 6f 20 6e 6f 74  **.    ** Do not
47b0: 20 63 6f 6e 73 69 64 65 72 20 61 20 73 69 6e 67   consider a sing
47c0: 6c 65 2d 70 61 73 73 20 73 74 72 61 74 65 67 79  le-pass strategy
47d0: 20 66 6f 72 20 61 20 6d 75 6c 74 69 2d 72 6f 77   for a multi-row
47e0: 20 75 70 64 61 74 65 20 69 66 0a 20 20 20 20 2a   update if.    *
47f0: 2a 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  * there are any 
4800: 74 72 69 67 67 65 72 73 20 6f 72 20 66 6f 72 65  triggers or fore
4810: 69 67 6e 20 6b 65 79 73 20 74 6f 20 70 72 6f 63  ign keys to proc
4820: 65 73 73 2c 20 6f 72 20 72 6f 77 73 20 6d 61 79  ess, or rows may
4830: 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 6c 65 74  .    ** be delet
4840: 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ed as a result o
4850: 66 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69  f REPLACE confli
4860: 63 74 20 68 61 6e 64 6c 69 6e 67 2e 20 41 6e 79  ct handling. Any
4870: 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a   of these.    **
4880: 20 74 68 69 6e 67 73 20 6d 69 67 68 74 20 64 69   things might di
4890: 73 74 75 72 62 20 61 20 63 75 72 73 6f 72 20 62  sturb a cursor b
48a0: 65 69 6e 67 20 75 73 65 64 20 74 6f 20 73 63 61  eing used to sca
48b0: 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 61  n through the ta
48c0: 62 6c 65 0a 20 20 20 20 2a 2a 20 6f 72 20 69 6e  ble.    ** or in
48d0: 64 65 78 2c 20 63 61 75 73 69 6e 67 20 61 20 73  dex, causing a s
48e0: 69 6e 67 6c 65 2d 70 61 73 73 20 61 70 70 72 6f  ingle-pass appro
48f0: 61 63 68 20 74 6f 20 6d 61 6c 66 75 6e 63 74 69  ach to malfuncti
4900: 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67  on.  */.    flag
4910: 73 20 3d 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s = WHERE_ONEPAS
4920: 53 5f 44 45 53 49 52 45 44 7c 57 48 45 52 45 5f  S_DESIRED|WHERE_
4930: 53 45 45 4b 5f 55 4e 49 51 5f 54 41 42 4c 45 3b  SEEK_UNIQ_TABLE;
4940: 0a 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65  .    if( !pParse
4950: 2d 3e 6e 65 73 74 65 64 20 26 26 20 21 70 54 72  ->nested && !pTr
4960: 69 67 67 65 72 20 26 26 20 21 68 61 73 46 4b 20  igger && !hasFK 
4970: 26 26 20 21 63 68 6e 67 4b 65 79 20 26 26 20 21  && !chngKey && !
4980: 62 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  bReplace ){.    
4990: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
49a0: 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f  _ONEPASS_MULTIRO
49b0: 57 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 49  W;.    }.    pWI
49c0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
49d0: 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
49e0: 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
49f0: 2c 20 30 2c 20 30 2c 20 66 6c 61 67 73 2c 20 69  , 0, 0, flags, i
4a00: 49 64 78 43 75 72 29 3b 0a 20 20 20 20 69 66 28  IdxCur);.    if(
4a10: 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
4a20: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
4a30: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 6f 6e  ;.  .    /* A on
4a40: 65 2d 70 61 73 73 20 73 74 72 61 74 65 67 79 20  e-pass strategy 
4a50: 74 68 61 74 20 6d 69 67 68 74 20 75 70 64 61 74  that might updat
4a60: 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  e more than one 
4a70: 72 6f 77 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20  row may not.    
4a80: 2a 2a 20 62 65 20 75 73 65 64 20 69 66 20 61 6e  ** be used if an
4a90: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  y column of the 
4aa0: 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74  index used for t
4ab0: 68 65 20 73 63 61 6e 20 69 73 20 62 65 69 6e 67  he scan is being
4ac0: 0a 20 20 20 20 2a 2a 20 75 70 64 61 74 65 64 2e  .    ** updated.
4ad0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
4ae0: 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
4af0: 20 6f 6e 20 22 62 22 2c 20 73 74 61 74 65 6d 65   on "b", stateme
4b00: 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 2a 2a 20  nts like.    ** 
4b10: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
4b20: 75 6c 64 20 63 72 65 61 74 65 20 61 6e 20 69 6e  uld create an in
4b30: 66 69 6e 69 74 65 20 6c 6f 6f 70 3a 0a 20 20 20  finite loop:.   
4b40: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 55 50 44   **.    **   UPD
4b50: 41 54 45 20 74 31 20 53 45 54 20 62 3d 62 2b 31  ATE t1 SET b=b+1
4b60: 20 57 48 45 52 45 20 62 3e 3f 0a 20 20 20 20 2a   WHERE b>?.    *
4b70: 2a 0a 20 20 20 20 2a 2a 20 46 61 6c 6c 20 62 61  *.    ** Fall ba
4b80: 63 6b 20 74 6f 20 4f 4e 45 50 41 53 53 5f 4f 46  ck to ONEPASS_OF
4b90: 46 20 69 66 20 77 68 65 72 65 2e 63 20 68 61 73  F if where.c has
4ba0: 20 73 65 6c 65 63 74 65 64 20 61 20 4f 4e 45 50   selected a ONEP
4bb0: 41 53 53 5f 4d 55 4c 54 49 0a 20 20 20 20 2a 2a  ASS_MULTI.    **
4bc0: 20 73 74 72 61 74 65 67 79 20 74 68 61 74 20 75   strategy that u
4bd0: 73 65 73 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  ses an index for
4be0: 20 77 68 69 63 68 20 6f 6e 65 20 6f 72 20 6d 6f   which one or mo
4bf0: 72 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 62  re columns are b
4c00: 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75 70 64 61  eing.    ** upda
4c10: 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 65 4f 6e  ted.  */.    eOn
4c20: 65 50 61 73 73 20 3d 20 73 71 6c 69 74 65 33 57  ePass = sqlite3W
4c30: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 70 57  hereOkOnePass(pW
4c40: 49 6e 66 6f 2c 20 61 69 43 75 72 4f 6e 65 50 61  Info, aiCurOnePa
4c50: 73 73 29 3b 0a 20 20 20 20 69 66 28 20 65 4f 6e  ss);.    if( eOn
4c60: 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 53  ePass!=ONEPASS_S
4c70: 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 73  INGLE ){.      s
4c80: 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
4c90: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
4ca0: 69 66 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  if( eOnePass==ON
4cb0: 45 50 41 53 53 5f 4d 55 4c 54 49 20 29 7b 0a 20  EPASS_MULTI ){. 
4cc0: 20 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20         int iCur 
4cd0: 3d 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31  = aiCurOnePass[1
4ce0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ];.        if( i
4cf0: 43 75 72 3e 3d 30 20 26 26 20 69 43 75 72 21 3d  Cur>=0 && iCur!=
4d00: 69 44 61 74 61 43 75 72 20 26 26 20 61 54 6f 4f  iDataCur && aToO
4d10: 70 65 6e 5b 69 43 75 72 2d 69 42 61 73 65 43 75  pen[iCur-iBaseCu
4d20: 72 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r] ){.          
4d30: 65 4f 6e 65 50 61 73 73 20 3d 20 4f 4e 45 50 41  eOnePass = ONEPA
4d40: 53 53 5f 4f 46 46 3b 0a 20 20 20 20 20 20 20 20  SS_OFF;.        
4d50: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
4d60: 28 20 69 43 75 72 21 3d 69 44 61 74 61 43 75 72  ( iCur!=iDataCur
4d70: 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54   || !HasRowid(pT
4d80: 61 62 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ab) );.      }. 
4d90: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
4da0: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
4db0: 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
4dc0: 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63  e rowid of the c
4dd0: 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
4de0: 65 20 57 48 45 52 45 20 73 63 61 6e 2e 20 49 6e  e WHERE scan. In
4df0: 20 4f 4e 45 50 41 53 53 5f 4f 46 46 0a 20 20 20   ONEPASS_OFF.   
4e00: 20 2a 2a 20 6d 6f 64 65 2c 20 77 72 69 74 65 20   ** mode, write 
4e10: 74 68 65 20 72 6f 77 69 64 20 69 6e 74 6f 20 74  the rowid into t
4e20: 68 65 20 46 49 46 4f 2e 20 49 6e 20 65 69 74 68  he FIFO. In eith
4e30: 65 72 20 6f 66 20 74 68 65 20 6f 6e 65 2d 70 61  er of the one-pa
4e40: 73 73 20 6d 6f 64 65 73 2c 0a 20 20 20 20 2a 2a  ss modes,.    **
4e50: 20 6c 65 61 76 65 20 69 74 20 69 6e 20 72 65 67   leave it in reg
4e60: 69 73 74 65 72 20 72 65 67 4f 6c 64 52 6f 77 69  ister regOldRowi
4e70: 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  d.  */.    sqlit
4e80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4e90: 4f 50 5f 52 6f 77 69 64 2c 20 69 44 61 74 61 43  OP_Rowid, iDataC
4ea0: 75 72 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 29  ur, regOldRowid)
4eb0: 3b 0a 20 20 20 20 69 66 28 20 65 4f 6e 65 50 61  ;.    if( eOnePa
4ec0: 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
4ed0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 6e  ){.      /* We n
4ee0: 65 65 64 20 74 6f 20 75 73 65 20 72 65 67 52 6f  eed to use regRo
4ef0: 77 53 65 74 2c 20 73 6f 20 72 65 61 6c 6c 6f 63  wSet, so realloc
4f00: 61 74 65 20 61 52 65 67 49 64 78 5b 6e 41 6c 6c  ate aRegIdx[nAll
4f10: 49 64 78 5d 20 2a 2f 0a 20 20 20 20 20 20 61 52  Idx] */.      aR
4f20: 65 67 49 64 78 5b 6e 41 6c 6c 49 64 78 5d 20 3d  egIdx[nAllIdx] =
4f30: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
4f40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4f50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
4f60: 6f 77 53 65 74 41 64 64 2c 20 72 65 67 52 6f 77  owSetAdd, regRow
4f70: 53 65 74 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64  Set, regOldRowid
4f80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
4f90: 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
4fa0: 65 20 50 4b 20 6f 66 20 74 68 65 20 63 75 72 72  e PK of the curr
4fb0: 65 6e 74 20 72 6f 77 20 69 6e 74 6f 20 61 6e 20  ent row into an 
4fc0: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
4fd0: 72 73 2e 20 49 6e 0a 20 20 20 20 2a 2a 20 4f 4e  rs. In.    ** ON
4fe0: 45 50 41 53 53 5f 4f 46 46 20 6d 6f 64 65 2c 20  EPASS_OFF mode, 
4ff0: 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 61 72  serialize the ar
5000: 72 61 79 20 69 6e 74 6f 20 61 20 72 65 63 6f 72  ray into a recor
5010: 64 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  d and store it i
5020: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 70 68  n.    ** the eph
5030: 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 4f 72  emeral table. Or
5040: 2c 20 69 6e 20 4f 4e 45 50 41 53 53 5f 53 49 4e  , in ONEPASS_SIN
5050: 47 4c 45 20 6f 72 20 4d 55 4c 54 49 20 6d 6f 64  GLE or MULTI mod
5060: 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a  e, change.    **
5070: 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
5080: 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
5090: 6e 20 74 6f 20 61 20 4e 6f 6f 70 20 28 74 68 65  n to a Noop (the
50a0: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
50b0: 20 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20   .    ** is not 
50c0: 72 65 71 75 69 72 65 64 29 20 61 6e 64 20 6c 65  required) and le
50d0: 61 76 65 20 74 68 65 20 50 4b 20 66 69 65 6c 64  ave the PK field
50e0: 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 6f  s in the array o
50f0: 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 2a 2f  f registers.  */
5100: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5110: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
5120: 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 61 69   assert( pPk->ai
5130: 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29 3b 0a  Column[i]>=0 );.
5140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5150: 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
5160: 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69  Table(v, pTab, i
5170: 44 61 74 61 43 75 72 2c 70 50 6b 2d 3e 61 69 43  DataCur,pPk->aiC
5180: 6f 6c 75 6d 6e 5b 69 5d 2c 69 50 6b 2b 69 29 3b  olumn[i],iPk+i);
5190: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
51a0: 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20  OnePass ){.     
51b0: 20 69 66 28 20 61 64 64 72 4f 70 65 6e 20 29 20   if( addrOpen ) 
51c0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
51d0: 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 4f  eToNoop(v, addrO
51e0: 70 65 6e 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79  pen);.      nKey
51f0: 20 3d 20 6e 50 6b 3b 0a 20 20 20 20 20 20 72 65   = nPk;.      re
5200: 67 4b 65 79 20 3d 20 69 50 6b 3b 0a 20 20 20 20  gKey = iPk;.    
5210: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
5220: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
5230: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5240: 20 69 50 6b 2c 20 6e 50 6b 2c 20 72 65 67 4b 65   iPk, nPk, regKe
5250: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
5260: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
5270: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
5280: 74 72 28 64 62 2c 20 70 50 6b 29 2c 20 6e 50 6b  tr(db, pPk), nPk
5290: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
52a0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
52b0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
52c0: 45 70 68 2c 20 72 65 67 4b 65 79 2c 20 69 50 6b  Eph, regKey, iPk
52d0: 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  , nPk);.    }.  
52e0: 7d 0a 0a 20 20 69 66 28 20 70 55 70 73 65 72 74  }..  if( pUpsert
52f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65  ==0 ){.    if( e
5300: 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53  OnePass!=ONEPASS
5310: 5f 4d 55 4c 54 49 20 29 7b 0a 20 20 20 20 20 20  _MULTI ){.      
5320: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
5330: 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
5340: 20 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65   .    if( !isVie
5350: 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  w ){.      int a
5360: 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 0a  ddrOnce = 0;.  .
5370: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 76        /* Open ev
5380: 65 72 79 20 69 6e 64 65 78 20 74 68 61 74 20 6e  ery index that n
5390: 65 65 64 73 20 75 70 64 61 74 69 6e 67 2e 20 2a  eeds updating. *
53a0: 2f 0a 20 20 20 20 20 20 69 66 28 20 65 4f 6e 65  /.      if( eOne
53b0: 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass!=ONEPASS_OF
53c0: 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  F ){.        if(
53d0: 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d   aiCurOnePass[0]
53e0: 3e 3d 30 20 29 20 61 54 6f 4f 70 65 6e 5b 61 69  >=0 ) aToOpen[ai
53f0: 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 2d 69 42  CurOnePass[0]-iB
5400: 61 73 65 43 75 72 5d 20 3d 20 30 3b 0a 20 20 20  aseCur] = 0;.   
5410: 20 20 20 20 20 69 66 28 20 61 69 43 75 72 4f 6e       if( aiCurOn
5420: 65 50 61 73 73 5b 31 5d 3e 3d 30 20 29 20 61 54  ePass[1]>=0 ) aT
5430: 6f 4f 70 65 6e 5b 61 69 43 75 72 4f 6e 65 50 61  oOpen[aiCurOnePa
5440: 73 73 5b 31 5d 2d 69 42 61 73 65 43 75 72 5d 20  ss[1]-iBaseCur] 
5450: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  = 0;.      }.  .
5460: 20 20 20 20 20 20 69 66 28 20 65 4f 6e 65 50 61        if( eOnePa
5470: 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ss==ONEPASS_MULT
5480: 49 20 26 26 20 28 6e 49 64 78 2d 28 61 69 43 75  I && (nIdx-(aiCu
5490: 72 4f 6e 65 50 61 73 73 5b 31 5d 3e 3d 30 29 29  rOnePass[1]>=0))
54a0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  >0 ){.        ad
54b0: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
54c0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
54d0: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
54e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
54f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
5500: 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65  enTableAndIndice
5510: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  s(pParse, pTab, 
5520: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
5530: 20 69 42 61 73 65 43 75 72 2c 0a 20 20 20 20 20   iBaseCur,.     
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 20 20 20 20 20 20 20 20 20 20 20 20 61 54 6f 4f              aToO
5560: 70 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pen, 0, 0);.    
5570: 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29    if( addrOnce )
5580: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
5590: 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65  Here(v, addrOnce
55a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
55b0: 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 75 70  /* Top of the up
55c0: 64 61 74 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  date loop */.   
55d0: 20 69 66 28 20 65 4f 6e 65 50 61 73 73 21 3d 4f   if( eOnePass!=O
55e0: 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20  NEPASS_OFF ){.  
55f0: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
5600: 26 26 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b  && aiCurOnePass[
5610: 30 5d 21 3d 69 44 61 74 61 43 75 72 20 26 26 20  0]!=iDataCur && 
5620: 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 21  aiCurOnePass[1]!
5630: 3d 69 44 61 74 61 43 75 72 20 29 7b 0a 20 20 20  =iDataCur ){.   
5640: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b       assert( pPk
5650: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
5660: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5670: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
5680: 20 69 44 61 74 61 43 75 72 2c 20 6c 61 62 65 6c   iDataCur, label
5690: 42 72 65 61 6b 2c 20 72 65 67 4b 65 79 2c 6e 4b  Break, regKey,nK
56a0: 65 79 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ey);.        Vdb
56b0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
56c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
56d0: 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53  eOnePass!=ONEPAS
56e0: 53 5f 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20  S_SINGLE ){.    
56f0: 20 20 20 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75      labelContinu
5700: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
5710: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
5720: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5740: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
5750: 70 50 6b 20 3f 20 72 65 67 4b 65 79 20 3a 20 72  pPk ? regKey : r
5760: 65 67 4f 6c 64 52 6f 77 69 64 2c 20 6c 61 62 65  egOldRowid, labe
5770: 6c 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 56  lBreak);.      V
5780: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
5790: 20 70 50 6b 3d 3d 30 29 3b 0a 20 20 20 20 20 20   pPk==0);.      
57a0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
57b0: 2c 20 70 50 6b 21 3d 30 29 3b 0a 20 20 20 20 7d  , pPk!=0);.    }
57c0: 65 6c 73 65 20 69 66 28 20 70 50 6b 20 29 7b 0a  else if( pPk ){.
57d0: 20 20 20 20 20 20 6c 61 62 65 6c 43 6f 6e 74 69        labelConti
57e0: 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
57f0: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
5800: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
5810: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5820: 50 5f 52 65 77 69 6e 64 2c 20 69 45 70 68 2c 20  P_Rewind, iEph, 
5830: 6c 61 62 65 6c 42 72 65 61 6b 29 3b 20 56 64 62  labelBreak); Vdb
5840: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5850: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
5860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5870: 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69  v, OP_RowData, i
5880: 45 70 68 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20  Eph, regKey);.  
5890: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
58a0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
58b0: 6f 74 46 6f 75 6e 64 2c 20 69 44 61 74 61 43 75  otFound, iDataCu
58c0: 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65  r, labelContinue
58d0: 2c 20 72 65 67 4b 65 79 2c 20 30 29 3b 0a 20 20  , regKey, 0);.  
58e0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
58f0: 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
5900: 20 20 20 20 20 20 6c 61 62 65 6c 43 6f 6e 74 69        labelConti
5910: 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
5920: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 6f  eAddOp3(v, OP_Ro
5930: 77 53 65 74 52 65 61 64 2c 20 72 65 67 52 6f 77  wSetRead, regRow
5940: 53 65 74 2c 6c 61 62 65 6c 42 72 65 61 6b 2c 0a  Set,labelBreak,.
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
5970: 65 67 4f 6c 64 52 6f 77 69 64 29 3b 0a 20 20 20  egOldRowid);.   
5980: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
5990: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
59a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
59b0: 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 44 61  P_NotExists, iDa
59c0: 74 61 43 75 72 2c 20 6c 61 62 65 6c 43 6f 6e 74  taCur, labelCont
59d0: 69 6e 75 65 2c 20 72 65 67 4f 6c 64 52 6f 77 69  inue, regOldRowi
59e0: 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  d);.      VdbeCo
59f0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
5a00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
5a10: 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 77 69  e rowid value wi
5a20: 6c 6c 20 63 68 61 6e 67 65 2c 20 73 65 74 20 72  ll change, set r
5a30: 65 67 69 73 74 65 72 20 72 65 67 4e 65 77 52 6f  egister regNewRo
5a40: 77 69 64 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 74  wid to.  ** cont
5a50: 61 69 6e 20 74 68 65 20 6e 65 77 20 76 61 6c 75  ain the new valu
5a60: 65 2e 20 49 66 20 74 68 65 20 72 6f 77 69 64 20  e. If the rowid 
5a70: 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 6d 6f 64  is not being mod
5a80: 69 66 69 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  ified,.  ** then
5a90: 20 72 65 67 4e 65 77 52 6f 77 69 64 20 69 73 20   regNewRowid is 
5aa0: 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65  the same registe
5ab0: 72 20 61 73 20 72 65 67 4f 6c 64 52 6f 77 69 64  r as regOldRowid
5ac0: 2c 20 77 68 69 63 68 20 69 73 0a 20 20 2a 2a 20  , which is.  ** 
5ad0: 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
5ae0: 64 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  d.  */.  assert(
5af0: 20 63 68 6e 67 4b 65 79 20 7c 7c 20 70 54 72 69   chngKey || pTri
5b00: 67 67 65 72 20 7c 7c 20 68 61 73 46 4b 20 7c 7c  gger || hasFK ||
5b10: 20 72 65 67 4f 6c 64 52 6f 77 69 64 3d 3d 72 65   regOldRowid==re
5b20: 67 4e 65 77 52 6f 77 69 64 20 29 3b 0a 20 20 69  gNewRowid );.  i
5b30: 66 28 20 63 68 6e 67 52 6f 77 69 64 20 29 7b 0a  f( chngRowid ){.
5b40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
5b50: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 6f 77  ode(pParse, pRow
5b60: 69 64 45 78 70 72 2c 20 72 65 67 4e 65 77 52 6f  idExpr, regNewRo
5b70: 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wid);.    sqlite
5b80: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5b90: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67  P_MustBeInt, reg
5ba0: 4e 65 77 52 6f 77 69 64 29 3b 20 56 64 62 65 43  NewRowid); VdbeC
5bb0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
5bc0: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
5bd0: 65 20 6f 6c 64 20 70 72 65 2d 55 50 44 41 54 45  e old pre-UPDATE
5be0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
5bf0: 72 6f 77 20 62 65 69 6e 67 20 63 68 61 6e 67 65  row being change
5c00: 64 2c 20 69 66 20 74 68 61 74 0a 20 20 2a 2a 20  d, if that.  ** 
5c10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  information is n
5c20: 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 63  eeded */.  if( c
5c30: 68 6e 67 50 6b 20 7c 7c 20 68 61 73 46 4b 20 7c  hngPk || hasFK |
5c40: 7c 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  | pTrigger ){.  
5c50: 20 20 75 33 32 20 6f 6c 64 6d 61 73 6b 20 3d 20    u32 oldmask = 
5c60: 28 68 61 73 46 4b 20 3f 20 73 71 6c 69 74 65 33  (hasFK ? sqlite3
5c70: 46 6b 4f 6c 64 6d 61 73 6b 28 70 50 61 72 73 65  FkOldmask(pParse
5c80: 2c 20 70 54 61 62 29 20 3a 20 30 29 3b 0a 20 20  , pTab) : 0);.  
5c90: 20 20 6f 6c 64 6d 61 73 6b 20 7c 3d 20 73 71 6c    oldmask |= sql
5ca0: 69 74 65 33 54 72 69 67 67 65 72 43 6f 6c 6d 61  ite3TriggerColma
5cb0: 73 6b 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sk(pParse, .    
5cc0: 20 20 20 20 70 54 72 69 67 67 65 72 2c 20 70 43      pTrigger, pC
5cd0: 68 61 6e 67 65 73 2c 20 30 2c 20 54 52 49 47 47  hanges, 0, TRIGG
5ce0: 45 52 5f 42 45 46 4f 52 45 7c 54 52 49 47 47 45  ER_BEFORE|TRIGGE
5cf0: 52 5f 41 46 54 45 52 2c 20 70 54 61 62 2c 20 6f  R_AFTER, pTab, o
5d00: 6e 45 72 72 6f 72 0a 20 20 20 20 29 3b 0a 20 20  nError.    );.  
5d10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
5d20: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
5d30: 20 20 20 20 20 69 66 28 20 6f 6c 64 6d 61 73 6b       if( oldmask
5d40: 3d 3d 30 78 66 66 66 66 66 66 66 66 0a 20 20 20  ==0xffffffff.   
5d50: 20 20 20 20 7c 7c 20 28 69 3c 33 32 20 26 26 20      || (i<32 && 
5d60: 28 6f 6c 64 6d 61 73 6b 20 26 20 4d 41 53 4b 42  (oldmask & MASKB
5d70: 49 54 33 32 28 69 29 29 21 3d 30 29 0a 20 20 20  IT32(i))!=0).   
5d80: 20 20 20 20 7c 7c 20 28 70 54 61 62 2d 3e 61 43      || (pTab->aC
5d90: 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  ol[i].colFlags &
5da0: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
5db0: 29 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )!=0.      ){.  
5dc0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
5dd0: 20 6f 6c 64 6d 61 73 6b 21 3d 30 78 66 66 66 66   oldmask!=0xffff
5de0: 66 66 66 66 20 26 26 20 69 3d 3d 33 31 20 29 3b  ffff && i==31 );
5df0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5e00: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
5e10: 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
5e20: 2c 20 69 44 61 74 61 43 75 72 2c 20 69 2c 20 72  , iDataCur, i, r
5e30: 65 67 4f 6c 64 2b 69 29 3b 0a 20 20 20 20 20 20  egOld+i);.      
5e40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5e50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5e60: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
5e70: 72 65 67 4f 6c 64 2b 69 29 3b 0a 20 20 20 20 20  regOld+i);.     
5e80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5e90: 20 63 68 6e 67 52 6f 77 69 64 3d 3d 30 20 26 26   chngRowid==0 &&
5ea0: 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPk==0 ){.     
5eb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5ec0: 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
5ed0: 65 67 4f 6c 64 52 6f 77 69 64 2c 20 72 65 67 4e  egOldRowid, regN
5ee0: 65 77 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a  ewRowid);.    }.
5ef0: 20 20 7d 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c 61    }..  /* Popula
5f00: 74 65 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  te the array of 
5f10: 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
5f20: 69 6e 67 20 61 74 20 72 65 67 4e 65 77 20 77 69  ing at regNew wi
5f30: 74 68 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  th the new.  ** 
5f40: 72 6f 77 20 64 61 74 61 2e 20 54 68 69 73 20 61  row data. This a
5f50: 72 72 61 79 20 69 73 20 75 73 65 64 20 74 6f 20  rray is used to 
5f60: 63 68 65 63 6b 20 63 6f 6e 73 74 61 6e 74 73 2c  check constants,
5f70: 20 63 72 65 61 74 65 20 74 68 65 20 6e 65 77 0a   create the new.
5f80: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
5f90: 6e 64 65 78 20 72 65 63 6f 72 64 73 2c 20 61 6e  ndex records, an
5fa0: 64 20 61 73 20 74 68 65 20 76 61 6c 75 65 73 20  d as the values 
5fb0: 66 6f 72 20 61 6e 79 20 6e 65 77 2e 2a 20 72 65  for any new.* re
5fc0: 66 65 72 65 6e 63 65 73 0a 20 20 2a 2a 20 6d 61  ferences.  ** ma
5fd0: 64 65 20 62 79 20 74 72 69 67 67 65 72 73 2e 0a  de by triggers..
5fe0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
5ff0: 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  re are one or mo
6000: 72 65 20 42 45 46 4f 52 45 20 74 72 69 67 67 65  re BEFORE trigge
6010: 72 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  rs, then do not 
6020: 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 20 20 2a  populate the.  *
6030: 2a 20 72 65 67 69 73 74 65 72 73 20 61 73 73 6f  * registers asso
6040: 63 69 61 74 65 64 20 77 69 74 68 20 63 6f 6c 75  ciated with colu
6050: 6d 6e 73 20 74 68 61 74 20 61 72 65 20 28 61 29  mns that are (a)
6060: 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 20 62 79   not modified by
6070: 0a 20 20 2a 2a 20 74 68 69 73 20 55 50 44 41 54  .  ** this UPDAT
6080: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  E statement and 
6090: 28 62 29 20 6e 6f 74 20 61 63 63 65 73 73 65 64  (b) not accessed
60a0: 20 62 79 20 6e 65 77 2e 2a 20 72 65 66 65 72 65   by new.* refere
60b0: 6e 63 65 73 2e 20 54 68 65 0a 20 20 2a 2a 20 76  nces. The.  ** v
60c0: 61 6c 75 65 73 20 66 6f 72 20 72 65 67 69 73 74  alues for regist
60d0: 65 72 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64  ers not modified
60e0: 20 62 79 20 74 68 65 20 55 50 44 41 54 45 20 6d   by the UPDATE m
60f0: 75 73 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20  ust be reloaded 
6100: 66 72 6f 6d 20 0a 20 20 2a 2a 20 74 68 65 20 64  from .  ** the d
6110: 61 74 61 62 61 73 65 20 61 66 74 65 72 20 74 68  atabase after th
6120: 65 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72  e BEFORE trigger
6130: 73 20 61 72 65 20 66 69 72 65 64 20 61 6e 79 77  s are fired anyw
6140: 61 79 20 28 61 73 20 74 68 65 20 74 72 69 67 67  ay (as the trigg
6150: 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76  er .  ** may hav
6160: 65 20 6d 6f 64 69 66 69 65 64 20 74 68 65 6d 29  e modified them)
6170: 2e 20 53 6f 20 6e 6f 74 20 6c 6f 61 64 69 6e 67  . So not loading
6180: 20 74 68 6f 73 65 20 74 68 61 74 20 61 72 65 20   those that are 
6190: 6e 6f 74 20 67 6f 69 6e 67 20 74 6f 0a 20 20 2a  not going to.  *
61a0: 2a 20 62 65 20 75 73 65 64 20 65 6c 69 6d 69 6e  * be used elimin
61b0: 61 74 65 73 20 73 6f 6d 65 20 72 65 64 75 6e 64  ates some redund
61c0: 61 6e 74 20 6f 70 63 6f 64 65 73 2e 0a 20 20 2a  ant opcodes..  *
61d0: 2f 0a 20 20 6e 65 77 6d 61 73 6b 20 3d 20 73 71  /.  newmask = sq
61e0: 6c 69 74 65 33 54 72 69 67 67 65 72 43 6f 6c 6d  lite3TriggerColm
61f0: 61 73 6b 28 0a 20 20 20 20 20 20 70 50 61 72 73  ask(.      pPars
6200: 65 2c 20 70 54 72 69 67 67 65 72 2c 20 70 43 68  e, pTrigger, pCh
6210: 61 6e 67 65 73 2c 20 31 2c 20 54 52 49 47 47 45  anges, 1, TRIGGE
6220: 52 5f 42 45 46 4f 52 45 2c 20 70 54 61 62 2c 20  R_BEFORE, pTab, 
6230: 6f 6e 45 72 72 6f 72 0a 20 20 29 3b 0a 20 20 66  onError.  );.  f
6240: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
6250: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
6260: 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( i==pTab->iPK
6270: 65 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ey ){.      sqli
6280: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6290: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
62a0: 4e 65 77 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73  New+i);.    }els
62b0: 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20 61 58 52  e{.      j = aXR
62c0: 65 66 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ef[i];.      if(
62d0: 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   j>=0 ){.       
62e0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
62f0: 28 70 50 61 72 73 65 2c 20 70 43 68 61 6e 67 65  (pParse, pChange
6300: 73 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 72  s->a[j].pExpr, r
6310: 65 67 4e 65 77 2b 69 29 3b 0a 20 20 20 20 20 20  egNew+i);.      
6320: 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 28 74 6d  }else if( 0==(tm
6330: 61 73 6b 26 54 52 49 47 47 45 52 5f 42 45 46 4f  ask&TRIGGER_BEFO
6340: 52 45 29 20 7c 7c 20 69 3e 33 31 20 7c 7c 20 28  RE) || i>31 || (
6350: 6e 65 77 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49  newmask & MASKBI
6360: 54 33 32 28 69 29 29 20 29 7b 0a 20 20 20 20 20  T32(i)) ){.     
6370: 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
6380: 68 20 6c 6f 61 64 73 20 74 68 65 20 76 61 6c 75  h loads the valu
6390: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 74 68  e of a column th
63a0: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  at will not be c
63b0: 68 61 6e 67 65 64 20 0a 20 20 20 20 20 20 20 20  hanged .        
63c0: 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
63d0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
63e0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
63f0: 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73   BEFORE triggers
6400: 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  , or.        ** 
6410: 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65  if there are one
6420: 20 6f 72 20 6d 6f 72 65 20 42 45 46 4f 52 45 20   or more BEFORE 
6430: 74 72 69 67 67 65 72 73 20 74 68 61 74 20 75 73  triggers that us
6440: 65 20 74 68 69 73 20 76 61 6c 75 65 20 76 69 61  e this value via
6450: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 6e 65  .        ** a ne
6460: 77 2e 2a 20 72 65 66 65 72 65 6e 63 65 20 69 6e  w.* reference in
6470: 20 61 20 74 72 69 67 67 65 72 20 70 72 6f 67 72   a trigger progr
6480: 61 6d 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  am..        */. 
6490: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
64a0: 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20   i==31 );.      
64b0: 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33    testcase( i==3
64c0: 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
64d0: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
64e0: 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
64f0: 70 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20  pTab, iDataCur, 
6500: 69 2c 20 72 65 67 4e 65 77 2b 69 29 3b 0a 20 20  i, regNew+i);.  
6510: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6520: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6530: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
6540: 20 30 2c 20 72 65 67 4e 65 77 2b 69 29 3b 0a 20   0, regNew+i);. 
6550: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6560: 0a 0a 20 20 2f 2a 20 46 69 72 65 20 61 6e 79 20  ..  /* Fire any 
6570: 42 45 46 4f 52 45 20 55 50 44 41 54 45 20 74 72  BEFORE UPDATE tr
6580: 69 67 67 65 72 73 2e 20 54 68 69 73 20 68 61 70  iggers. This hap
6590: 70 65 6e 73 20 62 65 66 6f 72 65 20 63 6f 6e 73  pens before cons
65a0: 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 2a 2a  traints are.  **
65b0: 20 76 65 72 69 66 69 65 64 2e 20 4f 6e 65 20 63   verified. One c
65c0: 6f 75 6c 64 20 61 72 67 75 65 20 74 68 61 74 20  ould argue that 
65d0: 74 68 69 73 20 69 73 20 77 72 6f 6e 67 2e 0a 20  this is wrong.. 
65e0: 20 2a 2f 0a 20 20 69 66 28 20 74 6d 61 73 6b 26   */.  if( tmask&
65f0: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 29  TRIGGER_BEFORE )
6600: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62  {.    sqlite3Tab
6610: 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70 54  leAffinity(v, pT
6620: 61 62 2c 20 72 65 67 4e 65 77 29 3b 0a 20 20 20  ab, regNew);.   
6630: 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54   sqlite3CodeRowT
6640: 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 70  rigger(pParse, p
6650: 54 72 69 67 67 65 72 2c 20 54 4b 5f 55 50 44 41  Trigger, TK_UPDA
6660: 54 45 2c 20 70 43 68 61 6e 67 65 73 2c 20 0a 20  TE, pChanges, . 
6670: 20 20 20 20 20 20 20 54 52 49 47 47 45 52 5f 42         TRIGGER_B
6680: 45 46 4f 52 45 2c 20 70 54 61 62 2c 20 72 65 67  EFORE, pTab, reg
6690: 4f 6c 64 52 6f 77 69 64 2c 20 6f 6e 45 72 72 6f  OldRowid, onErro
66a0: 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65  r, labelContinue
66b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  );..    /* The r
66c0: 6f 77 2d 74 72 69 67 67 65 72 20 6d 61 79 20 68  ow-trigger may h
66d0: 61 76 65 20 64 65 6c 65 74 65 64 20 74 68 65 20  ave deleted the 
66e0: 72 6f 77 20 62 65 69 6e 67 20 75 70 64 61 74 65  row being update
66f0: 64 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20 2a  d. In this.    *
6700: 2a 20 63 61 73 65 2c 20 6a 75 6d 70 20 74 6f 20  * case, jump to 
6710: 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 20 4e 6f  the next row. No
6720: 20 75 70 64 61 74 65 73 20 6f 72 20 41 46 54 45   updates or AFTE
6730: 52 20 74 72 69 67 67 65 72 73 20 61 72 65 20 0a  R triggers are .
6740: 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2e      ** required.
6750: 20 54 68 69 73 20 62 65 68 61 76 69 6f 72 20 2d   This behavior -
6760: 20 77 68 61 74 20 68 61 70 70 65 6e 73 20 77 68   what happens wh
6770: 65 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67  en the row being
6780: 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20   updated.    ** 
6790: 69 73 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65  is deleted or re
67a0: 6e 61 6d 65 64 20 62 79 20 61 20 42 45 46 4f 52  named by a BEFOR
67b0: 45 20 74 72 69 67 67 65 72 20 2d 20 69 73 20 6c  E trigger - is l
67c0: 65 66 74 20 75 6e 64 65 66 69 6e 65 64 20 69 6e  eft undefined in
67d0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 6f 63 75   the.    ** docu
67e0: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  mentation..    *
67f0: 2f 0a 20 20 20 20 69 66 28 20 70 50 6b 20 29 7b  /.    if( pPk ){
6800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6810: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
6820: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 44 61 74  P_NotFound, iDat
6830: 61 43 75 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69  aCur, labelConti
6840: 6e 75 65 2c 72 65 67 4b 65 79 2c 6e 4b 65 79 29  nue,regKey,nKey)
6850: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
6860: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c  rage(v);.    }el
6870: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
6880: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6890: 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 44 61  P_NotExists, iDa
68a0: 74 61 43 75 72 2c 20 6c 61 62 65 6c 43 6f 6e 74  taCur, labelCont
68b0: 69 6e 75 65 2c 20 72 65 67 4f 6c 64 52 6f 77 69  inue, regOldRowi
68c0: 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  d);.      VdbeCo
68d0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
68e0: 0a 0a 20 20 20 20 2f 2a 20 41 66 74 65 72 2d 42  ..    /* After-B
68f0: 45 46 4f 52 45 2d 74 72 69 67 67 65 72 2d 72 65  EFORE-trigger-re
6900: 6c 6f 61 64 2d 6c 6f 6f 70 3a 0a 20 20 20 20 2a  load-loop:.    *
6910: 2a 20 49 66 20 69 74 20 64 69 64 20 6e 6f 74 20  * If it did not 
6920: 64 65 6c 65 74 65 20 69 74 2c 20 74 68 65 20 42  delete it, the B
6930: 45 46 4f 52 45 20 74 72 69 67 67 65 72 20 6d 61  EFORE trigger ma
6940: 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6d 6f 64  y still have mod
6950: 69 66 69 65 64 20 0a 20 20 20 20 2a 2a 20 73 6f  ified .    ** so
6960: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
6970: 73 20 6f 66 20 74 68 65 20 72 6f 77 20 62 65 69  s of the row bei
6980: 6e 67 20 75 70 64 61 74 65 64 2e 20 4c 6f 61 64  ng updated. Load
6990: 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   the values for 
69a0: 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  .    ** all colu
69b0: 6d 6e 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64  mns not modified
69c0: 20 62 79 20 74 68 65 20 75 70 64 61 74 65 20 73   by the update s
69d0: 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 20 74 68  tatement into th
69e0: 65 69 72 20 72 65 67 69 73 74 65 72 73 0a 20 20  eir registers.  
69f0: 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69    ** in case thi
6a00: 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2e 20  s has happened. 
6a10: 4f 6e 6c 79 20 75 6e 6d 6f 64 69 66 69 65 64 20  Only unmodified 
6a20: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 72 65 6c 6f  columns are relo
6a30: 61 64 65 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  aded..    ** The
6a40: 20 76 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64   values computed
6a50: 20 66 6f 72 20 6d 6f 64 69 66 69 65 64 20 63 6f   for modified co
6a60: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 76 61  lumns use the va
6a70: 6c 75 65 73 20 62 65 66 6f 72 65 20 74 68 65 0a  lues before the.
6a80: 20 20 20 20 2a 2a 20 42 45 46 4f 52 45 20 74 72      ** BEFORE tr
6a90: 69 67 67 65 72 20 72 75 6e 73 2e 20 20 53 65 65  igger runs.  See
6aa0: 20 74 65 73 74 20 63 61 73 65 20 74 72 69 67 67   test case trigg
6ab0: 65 72 31 2d 31 38 2e 30 20 28 61 64 64 65 64 20  er1-18.0 (added 
6ac0: 32 30 31 38 2d 30 34 2d 32 36 29 0a 20 20 20 20  2018-04-26).    
6ad0: 2a 2a 20 66 6f 72 20 61 6e 20 65 78 61 6d 70 6c  ** for an exampl
6ae0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
6af0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
6b00: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
6b10: 20 69 66 28 20 61 58 52 65 66 5b 69 5d 3c 30 20   if( aXRef[i]<0 
6b20: 26 26 20 69 21 3d 70 54 61 62 2d 3e 69 50 4b 65  && i!=pTab->iPKe
6b30: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  y ){.        sql
6b40: 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
6b50: 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20  olumnOfTable(v, 
6b60: 70 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20  pTab, iDataCur, 
6b70: 69 2c 20 72 65 67 4e 65 77 2b 69 29 3b 0a 20 20  i, regNew+i);.  
6b80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6b90: 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29  .  if( !isView )
6ba0: 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 63 6f 6e 73  {.    /* Do cons
6bb0: 74 72 61 69 6e 74 20 63 68 65 63 6b 73 2e 20 2a  traint checks. *
6bc0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65  /.    assert( re
6bd0: 67 4f 6c 64 52 6f 77 69 64 3e 30 20 29 3b 0a 20  gOldRowid>0 );. 
6be0: 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61     sqlite3Genera
6bf0: 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
6c00: 6b 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ks(pParse, pTab,
6c10: 20 61 52 65 67 49 64 78 2c 20 69 44 61 74 61 43   aRegIdx, iDataC
6c20: 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20 20 20  ur, iIdxCur,.   
6c30: 20 20 20 20 20 72 65 67 4e 65 77 52 6f 77 69 64       regNewRowid
6c40: 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c 20 63  , regOldRowid, c
6c50: 68 6e 67 4b 65 79 2c 20 6f 6e 45 72 72 6f 72 2c  hngKey, onError,
6c60: 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 2c 20   labelContinue, 
6c70: 26 62 52 65 70 6c 61 63 65 2c 0a 20 20 20 20 20  &bReplace,.     
6c80: 20 20 20 61 58 52 65 66 2c 20 30 29 3b 0a 0a 20     aXRef, 0);.. 
6c90: 20 20 20 2f 2a 20 49 66 20 52 45 50 4c 41 43 45     /* If REPLACE
6ca0: 20 63 6f 6e 66 6c 69 63 74 20 68 61 6e 64 6c 69   conflict handli
6cb0: 6e 67 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ng may have been
6cc0: 20 75 73 65 64 2c 20 6f 72 20 69 66 20 74 68 65   used, or if the
6cd0: 20 50 4b 20 6f 66 20 74 68 65 0a 20 20 20 20 2a   PK of the.    *
6ce0: 2a 20 72 6f 77 20 69 73 20 63 68 61 6e 67 69 6e  * row is changin
6cf0: 67 2c 20 74 68 65 6e 20 74 68 65 20 47 65 6e 65  g, then the Gene
6d00: 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68  rateConstraintCh
6d10: 65 63 6b 73 28 29 20 61 62 6f 76 65 20 6d 61 79  ecks() above may
6d20: 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 6d 6f 76   have.    ** mov
6d30: 65 64 20 63 75 72 73 6f 72 20 69 44 61 74 61 43  ed cursor iDataC
6d40: 75 72 2e 20 52 65 73 65 65 6b 20 69 74 2e 20 2a  ur. Reseek it. *
6d50: 2f 0a 20 20 20 20 69 66 28 20 62 52 65 70 6c 61  /.    if( bRepla
6d60: 63 65 20 7c 7c 20 63 68 6e 67 4b 65 79 20 29 7b  ce || chngKey ){
6d70: 0a 20 20 20 20 20 20 69 66 28 20 70 50 6b 20 29  .      if( pPk )
6d80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6d90: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
6da0: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 69 44  , OP_NotFound,iD
6db0: 61 74 61 43 75 72 2c 6c 61 62 65 6c 43 6f 6e 74  ataCur,labelCont
6dc0: 69 6e 75 65 2c 72 65 67 4b 65 79 2c 6e 4b 65 79  inue,regKey,nKey
6dd0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6de0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6df0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6e00: 4e 6f 74 45 78 69 73 74 73 2c 20 69 44 61 74 61  NotExists, iData
6e10: 43 75 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e  Cur, labelContin
6e20: 75 65 2c 72 65 67 4f 6c 64 52 6f 77 69 64 29 3b  ue,regOldRowid);
6e30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
6e40: 20 20 20 20 2f 2a 20 44 6f 20 46 4b 20 63 6f 6e      /* Do FK con
6e50: 73 74 72 61 69 6e 74 20 63 68 65 63 6b 73 2e 20  straint checks. 
6e60: 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73 46 4b  */.    if( hasFK
6e70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6e80: 33 46 6b 43 68 65 63 6b 28 70 50 61 72 73 65 2c  3FkCheck(pParse,
6e90: 20 70 54 61 62 2c 20 72 65 67 4f 6c 64 52 6f 77   pTab, regOldRow
6ea0: 69 64 2c 20 30 2c 20 61 58 52 65 66 2c 20 63 68  id, 0, aXRef, ch
6eb0: 6e 67 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 0a 20  ngKey);.    }.. 
6ec0: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
6ed0: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61   index entries a
6ee0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
6ef0: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
6f00: 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  d.  */.    sqlit
6f10: 65 33 47 65 6e 65 72 61 74 65 52 6f 77 49 6e 64  e3GenerateRowInd
6f20: 65 78 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c  exDelete(pParse,
6f30: 20 70 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c   pTab, iDataCur,
6f40: 20 69 49 64 78 43 75 72 2c 20 61 52 65 67 49 64   iIdxCur, aRegId
6f50: 78 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  x, -1);..    /* 
6f60: 49 66 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  If changing the 
6f70: 72 6f 77 69 64 20 76 61 6c 75 65 2c 20 6f 72 20  rowid value, or 
6f80: 69 66 20 74 68 65 72 65 20 61 72 65 20 66 6f 72  if there are for
6f90: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
6fa0: 69 6e 74 73 0a 20 20 20 20 2a 2a 20 74 6f 20 70  ints.    ** to p
6fb0: 72 6f 63 65 73 73 2c 20 64 65 6c 65 74 65 20 74  rocess, delete t
6fc0: 68 65 20 6f 6c 64 20 72 65 63 6f 72 64 2e 20 4f  he old record. O
6fd0: 74 68 65 72 77 69 73 65 2c 20 61 64 64 20 61 20  therwise, add a 
6fe0: 6e 6f 6f 70 20 4f 50 5f 44 65 6c 65 74 65 0a 20  noop OP_Delete. 
6ff0: 20 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20     ** to invoke 
7000: 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68  the pre-update h
7010: 6f 6f 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ook..    **.    
7020: 2a 2a 20 54 68 61 74 20 28 72 65 67 4e 65 77 3d  ** That (regNew=
7030: 3d 72 65 67 6e 65 77 52 6f 77 69 64 2b 31 29 20  =regnewRowid+1) 
7040: 69 73 20 74 72 75 65 20 69 73 20 61 6c 73 6f 20  is true is also 
7050: 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 74 68  important for th
7060: 65 20 0a 20 20 20 20 2a 2a 20 70 72 65 2d 75 70  e .    ** pre-up
7070: 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68  date hook. If th
7080: 65 20 63 61 6c 6c 65 72 20 69 6e 76 6f 6b 65 73  e caller invokes
7090: 20 70 72 65 75 70 64 61 74 65 5f 6e 65 77 28 29   preupdate_new()
70a0: 2c 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 20  , the returned. 
70b0: 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 73 20 63     ** value is c
70c0: 6f 70 69 65 64 20 66 72 6f 6d 20 6d 65 6d 6f 72  opied from memor
70d0: 79 20 63 65 6c 6c 20 28 72 65 67 4e 65 77 52 6f  y cell (regNewRo
70e0: 77 69 64 2b 31 2b 69 43 6f 6c 29 2c 20 77 68 65  wid+1+iCol), whe
70f0: 72 65 20 69 43 6f 6c 0a 20 20 20 20 2a 2a 20 69  re iCol.    ** i
7100: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64  s the column ind
7110: 65 78 20 73 75 70 70 6c 69 65 64 20 62 79 20 74  ex supplied by t
7120: 68 65 20 75 73 65 72 2e 0a 20 20 20 20 2a 2f 0a  he user..    */.
7130: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67 4e      assert( regN
7140: 65 77 3d 3d 72 65 67 4e 65 77 52 6f 77 69 64 2b  ew==regNewRowid+
7150: 31 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  1 );.#ifdef SQLI
7160: 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
7170: 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 73 71 6c  ATE_HOOK.    sql
7180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7190: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 44 61  , OP_Delete, iDa
71a0: 74 61 43 75 72 2c 0a 20 20 20 20 20 20 20 20 4f  taCur,.        O
71b0: 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 20 7c  PFLAG_ISUPDATE |
71c0: 20 28 28 68 61 73 46 4b 3e 31 20 7c 7c 20 63 68   ((hasFK>1 || ch
71d0: 6e 67 4b 65 79 29 20 3f 20 30 20 3a 20 4f 50 46  ngKey) ? 0 : OPF
71e0: 4c 41 47 5f 49 53 4e 4f 4f 50 29 2c 0a 20 20 20  LAG_ISNOOP),.   
71f0: 20 20 20 20 20 72 65 67 4e 65 77 52 6f 77 69 64       regNewRowid
7200: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
7210: 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
7220: 53 5f 4d 55 4c 54 49 20 29 7b 0a 20 20 20 20 20  S_MULTI ){.     
7230: 20 61 73 73 65 72 74 28 20 68 61 73 46 4b 3d 3d   assert( hasFK==
7240: 30 20 26 26 20 63 68 6e 67 4b 65 79 3d 3d 30 20  0 && chngKey==0 
7250: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7260: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
7270: 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54  OPFLAG_SAVEPOSIT
7280: 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ION);.    }.    
7290: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73  if( !pParse->nes
72a0: 74 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ted ){.      sql
72b0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
72c0: 28 76 2c 20 70 54 61 62 2c 20 50 34 5f 54 41 42  (v, pTab, P4_TAB
72d0: 4c 45 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  LE);.    }.#else
72e0: 0a 20 20 20 20 69 66 28 20 68 61 73 46 4b 3e 31  .    if( hasFK>1
72f0: 20 7c 7c 20 63 68 6e 67 4b 65 79 20 29 7b 0a 20   || chngKey ){. 
7300: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7310: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 6c  AddOp2(v, OP_Del
7320: 65 74 65 2c 20 69 44 61 74 61 43 75 72 2c 20 30  ete, iDataCur, 0
7330: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
7340: 0a 20 20 20 20 69 66 28 20 68 61 73 46 4b 20 29  .    if( hasFK )
7350: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
7360: 6b 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  kCheck(pParse, p
7370: 54 61 62 2c 20 30 2c 20 72 65 67 4e 65 77 52 6f  Tab, 0, regNewRo
7380: 77 69 64 2c 20 61 58 52 65 66 2c 20 63 68 6e 67  wid, aXRef, chng
7390: 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  Key);.    }.  . 
73a0: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
73b0: 20 6e 65 77 20 69 6e 64 65 78 20 65 6e 74 72 69   new index entri
73c0: 65 73 20 61 6e 64 20 74 68 65 20 6e 65 77 20 72  es and the new r
73d0: 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 20 20 73 71  ecord. */.    sq
73e0: 6c 69 74 65 33 43 6f 6d 70 6c 65 74 65 49 6e 73  lite3CompleteIns
73f0: 65 72 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20  ertion(.        
7400: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44  pParse, pTab, iD
7410: 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c  ataCur, iIdxCur,
7420: 20 72 65 67 4e 65 77 52 6f 77 69 64 2c 20 61 52   regNewRowid, aR
7430: 65 67 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20  egIdx, .        
7440: 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 20  OPFLAG_ISUPDATE 
7450: 7c 20 28 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  | (eOnePass==ONE
7460: 50 41 53 53 5f 4d 55 4c 54 49 20 3f 20 4f 50 46  PASS_MULTI ? OPF
7470: 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
7480: 20 3a 20 30 29 2c 20 0a 20 20 20 20 20 20 20 20   : 0), .        
7490: 30 2c 20 30 0a 20 20 20 20 29 3b 0a 0a 20 20 20  0, 0.    );..   
74a0: 20 2f 2a 20 44 6f 20 61 6e 79 20 4f 4e 20 43 41   /* Do any ON CA
74b0: 53 43 41 44 45 2c 20 53 45 54 20 4e 55 4c 4c 20  SCADE, SET NULL 
74c0: 6f 72 20 53 45 54 20 44 45 46 41 55 4c 54 20 6f  or SET DEFAULT o
74d0: 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69 72  perations requir
74e0: 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61 6e  ed to.    ** han
74f0: 64 6c 65 20 72 6f 77 73 20 28 70 6f 73 73 69 62  dle rows (possib
7500: 6c 79 20 69 6e 20 6f 74 68 65 72 20 74 61 62 6c  ly in other tabl
7510: 65 73 29 20 74 68 61 74 20 72 65 66 65 72 20 76  es) that refer v
7520: 69 61 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  ia a foreign key
7530: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  .    ** to the r
7540: 6f 77 20 6a 75 73 74 20 75 70 64 61 74 65 64 2e  ow just updated.
7550: 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 68 61 73   */ .    if( has
7560: 46 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FK ){.      sqli
7570: 74 65 33 46 6b 41 63 74 69 6f 6e 73 28 70 50 61  te3FkActions(pPa
7580: 72 73 65 2c 20 70 54 61 62 2c 20 70 43 68 61 6e  rse, pTab, pChan
7590: 67 65 73 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64  ges, regOldRowid
75a0: 2c 20 61 58 52 65 66 2c 20 63 68 6e 67 4b 65 79  , aXRef, chngKey
75b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
75c0: 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
75d0: 20 72 6f 77 20 63 6f 75 6e 74 65 72 20 0a 20 20   row counter .  
75e0: 2a 2f 0a 20 20 69 66 28 20 72 65 67 52 6f 77 43  */.  if( regRowC
75f0: 6f 75 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ount ){.    sqli
7600: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7610: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67 52   OP_AddImm, regR
7620: 6f 77 43 6f 75 6e 74 2c 20 31 29 3b 0a 20 20 7d  owCount, 1);.  }
7630: 0a 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 52  ..  sqlite3CodeR
7640: 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65  owTrigger(pParse
7650: 2c 20 70 54 72 69 67 67 65 72 2c 20 54 4b 5f 55  , pTrigger, TK_U
7660: 50 44 41 54 45 2c 20 70 43 68 61 6e 67 65 73 2c  PDATE, pChanges,
7670: 20 0a 20 20 20 20 20 20 54 52 49 47 47 45 52 5f   .      TRIGGER_
7680: 41 46 54 45 52 2c 20 70 54 61 62 2c 20 72 65 67  AFTER, pTab, reg
7690: 4f 6c 64 52 6f 77 69 64 2c 20 6f 6e 45 72 72 6f  OldRowid, onErro
76a0: 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65  r, labelContinue
76b0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 65 61 74 20  );..  /* Repeat 
76c0: 74 68 65 20 61 62 6f 76 65 20 77 69 74 68 20 74  the above with t
76d0: 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 74  he next record t
76e0: 6f 20 62 65 20 75 70 64 61 74 65 64 2c 20 75 6e  o be updated, un
76f0: 74 69 6c 0a 20 20 2a 2a 20 61 6c 6c 20 72 65 63  til.  ** all rec
7700: 6f 72 64 20 73 65 6c 65 63 74 65 64 20 62 79 20  ord selected by 
7710: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
7720: 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
7730: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ed..  */.  if( e
7740: 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
7750: 5f 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20 2f  _SINGLE ){.    /
7760: 2a 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * Nothing to do 
7770: 61 74 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 66  at end-of-loop f
7780: 6f 72 20 61 20 73 69 6e 67 6c 65 2d 70 61 73 73  or a single-pass
7790: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
77a0: 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
77b0: 53 5f 4d 55 4c 54 49 20 29 7b 0a 20 20 20 20 73  S_MULTI ){.    s
77c0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
77d0: 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43  eLabel(v, labelC
77e0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71  ontinue);.    sq
77f0: 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
7800: 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Info);.  }else i
7810: 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 73 71  f( pPk ){.    sq
7820: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
7830: 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6f  Label(v, labelCo
7840: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c  ntinue);.    sql
7850: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7860: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 45 70 68 2c  , OP_Next, iEph,
7870: 20 61 64 64 72 54 6f 70 29 3b 20 56 64 62 65 43   addrTop); VdbeC
7880: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65  overage(v);.  }e
7890: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
78a0: 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
78b0: 6c 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a  lContinue);.  }.
78c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
78d0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
78e0: 65 6c 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20  elBreak);..  /* 
78f0: 55 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74  Update the sqlit
7900: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
7910: 20 62 79 20 73 74 6f 72 69 6e 67 20 74 68 65 20   by storing the 
7920: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 20  content of the. 
7930: 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69   ** maximum rowi
7940: 64 20 63 6f 75 6e 74 65 72 20 76 61 6c 75 65 73  d counter values
7950: 20 72 65 63 6f 72 64 65 64 20 77 68 69 6c 65 20   recorded while 
7960: 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 0a 20  inserting into. 
7970: 20 2a 2a 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   ** autoincremen
7980: 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  t tables..  */. 
7990: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73   if( pParse->nes
79a0: 74 65 64 3d 3d 30 20 26 26 20 70 50 61 72 73 65  ted==0 && pParse
79b0: 2d 3e 70 54 72 69 67 67 65 72 54 61 62 3d 3d 30  ->pTriggerTab==0
79c0: 20 26 26 20 70 55 70 73 65 72 74 3d 3d 30 20 29   && pUpsert==0 )
79d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74  {.    sqlite3Aut
79e0: 6f 69 6e 63 72 65 6d 65 6e 74 45 6e 64 28 70 50  oincrementEnd(pP
79f0: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
7a00: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  .  ** Return the
7a10: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
7a20: 74 68 61 74 20 77 65 72 65 20 63 68 61 6e 67 65  that were change
7a30: 64 2c 20 69 66 20 77 65 20 61 72 65 20 74 72 61  d, if we are tra
7a40: 63 6b 69 6e 67 0a 20 20 2a 2a 20 74 68 61 74 20  cking.  ** that 
7a50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a  information..  *
7a60: 2f 0a 20 20 69 66 28 20 72 65 67 52 6f 77 43 6f  /.  if( regRowCo
7a70: 75 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  unt ){.    sqlit
7a80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7a90: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65  OP_ResultRow, re
7aa0: 67 52 6f 77 43 6f 75 6e 74 2c 20 31 29 3b 0a 20  gRowCount, 1);. 
7ab0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7ac0: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a  tNumCols(v, 1);.
7ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
7ae0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20  etColName(v, 0, 
7af0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 72  COLNAME_NAME, "r
7b00: 6f 77 73 20 75 70 64 61 74 65 64 22 2c 20 53 51  ows updated", SQ
7b10: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7b20: 7d 0a 0a 75 70 64 61 74 65 5f 63 6c 65 61 6e 75  }..update_cleanu
7b30: 70 3a 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68  p:.  sqlite3Auth
7b40: 43 6f 6e 74 65 78 74 50 6f 70 28 26 73 43 6f 6e  ContextPop(&sCon
7b50: 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  text);.  sqlite3
7b60: 44 62 46 72 65 65 28 64 62 2c 20 61 58 52 65 66  DbFree(db, aXRef
7b70: 29 3b 20 2f 2a 20 41 6c 73 6f 20 66 72 65 65 73  ); /* Also frees
7b80: 20 61 52 65 67 49 64 78 5b 5d 20 61 6e 64 20 61   aRegIdx[] and a
7b90: 54 6f 4f 70 65 6e 5b 5d 20 2a 2f 0a 20 20 73 71  ToOpen[] */.  sq
7ba0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
7bb0: 74 65 28 64 62 2c 20 70 54 61 62 4c 69 73 74 29  te(db, pTabList)
7bc0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
7bd0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
7be0: 68 61 6e 67 65 73 29 3b 0a 20 20 73 71 6c 69 74  hanges);.  sqlit
7bf0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
7c00: 20 70 57 68 65 72 65 29 3b 0a 23 69 66 20 64 65   pWhere);.#if de
7c10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
7c20: 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54  BLE_UPDATE_DELET
7c30: 45 5f 4c 49 4d 49 54 29 20 0a 20 20 73 71 6c 69  E_LIMIT) .  sqli
7c40: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
7c50: 65 28 64 62 2c 20 70 4f 72 64 65 72 42 79 29 3b  e(db, pOrderBy);
7c60: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
7c70: 6c 65 74 65 28 64 62 2c 20 70 4c 69 6d 69 74 29  lete(db, pLimit)
7c80: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
7c90: 6e 3b 0a 7d 0a 2f 2a 20 4d 61 6b 65 20 73 75 72  n;.}./* Make sur
7ca0: 65 20 22 69 73 56 69 65 77 22 20 61 6e 64 20 6f  e "isView" and o
7cb0: 74 68 65 72 20 6d 61 63 72 6f 73 20 64 65 66 69  ther macros defi
7cc0: 6e 65 64 20 61 62 6f 76 65 20 61 72 65 20 75 6e  ned above are un
7cd0: 64 65 66 69 6e 65 64 2e 20 4f 74 68 65 72 77 69  defined. Otherwi
7ce0: 73 65 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 69  se.** they may i
7cf0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 63 6f  nterfere with co
7d00: 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 6f 74 68  mpilation of oth
7d10: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  er functions in 
7d20: 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 28 6f 72  this file.** (or
7d30: 20 69 6e 20 61 6e 6f 74 68 65 72 20 66 69 6c 65   in another file
7d40: 2c 20 69 66 20 74 68 69 73 20 66 69 6c 65 20 62  , if this file b
7d50: 65 63 6f 6d 65 73 20 70 61 72 74 20 6f 66 20 74  ecomes part of t
7d60: 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 29  he amalgamation)
7d70: 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 69 73 56  .  */.#ifdef isV
7d80: 69 65 77 0a 20 23 75 6e 64 65 66 20 69 73 56 69  iew. #undef isVi
7d90: 65 77 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  ew.#endif.#ifdef
7da0: 20 70 54 72 69 67 67 65 72 0a 20 23 75 6e 64 65   pTrigger. #unde
7db0: 66 20 70 54 72 69 67 67 65 72 0a 23 65 6e 64 69  f pTrigger.#endi
7dc0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
7dd0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7de0: 42 4c 45 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  BLE./*.** Genera
7df0: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 55  te code for an U
7e00: 50 44 41 54 45 20 6f 66 20 61 20 76 69 72 74 75  PDATE of a virtu
7e10: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
7e20: 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f  There are two po
7e30: 73 73 69 62 6c 65 20 73 74 72 61 74 65 67 69 65  ssible strategie
7e40: 73 20 2d 20 74 68 65 20 64 65 66 61 75 6c 74 20  s - the default 
7e50: 61 6e 64 20 74 68 65 20 73 70 65 63 69 61 6c 20  and the special 
7e60: 0a 2a 2a 20 22 6f 6e 65 70 61 73 73 22 20 73 74  .** "onepass" st
7e70: 72 61 74 65 67 79 2e 20 4f 6e 65 70 61 73 73 20  rategy. Onepass 
7e80: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  is only used if 
7e90: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
7ea0: 65 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  e .** implementa
7eb0: 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74  tion indicates t
7ec0: 68 61 74 20 70 57 68 65 72 65 20 6d 61 79 20 6d  hat pWhere may m
7ed0: 61 74 63 68 20 61 74 20 6d 6f 73 74 20 6f 6e 65  atch at most one
7ee0: 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   row..**.** The 
7ef0: 64 65 66 61 75 6c 74 20 73 74 72 61 74 65 67 79  default strategy
7f00: 20 69 73 20 74 6f 20 63 72 65 61 74 65 20 61 6e   is to create an
7f10: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
7f20: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
7f30: 2a 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74  * for each row t
7f40: 6f 20 62 65 20 63 68 61 6e 67 65 64 3a 0a 2a 2a  o be changed:.**
7f50: 0a 2a 2a 20 20 20 28 41 29 20 20 54 68 65 20 6f  .**   (A)  The o
7f60: 72 69 67 69 6e 61 6c 20 72 6f 77 69 64 20 6f 66  riginal rowid of
7f70: 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 20 20   that row..**   
7f80: 28 42 29 20 20 54 68 65 20 72 65 76 69 73 65 64  (B)  The revised
7f90: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 72   rowid for the r
7fa0: 6f 77 2e 0a 2a 2a 20 20 20 28 43 29 20 20 54 68  ow..**   (C)  Th
7fb0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 65 76 65  e content of eve
7fc0: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ry column in the
7fd0: 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   row..**.** Then
7fe0: 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   loop through th
7ff0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
8000: 69 73 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  is ephemeral tab
8010: 6c 65 20 65 78 65 63 75 74 69 6e 67 20 61 0a 2a  le executing a.*
8020: 2a 20 56 55 70 64 61 74 65 20 66 6f 72 20 65 61  * VUpdate for ea
8030: 63 68 20 72 6f 77 2e 20 57 68 65 6e 20 66 69 6e  ch row. When fin
8040: 69 73 68 65 64 2c 20 64 72 6f 70 20 74 68 65 20  ished, drop the 
8050: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
8060: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6f 6e 65 70  .**.** The "onep
8070: 61 73 73 22 20 73 74 72 61 74 65 67 79 20 64 6f  ass" strategy do
8080: 65 73 20 6e 6f 74 20 75 73 65 20 61 6e 20 65 70  es not use an ep
8090: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 49  hemeral table. I
80a0: 6e 73 74 65 61 64 2c 20 69 74 0a 2a 2a 20 73 74  nstead, it.** st
80b0: 6f 72 65 73 20 74 68 65 20 73 61 6d 65 20 76 61  ores the same va
80c0: 6c 75 65 73 20 28 41 2c 20 42 20 61 6e 64 20 43  lues (A, B and C
80d0: 20 61 62 6f 76 65 29 20 69 6e 20 61 20 72 65 67   above) in a reg
80e0: 69 73 74 65 72 20 61 72 72 61 79 20 61 6e 64 0a  ister array and.
80f0: 2a 2a 20 6d 61 6b 65 73 20 61 20 73 69 6e 67 6c  ** makes a singl
8100: 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20  e invocation of 
8110: 56 55 70 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  VUpdate..*/.stat
8120: 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 56 69  ic void updateVi
8130: 72 74 75 61 6c 54 61 62 6c 65 28 0a 20 20 50 61  rtualTable(.  Pa
8140: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8150: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
8160: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
8170: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
8180: 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
8190: 61 6c 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6d  al table to be m
81a0: 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 54 61 62  odified */.  Tab
81b0: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
81c0: 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
81d0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
81e0: 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20  List *pChanges, 
81f0: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20   /* The columns 
8200: 74 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65  to change in the
8210: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
8220: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 6f  t */.  Expr *pRo
8230: 77 69 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 45  wid,        /* E
8240: 78 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74  xpression used t
8250: 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20  o recompute the 
8260: 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  rowid */.  int *
8270: 61 58 52 65 66 2c 20 20 20 20 20 20 20 20 20 20  aXRef,          
8280: 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
8290: 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 54 61 62 20  columns of pTab 
82a0: 74 6f 20 65 6e 74 72 69 65 73 20 69 6e 20 70 43  to entries in pC
82b0: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 45 78 70 72  hanges */.  Expr
82c0: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
82d0: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
82e0: 20 6f 66 20 74 68 65 20 55 50 44 41 54 45 20 73   of the UPDATE s
82f0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
8300: 74 20 6f 6e 45 72 72 6f 72 20 20 20 20 20 20 20  t onError       
8310: 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     /* ON CONFLIC
8320: 54 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 29 7b  T strategy */.){
8330: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
8340: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20  rse->pVdbe;  /* 
8350: 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  Virtual machine 
8360: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8370: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 70 68 65  on */.  int ephe
8380: 6d 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  mTab;           
8390: 20 20 2f 2a 20 54 61 62 6c 65 20 68 6f 6c 64 69    /* Table holdi
83a0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ng the result of
83b0: 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20   the SELECT */. 
83c0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
83d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
83e0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
83f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8400: 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 44 61 74  arse->db; /* Dat
8410: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8420: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8430: 20 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74   *pVTab = (const
8440: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 47 65   char*)sqlite3Ge
8450: 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
8460: 29 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  );.  WhereInfo *
8470: 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 41  pWInfo;.  int nA
8480: 72 67 20 3d 20 32 20 2b 20 70 54 61 62 2d 3e 6e  rg = 2 + pTab->n
8490: 43 6f 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  Col;      /* Num
84a0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
84b0: 20 74 6f 20 56 55 70 64 61 74 65 20 2a 2f 0a 20   to VUpdate */. 
84c0: 20 69 6e 74 20 72 65 67 41 72 67 3b 20 20 20 20   int regArg;    
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84e0: 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73 74   /* First regist
84f0: 65 72 20 69 6e 20 56 55 70 64 61 74 65 20 61 72  er in VUpdate ar
8500: 67 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  g array */.  int
8510: 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20   regRec;        
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8530: 52 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63  Register in whic
8540: 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 72 65  h to assemble re
8550: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  cord */.  int re
8560: 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  gRowid;         
8570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
8580: 69 73 74 65 72 20 66 6f 72 20 65 70 68 65 6d 20  ister for ephem 
8590: 74 61 62 6c 65 20 72 6f 77 69 64 20 2a 2f 0a 20  table rowid */. 
85a0: 20 69 6e 74 20 69 43 73 72 20 3d 20 70 53 72 63   int iCsr = pSrc
85b0: 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 20  ->a[0].iCursor; 
85c0: 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20   /* Cursor used 
85d0: 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  for virtual tabl
85e0: 65 20 73 63 61 6e 20 2a 2f 0a 20 20 69 6e 74 20  e scan */.  int 
85f0: 61 44 75 6d 6d 79 5b 32 5d 3b 20 20 20 20 20 20  aDummy[2];      
8600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
8610: 6e 75 73 65 64 20 61 72 67 20 66 6f 72 20 73 71  nused arg for sq
8620: 6c 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50  lite3WhereOkOneP
8630: 61 73 73 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65  ass() */.  int e
8640: 4f 6e 65 50 61 73 73 3b 20 20 20 20 20 20 20 20  OnePass;        
8650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
8660: 75 65 20 74 6f 20 75 73 65 20 6f 6e 65 70 61 73  ue to use onepas
8670: 73 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20  s strategy */.  
8680: 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
8690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86a0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
86b0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a  _OpenEphemeral *
86c0: 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
86d0: 20 6e 41 72 67 20 72 65 67 69 73 74 65 72 73 20   nArg registers 
86e0: 69 6e 20 77 68 69 63 68 20 74 6f 20 67 61 74 68  in which to gath
86f0: 65 72 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  er the arguments
8700: 20 66 6f 72 20 56 55 70 64 61 74 65 2e 20 54 68   for VUpdate. Th
8710: 65 6e 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61  en.  ** create a
8720: 6e 64 20 6f 70 65 6e 20 74 68 65 20 65 70 68 65  nd open the ephe
8730: 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 20 77  meral table in w
8740: 68 69 63 68 20 74 68 65 20 72 65 63 6f 72 64 73  hich the records
8750: 20 63 72 65 61 74 65 64 20 66 72 6f 6d 0a 20 20   created from.  
8760: 2a 2a 20 74 68 65 73 65 20 61 72 67 75 6d 65 6e  ** these argumen
8770: 74 73 20 77 69 6c 6c 20 62 65 20 74 65 6d 70 6f  ts will be tempo
8780: 72 61 72 69 6c 79 20 73 74 6f 72 65 64 2e 20 2a  rarily stored. *
8790: 2f 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b  /.  assert( v );
87a0: 0a 20 20 65 70 68 65 6d 54 61 62 20 3d 20 70 50  .  ephemTab = pP
87b0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
87c0: 61 64 64 72 3d 20 73 71 6c 69 74 65 33 56 64 62  addr= sqlite3Vdb
87d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
87e0: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 65 70 68  enEphemeral, eph
87f0: 65 6d 54 61 62 2c 20 6e 41 72 67 29 3b 0a 20 20  emTab, nArg);.  
8800: 72 65 67 41 72 67 20 3d 20 70 50 61 72 73 65 2d  regArg = pParse-
8810: 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 70 50 61  >nMem + 1;.  pPa
8820: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72  rse->nMem += nAr
8830: 67 3b 0a 20 20 72 65 67 52 65 63 20 3d 20 2b 2b  g;.  regRec = ++
8840: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
8850: 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
8860: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 2f 2a  rse->nMem;..  /*
8870: 20 53 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20   Start scanning 
8880: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
8890: 65 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20  e */.  pWInfo = 
88a0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
88b0: 6e 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  n(pParse, pSrc, 
88c0: 70 57 68 65 72 65 2c 20 30 2c 30 2c 57 48 45 52  pWhere, 0,0,WHER
88d0: 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
88e0: 44 2c 30 29 3b 0a 20 20 69 66 28 20 70 57 49 6e  D,0);.  if( pWIn
88f0: 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  fo==0 ) return;.
8900: 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74  .  /* Populate t
8910: 68 65 20 61 72 67 75 6d 65 6e 74 20 72 65 67 69  he argument regi
8920: 73 74 65 72 73 2e 20 2a 2f 0a 20 20 66 6f 72 28  sters. */.  for(
8930: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
8940: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
8950: 20 61 58 52 65 66 5b 69 5d 3e 3d 30 20 29 7b 0a   aXRef[i]>=0 ){.
8960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8970: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
8980: 68 61 6e 67 65 73 2d 3e 61 5b 61 58 52 65 66 5b  hanges->a[aXRef[
8990: 69 5d 5d 2e 70 45 78 70 72 2c 20 72 65 67 41 72  i]].pExpr, regAr
89a0: 67 2b 32 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73  g+2+i);.    }els
89b0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
89c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
89d0: 5f 56 43 6f 6c 75 6d 6e 2c 20 69 43 73 72 2c 20  _VColumn, iCsr, 
89e0: 69 2c 20 72 65 67 41 72 67 2b 32 2b 69 29 3b 0a  i, regArg+2+i);.
89f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8a00: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
8a10: 4c 41 47 5f 4e 4f 43 48 4e 47 29 3b 2f 2a 20 45  LAG_NOCHNG);/* E
8a20: 6e 61 62 6c 65 20 73 71 6c 69 74 65 33 5f 76 74  nable sqlite3_vt
8a30: 61 62 5f 6e 6f 63 68 61 6e 67 65 28 29 20 2a 2f  ab_nochange() */
8a40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8a50: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
8a60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
8a70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
8a80: 6f 77 69 64 2c 20 69 43 73 72 2c 20 72 65 67 41  owid, iCsr, regA
8a90: 72 67 29 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  rg);.    if( pRo
8aa0: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  wid ){.      sql
8ab0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
8ac0: 72 73 65 2c 20 70 52 6f 77 69 64 2c 20 72 65 67  rse, pRowid, reg
8ad0: 41 72 67 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73  Arg+1);.    }els
8ae0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
8af0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8b00: 5f 52 6f 77 69 64 2c 20 69 43 73 72 2c 20 72 65  _Rowid, iCsr, re
8b10: 67 41 72 67 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  gArg+1);.    }. 
8b20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65   }else{.    Inde
8b30: 78 20 2a 70 50 6b 3b 20 20 20 2f 2a 20 50 52 49  x *pPk;   /* PRI
8b40: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 2a  MARY KEY index *
8b50: 2f 0a 20 20 20 20 69 31 36 20 69 50 6b 3b 20 20  /.    i16 iPk;  
8b60: 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b      /* PRIMARY K
8b70: 45 59 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20  EY column */.   
8b80: 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72   pPk = sqlite3Pr
8b90: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
8ba0: 61 62 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ab);.    assert(
8bb0: 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 20 20 61   pPk!=0 );.    a
8bc0: 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 4b 65 79  ssert( pPk->nKey
8bd0: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 69 50  Col==1 );.    iP
8be0: 6b 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  k = pPk->aiColum
8bf0: 6e 5b 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  n[0];.    sqlite
8c00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8c10: 50 5f 56 43 6f 6c 75 6d 6e 2c 20 69 43 73 72 2c  P_VColumn, iCsr,
8c20: 20 69 50 6b 2c 20 72 65 67 41 72 67 29 3b 0a 20   iPk, regArg);. 
8c30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8c40: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
8c50: 2c 20 72 65 67 41 72 67 2b 32 2b 69 50 6b 2c 20  , regArg+2+iPk, 
8c60: 72 65 67 41 72 67 2b 31 29 3b 0a 20 20 7d 0a 0a  regArg+1);.  }..
8c70: 20 20 65 4f 6e 65 50 61 73 73 20 3d 20 73 71 6c    eOnePass = sql
8c80: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
8c90: 73 73 28 70 57 49 6e 66 6f 2c 20 61 44 75 6d 6d  ss(pWInfo, aDumm
8ca0: 79 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20  y);..  /* There 
8cb0: 69 73 20 6e 6f 20 4f 4e 45 50 41 53 53 5f 4d 55  is no ONEPASS_MU
8cc0: 4c 54 49 20 6f 6e 20 76 69 72 74 75 61 6c 20 74  LTI on virtual t
8cd0: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
8ce0: 74 28 20 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  t( eOnePass==ONE
8cf0: 50 41 53 53 5f 4f 46 46 20 7c 7c 20 65 4f 6e 65  PASS_OFF || eOne
8d00: 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 53 49  Pass==ONEPASS_SI
8d10: 4e 47 4c 45 20 29 3b 0a 0a 20 20 69 66 28 20 65  NGLE );..  if( e
8d20: 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20 20 20 2f  OnePass ){.    /
8d30: 2a 20 49 66 20 75 73 69 6e 67 20 74 68 65 20 6f  * If using the o
8d40: 6e 65 70 61 73 73 20 73 74 72 61 74 65 67 79 2c  nepass strategy,
8d50: 20 6e 6f 2d 6f 70 20 6f 75 74 20 74 68 65 20 4f   no-op out the O
8d60: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
8d70: 63 6f 64 65 64 0a 20 20 20 20 2a 2a 20 61 62 6f  coded.    ** abo
8d80: 76 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ve. */.    sqlit
8d90: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
8da0: 6f 70 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  op(v, addr);.   
8db0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8dc0: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
8dd0: 69 43 73 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCsr);.  }else{.
8de0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
8df0: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
8e00: 61 72 67 75 6d 65 6e 74 20 72 65 67 69 73 74 65  argument registe
8e10: 72 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 69  r contents and i
8e20: 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 0a 20 20  nsert it into.  
8e30: 20 20 2a 2a 20 74 68 65 20 65 70 68 65 6d 65 72    ** the ephemer
8e40: 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  al table. */.   
8e50: 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
8e60: 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  te(pParse);.    
8e70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8e80: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
8e90: 72 64 2c 20 72 65 67 41 72 67 2c 20 6e 41 72 67  rd, regArg, nArg
8ea0: 2c 20 72 65 67 52 65 63 29 3b 0a 23 69 66 64 65  , regRec);.#ifde
8eb0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
8ec0: 20 20 20 2f 2a 20 53 69 67 6e 61 6c 20 61 6e 20     /* Signal an 
8ed0: 61 73 73 65 72 74 28 29 20 77 69 74 68 69 6e 20  assert() within 
8ee0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 74 68  OP_MakeRecord th
8ef0: 61 74 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64  at it is allowed
8f00: 20 74 6f 0a 20 20 20 20 2a 2a 20 61 63 63 65 70   to.    ** accep
8f10: 74 20 6e 6f 2d 63 68 61 6e 67 65 20 72 65 63 6f  t no-change reco
8f20: 72 64 73 20 77 69 74 68 20 73 65 72 69 61 6c 5f  rds with serial_
8f30: 74 79 70 65 20 31 30 20 2a 2f 0a 20 20 20 20 73  type 10 */.    s
8f40: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8f50: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 4e 4f 43  P5(v, OPFLAG_NOC
8f60: 48 4e 47 5f 4d 41 47 49 43 29 3b 0a 23 65 6e 64  HNG_MAGIC);.#end
8f70: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
8f80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
8f90: 65 77 52 6f 77 69 64 2c 20 65 70 68 65 6d 54 61  ewRowid, ephemTa
8fa0: 62 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  b, regRowid);.  
8fb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8fc0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
8fd0: 2c 20 65 70 68 65 6d 54 61 62 2c 20 72 65 67 52  , ephemTab, regR
8fe0: 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ec, regRowid);. 
8ff0: 20 7d 0a 0a 0a 20 20 69 66 28 20 65 4f 6e 65 50   }...  if( eOneP
9000: 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
9010: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74   ){.    /* End t
9020: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
9030: 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 73 71 6c   scan */.    sql
9040: 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
9050: 6e 66 6f 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65  nfo);..    /* Be
9060: 67 69 6e 20 73 63 61 6e 6e 6e 69 6e 67 20 74 68  gin scannning th
9070: 72 6f 75 67 68 20 74 68 65 20 65 70 68 65 6d 65  rough the epheme
9080: 72 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  ral table. */.  
9090: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
90a0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
90b0: 5f 52 65 77 69 6e 64 2c 20 65 70 68 65 6d 54 61  _Rewind, ephemTa
90c0: 62 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  b); VdbeCoverage
90d0: 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74  (v);..    /* Ext
90e0: 72 61 63 74 20 61 72 67 75 6d 65 6e 74 73 20 66  ract arguments f
90f0: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
9100: 72 6f 77 20 6f 66 20 74 68 65 20 65 70 68 65 6d  row of the ephem
9110: 65 72 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 0a  eral table and .
9120: 20 20 20 20 2a 2a 20 69 6e 76 6f 6b 65 20 74 68      ** invoke th
9130: 65 20 56 55 70 64 61 74 65 20 6d 65 74 68 6f 64  e VUpdate method
9140: 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  .  */.    for(i=
9150: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
9160: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9170: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
9180: 6f 6c 75 6d 6e 2c 20 65 70 68 65 6d 54 61 62 2c  olumn, ephemTab,
9190: 20 69 2c 20 72 65 67 41 72 67 2b 69 29 3b 0a 20   i, regArg+i);. 
91a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
91b0: 65 33 56 74 61 62 4d 61 6b 65 57 72 69 74 61 62  e3VtabMakeWritab
91c0: 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  le(pParse, pTab)
91d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
91e0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 55 70 64  ddOp4(v, OP_VUpd
91f0: 61 74 65 2c 20 30 2c 20 6e 41 72 67 2c 20 72 65  ate, 0, nArg, re
9200: 67 41 72 67 2c 20 70 56 54 61 62 2c 20 50 34 5f  gArg, pVTab, P4_
9210: 56 54 41 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  VTAB);.  sqlite3
9220: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
9230: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
9240: 75 6c 74 20 3f 20 4f 45 5f 41 62 6f 72 74 20 3a  ult ? OE_Abort :
9250: 20 6f 6e 45 72 72 6f 72 29 3b 0a 20 20 73 71 6c   onError);.  sql
9260: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
9270: 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20  rse);..  /* End 
9280: 6f 66 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  of the ephemeral
9290: 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 4f 72 2c   table scan. Or,
92a0: 20 69 66 20 75 73 69 6e 67 20 74 68 65 20 6f 6e   if using the on
92b0: 65 70 61 73 73 20 73 74 72 61 74 65 67 79 2c 0a  epass strategy,.
92c0: 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 68 65 72    ** jump to her
92d0: 65 20 69 66 20 74 68 65 20 73 63 61 6e 20 76 69  e if the scan vi
92e0: 73 69 74 65 64 20 7a 65 72 6f 20 72 6f 77 73 2e  sited zero rows.
92f0: 20 2a 2f 0a 20 20 69 66 28 20 65 4f 6e 65 50 61   */.  if( eOnePa
9300: 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
9310: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
9320: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
9330: 65 78 74 2c 20 65 70 68 65 6d 54 61 62 2c 20 61  ext, ephemTab, a
9340: 64 64 72 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  ddr+1); VdbeCove
9350: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
9360: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
9370: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73  (v, addr);.    s
9380: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9390: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 65 70  (v, OP_Close, ep
93a0: 68 65 6d 54 61 62 2c 20 30 29 3b 0a 20 20 7d 65  hemTab, 0);.  }e
93b0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
93c0: 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
93d0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
93e0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
93f0: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a        RTUALTABLE */.