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

Artifact d1c2477dcf14d90999d1935af4efb4806553250b:


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 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
0c60: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
0c70: 56 61 6c 75 65 2c 20 50 34 5f 4d 45 4d 29 3b 0a  Value, P4_MEM);.
0c80: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
0c90: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
0ca0: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 69 66 28  NG_POINT.    if(
0cb0: 20 69 52 65 67 3e 3d 30 20 26 26 20 70 54 61 62   iReg>=0 && pTab
0cc0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 61 66 66 69 6e 69  ->aCol[i].affini
0cd0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
0ce0: 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  EAL ){.      sql
0cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
0d00: 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74  , OP_RealAffinit
0d10: 79 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 0a  y, iReg);.    }.
0d20: 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
0d30: 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 6e 20 55  .** Process an U
0d40: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
0d50: 0a 2a 2a 0a 2a 2a 20 20 20 55 50 44 41 54 45 20  .**.**   UPDATE 
0d60: 4f 52 20 49 47 4e 4f 52 45 20 74 61 62 6c 65 5f  OR IGNORE table_
0d70: 77 78 79 7a 20 53 45 54 20 61 3d 62 2c 20 63 3d  wxyz SET a=b, c=
0d80: 64 20 57 48 45 52 45 20 65 3c 35 20 41 4e 44 20  d WHERE e<5 AND 
0d90: 66 20 4e 4f 54 20 4e 55 4c 4c 3b 0a 2a 2a 20 20  f NOT NULL;.**  
0da0: 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
0db0: 2f 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  / \________/    
0dc0: 20 5c 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20   \______/       
0dd0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
0de0: 5f 2f 0a 2a 20 20 20 20 20 20 20 20 20 20 20 20  _/.*            
0df0: 6f 6e 45 72 72 6f 72 20 20 20 70 54 61 62 4c 69  onError   pTabLi
0e00: 73 74 20 20 20 20 20 20 70 43 68 61 6e 67 65 73  st      pChanges
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 68               pWh
0e20: 65 72 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ere.*/.void sqli
0e30: 74 65 33 55 70 64 61 74 65 28 0a 20 20 50 61 72  te3Update(.  Par
0e40: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0e50: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
0e60: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
0e70: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
0e80: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  ,     /* The tab
0e90: 6c 65 20 69 6e 20 77 68 69 63 68 20 77 65 20 73  le in which we s
0ea0: 68 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 69  hould change thi
0eb0: 6e 67 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ngs */.  ExprLis
0ec0: 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 20 20  t *pChanges,    
0ed0: 2f 2a 20 54 68 69 6e 67 73 20 74 6f 20 62 65 20  /* Things to be 
0ee0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 45 78 70  changed */.  Exp
0ef0: 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
0f00: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
0f10: 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
0f20: 20 6e 75 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6f   null */.  int o
0f30: 6e 45 72 72 6f 72 20 20 20 20 20 20 20 20 20 20  nError          
0f40: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64    /* How to hand
0f50: 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 72  le constraint er
0f60: 72 6f 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rors */.){.  int
0f70: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
0f80: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
0f90: 74 65 72 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20  ters */.  Table 
0fa0: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
0fb0: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f   /* The table to
0fc0: 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20   be updated */. 
0fd0: 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 30   int addrTop = 0
0fe0: 3b 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20  ;       /* VDBE 
0ff0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
1000: 65 73 73 20 6f 66 20 74 68 65 20 73 74 61 72 74  ess of the start
1010: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
1020: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1030: 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 49 6e 66 6f  nfo;     /* Info
1040: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
1050: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1060: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
1070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1080: 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
1090: 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 49  se engine */.  I
10a0: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
10b0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
10c0: 70 69 6e 67 20 6f 76 65 72 20 69 6e 64 69 63 65  ping over indice
10d0: 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  s */.  Index *pP
10e0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
10f0: 20 54 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   The PRIMARY KEY
1100: 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f   index for WITHO
1110: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20  UT ROWID tables 
1120: 2a 2f 0a 20 20 69 6e 74 20 6e 49 64 78 3b 20 20  */.  int nIdx;  
1130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1140: 75 6d 62 65 72 20 6f 66 20 69 6e 64 69 63 65 73  umber of indices
1150: 20 74 68 61 74 20 6e 65 65 64 20 75 70 64 61 74   that need updat
1160: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  ing */.  int iBa
1170: 73 65 43 75 72 3b 20 20 20 20 20 20 20 20 20 20  seCur;          
1180: 2f 2a 20 42 61 73 65 20 63 75 72 73 6f 72 20 6e  /* Base cursor n
1190: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  umber */.  int i
11a0: 44 61 74 61 43 75 72 3b 20 20 20 20 20 20 20 20  DataCur;        
11b0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20    /* Cursor for 
11c0: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 64 61  the canonical da
11d0: 74 61 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ta btree */.  in
11e0: 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
11f0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66       /* Cursor f
1200: 6f 72 20 74 68 65 20 66 69 72 73 74 20 69 6e 64  or the first ind
1210: 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ex */.  sqlite3 
1220: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
1230: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
1240: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
1250: 74 20 2a 61 52 65 67 49 64 78 20 3d 20 30 3b 20  t *aRegIdx = 0; 
1260: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 72 65 67 69       /* One regi
1270: 73 74 65 72 20 61 73 73 69 67 6e 65 64 20 74 6f  ster assigned to
1280: 20 65 61 63 68 20 69 6e 64 65 78 20 74 6f 20 62   each index to b
1290: 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 69  e updated */.  i
12a0: 6e 74 20 2a 61 58 52 65 66 20 3d 20 30 3b 20 20  nt *aXRef = 0;  
12b0: 20 20 20 20 20 20 2f 2a 20 61 58 52 65 66 5b 69        /* aXRef[i
12c0: 5d 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 69  ] is the index i
12d0: 6e 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 5d 20  n pChanges->a[] 
12e0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  of the.         
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 2a 2a 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ** an expression
1310: 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20 63 6f   for the i-th co
1320: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
1330: 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
1340: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
1350: 58 52 65 66 5b 69 5d 3d 3d 2d 31 20 69 66 20 74  XRef[i]==-1 if t
1360: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 69  he i-th column i
1370: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2e 20 2a  s not changed. *
1380: 2f 0a 20 20 75 38 20 2a 61 54 6f 4f 70 65 6e 3b  /.  u8 *aToOpen;
1390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
13a0: 66 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  for tables and i
13b0: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 6f 70 65  ndices to be ope
13c0: 6e 65 64 20 2a 2f 0a 20 20 75 38 20 63 68 6e 67  ned */.  u8 chng
13d0: 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pk;             
13e0: 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  /* PRIMARY KEY c
13f0: 68 61 6e 67 65 64 20 69 6e 20 61 20 57 49 54 48  hanged in a WITH
1400: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20  OUT ROWID table 
1410: 2a 2f 0a 20 20 75 38 20 63 68 6e 67 52 6f 77 69  */.  u8 chngRowi
1420: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  d;          /* R
1430: 6f 77 69 64 20 63 68 61 6e 67 65 64 20 69 6e 20  owid changed in 
1440: 61 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 20 2a  a normal table *
1450: 2f 0a 20 20 75 38 20 63 68 6e 67 4b 65 79 3b 20  /.  u8 chngKey; 
1460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 69             /* Ei
1470: 74 68 65 72 20 63 68 6e 67 50 6b 20 6f 72 20 63  ther chngPk or c
1480: 68 6e 67 52 6f 77 69 64 20 2a 2f 0a 20 20 45 78  hngRowid */.  Ex
1490: 70 72 20 2a 70 52 6f 77 69 64 45 78 70 72 20 3d  pr *pRowidExpr =
14a0: 20 30 3b 20 20 2f 2a 20 45 78 70 72 65 73 73 69   0;  /* Expressi
14b0: 6f 6e 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  on defining the 
14c0: 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  new record numbe
14d0: 72 20 2a 2f 0a 20 20 41 75 74 68 43 6f 6e 74 65  r */.  AuthConte
14e0: 78 74 20 73 43 6f 6e 74 65 78 74 3b 20 20 2f 2a  xt sContext;  /*
14f0: 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69   The authorizati
1500: 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  on context */.  
1510: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
1520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61         /* The na
1530: 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 72 65  me-context to re
1540: 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e  solve expression
1550: 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  s in */.  int iD
1560: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1570: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1580: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
1590: 65 20 62 65 69 6e 67 20 75 70 64 61 74 65 64 20  e being updated 
15a0: 2a 2f 0a 20 20 69 6e 74 20 6f 6b 4f 6e 65 50 61  */.  int okOnePa
15b0: 73 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ss;         /* T
15c0: 72 75 65 20 66 6f 72 20 6f 6e 65 2d 70 61 73 73  rue for one-pass
15d0: 20 61 6c 67 6f 72 69 74 68 6d 20 77 69 74 68 6f   algorithm witho
15e0: 75 74 20 74 68 65 20 46 49 46 4f 20 2a 2f 0a 20  ut the FIFO */. 
15f0: 20 69 6e 74 20 68 61 73 46 4b 3b 20 20 20 20 20   int hasFK;     
1600: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1610: 69 66 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70  if foreign key p
1620: 72 6f 63 65 73 73 69 6e 67 20 69 73 20 72 65 71  rocessing is req
1630: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c  uired */.  int l
1640: 61 62 65 6c 42 72 65 61 6b 3b 20 20 20 20 20 20  abelBreak;      
1650: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
1660: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 55  o break out of U
1670: 50 44 41 54 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20  PDATE loop */.  
1680: 69 6e 74 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75  int labelContinu
1690: 65 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  e;     /* Jump h
16a0: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
16b0: 6e 65 78 74 20 73 74 65 70 20 6f 66 20 55 50 44  next step of UPD
16c0: 41 54 45 20 6c 6f 6f 70 20 2a 2f 0a 0a 23 69 66  ATE loop */..#if
16d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16e0: 5f 54 52 49 47 47 45 52 0a 20 20 69 6e 74 20 69  _TRIGGER.  int i
16f0: 73 56 69 65 77 3b 20 20 20 20 20 20 20 20 20 20  sView;          
1700: 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 75    /* True when u
1710: 70 64 61 74 69 6e 67 20 61 20 76 69 65 77 20 28  pdating a view (
1720: 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67 67  INSTEAD OF trigg
1730: 65 72 29 20 2a 2f 0a 20 20 54 72 69 67 67 65 72  er) */.  Trigger
1740: 20 2a 70 54 72 69 67 67 65 72 3b 20 20 20 20 20   *pTrigger;     
1750: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 72 69 67 67  /* List of trigg
1760: 65 72 73 20 6f 6e 20 70 54 61 62 2c 20 69 66 20  ers on pTab, if 
1770: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
1780: 74 20 74 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  t tmask;        
1790: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
17a0: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 7c 54  TRIGGER_BEFORE|T
17b0: 52 49 47 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a  RIGGER_AFTER */.
17c0: 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 65 77  #endif.  int new
17d0: 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
17e0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 4e 45 57 2e 2a  /* Mask of NEW.*
17f0: 20 63 6f 6c 75 6d 6e 73 20 61 63 63 65 73 73 65   columns accesse
1800: 64 20 62 79 20 42 45 46 4f 52 45 20 74 72 69 67  d by BEFORE trig
1810: 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  gers */.  int iE
1820: 70 68 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ph = 0;         
1830: 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c 20 74 61   /* Ephemeral ta
1840: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ble holding all 
1850: 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75  primary key valu
1860: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  es */.  int nKey
1870: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
1880: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
1890: 65 6e 74 73 20 69 6e 20 72 65 67 4b 65 79 20 66  ents in regKey f
18a0: 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
18b0: 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 75 72 4f   */.  int aiCurO
18c0: 6e 65 50 61 73 73 5b 32 5d 3b 20 20 20 2f 2a 20  nePass[2];   /* 
18d0: 54 68 65 20 77 72 69 74 65 20 63 75 72 73 6f 72  The write cursor
18e0: 73 20 6f 70 65 6e 65 64 20 62 79 20 57 48 45 52  s opened by WHER
18f0: 45 5f 4f 4e 45 50 41 53 53 20 2a 2f 0a 0a 20 20  E_ONEPASS */..  
1900: 2f 2a 20 52 65 67 69 73 74 65 72 20 41 6c 6c 6f  /* Register Allo
1910: 63 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  cations */.  int
1920: 20 72 65 67 52 6f 77 43 6f 75 6e 74 20 3d 20 30   regRowCount = 0
1930: 3b 20 20 20 2f 2a 20 41 20 63 6f 75 6e 74 20 6f  ;   /* A count o
1940: 66 20 72 6f 77 73 20 63 68 61 6e 67 65 64 20 2a  f rows changed *
1950: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 6c 64 52 6f  /.  int regOldRo
1960: 77 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  wid;       /* Th
1970: 65 20 6f 6c 64 20 72 6f 77 69 64 20 2a 2f 0a 20  e old rowid */. 
1980: 20 69 6e 74 20 72 65 67 4e 65 77 52 6f 77 69 64   int regNewRowid
1990: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  ;       /* The n
19a0: 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e  ew rowid */.  in
19b0: 74 20 72 65 67 4e 65 77 3b 20 20 20 20 20 20 20  t regNew;       
19c0: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
19d0: 6f 66 20 74 68 65 20 4e 45 57 2e 2a 20 74 61 62  of the NEW.* tab
19e0: 6c 65 20 69 6e 20 74 72 69 67 67 65 72 73 20 2a  le in triggers *
19f0: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 6c 64 20 3d  /.  int regOld =
1a00: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f   0;        /* Co
1a10: 6e 74 65 6e 74 20 6f 66 20 4f 4c 44 2e 2a 20 74  ntent of OLD.* t
1a20: 61 62 6c 65 20 69 6e 20 74 72 69 67 67 65 72 73  able in triggers
1a30: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77   */.  int regRow
1a40: 53 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Set = 0;     /* 
1a50: 52 6f 77 73 65 74 20 6f 66 20 72 6f 77 73 20 74  Rowset of rows t
1a60: 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a  o be updated */.
1a70: 20 20 69 6e 74 20 72 65 67 4b 65 79 20 3d 20 30    int regKey = 0
1a80: 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70  ;        /* comp
1a90: 6f 73 69 74 65 20 50 52 49 4d 41 52 59 20 4b 45  osite PRIMARY KE
1aa0: 59 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6d 65  Y value */..  me
1ab0: 6d 73 65 74 28 26 73 43 6f 6e 74 65 78 74 2c 20  mset(&sContext, 
1ac0: 30 2c 20 73 69 7a 65 6f 66 28 73 43 6f 6e 74 65  0, sizeof(sConte
1ad0: 78 74 29 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  xt));.  db = pPa
1ae0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
1af0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1b00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b10: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61  ){.    goto upda
1b20: 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  te_cleanup;.  }.
1b30: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69    assert( pTabLi
1b40: 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 0a  st->nSrc==1 );..
1b50: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
1b60: 74 61 62 6c 65 20 77 68 69 63 68 20 77 65 20 77  table which we w
1b70: 61 6e 74 20 74 6f 20 75 70 64 61 74 65 2e 20 0a  ant to update. .
1b80: 20 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71    */.  pTab = sq
1b90: 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
1ba0: 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  up(pParse, pTabL
1bb0: 69 73 74 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ist);.  if( pTab
1bc0: 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64 61 74  ==0 ) goto updat
1bd0: 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 44 62  e_cleanup;.  iDb
1be0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1bf0: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
1c00: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1c10: 61 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  a);..  /* Figure
1c20: 20 6f 75 74 20 69 66 20 77 65 20 68 61 76 65 20   out if we have 
1c30: 61 6e 79 20 74 72 69 67 67 65 72 73 20 61 6e 64  any triggers and
1c40: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   if the table be
1c50: 69 6e 67 0a 20 20 2a 2a 20 75 70 64 61 74 65 64  ing.  ** updated
1c60: 20 69 73 20 61 20 76 69 65 77 2e 0a 20 20 2a 2f   is a view..  */
1c70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c80: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 70  OMIT_TRIGGER.  p
1c90: 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
1ca0: 33 54 72 69 67 67 65 72 73 45 78 69 73 74 28 70  3TriggersExist(p
1cb0: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f  Parse, pTab, TK_
1cc0: 55 50 44 41 54 45 2c 20 70 43 68 61 6e 67 65 73  UPDATE, pChanges
1cd0: 2c 20 26 74 6d 61 73 6b 29 3b 0a 20 20 69 73 56  , &tmask);.  isV
1ce0: 69 65 77 20 3d 20 70 54 61 62 2d 3e 70 53 65 6c  iew = pTab->pSel
1cf0: 65 63 74 21 3d 30 3b 0a 20 20 61 73 73 65 72 74  ect!=0;.  assert
1d00: 28 20 70 54 72 69 67 67 65 72 20 7c 7c 20 74 6d  ( pTrigger || tm
1d10: 61 73 6b 3d 3d 30 20 29 3b 0a 23 65 6c 73 65 0a  ask==0 );.#else.
1d20: 23 20 64 65 66 69 6e 65 20 70 54 72 69 67 67 65  # define pTrigge
1d30: 72 20 30 0a 23 20 64 65 66 69 6e 65 20 69 73 56  r 0.# define isV
1d40: 69 65 77 20 30 0a 23 20 64 65 66 69 6e 65 20 74  iew 0.# define t
1d50: 6d 61 73 6b 20 30 0a 23 65 6e 64 69 66 0a 23 69  mask 0.#endif.#i
1d60: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
1d70: 5f 56 49 45 57 0a 23 20 75 6e 64 65 66 20 69 73  _VIEW.# undef is
1d80: 56 69 65 77 0a 23 20 64 65 66 69 6e 65 20 69 73  View.# define is
1d90: 56 69 65 77 20 30 0a 23 65 6e 64 69 66 0a 0a 20  View 0.#endif.. 
1da0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
1db0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
1dc0: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
1dd0: 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
1de0: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69  cleanup;.  }.  i
1df0: 66 28 20 73 71 6c 69 74 65 33 49 73 52 65 61 64  f( sqlite3IsRead
1e00: 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20 70 54 61  Only(pParse, pTa
1e10: 62 2c 20 74 6d 61 73 6b 29 20 29 7b 0a 20 20 20  b, tmask) ){.   
1e20: 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65   goto update_cle
1e30: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  anup;.  }..  /* 
1e40: 41 6c 6c 6f 63 61 74 65 20 61 20 63 75 72 73 6f  Allocate a curso
1e50: 72 73 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  rs for the main 
1e60: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 61  database table a
1e70: 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63  nd for all indic
1e80: 65 73 2e 0a 20 20 2a 2a 20 54 68 65 20 69 6e 64  es..  ** The ind
1e90: 65 78 20 63 75 72 73 6f 72 73 20 6d 69 67 68 74  ex cursors might
1ea0: 20 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 62 75   not be used, bu
1eb0: 74 20 69 66 20 74 68 65 79 20 61 72 65 20 75 73  t if they are us
1ec0: 65 64 20 74 68 65 79 0a 20 20 2a 2a 20 6e 65 65  ed they.  ** nee
1ed0: 64 20 74 6f 20 6f 63 63 75 72 20 72 69 67 68 74  d to occur right
1ee0: 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62   after the datab
1ef0: 61 73 65 20 63 75 72 73 6f 72 2e 20 20 53 6f 20  ase cursor.  So 
1f00: 67 6f 20 61 68 65 61 64 20 61 6e 64 0a 20 20 2a  go ahead and.  *
1f10: 2a 20 61 6c 6c 6f 63 61 74 65 20 65 6e 6f 75 67  * allocate enoug
1f20: 68 20 73 70 61 63 65 2c 20 6a 75 73 74 20 69 6e  h space, just in
1f30: 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 70 54   case..  */.  pT
1f40: 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
1f50: 72 73 6f 72 20 3d 20 69 42 61 73 65 43 75 72 20  rsor = iBaseCur 
1f60: 3d 20 69 44 61 74 61 43 75 72 20 3d 20 70 50 61  = iDataCur = pPa
1f70: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69  rse->nTab++;.  i
1f80: 49 64 78 43 75 72 20 3d 20 69 44 61 74 61 43 75  IdxCur = iDataCu
1f90: 72 2b 31 3b 0a 20 20 70 50 6b 20 3d 20 48 61 73  r+1;.  pPk = Has
1fa0: 52 6f 77 69 64 28 70 54 61 62 29 20 3f 20 30 20  Rowid(pTab) ? 0 
1fb0: 3a 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  : sqlite3Primary
1fc0: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
1fd0: 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49    for(nIdx=0, pI
1fe0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
1ff0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
2000: 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29  ->pNext, nIdx++)
2010: 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  {.    if( pIdx->
2020: 61 75 74 6f 49 6e 64 65 78 3d 3d 32 20 26 26 20  autoIndex==2 && 
2030: 70 50 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPk!=0 ){.      
2040: 69 44 61 74 61 43 75 72 20 3d 20 70 50 61 72 73  iDataCur = pPars
2050: 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 20 20 70  e->nTab;.      p
2060: 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
2070: 75 72 73 6f 72 20 3d 20 69 44 61 74 61 43 75 72  ursor = iDataCur
2080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
2090: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 0a  se->nTab++;.  }.
20a0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
20b0: 70 61 63 65 20 66 6f 72 20 61 58 52 65 66 5b 5d  pace for aXRef[]
20c0: 2c 20 61 52 65 67 49 64 78 5b 5d 2c 20 61 6e 64  , aRegIdx[], and
20d0: 20 61 54 6f 4f 70 65 6e 5b 5d 2e 20 20 0a 20 20   aToOpen[].  .  
20e0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 58  ** Initialize aX
20f0: 52 65 66 5b 5d 20 61 6e 64 20 61 54 6f 4f 70 65  Ref[] and aToOpe
2100: 6e 5b 5d 20 74 6f 20 74 68 65 69 72 20 64 65 66  n[] to their def
2110: 61 75 6c 74 20 76 61 6c 75 65 73 2e 0a 20 20 2a  ault values..  *
2120: 2f 0a 20 20 61 58 52 65 66 20 3d 20 73 71 6c 69  /.  aXRef = sqli
2130: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
2140: 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a  b, sizeof(int) *
2150: 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 6e 49 64   (pTab->nCol+nId
2160: 78 29 20 2b 20 6e 49 64 78 2b 32 20 29 3b 0a 20  x) + nIdx+2 );. 
2170: 20 69 66 28 20 61 58 52 65 66 3d 3d 30 20 29 20   if( aXRef==0 ) 
2180: 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61  goto update_clea
2190: 6e 75 70 3b 0a 20 20 61 52 65 67 49 64 78 20 3d  nup;.  aRegIdx =
21a0: 20 61 58 52 65 66 2b 70 54 61 62 2d 3e 6e 43 6f   aXRef+pTab->nCo
21b0: 6c 3b 0a 20 20 61 54 6f 4f 70 65 6e 20 3d 20 28  l;.  aToOpen = (
21c0: 75 38 2a 29 28 61 52 65 67 49 64 78 2b 6e 49 64  u8*)(aRegIdx+nId
21d0: 78 29 3b 0a 20 20 6d 65 6d 73 65 74 28 61 54 6f  x);.  memset(aTo
21e0: 4f 70 65 6e 2c 20 31 2c 20 6e 49 64 78 2b 31 29  Open, 1, nIdx+1)
21f0: 3b 0a 20 20 61 54 6f 4f 70 65 6e 5b 6e 49 64 78  ;.  aToOpen[nIdx
2200: 2b 31 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  +1] = 0;.  for(i
2210: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
2220: 3b 20 69 2b 2b 29 20 61 58 52 65 66 5b 69 5d 20  ; i++) aXRef[i] 
2230: 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  = -1;..  /* Init
2240: 69 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 2d  ialize the name-
2250: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 6d 65 6d  context */.  mem
2260: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
2270: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
2280: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2290: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
22a0: 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 0a 20 20   = pTabList;..  
22b0: 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63  /* Resolve the c
22c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 61  olumn names in a
22d0: 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ll the expressio
22e0: 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ns of the.  ** o
22f0: 66 20 74 68 65 20 55 50 44 41 54 45 20 73 74 61  f the UPDATE sta
2300: 74 65 6d 65 6e 74 2e 20 20 41 6c 73 6f 20 66 69  tement.  Also fi
2310: 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  nd the column in
2320: 64 65 78 0a 20 20 2a 2a 20 66 6f 72 20 65 61 63  dex.  ** for eac
2330: 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 75  h column to be u
2340: 70 64 61 74 65 64 20 69 6e 20 74 68 65 20 70 43  pdated in the pC
2350: 68 61 6e 67 65 73 20 61 72 72 61 79 2e 20 20 46  hanges array.  F
2360: 6f 72 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 6c  or each.  ** col
2370: 75 6d 6e 20 74 6f 20 62 65 20 75 70 64 61 74 65  umn to be update
2380: 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20  d, make sure we 
2390: 68 61 76 65 20 61 75 74 68 6f 72 69 7a 61 74 69  have authorizati
23a0: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a  on to change.  *
23b0: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 0a 20  * that column.. 
23c0: 20 2a 2f 0a 20 20 63 68 6e 67 52 6f 77 69 64 20   */.  chngRowid 
23d0: 3d 20 63 68 6e 67 50 6b 20 3d 20 30 3b 0a 20 20  = chngPk = 0;.  
23e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 61 6e  for(i=0; i<pChan
23f0: 67 65 73 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ges->nExpr; i++)
2400: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
2410: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
2420: 73 28 26 73 4e 43 2c 20 70 43 68 61 6e 67 65 73  s(&sNC, pChanges
2430: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
2440: 0a 20 20 20 20 20 20 67 6f 74 6f 20 75 70 64 61  .      goto upda
2450: 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  te_cleanup;.    
2460: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  }.    for(j=0; j
2470: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
2480: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
2490: 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62  ite3StrICmp(pTab
24a0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
24b0: 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e   pChanges->a[i].
24c0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
24d0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62       if( j==pTab
24e0: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
24f0: 20 20 20 20 20 63 68 6e 67 52 6f 77 69 64 20 3d       chngRowid =
2500: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 52   1;.          pR
2510: 6f 77 69 64 45 78 70 72 20 3d 20 70 43 68 61 6e  owidExpr = pChan
2520: 67 65 73 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ges->a[i].pExpr;
2530: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2540: 66 28 20 70 50 6b 20 26 26 20 28 70 54 61 62 2d  f( pPk && (pTab-
2550: 3e 61 43 6f 6c 5b 6a 5d 2e 63 6f 6c 46 6c 61 67  >aCol[j].colFlag
2560: 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d  s & COLFLAG_PRIM
2570: 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  KEY)!=0 ){.     
2580: 20 20 20 20 20 63 68 6e 67 50 6b 20 3d 20 31 3b       chngPk = 1;
2590: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25a0: 20 20 20 61 58 52 65 66 5b 6a 5d 20 3d 20 69 3b     aXRef[j] = i;
25b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
25c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25d0: 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
25e0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Col ){.      if(
25f0: 20 70 50 6b 3d 3d 30 20 26 26 20 73 71 6c 69 74   pPk==0 && sqlit
2600: 65 33 49 73 52 6f 77 69 64 28 70 43 68 61 6e 67  e3IsRowid(pChang
2610: 65 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  es->a[i].zName) 
2620: 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  ){.        j = -
2630: 31 3b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 52  1;.        chngR
2640: 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  owid = 1;.      
2650: 20 20 70 52 6f 77 69 64 45 78 70 72 20 3d 20 70    pRowidExpr = p
2660: 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 70 45  Changes->a[i].pE
2670: 78 70 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xpr;.      }else
2680: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2690: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
26a0: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d  , "no such colum
26b0: 6e 3a 20 25 73 22 2c 20 70 43 68 61 6e 67 65 73  n: %s", pChanges
26c0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
26d0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63         pParse->c
26e0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
26f0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 75 70 64          goto upd
2700: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ate_cleanup;.   
2710: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
2720: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2730: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
2740: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b   {.      int rc;
2750: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2760: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
2770: 72 73 65 2c 20 53 51 4c 49 54 45 5f 55 50 44 41  rse, SQLITE_UPDA
2780: 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
2790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 3c 30               j<0
27b0: 20 3f 20 22 52 4f 57 49 44 22 20 3a 20 70 54 61   ? "ROWID" : pTa
27c0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
27d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
27f0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
2800: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2810: 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a  =SQLITE_DENY ){.
2820: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 75 70 64          goto upd
2830: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ate_cleanup;.   
2840: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
2850: 3d 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 20 29  =SQLITE_IGNORE )
2860: 7b 0a 20 20 20 20 20 20 20 20 61 58 52 65 66 5b  {.        aXRef[
2870: 6a 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  j] = -1;.      }
2880: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2890: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 63 68 6e  }.  assert( (chn
28a0: 67 52 6f 77 69 64 20 26 20 63 68 6e 67 50 6b 29  gRowid & chngPk)
28b0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
28c0: 20 63 68 6e 67 52 6f 77 69 64 3d 3d 30 20 7c 7c   chngRowid==0 ||
28d0: 20 63 68 6e 67 52 6f 77 69 64 3d 3d 31 20 29 3b   chngRowid==1 );
28e0: 0a 20 20 61 73 73 65 72 74 28 20 63 68 6e 67 50  .  assert( chngP
28f0: 6b 3d 3d 30 20 7c 7c 20 63 68 6e 67 50 6b 3d 3d  k==0 || chngPk==
2900: 31 20 29 3b 0a 20 20 63 68 6e 67 4b 65 79 20 3d  1 );.  chngKey =
2910: 20 63 68 6e 67 52 6f 77 69 64 20 2b 20 63 68 6e   chngRowid + chn
2920: 67 50 6b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  gPk;..  /* The S
2930: 45 54 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ET expressions a
2940: 72 65 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  re not actually 
2950: 75 73 65 64 20 69 6e 73 69 64 65 20 74 68 65 20  used inside the 
2960: 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  WHERE loop..  **
2970: 20 53 6f 20 72 65 73 65 74 20 74 68 65 20 63 6f   So reset the co
2980: 6c 55 73 65 64 20 6d 61 73 6b 0a 20 20 2a 2f 0a  lUsed mask.  */.
2990: 20 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d    pTabList->a[0]
29a0: 2e 63 6f 6c 55 73 65 64 20 3d 20 30 3b 0a 0a 20  .colUsed = 0;.. 
29b0: 20 68 61 73 46 4b 20 3d 20 73 71 6c 69 74 65 33   hasFK = sqlite3
29c0: 46 6b 52 65 71 75 69 72 65 64 28 70 50 61 72 73  FkRequired(pPars
29d0: 65 2c 20 70 54 61 62 2c 20 61 58 52 65 66 2c 20  e, pTab, aXRef, 
29e0: 63 68 6e 67 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20  chngKey);..  /* 
29f0: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 6e 74  There is one ent
2a00: 72 79 20 69 6e 20 74 68 65 20 61 52 65 67 49 64  ry in the aRegId
2a10: 78 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 65 61  x[] array for ea
2a20: 63 68 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20  ch index on the 
2a30: 74 61 62 6c 65 0a 20 20 2a 2a 20 62 65 69 6e 67  table.  ** being
2a40: 20 75 70 64 61 74 65 64 2e 20 20 46 69 6c 6c 20   updated.  Fill 
2a50: 69 6e 20 61 52 65 67 49 64 78 5b 5d 20 77 69 74  in aRegIdx[] wit
2a60: 68 20 61 20 72 65 67 69 73 74 65 72 20 6e 75 6d  h a register num
2a70: 62 65 72 20 74 68 61 74 20 77 69 6c 6c 20 68 6f  ber that will ho
2a80: 6c 64 0a 20 20 2a 2a 20 74 68 65 20 6b 65 79 20  ld.  ** the key 
2a90: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 65 61  for accessing ea
2aa0: 63 68 20 69 6e 64 65 78 2e 20 20 0a 20 20 2a 2f  ch index.  .  */
2ab0: 0a 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64 78  .  for(j=0, pIdx
2ac0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
2ad0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
2ae0: 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20  pNext, j++){.   
2af0: 20 69 6e 74 20 72 65 67 3b 0a 20 20 20 20 69 66   int reg;.    if
2b00: 28 20 63 68 6e 67 4b 65 79 20 7c 7c 20 68 61 73  ( chngKey || has
2b10: 46 4b 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72  FK || pIdx->pPar
2b20: 74 49 64 78 57 68 65 72 65 20 7c 7c 20 70 49 64  tIdxWhere || pId
2b30: 78 3d 3d 70 50 6b 20 29 7b 0a 20 20 20 20 20 20  x==pPk ){.      
2b40: 72 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  reg = ++pParse->
2b50: 6e 4d 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nMem;.    }else{
2b60: 0a 20 20 20 20 20 20 72 65 67 20 3d 20 30 3b 0a  .      reg = 0;.
2b70: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2b80: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
2b90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
2ba0: 28 20 61 58 52 65 66 5b 70 49 64 78 2d 3e 61 69  ( aXRef[pIdx->ai
2bb0: 43 6f 6c 75 6d 6e 5b 69 5d 5d 3e 3d 30 20 29 7b  Column[i]]>=0 ){
2bc0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 20 3d  .          reg =
2bd0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2be0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2bf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2c10: 28 20 72 65 67 3d 3d 30 20 29 20 61 54 6f 4f 70  ( reg==0 ) aToOp
2c20: 65 6e 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 20  en[j+1] = 0;.   
2c30: 20 61 52 65 67 49 64 78 5b 6a 5d 20 3d 20 72 65   aRegIdx[j] = re
2c40: 67 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  g;.  }..  /* Beg
2c50: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  in generating co
2c60: 64 65 2e 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  de. */.  v = sql
2c70: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
2c80: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
2c90: 29 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c  ) goto update_cl
2ca0: 65 61 6e 75 70 3b 0a 20 20 69 66 28 20 70 50 61  eanup;.  if( pPa
2cb0: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29  rse->nested==0 )
2cc0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
2cd0: 74 43 68 61 6e 67 65 73 28 76 29 3b 0a 20 20 73  tChanges(v);.  s
2ce0: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
2cf0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
2d00: 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 1, iDb);..#ifn
2d10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d20: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
2d30: 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 73  * Virtual tables
2d40: 20 6d 75 73 74 20 62 65 20 68 61 6e 64 6c 65 64   must be handled
2d50: 20 73 65 70 61 72 61 74 65 6c 79 20 2a 2f 0a 20   separately */. 
2d60: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2d70: 54 61 62 29 20 29 7b 0a 20 20 20 20 75 70 64 61  Tab) ){.    upda
2d80: 74 65 56 69 72 74 75 61 6c 54 61 62 6c 65 28 70  teVirtualTable(p
2d90: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2da0: 20 70 54 61 62 2c 20 70 43 68 61 6e 67 65 73 2c   pTab, pChanges,
2db0: 20 70 52 6f 77 69 64 45 78 70 72 2c 20 61 58 52   pRowidExpr, aXR
2dc0: 65 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ef,.            
2dd0: 20 20 20 20 20 20 20 20 20 20 20 70 57 68 65 72             pWher
2de0: 65 2c 20 6f 6e 45 72 72 6f 72 29 3b 0a 20 20 20  e, onError);.   
2df0: 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20   pWhere = 0;.   
2e00: 20 70 54 61 62 4c 69 73 74 20 3d 20 30 3b 0a 20   pTabList = 0;. 
2e10: 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63     goto update_c
2e20: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 23 65 6e 64  leanup;.  }.#end
2e30: 69 66 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  if..  /* Allocat
2e40: 65 20 72 65 71 75 69 72 65 64 20 72 65 67 69 73  e required regis
2e50: 74 65 72 73 2e 20 2a 2f 0a 20 20 72 65 67 52 6f  ters. */.  regRo
2e60: 77 53 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  wSet = ++pParse-
2e70: 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 6c 64 52  >nMem;.  regOldR
2e80: 6f 77 69 64 20 3d 20 72 65 67 4e 65 77 52 6f 77  owid = regNewRow
2e90: 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
2ea0: 4d 65 6d 3b 0a 20 20 69 66 28 20 63 68 6e 67 50  Mem;.  if( chngP
2eb0: 6b 20 7c 7c 20 70 54 72 69 67 67 65 72 20 7c 7c  k || pTrigger ||
2ec0: 20 68 61 73 46 4b 20 29 7b 0a 20 20 20 20 72 65   hasFK ){.    re
2ed0: 67 4f 6c 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gOld = pParse->n
2ee0: 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61  Mem + 1;.    pPa
2ef0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 54 61  rse->nMem += pTa
2f00: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 69  b->nCol;.  }.  i
2f10: 66 28 20 63 68 6e 67 4b 65 79 20 7c 7c 20 70 54  f( chngKey || pT
2f20: 72 69 67 67 65 72 20 7c 7c 20 68 61 73 46 4b 20  rigger || hasFK 
2f30: 29 7b 0a 20 20 20 20 72 65 67 4e 65 77 52 6f 77  ){.    regNewRow
2f40: 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
2f50: 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 67 4e 65  Mem;.  }.  regNe
2f60: 77 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  w = pParse->nMem
2f70: 20 2b 20 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e   + 1;.  pParse->
2f80: 6e 4d 65 6d 20 2b 3d 20 70 54 61 62 2d 3e 6e 43  nMem += pTab->nC
2f90: 6f 6c 3b 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20  ol;..  /* Start 
2fa0: 74 68 65 20 76 69 65 77 20 63 6f 6e 74 65 78 74  the view context
2fb0: 2e 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65  . */.  if( isVie
2fc0: 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  w ){.    sqlite3
2fd0: 41 75 74 68 43 6f 6e 74 65 78 74 50 75 73 68 28  AuthContextPush(
2fe0: 70 50 61 72 73 65 2c 20 26 73 43 6f 6e 74 65 78  pParse, &sContex
2ff0: 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  t, pTab->zName);
3000: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
3010: 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 75   are trying to u
3020: 70 64 61 74 65 20 61 20 76 69 65 77 2c 20 72 65  pdate a view, re
3030: 61 6c 69 7a 65 20 74 68 61 74 20 76 69 65 77 20  alize that view 
3040: 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 65 70 68 65  into.  ** a ephe
3050: 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a  meral table..  *
3060: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
3070: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
3080: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
3090: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
30a0: 29 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 29  ).  if( isView )
30b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 74  {.    sqlite3Mat
30c0: 65 72 69 61 6c 69 7a 65 56 69 65 77 28 70 50 61  erializeView(pPa
30d0: 72 73 65 2c 20 70 54 61 62 2c 20 70 57 68 65 72  rse, pTab, pWher
30e0: 65 2c 20 69 44 61 74 61 43 75 72 29 3b 0a 20 20  e, iDataCur);.  
30f0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
3100: 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d  esolve the colum
3110: 6e 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 74  n names in all t
3120: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
3130: 6e 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45  n the.  ** WHERE
3140: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
3150: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
3160: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
3170: 2c 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20  , pWhere) ){.   
3180: 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65   goto update_cle
3190: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  anup;.  }..  /* 
31a0: 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
31b0: 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 69  se scan.  */.  i
31c0: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
31d0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
31e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
31f0: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77  _Null, 0, regRow
3200: 53 65 74 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64  Set, regOldRowid
3210: 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
3220: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
3230: 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  n(.        pPars
3240: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
3250: 65 72 65 2c 20 30 2c 20 30 2c 20 57 48 45 52 45  ere, 0, 0, WHERE
3260: 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
3270: 2c 20 69 49 64 78 43 75 72 0a 20 20 20 20 29 3b  , iIdxCur.    );
3280: 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
3290: 3d 30 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65  =0 ) goto update
32a0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 6f 6b  _cleanup;.    ok
32b0: 4f 6e 65 50 61 73 73 20 3d 20 73 71 6c 69 74 65  OnePass = sqlite
32c0: 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28  3WhereOkOnePass(
32d0: 70 57 49 6e 66 6f 2c 20 61 69 43 75 72 4f 6e 65  pWInfo, aiCurOne
32e0: 50 61 73 73 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  Pass);.  .    /*
32f0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 72 6f   Remember the ro
3300: 77 69 64 20 6f 66 20 65 76 65 72 79 20 69 74 65  wid of every ite
3310: 6d 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  m to be updated.
3320: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
3330: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3340: 20 4f 50 5f 52 6f 77 69 64 2c 20 69 44 61 74 61   OP_Rowid, iData
3350: 43 75 72 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64  Cur, regOldRowid
3360: 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6b 4f 6e  );.    if( !okOn
3370: 65 50 61 73 73 20 29 7b 0a 20 20 20 20 20 20 73  ePass ){.      s
3380: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3390: 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 41 64 64  (v, OP_RowSetAdd
33a0: 2c 20 72 65 67 52 6f 77 53 65 74 2c 20 72 65 67  , regRowSet, reg
33b0: 4f 6c 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  OldRowid);.    }
33c0: 0a 20 20 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74  .  .    /* End t
33d0: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
33e0: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
33f0: 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
3400: 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  d(pWInfo);.  }el
3410: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 50 6b 3b  se{.    int iPk;
3420: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3430: 74 20 6f 66 20 6e 50 6b 20 6d 65 6d 6f 72 79 20  t of nPk memory 
3440: 63 65 6c 6c 73 20 68 6f 6c 64 69 6e 67 20 50 52  cells holding PR
3450: 49 4d 41 52 59 20 4b 45 59 20 76 61 6c 75 65 20  IMARY KEY value 
3460: 2a 2f 0a 20 20 20 20 69 31 36 20 6e 50 6b 3b 20  */.    i16 nPk; 
3470: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3480: 72 20 6f 66 20 63 6f 6d 70 6f 6e 65 6e 74 73 20  r of components 
3490: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
34a0: 45 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  EY */.    int ad
34b0: 64 72 4f 70 65 6e 3b 20 20 20 20 2f 2a 20 41 64  drOpen;    /* Ad
34c0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 70 65  dress of the Ope
34d0: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
34e0: 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61  uction */..    a
34f0: 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b  ssert( pPk!=0 );
3500: 0a 20 20 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e  .    nPk = pPk->
3510: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 69 50 6b  nKeyCol;.    iPk
3520: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
3530: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
3540: 4d 65 6d 20 2b 3d 20 6e 50 6b 3b 0a 20 20 20 20  Mem += nPk;.    
3550: 72 65 67 4b 65 79 20 3d 20 2b 2b 70 50 61 72 73  regKey = ++pPars
3560: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 45 70  e->nMem;.    iEp
3570: 68 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  h = pParse->nTab
3580: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
3590: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
35a0: 4e 75 6c 6c 2c 20 30 2c 20 69 50 6b 29 3b 0a 20  Null, 0, iPk);. 
35b0: 20 20 20 61 64 64 72 4f 70 65 6e 20 3d 20 73 71     addrOpen = sq
35c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
35d0: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
35e0: 72 61 6c 2c 20 69 45 70 68 2c 20 6e 50 6b 29 3b  ral, iEph, nPk);
35f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3600: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
3610: 72 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 70  rse, pPk);.    p
3620: 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
3630: 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
3640: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
3650: 72 65 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20  re, 0, 0, .     
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
3680: 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 2c  ONEPASS_DESIRED,
3690: 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 69   iIdxCur);.    i
36a0: 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
36b0: 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e  oto update_clean
36c0: 75 70 3b 0a 20 20 20 20 6f 6b 4f 6e 65 50 61 73  up;.    okOnePas
36d0: 73 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  s = sqlite3Where
36e0: 4f 6b 4f 6e 65 50 61 73 73 28 70 57 49 6e 66 6f  OkOnePass(pWInfo
36f0: 2c 20 61 69 43 75 72 4f 6e 65 50 61 73 73 29 3b  , aiCurOnePass);
3700: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3710: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
3720: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
3730: 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
3740: 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43  (v, pTab, iDataC
3750: 75 72 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ur, pPk->aiColum
3760: 6e 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  n[i],.          
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6b 2b              iPk+
3790: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i);.    }.    if
37a0: 28 20 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20  ( okOnePass ){. 
37b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37c0: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
37d0: 61 64 64 72 4f 70 65 6e 29 3b 0a 20 20 20 20 20  addrOpen);.     
37e0: 20 6e 4b 65 79 20 3d 20 6e 50 6b 3b 0a 20 20 20   nKey = nPk;.   
37f0: 20 20 20 72 65 67 4b 65 79 20 3d 20 69 50 6b 3b     regKey = iPk;
3800: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3820: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
3830: 63 6f 72 64 2c 20 69 50 6b 2c 20 6e 50 6b 2c 20  cord, iPk, nPk, 
3840: 72 65 67 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  regKey,.        
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3860: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
3870: 6e 69 74 79 53 74 72 28 76 2c 20 70 50 6b 29 2c  nityStr(v, pPk),
3880: 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P4_TRANSIENT);.
3890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
38a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
38b0: 78 49 6e 73 65 72 74 2c 20 69 45 70 68 2c 20 72  xInsert, iEph, r
38c0: 65 67 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20  egKey);.    }.  
38d0: 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
38e0: 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a  d(pWInfo);.  }..
38f0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
3900: 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 75 70 64  the count of upd
3910: 61 74 65 64 20 72 6f 77 73 0a 20 20 2a 2f 0a 20  ated rows.  */. 
3920: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
3930: 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
3940: 77 73 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ws) && !pParse->
3950: 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
3960: 20 20 20 72 65 67 52 6f 77 43 6f 75 6e 74 20 3d     regRowCount =
3970: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
3980: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3990: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
39a0: 65 67 65 72 2c 20 30 2c 20 72 65 67 52 6f 77 43  eger, 0, regRowC
39b0: 6f 75 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 6c 61  ount);.  }..  la
39c0: 62 65 6c 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  belBreak = sqlit
39d0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
39e0: 76 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65  v);.  if( !isVie
39f0: 77 20 29 7b 0a 20 20 20 20 2f 2a 20 0a 20 20 20  w ){.    /* .   
3a00: 20 2a 2a 20 4f 70 65 6e 20 65 76 65 72 79 20 69   ** Open every i
3a10: 6e 64 65 78 20 74 68 61 74 20 6e 65 65 64 73 20  ndex that needs 
3a20: 75 70 64 61 74 69 6e 67 2e 20 20 4e 6f 74 65 20  updating.  Note 
3a30: 74 68 61 74 20 69 66 20 61 6e 79 0a 20 20 20 20  that if any.    
3a40: 2a 2a 20 69 6e 64 65 78 20 63 6f 75 6c 64 20 70  ** index could p
3a50: 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6e 76 6f 6b  otentially invok
3a60: 65 20 61 20 52 45 50 4c 41 43 45 20 63 6f 6e 66  e a REPLACE conf
3a70: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
3a80: 0a 20 20 20 20 2a 2a 20 61 63 74 69 6f 6e 2c 20  .    ** action, 
3a90: 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
3aa0: 6f 70 65 6e 20 61 6c 6c 20 69 6e 64 69 63 65 73  open all indices
3ab0: 20 62 65 63 61 75 73 65 20 77 65 20 6d 69 67 68   because we migh
3ac0: 74 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  t need.    ** to
3ad0: 20 62 65 20 64 65 6c 65 74 69 6e 67 20 73 6f 6d   be deleting som
3ae0: 65 20 72 65 63 6f 72 64 73 2e 0a 20 20 20 20 2a  e records..    *
3af0: 2f 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  /.    if( onErro
3b00: 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r==OE_Replace ){
3b10: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 54  .      memset(aT
3b20: 6f 4f 70 65 6e 2c 20 31 2c 20 6e 49 64 78 2b 31  oOpen, 1, nIdx+1
3b30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
3b40: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
3b50: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
3b60: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
3b70: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
3b80: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
3b90: 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
3ba0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 54         memset(aT
3bb0: 6f 4f 70 65 6e 2c 20 31 2c 20 6e 49 64 78 2b 31  oOpen, 1, nIdx+1
3bc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
3bd0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
3be0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3bf0: 69 66 28 20 6f 6b 4f 6e 65 50 61 73 73 20 29 7b  if( okOnePass ){
3c00: 0a 20 20 20 20 20 20 69 66 28 20 61 69 43 75 72  .      if( aiCur
3c10: 4f 6e 65 50 61 73 73 5b 30 5d 3e 3d 30 20 29 20  OnePass[0]>=0 ) 
3c20: 61 54 6f 4f 70 65 6e 5b 61 69 43 75 72 4f 6e 65  aToOpen[aiCurOne
3c30: 50 61 73 73 5b 30 5d 2d 69 42 61 73 65 43 75 72  Pass[0]-iBaseCur
3c40: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  ] = 0;.      if(
3c50: 20 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d   aiCurOnePass[1]
3c60: 3e 3d 30 20 29 20 61 54 6f 4f 70 65 6e 5b 61 69  >=0 ) aToOpen[ai
3c70: 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 2d 69 42  CurOnePass[1]-iB
3c80: 61 73 65 43 75 72 5d 20 3d 20 30 3b 0a 20 20 20  aseCur] = 0;.   
3c90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
3ca0: 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65  enTableAndIndice
3cb0: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  s(pParse, pTab, 
3cc0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 42  OP_OpenWrite, iB
3cd0: 61 73 65 43 75 72 2c 20 61 54 6f 4f 70 65 6e 2c  aseCur, aToOpen,
3ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  0, 0);.  }..  /*
3d10: 20 54 6f 70 20 6f 66 20 74 68 65 20 75 70 64 61   Top of the upda
3d20: 74 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 66 28  te loop */.  if(
3d30: 20 6f 6b 4f 6e 65 50 61 73 73 20 29 7b 0a 20 20   okOnePass ){.  
3d40: 20 20 69 66 28 20 61 54 6f 4f 70 65 6e 5b 69 44    if( aToOpen[iD
3d50: 61 74 61 43 75 72 2d 69 42 61 73 65 43 75 72 5d  ataCur-iBaseCur]
3d60: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
3d70: 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 20 20  ( pPk!=0 );.    
3d80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3d90: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
3da0: 46 6f 75 6e 64 2c 20 69 44 61 74 61 43 75 72 2c  Found, iDataCur,
3db0: 20 6c 61 62 65 6c 42 72 65 61 6b 2c 20 72 65 67   labelBreak, reg
3dc0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
3dd0: 7d 0a 20 20 20 20 6c 61 62 65 6c 43 6f 6e 74 69  }.    labelConti
3de0: 6e 75 65 20 3d 20 6c 61 62 65 6c 42 72 65 61 6b  nue = labelBreak
3df0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3e00: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
3e10: 4e 75 6c 6c 2c 20 70 50 6b 20 3f 20 72 65 67 4b  Null, pPk ? regK
3e20: 65 79 20 3a 20 72 65 67 4f 6c 64 52 6f 77 69 64  ey : regOldRowid
3e30: 2c 20 6c 61 62 65 6c 42 72 65 61 6b 29 3b 0a 20  , labelBreak);. 
3e40: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 6b 20 29   }else if( pPk )
3e50: 7b 0a 20 20 20 20 6c 61 62 65 6c 43 6f 6e 74 69  {.    labelConti
3e60: 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
3e70: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
3e80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3e90: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
3ea0: 64 2c 20 69 45 70 68 2c 20 6c 61 62 65 6c 42 72  d, iEph, labelBr
3eb0: 65 61 6b 29 3b 0a 20 20 20 20 61 64 64 72 54 6f  eak);.    addrTo
3ec0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
3ed0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b  ddOp2(v, OP_RowK
3ee0: 65 79 2c 20 69 45 70 68 2c 20 72 65 67 4b 65 79  ey, iEph, regKey
3ef0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3f00: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
3f10: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 44 61 74  P_NotFound, iDat
3f20: 61 43 75 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69  aCur, labelConti
3f30: 6e 75 65 2c 20 72 65 67 4b 65 79 2c 20 30 29 3b  nue, regKey, 0);
3f40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 61  .  }else{.    la
3f50: 62 65 6c 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  belContinue = sq
3f60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
3f70: 76 2c 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64  v, OP_RowSetRead
3f80: 2c 20 72 65 67 52 6f 77 53 65 74 2c 20 6c 61 62  , regRowSet, lab
3f90: 65 6c 42 72 65 61 6b 2c 0a 20 20 20 20 20 20 20  elBreak,.       
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fb0: 20 20 20 20 20 20 72 65 67 4f 6c 64 52 6f 77 69        regOldRowi
3fc0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
3fd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3fe0: 4e 6f 74 45 78 69 73 74 73 2c 20 69 44 61 74 61  NotExists, iData
3ff0: 43 75 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e  Cur, labelContin
4000: 75 65 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 29  ue, regOldRowid)
4010: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
4020: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
4030: 20 77 69 6c 6c 20 63 68 61 6e 67 65 2c 20 73 65   will change, se
4040: 74 20 72 65 67 69 73 74 65 72 20 72 65 67 4e 65  t register regNe
4050: 77 52 6f 77 69 64 20 74 6f 0a 20 20 2a 2a 20 63  wRowid to.  ** c
4060: 6f 6e 74 61 69 6e 20 74 68 65 20 6e 65 77 20 76  ontain the new v
4070: 61 6c 75 65 2e 20 49 66 20 74 68 65 20 72 65 63  alue. If the rec
4080: 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f  ord number is no
4090: 74 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  t being modified
40a0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 67 4e  ,.  ** then regN
40b0: 65 77 52 6f 77 69 64 20 69 73 20 74 68 65 20 73  ewRowid is the s
40c0: 61 6d 65 20 72 65 67 69 73 74 65 72 20 61 73 20  ame register as 
40d0: 72 65 67 4f 6c 64 52 6f 77 69 64 2c 20 77 68 69  regOldRowid, whi
40e0: 63 68 20 69 73 0a 20 20 2a 2a 20 61 6c 72 65 61  ch is.  ** alrea
40f0: 64 79 20 70 6f 70 75 6c 61 74 65 64 2e 20 20 2a  dy populated.  *
4100: 2f 0a 20 20 61 73 73 65 72 74 28 20 63 68 6e 67  /.  assert( chng
4110: 4b 65 79 20 7c 7c 20 70 54 72 69 67 67 65 72 20  Key || pTrigger 
4120: 7c 7c 20 68 61 73 46 4b 20 7c 7c 20 72 65 67 4f  || hasFK || regO
4130: 6c 64 52 6f 77 69 64 3d 3d 72 65 67 4e 65 77 52  ldRowid==regNewR
4140: 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 63 68  owid );.  if( ch
4150: 6e 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73  ngRowid ){.    s
4160: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
4170: 50 61 72 73 65 2c 20 70 52 6f 77 69 64 45 78 70  Parse, pRowidExp
4180: 72 2c 20 72 65 67 4e 65 77 52 6f 77 69 64 29 3b  r, regNewRowid);
4190: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
41a0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
41b0: 74 42 65 49 6e 74 2c 20 72 65 67 4e 65 77 52 6f  tBeInt, regNewRo
41c0: 77 69 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  wid);.  }..  /* 
41d0: 43 6f 6d 70 75 74 65 20 74 68 65 20 6f 6c 64 20  Compute the old 
41e0: 70 72 65 2d 55 50 44 41 54 45 20 63 6f 6e 74 65  pre-UPDATE conte
41f0: 6e 74 20 6f 66 20 74 68 65 20 72 6f 77 20 62 65  nt of the row be
4200: 69 6e 67 20 63 68 61 6e 67 65 64 2c 20 69 66 20  ing changed, if 
4210: 74 68 61 74 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d  that.  ** inform
4220: 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 20  ation is needed 
4230: 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 50 6b 20  */.  if( chngPk 
4240: 7c 7c 20 68 61 73 46 4b 20 7c 7c 20 70 54 72 69  || hasFK || pTri
4250: 67 67 65 72 20 29 7b 0a 20 20 20 20 75 33 32 20  gger ){.    u32 
4260: 6f 6c 64 6d 61 73 6b 20 3d 20 28 68 61 73 46 4b  oldmask = (hasFK
4270: 20 3f 20 73 71 6c 69 74 65 33 46 6b 4f 6c 64 6d   ? sqlite3FkOldm
4280: 61 73 6b 28 70 50 61 72 73 65 2c 20 70 54 61 62  ask(pParse, pTab
4290: 29 20 3a 20 30 29 3b 0a 20 20 20 20 6f 6c 64 6d  ) : 0);.    oldm
42a0: 61 73 6b 20 7c 3d 20 73 71 6c 69 74 65 33 54 72  ask |= sqlite3Tr
42b0: 69 67 67 65 72 43 6f 6c 6d 61 73 6b 28 70 50 61  iggerColmask(pPa
42c0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54  rse, .        pT
42d0: 72 69 67 67 65 72 2c 20 70 43 68 61 6e 67 65 73  rigger, pChanges
42e0: 2c 20 30 2c 20 54 52 49 47 47 45 52 5f 42 45 46  , 0, TRIGGER_BEF
42f0: 4f 52 45 7c 54 52 49 47 47 45 52 5f 41 46 54 45  ORE|TRIGGER_AFTE
4300: 52 2c 20 70 54 61 62 2c 20 6f 6e 45 72 72 6f 72  R, pTab, onError
4310: 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28  .    );.    for(
4320: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
4330: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
4340: 66 28 20 6f 6c 64 6d 61 73 6b 3d 3d 30 78 66 66  f( oldmask==0xff
4350: 66 66 66 66 66 66 0a 20 20 20 20 20 20 20 7c 7c  ffffff.       ||
4360: 20 28 69 3c 33 32 20 26 26 20 28 6f 6c 64 6d 61   (i<32 && (oldma
4370: 73 6b 20 26 20 28 31 3c 3c 69 29 29 29 0a 20 20  sk & (1<<i))).  
4380: 20 20 20 20 20 7c 7c 20 28 70 54 61 62 2d 3e 61       || (pTab->a
4390: 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20  Col[i].colFlags 
43a0: 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  & COLFLAG_PRIMKE
43b0: 59 29 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  Y)!=0.      ){. 
43c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
43d0: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
43e0: 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20  fTable(v, pTab, 
43f0: 69 44 61 74 61 43 75 72 2c 20 69 2c 20 72 65 67  iDataCur, i, reg
4400: 4f 6c 64 2b 69 29 3b 0a 20 20 20 20 20 20 7d 65  Old+i);.      }e
4410: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4430: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
4440: 67 4f 6c 64 2b 69 29 3b 0a 20 20 20 20 20 20 7d  gOld+i);.      }
4450: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
4460: 68 6e 67 52 6f 77 69 64 3d 3d 30 20 26 26 20 70  hngRowid==0 && p
4470: 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Pk==0 ){.      s
4480: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4490: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
44a0: 4f 6c 64 52 6f 77 69 64 2c 20 72 65 67 4e 65 77  OldRowid, regNew
44b0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Rowid);.    }.  
44c0: 7d 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  }..  /* Populate
44d0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65   the array of re
44e0: 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e  gisters beginnin
44f0: 67 20 61 74 20 72 65 67 4e 65 77 20 77 69 74 68  g at regNew with
4500: 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 72 6f   the new.  ** ro
4510: 77 20 64 61 74 61 2e 20 54 68 69 73 20 61 72 72  w data. This arr
4520: 61 79 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ay is used to ch
4530: 65 63 6b 20 63 6f 6e 73 74 61 69 6e 74 73 2c 20  eck constaints, 
4540: 63 72 65 61 74 65 20 74 68 65 20 6e 65 77 0a 20  create the new. 
4550: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
4560: 64 65 78 20 72 65 63 6f 72 64 73 2c 20 61 6e 64  dex records, and
4570: 20 61 73 20 74 68 65 20 76 61 6c 75 65 73 20 66   as the values f
4580: 6f 72 20 61 6e 79 20 6e 65 77 2e 2a 20 72 65 66  or any new.* ref
4590: 65 72 65 6e 63 65 73 0a 20 20 2a 2a 20 6d 61 64  erences.  ** mad
45a0: 65 20 62 79 20 74 72 69 67 67 65 72 73 2e 0a 20  e by triggers.. 
45b0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 72   **.  ** If ther
45c0: 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  e are one or mor
45d0: 65 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72  e BEFORE trigger
45e0: 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 70  s, then do not p
45f0: 6f 70 75 6c 61 74 65 20 74 68 65 0a 20 20 2a 2a  opulate the.  **
4600: 20 72 65 67 69 73 74 65 72 73 20 61 73 73 6f 63   registers assoc
4610: 69 61 74 65 64 20 77 69 74 68 20 63 6f 6c 75 6d  iated with colum
4620: 6e 73 20 74 68 61 74 20 61 72 65 20 28 61 29 20  ns that are (a) 
4630: 6e 6f 74 20 6d 6f 64 69 66 69 65 64 20 62 79 0a  not modified by.
4640: 20 20 2a 2a 20 74 68 69 73 20 55 50 44 41 54 45    ** this UPDATE
4650: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 28   statement and (
4660: 62 29 20 6e 6f 74 20 61 63 63 65 73 73 65 64 20  b) not accessed 
4670: 62 79 20 6e 65 77 2e 2a 20 72 65 66 65 72 65 6e  by new.* referen
4680: 63 65 73 2e 20 54 68 65 0a 20 20 2a 2a 20 76 61  ces. The.  ** va
4690: 6c 75 65 73 20 66 6f 72 20 72 65 67 69 73 74 65  lues for registe
46a0: 72 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 20  rs not modified 
46b0: 62 79 20 74 68 65 20 55 50 44 41 54 45 20 6d 75  by the UPDATE mu
46c0: 73 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 66  st be reloaded f
46d0: 72 6f 6d 20 0a 20 20 2a 2a 20 74 68 65 20 64 61  rom .  ** the da
46e0: 74 61 62 61 73 65 20 61 66 74 65 72 20 74 68 65  tabase after the
46f0: 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73   BEFORE triggers
4700: 20 61 72 65 20 66 69 72 65 64 20 61 6e 79 77 61   are fired anywa
4710: 79 20 28 61 73 20 74 68 65 20 74 72 69 67 67 65  y (as the trigge
4720: 72 20 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65  r .  ** may have
4730: 20 6d 6f 64 69 66 69 65 64 20 74 68 65 6d 29 2e   modified them).
4740: 20 53 6f 20 6e 6f 74 20 6c 6f 61 64 69 6e 67 20   So not loading 
4750: 74 68 6f 73 65 20 74 68 61 74 20 61 72 65 20 6e  those that are n
4760: 6f 74 20 67 6f 69 6e 67 20 74 6f 0a 20 20 2a 2a  ot going to.  **
4770: 20 62 65 20 75 73 65 64 20 65 6c 69 6d 69 6e 61   be used elimina
4780: 74 65 73 20 73 6f 6d 65 20 72 65 64 75 6e 64 61  tes some redunda
4790: 6e 74 20 6f 70 63 6f 64 65 73 2e 0a 20 20 2a 2f  nt opcodes..  */
47a0: 0a 20 20 6e 65 77 6d 61 73 6b 20 3d 20 73 71 6c  .  newmask = sql
47b0: 69 74 65 33 54 72 69 67 67 65 72 43 6f 6c 6d 61  ite3TriggerColma
47c0: 73 6b 28 0a 20 20 20 20 20 20 70 50 61 72 73 65  sk(.      pParse
47d0: 2c 20 70 54 72 69 67 67 65 72 2c 20 70 43 68 61  , pTrigger, pCha
47e0: 6e 67 65 73 2c 20 31 2c 20 54 52 49 47 47 45 52  nges, 1, TRIGGER
47f0: 5f 42 45 46 4f 52 45 2c 20 70 54 61 62 2c 20 6f  _BEFORE, pTab, o
4800: 6e 45 72 72 6f 72 0a 20 20 29 3b 0a 20 20 73 71  nError.  );.  sq
4810: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4820: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
4830: 65 67 4e 65 77 2c 20 72 65 67 4e 65 77 2b 70 54  egNew, regNew+pT
4840: 61 62 2d 3e 6e 43 6f 6c 2d 31 29 3b 0a 20 20 66  ab->nCol-1);.  f
4850: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
4860: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
4870: 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( i==pTab->iPK
4880: 65 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 73 71  ey ){.      /*sq
4890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
48a0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
48b0: 65 67 4e 65 77 2b 69 29 3b 2a 2f 0a 20 20 20 20  egNew+i);*/.    
48c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d  }else{.      j =
48d0: 20 61 58 52 65 66 5b 69 5d 3b 0a 20 20 20 20 20   aXRef[i];.     
48e0: 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
48f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
4900: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 68  Code(pParse, pCh
4910: 61 6e 67 65 73 2d 3e 61 5b 6a 5d 2e 70 45 78 70  anges->a[j].pExp
4920: 72 2c 20 72 65 67 4e 65 77 2b 69 29 3b 0a 20 20  r, regNew+i);.  
4930: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d      }else if( 0=
4940: 3d 28 74 6d 61 73 6b 26 54 52 49 47 47 45 52 5f  =(tmask&TRIGGER_
4950: 42 45 46 4f 52 45 29 20 7c 7c 20 69 3e 33 31 20  BEFORE) || i>31 
4960: 7c 7c 20 28 6e 65 77 6d 61 73 6b 26 28 31 3c 3c  || (newmask&(1<<
4970: 69 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  i)) ){.        /
4980: 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6c 6f  * This branch lo
4990: 61 64 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ads the value of
49a0: 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 77   a column that w
49b0: 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68 61 6e 67  ill not be chang
49c0: 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ed .        ** i
49d0: 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20  nto a register. 
49e0: 54 68 69 73 20 69 73 20 64 6f 6e 65 20 69 66 20  This is done if 
49f0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 42 45 46  there are no BEF
4a00: 4f 52 45 20 74 72 69 67 67 65 72 73 2c 20 6f 72  ORE triggers, or
4a10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 74  .        ** if t
4a20: 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
4a30: 6d 6f 72 65 20 42 45 46 4f 52 45 20 74 72 69 67  more BEFORE trig
4a40: 67 65 72 73 20 74 68 61 74 20 75 73 65 20 74 68  gers that use th
4a50: 69 73 20 76 61 6c 75 65 20 76 69 61 0a 20 20 20  is value via.   
4a60: 20 20 20 20 20 2a 2a 20 61 20 6e 65 77 2e 2a 20       ** a new.* 
4a70: 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 74  reference in a t
4a80: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 0a  rigger program..
4a90: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
4aa0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
4ab0: 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  31 );.        te
4ac0: 73 74 63 61 73 65 28 20 69 3d 3d 33 32 20 29 3b  stcase( i==32 );
4ad0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4ae0: 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
4af0: 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62  nOfTable(v, pTab
4b00: 2c 20 69 44 61 74 61 43 75 72 2c 20 69 2c 20 72  , iDataCur, i, r
4b10: 65 67 4e 65 77 2b 69 29 3b 0a 20 20 20 20 20 20  egNew+i);.      
4b20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
4b30: 2a 20 46 69 72 65 20 61 6e 79 20 42 45 46 4f 52  * Fire any BEFOR
4b40: 45 20 55 50 44 41 54 45 20 74 72 69 67 67 65 72  E UPDATE trigger
4b50: 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  s. This happens 
4b60: 62 65 66 6f 72 65 20 63 6f 6e 73 74 72 61 69 6e  before constrain
4b70: 74 73 20 61 72 65 0a 20 20 2a 2a 20 76 65 72 69  ts are.  ** veri
4b80: 66 69 65 64 2e 20 4f 6e 65 20 63 6f 75 6c 64 20  fied. One could 
4b90: 61 72 67 75 65 20 74 68 61 74 20 74 68 69 73 20  argue that this 
4ba0: 69 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20  is wrong..  */. 
4bb0: 20 69 66 28 20 74 6d 61 73 6b 26 54 52 49 47 47   if( tmask&TRIGG
4bc0: 45 52 5f 42 45 46 4f 52 45 20 29 7b 0a 20 20 20  ER_BEFORE ){.   
4bd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4be0: 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p2(v, OP_Affinit
4bf0: 79 2c 20 72 65 67 4e 65 77 2c 20 70 54 61 62 2d  y, regNew, pTab-
4c00: 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 73 71 6c 69  >nCol);.    sqli
4c10: 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79  te3TableAffinity
4c20: 53 74 72 28 76 2c 20 70 54 61 62 29 3b 0a 20 20  Str(v, pTab);.  
4c30: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f 77    sqlite3CodeRow
4c40: 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20  Trigger(pParse, 
4c50: 70 54 72 69 67 67 65 72 2c 20 54 4b 5f 55 50 44  pTrigger, TK_UPD
4c60: 41 54 45 2c 20 70 43 68 61 6e 67 65 73 2c 20 0a  ATE, pChanges, .
4c70: 20 20 20 20 20 20 20 20 54 52 49 47 47 45 52 5f          TRIGGER_
4c80: 42 45 46 4f 52 45 2c 20 70 54 61 62 2c 20 72 65  BEFORE, pTab, re
4c90: 67 4f 6c 64 52 6f 77 69 64 2c 20 6f 6e 45 72 72  gOldRowid, onErr
4ca0: 6f 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75  or, labelContinu
4cb0: 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  e);..    /* The 
4cc0: 72 6f 77 2d 74 72 69 67 67 65 72 20 6d 61 79 20  row-trigger may 
4cd0: 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 68 65  have deleted the
4ce0: 20 72 6f 77 20 62 65 69 6e 67 20 75 70 64 61 74   row being updat
4cf0: 65 64 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20  ed. In this.    
4d00: 2a 2a 20 63 61 73 65 2c 20 6a 75 6d 70 20 74 6f  ** case, jump to
4d10: 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 20 4e   the next row. N
4d20: 6f 20 75 70 64 61 74 65 73 20 6f 72 20 41 46 54  o updates or AFT
4d30: 45 52 20 74 72 69 67 67 65 72 73 20 61 72 65 20  ER triggers are 
4d40: 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64  .    ** required
4d50: 2e 20 54 68 69 73 20 62 65 68 61 76 69 6f 72 20  . This behavior 
4d60: 2d 20 77 68 61 74 20 68 61 70 70 65 6e 73 20 77  - what happens w
4d70: 68 65 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e  hen the row bein
4d80: 67 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a  g updated.    **
4d90: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72 20 72   is deleted or r
4da0: 65 6e 61 6d 65 64 20 62 79 20 61 20 42 45 46 4f  enamed by a BEFO
4db0: 52 45 20 74 72 69 67 67 65 72 20 2d 20 69 73 20  RE trigger - is 
4dc0: 6c 65 66 74 20 75 6e 64 65 66 69 6e 65 64 20 69  left undefined i
4dd0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 6f 63  n the.    ** doc
4de0: 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20  umentation..    
4df0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 6b 20 29  */.    if( pPk )
4e00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
4e10: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
4e20: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 44 61  OP_NotFound, iDa
4e30: 74 61 43 75 72 2c 20 6c 61 62 65 6c 43 6f 6e 74  taCur, labelCont
4e40: 69 6e 75 65 2c 72 65 67 4b 65 79 2c 6e 4b 65 79  inue,regKey,nKey
4e50: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
4e60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4e70: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
4e80: 78 69 73 74 73 2c 20 69 44 61 74 61 43 75 72 2c  xists, iDataCur,
4e90: 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75 65 2c 20   labelContinue, 
4ea0: 72 65 67 4f 6c 64 52 6f 77 69 64 29 3b 0a 20 20  regOldRowid);.  
4eb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69    }..    /* If i
4ec0: 74 20 64 69 64 20 6e 6f 74 20 64 65 6c 65 74 65  t did not delete
4ed0: 20 69 74 2c 20 74 68 65 20 72 6f 77 2d 74 72 69   it, the row-tri
4ee0: 67 67 65 72 20 6d 61 79 20 73 74 69 6c 6c 20 68  gger may still h
4ef0: 61 76 65 20 6d 6f 64 69 66 69 65 64 20 0a 20 20  ave modified .  
4f00: 20 20 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65    ** some of the
4f10: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
4f20: 72 6f 77 20 62 65 69 6e 67 20 75 70 64 61 74 65  row being update
4f30: 64 2e 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75  d. Load the valu
4f40: 65 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 61  es for .    ** a
4f50: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6e 6f 74 20 6d  ll columns not m
4f60: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75  odified by the u
4f70: 70 64 61 74 65 20 73 74 61 74 65 6d 65 6e 74 20  pdate statement 
4f80: 69 6e 74 6f 20 74 68 65 69 72 20 0a 20 20 20 20  into their .    
4f90: 2a 2a 20 72 65 67 69 73 74 65 72 73 20 69 6e 20  ** registers in 
4fa0: 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61  case this has ha
4fb0: 70 70 65 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ppened..    */. 
4fc0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
4fd0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
4fe0: 20 20 20 20 20 20 69 66 28 20 61 58 52 65 66 5b        if( aXRef[
4ff0: 69 5d 3c 30 20 26 26 20 69 21 3d 70 54 61 62 2d  i]<0 && i!=pTab-
5000: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
5010: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5020: 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
5030: 65 28 76 2c 20 70 54 61 62 2c 20 69 44 61 74 61  e(v, pTab, iData
5040: 43 75 72 2c 20 69 2c 20 72 65 67 4e 65 77 2b 69  Cur, i, regNew+i
5050: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5060: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 56  .  }..  if( !isV
5070: 69 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  iew ){.    int j
5080: 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
5090: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a   /* Address of j
50a0: 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ump instruction 
50b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52 65 70 6c  */.    int bRepl
50c0: 61 63 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ace = 0;     /* 
50d0: 54 72 75 65 20 69 66 20 52 45 50 4c 41 43 45 20  True if REPLACE 
50e0: 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
50f0: 69 6f 6e 20 6d 69 67 68 74 20 68 61 70 70 65 6e  ion might happen
5100: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 63   */..    /* Do c
5110: 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 73  onstraint checks
5120: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
5130: 20 72 65 67 4f 6c 64 52 6f 77 69 64 3e 30 20 29   regOldRowid>0 )
5140: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e  ;.    sqlite3Gen
5150: 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  erateConstraintC
5160: 68 65 63 6b 73 28 70 50 61 72 73 65 2c 20 70 54  hecks(pParse, pT
5170: 61 62 2c 20 61 52 65 67 49 64 78 2c 20 69 44 61  ab, aRegIdx, iDa
5180: 74 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 0a  taCur, iIdxCur,.
5190: 20 20 20 20 20 20 20 20 72 65 67 4e 65 77 52 6f          regNewRo
51a0: 77 69 64 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64  wid, regOldRowid
51b0: 2c 20 63 68 6e 67 4b 65 79 2c 20 6f 6e 45 72 72  , chngKey, onErr
51c0: 6f 72 2c 20 6c 61 62 65 6c 43 6f 6e 74 69 6e 75  or, labelContinu
51d0: 65 2c 20 26 62 52 65 70 6c 61 63 65 29 3b 0a 0a  e, &bReplace);..
51e0: 20 20 20 20 2f 2a 20 44 6f 20 46 4b 20 63 6f 6e      /* Do FK con
51f0: 73 74 72 61 69 6e 74 20 63 68 65 63 6b 73 2e 20  straint checks. 
5200: 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73 46 4b  */.    if( hasFK
5210: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5220: 33 46 6b 43 68 65 63 6b 28 70 50 61 72 73 65 2c  3FkCheck(pParse,
5230: 20 70 54 61 62 2c 20 72 65 67 4f 6c 64 52 6f 77   pTab, regOldRow
5240: 69 64 2c 20 30 2c 20 61 58 52 65 66 2c 20 63 68  id, 0, aXRef, ch
5250: 6e 67 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 0a 20  ngKey);.    }.. 
5260: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
5270: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61   index entries a
5280: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
5290: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
52a0: 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  d.  */.    if( b
52b0: 52 65 70 6c 61 63 65 20 7c 7c 20 63 68 6e 67 4b  Replace || chngK
52c0: 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ey ){.      if( 
52d0: 70 50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  pPk ){.        j
52e0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
52f0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
5300: 6f 74 46 6f 75 6e 64 2c 20 69 44 61 74 61 43 75  otFound, iDataCu
5310: 72 2c 20 30 2c 20 72 65 67 4b 65 79 2c 20 6e 4b  r, 0, regKey, nK
5320: 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ey);.      }else
5330: 7b 0a 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73  {.        j1 = s
5340: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5350: 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
5360: 2c 20 69 44 61 74 61 43 75 72 2c 20 30 2c 20 72  , iDataCur, 0, r
5370: 65 67 4f 6c 64 52 6f 77 69 64 29 3b 0a 20 20 20  egOldRowid);.   
5380: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
5390: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f  qlite3GenerateRo
53a0: 77 49 6e 64 65 78 44 65 6c 65 74 65 28 70 50 61  wIndexDelete(pPa
53b0: 72 73 65 2c 20 70 54 61 62 2c 20 69 44 61 74 61  rse, pTab, iData
53c0: 43 75 72 2c 20 69 49 64 78 43 75 72 2c 20 61 52  Cur, iIdxCur, aR
53d0: 65 67 49 64 78 29 3b 0a 20 20 0a 20 20 20 20 2f  egIdx);.  .    /
53e0: 2a 20 49 66 20 63 68 61 6e 67 69 6e 67 20 74 68  * If changing th
53f0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2c  e record number,
5400: 20 64 65 6c 65 74 65 20 74 68 65 20 6f 6c 64 20   delete the old 
5410: 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20  record.  */.    
5420: 69 66 28 20 68 61 73 46 4b 20 7c 7c 20 63 68 6e  if( hasFK || chn
5430: 67 4b 65 79 20 7c 7c 20 70 50 6b 21 3d 30 20 29  gKey || pPk!=0 )
5440: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5450: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5460: 44 65 6c 65 74 65 2c 20 69 44 61 74 61 43 75 72  Delete, iDataCur
5470: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
5480: 69 66 28 20 62 52 65 70 6c 61 63 65 20 7c 7c 20  if( bReplace || 
5490: 63 68 6e 67 4b 65 79 20 29 7b 0a 20 20 20 20 20  chngKey ){.     
54a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
54b0: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
54c0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 68 61 73 46   }..    if( hasF
54d0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
54e0: 65 33 46 6b 43 68 65 63 6b 28 70 50 61 72 73 65  e3FkCheck(pParse
54f0: 2c 20 70 54 61 62 2c 20 30 2c 20 72 65 67 4e 65  , pTab, 0, regNe
5500: 77 52 6f 77 69 64 2c 20 61 58 52 65 66 2c 20 63  wRowid, aXRef, c
5510: 68 6e 67 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20  hngKey);.    }. 
5520: 20 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20   .    /* Insert 
5530: 74 68 65 20 6e 65 77 20 69 6e 64 65 78 20 65 6e  the new index en
5540: 74 72 69 65 73 20 61 6e 64 20 74 68 65 20 6e 65  tries and the ne
5550: 77 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 20  w record. */.   
5560: 20 73 71 6c 69 74 65 33 43 6f 6d 70 6c 65 74 65   sqlite3Complete
5570: 49 6e 73 65 72 74 69 6f 6e 28 70 50 61 72 73 65  Insertion(pParse
5580: 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43 75 72  , pTab, iDataCur
5590: 2c 20 69 49 64 78 43 75 72 2c 0a 20 20 20 20 20  , iIdxCur,.     
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 20 20 20 20 72 65 67 4e 65 77 52 6f          regNewRo
55c0: 77 69 64 2c 20 61 52 65 67 49 64 78 2c 20 31 2c  wid, aRegIdx, 1,
55d0: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20   0, 0);..    /* 
55e0: 44 6f 20 61 6e 79 20 4f 4e 20 43 41 53 43 41 44  Do any ON CASCAD
55f0: 45 2c 20 53 45 54 20 4e 55 4c 4c 20 6f 72 20 53  E, SET NULL or S
5600: 45 54 20 44 45 46 41 55 4c 54 20 6f 70 65 72 61  ET DEFAULT opera
5610: 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74  tions required t
5620: 6f 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20  o.    ** handle 
5630: 72 6f 77 73 20 28 70 6f 73 73 69 62 6c 79 20 69  rows (possibly i
5640: 6e 20 6f 74 68 65 72 20 74 61 62 6c 65 73 29 20  n other tables) 
5650: 74 68 61 74 20 72 65 66 65 72 20 76 69 61 20 61  that refer via a
5660: 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 20 20 20   foreign key.   
5670: 20 2a 2a 20 74 6f 20 74 68 65 20 72 6f 77 20 6a   ** to the row j
5680: 75 73 74 20 75 70 64 61 74 65 64 2e 20 2a 2f 20  ust updated. */ 
5690: 0a 20 20 20 20 69 66 28 20 68 61 73 46 4b 20 29  .    if( hasFK )
56a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
56b0: 6b 41 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  kActions(pParse,
56c0: 20 70 54 61 62 2c 20 70 43 68 61 6e 67 65 73 2c   pTab, pChanges,
56d0: 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c 20 61 58   regOldRowid, aX
56e0: 52 65 66 2c 20 63 68 6e 67 4b 65 79 29 3b 0a 20  Ref, chngKey);. 
56f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
5700: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 6f 77  ncrement the row
5710: 20 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2f 0a 20   counter .  */. 
5720: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
5730: 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
5740: 77 73 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ws) && !pParse->
5750: 70 54 72 69 67 67 65 72 54 61 62 29 7b 0a 20 20  pTriggerTab){.  
5760: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5770: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
5780: 2c 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20 31  , regRowCount, 1
5790: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
57a0: 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28  3CodeRowTrigger(
57b0: 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
57c0: 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 70 43 68  , TK_UPDATE, pCh
57d0: 61 6e 67 65 73 2c 20 0a 20 20 20 20 20 20 54 52  anges, .      TR
57e0: 49 47 47 45 52 5f 41 46 54 45 52 2c 20 70 54 61  IGGER_AFTER, pTa
57f0: 62 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64 2c 20  b, regOldRowid, 
5800: 6f 6e 45 72 72 6f 72 2c 20 6c 61 62 65 6c 43 6f  onError, labelCo
5810: 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 2f 2a 20 52  ntinue);..  /* R
5820: 65 70 65 61 74 20 74 68 65 20 61 62 6f 76 65 20  epeat the above 
5830: 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 72 65  with the next re
5840: 63 6f 72 64 20 74 6f 20 62 65 20 75 70 64 61 74  cord to be updat
5850: 65 64 2c 20 75 6e 74 69 6c 0a 20 20 2a 2a 20 61  ed, until.  ** a
5860: 6c 6c 20 72 65 63 6f 72 64 20 73 65 6c 65 63 74  ll record select
5870: 65 64 20 62 79 20 74 68 65 20 57 48 45 52 45 20  ed by the WHERE 
5880: 63 6c 61 75 73 65 20 68 61 76 65 20 62 65 65 6e  clause have been
5890: 20 75 70 64 61 74 65 64 2e 0a 20 20 2a 2f 0a 20   updated..  */. 
58a0: 20 69 66 28 20 6f 6b 4f 6e 65 50 61 73 73 20 29   if( okOnePass )
58b0: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 68 69 6e 67  {.    /* Nothing
58c0: 20 74 6f 20 64 6f 20 61 74 20 65 6e 64 2d 6f 66   to do at end-of
58d0: 2d 6c 6f 6f 70 20 66 6f 72 20 61 20 73 69 6e 67  -loop for a sing
58e0: 6c 65 2d 70 61 73 73 20 2a 2f 0a 20 20 7d 65 6c  le-pass */.  }el
58f0: 73 65 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20  se if( pPk ){.  
5900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
5910: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
5920: 65 6c 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  elContinue);.   
5930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5940: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
5950: 45 70 68 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  Eph, addrTop);. 
5960: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
5970: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5980: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
5990: 65 6c 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d  elContinue);.  }
59a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
59b0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
59c0: 62 65 6c 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a  belBreak);..  /*
59d0: 20 43 6c 6f 73 65 20 61 6c 6c 20 74 61 62 6c 65   Close all table
59e0: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  s */.  for(i=0, 
59f0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
5a00: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
5a10: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
5a20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 52 65  .    assert( aRe
5a30: 67 49 64 78 20 29 3b 0a 20 20 20 20 69 66 28 20  gIdx );.    if( 
5a40: 61 54 6f 4f 70 65 6e 5b 69 2b 31 5d 20 29 7b 0a  aToOpen[i+1] ){.
5a50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5a60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
5a70: 6f 73 65 2c 20 69 49 64 78 43 75 72 2b 69 2c 20  ose, iIdxCur+i, 
5a80: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
5a90: 69 66 28 20 69 44 61 74 61 43 75 72 3c 69 49 64  if( iDataCur<iId
5aa0: 78 43 75 72 20 29 20 73 71 6c 69 74 65 33 56 64  xCur ) sqlite3Vd
5ab0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
5ac0: 6c 6f 73 65 2c 20 69 44 61 74 61 43 75 72 2c 20  lose, iDataCur, 
5ad0: 30 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  0);..  /* Update
5ae0: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
5af0: 65 6e 63 65 20 74 61 62 6c 65 20 62 79 20 73 74  ence table by st
5b00: 6f 72 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  oring the conten
5b10: 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6d 61  t of the.  ** ma
5b20: 78 69 6d 75 6d 20 72 6f 77 69 64 20 63 6f 75 6e  ximum rowid coun
5b30: 74 65 72 20 76 61 6c 75 65 73 20 72 65 63 6f 72  ter values recor
5b40: 64 65 64 20 77 68 69 6c 65 20 69 6e 73 65 72 74  ded while insert
5b50: 69 6e 67 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 75  ing into.  ** au
5b60: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 74 61 62 6c  toincrement tabl
5b70: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
5b80: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
5b90: 20 26 26 20 70 50 61 72 73 65 2d 3e 70 54 72 69   && pParse->pTri
5ba0: 67 67 65 72 54 61 62 3d 3d 30 20 29 7b 0a 20 20  ggerTab==0 ){.  
5bb0: 20 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63    sqlite3Autoinc
5bc0: 72 65 6d 65 6e 74 45 6e 64 28 70 50 61 72 73 65  rementEnd(pParse
5bd0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  );.  }..  /*.  *
5be0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
5bf0: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
5c00: 20 77 65 72 65 20 63 68 61 6e 67 65 64 2e 20 49   were changed. I
5c10: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
5c20: 73 20 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 69  s .  ** generati
5c30: 6e 67 20 63 6f 64 65 20 62 65 63 61 75 73 65 20  ng code because 
5c40: 6f 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  of a call to sql
5c50: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
5c60: 29 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 69  ), do not.  ** i
5c70: 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61  nvoke the callba
5c80: 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  ck function..  *
5c90: 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  /.  if( (db->fla
5ca0: 67 73 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52  gs&SQLITE_CountR
5cb0: 6f 77 73 29 20 26 26 20 21 70 50 61 72 73 65 2d  ows) && !pParse-
5cc0: 3e 70 54 72 69 67 67 65 72 54 61 62 20 26 26 20  >pTriggerTab && 
5cd0: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
5ce0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5cf0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
5d00: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 6f 77  esultRow, regRow
5d10: 43 6f 75 6e 74 2c 20 31 29 3b 0a 20 20 20 20 73  Count, 1);.    s
5d20: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
5d30: 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20  Cols(v, 1);.    
5d40: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
5d50: 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e  lName(v, 0, COLN
5d60: 41 4d 45 5f 4e 41 4d 45 2c 20 22 72 6f 77 73 20  AME_NAME, "rows 
5d70: 75 70 64 61 74 65 64 22 2c 20 53 51 4c 49 54 45  updated", SQLITE
5d80: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 0a 75  _STATIC);.  }..u
5d90: 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3a 0a 20  pdate_cleanup:. 
5da0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74   sqlite3AuthCont
5db0: 65 78 74 50 6f 70 28 26 73 43 6f 6e 74 65 78 74  extPop(&sContext
5dc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
5dd0: 65 65 28 64 62 2c 20 61 58 52 65 66 29 3b 20 2f  ee(db, aXRef); /
5de0: 2a 20 41 6c 73 6f 20 66 72 65 65 73 20 61 52 65  * Also frees aRe
5df0: 67 49 64 78 5b 5d 20 61 6e 64 20 61 54 6f 4f 70  gIdx[] and aToOp
5e00: 65 6e 5b 5d 20 2a 2f 0a 20 20 73 71 6c 69 74 65  en[] */.  sqlite
5e10: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
5e20: 62 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  b, pTabList);.  
5e30: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
5e40: 65 6c 65 74 65 28 64 62 2c 20 70 43 68 61 6e 67  elete(db, pChang
5e50: 65 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  es);.  sqlite3Ex
5e60: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 68  prDelete(db, pWh
5e70: 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ere);.  return;.
5e80: 7d 0a 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 22  }./* Make sure "
5e90: 69 73 56 69 65 77 22 20 61 6e 64 20 6f 74 68 65  isView" and othe
5ea0: 72 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64  r macros defined
5eb0: 20 61 62 6f 76 65 20 61 72 65 20 75 6e 64 65 66   above are undef
5ec0: 69 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 0a  ined. Otherwise.
5ed0: 2a 2a 20 74 68 65 6c 79 20 6d 61 79 20 69 6e 74  ** thely may int
5ee0: 65 72 66 65 72 65 20 77 69 74 68 20 63 6f 6d 70  erfere with comp
5ef0: 69 6c 61 74 69 6f 6e 20 6f 66 20 6f 74 68 65 72  ilation of other
5f00: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68   functions in th
5f10: 69 73 20 66 69 6c 65 0a 2a 2a 20 28 6f 72 20 69  is file.** (or i
5f20: 6e 20 61 6e 6f 74 68 65 72 20 66 69 6c 65 2c 20  n another file, 
5f30: 69 66 20 74 68 69 73 20 66 69 6c 65 20 62 65 63  if this file bec
5f40: 6f 6d 65 73 20 70 61 72 74 20 6f 66 20 74 68 65  omes part of the
5f50: 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 29 2e 20   amalgamation). 
5f60: 20 2a 2f 0a 23 69 66 64 65 66 20 69 73 56 69 65   */.#ifdef isVie
5f70: 77 0a 20 23 75 6e 64 65 66 20 69 73 56 69 65 77  w. #undef isView
5f80: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 70  .#endif.#ifdef p
5f90: 54 72 69 67 67 65 72 0a 20 23 75 6e 64 65 66 20  Trigger. #undef 
5fa0: 70 54 72 69 67 67 65 72 0a 23 65 6e 64 69 66 0a  pTrigger.#endif.
5fb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5fc0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5fd0: 45 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  E./*.** Generate
5fe0: 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 55 50 44   code for an UPD
5ff0: 41 54 45 20 6f 66 20 61 20 76 69 72 74 75 61 6c  ATE of a virtual
6000: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
6010: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 68  e strategy is th
6020: 61 74 20 77 65 20 63 72 65 61 74 65 20 61 6e 20  at we create an 
6030: 65 70 68 65 6d 65 72 69 61 6c 20 74 61 62 6c 65  ephemerial table
6040: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
6050: 2a 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74  * for each row t
6060: 6f 20 62 65 20 63 68 61 6e 67 65 64 3a 0a 2a 2a  o be changed:.**
6070: 0a 2a 2a 20 20 20 28 41 29 20 20 54 68 65 20 6f  .**   (A)  The o
6080: 72 69 67 69 6e 61 6c 20 72 6f 77 69 64 20 6f 66  riginal rowid of
6090: 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 20 20   that row..**   
60a0: 28 42 29 20 20 54 68 65 20 72 65 76 69 73 65 64  (B)  The revised
60b0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 72   rowid for the r
60c0: 6f 77 2e 20 28 6e 6f 74 65 31 29 0a 2a 2a 20 20  ow. (note1).**  
60d0: 20 28 43 29 20 20 54 68 65 20 63 6f 6e 74 65 6e   (C)  The conten
60e0: 74 20 6f 66 20 65 76 65 72 79 20 63 6f 6c 75 6d  t of every colum
60f0: 6e 20 69 6e 20 74 68 65 20 72 6f 77 2e 0a 2a 2a  n in the row..**
6100: 0a 2a 2a 20 54 68 65 6e 20 77 65 20 6c 6f 6f 70  .** Then we loop
6110: 20 6f 76 65 72 20 74 68 69 73 20 65 70 68 65 6d   over this ephem
6120: 65 72 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 66  eral table and f
6130: 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 0a 2a  or each row in.*
6140: 2a 20 74 68 65 20 65 70 68 65 72 6d 65 72 61 6c  * the ephermeral
6150: 20 74 61 62 6c 65 20 63 61 6c 6c 20 56 55 70 64   table call VUpd
6160: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ate..**.** When 
6170: 66 69 6e 69 73 68 65 64 2c 20 64 72 6f 70 20 74  finished, drop t
6180: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
6190: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 6e 6f 74 65 31  le..**.** (note1
61a0: 29 20 41 63 74 75 61 6c 6c 79 2c 20 69 66 20 77  ) Actually, if w
61b0: 65 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63  e know in advanc
61c0: 65 20 74 68 61 74 20 28 41 29 20 69 73 20 61 6c  e that (A) is al
61d0: 77 61 79 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a  ways the same.**
61e0: 20 61 73 20 28 42 29 20 77 65 20 6f 6e 6c 79 20   as (B) we only 
61f0: 73 74 6f 72 65 20 28 41 29 2c 20 74 68 65 6e 20  store (A), then 
6200: 64 75 70 6c 69 63 61 74 65 20 28 41 29 20 77 68  duplicate (A) wh
6210: 65 6e 20 70 75 6c 6c 69 6e 67 0a 2a 2a 20 69 74  en pulling.** it
6220: 20 6f 75 74 20 6f 66 20 74 68 65 20 65 70 68 65   out of the ephe
6230: 6d 65 72 61 6c 20 74 61 62 6c 65 20 62 65 66 6f  meral table befo
6240: 72 65 20 63 61 6c 6c 69 6e 67 20 56 55 70 64 61  re calling VUpda
6250: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
6260: 69 64 20 75 70 64 61 74 65 56 69 72 74 75 61 6c  id updateVirtual
6270: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
6280: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
6290: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
62a0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
62b0: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f  t *pSrc,       /
62c0: 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 74 61  * The virtual ta
62d0: 62 6c 65 20 74 6f 20 62 65 20 6d 6f 64 69 66 69  ble to be modifi
62e0: 65 64 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ed */.  Table *p
62f0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab,         /* 
6300: 54 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  The virtual tabl
6310: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
6320: 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f 2a 20 54  *pChanges,  /* T
6330: 68 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 63 68  he columns to ch
6340: 61 6e 67 65 20 69 6e 20 74 68 65 20 55 50 44 41  ange in the UPDA
6350: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
6360: 20 20 45 78 70 72 20 2a 70 52 6f 77 69 64 2c 20    Expr *pRowid, 
6370: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
6380: 73 69 6f 6e 20 75 73 65 64 20 74 6f 20 72 65 63  sion used to rec
6390: 6f 6d 70 75 74 65 20 74 68 65 20 72 6f 77 69 64  ompute the rowid
63a0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 58 52 65 66   */.  int *aXRef
63b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  ,          /* Ma
63c0: 70 70 69 6e 67 20 66 72 6f 6d 20 63 6f 6c 75 6d  pping from colum
63d0: 6e 73 20 6f 66 20 70 54 61 62 20 74 6f 20 65 6e  ns of pTab to en
63e0: 74 72 69 65 73 20 69 6e 20 70 43 68 61 6e 67 65  tries in pChange
63f0: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  s */.  Expr *pWh
6400: 65 72 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 57  ere,        /* W
6410: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
6420: 68 65 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  he UPDATE statem
6430: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ent */.  int onE
6440: 72 72 6f 72 20 20 20 20 20 20 20 20 20 20 2f 2a  rror          /*
6450: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 73 74 72   ON CONFLICT str
6460: 61 74 65 67 79 20 2a 2f 0a 29 7b 0a 20 20 56 64  ategy */.){.  Vd
6470: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
6480: 70 56 64 62 65 3b 20 20 2f 2a 20 56 69 72 74 75  pVdbe;  /* Virtu
6490: 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
64a0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
64b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
64c0: 69 73 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ist = 0;     /* 
64d0: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
64e0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
64f0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
6500: 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 30 3b  ct *pSelect = 0;
6510: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
6520: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
6530: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20  .  Expr *pExpr; 
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6550: 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73  Temporary expres
6560: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 70  sion */.  int ep
6570: 68 65 6d 54 61 62 3b 20 20 20 20 20 20 20 20 20  hemTab;         
6580: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 68 6f 6c      /* Table hol
6590: 64 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ding the result 
65a0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f  of the SELECT */
65b0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
65d0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
65e0: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
6600: 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66  ddress of top of
6610: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69   loop */.  int i
6620: 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
6630: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
6640: 67 69 73 74 65 72 20 69 6e 20 73 65 74 20 70 61  gister in set pa
6650: 73 73 65 64 20 74 6f 20 4f 50 5f 56 55 70 64 61  ssed to OP_VUpda
6660: 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  te */.  sqlite3 
6670: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6680: 3b 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f  ; /* Database co
6690: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
66a0: 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
66b0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
66c0: 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
66d0: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 53 65 6c  db, pTab);.  Sel
66e0: 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 0a 20  ectDest dest;.. 
66f0: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
6700: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
6710: 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6e  nt that will fin
6720: 64 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 73  d the new values
6730: 20 66 6f 72 0a 20 20 2a 2a 20 61 6c 6c 20 75 70   for.  ** all up
6740: 64 61 74 65 64 20 72 6f 77 73 2e 20 0a 20 20 2a  dated rows. .  *
6750: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c  /.  pEList = sql
6760: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
6770: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71  nd(pParse, 0, sq
6780: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
6790: 5f 49 44 2c 20 22 5f 72 6f 77 69 64 5f 22 29 29  _ID, "_rowid_"))
67a0: 3b 0a 20 20 69 66 28 20 70 52 6f 77 69 64 20 29  ;.  if( pRowid )
67b0: 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73  {.    pEList = s
67c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
67d0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 45 4c  pend(pParse, pEL
67e0: 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ist,.           
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6800: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6810: 78 70 72 44 75 70 28 64 62 2c 20 70 52 6f 77 69  xprDup(db, pRowi
6820: 64 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20 61 73  d, 0));.  }.  as
6830: 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65  sert( pTab->iPKe
6840: 79 3c 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  y<0 );.  for(i=0
6850: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
6860: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 58  i++){.    if( aX
6870: 52 65 66 5b 69 5d 3e 3d 30 20 29 7b 0a 20 20 20  Ref[i]>=0 ){.   
6880: 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
6890: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43  e3ExprDup(db, pC
68a0: 68 61 6e 67 65 73 2d 3e 61 5b 61 58 52 65 66 5b  hanges->a[aXRef[
68b0: 69 5d 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  i]].pExpr, 0);. 
68c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
68d0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
68e0: 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 70  xpr(db, TK_ID, p
68f0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
6900: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
6910: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
6920: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
6930: 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 70 45  arse, pEList, pE
6940: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 70 53 65 6c  xpr);.  }.  pSel
6950: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
6960: 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c 20 70  ectNew(pParse, p
6970: 45 4c 69 73 74 2c 20 70 53 72 63 2c 20 70 57 68  EList, pSrc, pWh
6980: 65 72 65 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ere, 0, 0, 0, 0,
6990: 20 30 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a 20   0, 0);.  .  /* 
69a0: 43 72 65 61 74 65 20 74 68 65 20 65 70 68 65 6d  Create the ephem
69b0: 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 74 6f 20  eral table into 
69c0: 77 68 69 63 68 20 74 68 65 20 75 70 64 61 74 65  which the update
69d0: 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 20 20   results will.  
69e0: 2a 2a 20 62 65 20 73 74 6f 72 65 64 2e 0a 20 20  ** be stored..  
69f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  */.  assert( v )
6a00: 3b 0a 20 20 65 70 68 65 6d 54 61 62 20 3d 20 70  ;.  ephemTab = p
6a10: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
6a20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6a30: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
6a40: 65 6d 65 72 61 6c 2c 20 65 70 68 65 6d 54 61 62  emeral, ephemTab
6a50: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 2b 28  , pTab->nCol+1+(
6a60: 70 52 6f 77 69 64 21 3d 30 29 29 3b 0a 20 20 73  pRowid!=0));.  s
6a70: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6a80: 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
6a90: 44 45 52 45 44 29 3b 0a 0a 20 20 2f 2a 20 66 69  DERED);..  /* fi
6aa0: 6c 6c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  ll the ephemeral
6ab0: 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 73   table .  */.  s
6ac0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
6ad0: 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
6ae0: 54 61 62 6c 65 2c 20 65 70 68 65 6d 54 61 62 29  Table, ephemTab)
6af0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
6b00: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
6b10: 74 2c 20 26 64 65 73 74 29 3b 0a 0a 20 20 2f 2a  t, &dest);..  /*
6b20: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
6b30: 6f 20 73 63 61 6e 20 74 68 65 20 65 70 68 65 6d  o scan the ephem
6b40: 65 72 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 63  eral table and c
6b50: 61 6c 6c 20 56 55 70 64 61 74 65 2e 20 2a 2f 0a  all VUpdate. */.
6b60: 20 20 69 52 65 67 20 3d 20 2b 2b 70 50 61 72 73    iReg = ++pPars
6b70: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 70 50 61 72 73  e->nMem;.  pPars
6b80: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 54 61 62 2d  e->nMem += pTab-
6b90: 3e 6e 43 6f 6c 2b 31 3b 0a 20 20 61 64 64 72 20  >nCol+1;.  addr 
6ba0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6bb0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
6bc0: 2c 20 65 70 68 65 6d 54 61 62 2c 20 30 29 3b 0a  , ephemTab, 0);.
6bd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6be0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
6bf0: 2c 20 20 65 70 68 65 6d 54 61 62 2c 20 30 2c 20  ,  ephemTab, 0, 
6c00: 69 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  iReg);.  sqlite3
6c10: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6c20: 5f 43 6f 6c 75 6d 6e 2c 20 65 70 68 65 6d 54 61  _Column, ephemTa
6c30: 62 2c 20 28 70 52 6f 77 69 64 3f 31 3a 30 29 2c  b, (pRowid?1:0),
6c40: 20 69 52 65 67 2b 31 29 3b 0a 20 20 66 6f 72 28   iReg+1);.  for(
6c50: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
6c60: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  l; i++){.    sql
6c70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6c80: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 65 70 68  , OP_Column, eph
6c90: 65 6d 54 61 62 2c 20 69 2b 31 2b 28 70 52 6f 77  emTab, i+1+(pRow
6ca0: 69 64 21 3d 30 29 2c 20 69 52 65 67 2b 32 2b 69  id!=0), iReg+2+i
6cb0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
6cc0: 56 74 61 62 4d 61 6b 65 57 72 69 74 61 62 6c 65  VtabMakeWritable
6cd0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
6ce0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6cf0: 4f 70 34 28 76 2c 20 4f 50 5f 56 55 70 64 61 74  Op4(v, OP_VUpdat
6d00: 65 2c 20 30 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  e, 0, pTab->nCol
6d10: 2b 32 2c 20 69 52 65 67 2c 20 70 56 54 61 62 2c  +2, iReg, pVTab,
6d20: 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 73 71 6c   P4_VTAB);.  sql
6d30: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
6d40: 28 76 2c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  (v, onError==OE_
6d50: 44 65 66 61 75 6c 74 20 3f 20 4f 45 5f 41 62 6f  Default ? OE_Abo
6d60: 72 74 20 3a 20 6f 6e 45 72 72 6f 72 29 3b 0a 20  rt : onError);. 
6d70: 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
6d80: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
6d90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6da0: 20 4f 50 5f 4e 65 78 74 2c 20 65 70 68 65 6d 54   OP_Next, ephemT
6db0: 61 62 2c 20 61 64 64 72 2b 31 29 3b 0a 20 20 73  ab, addr+1);.  s
6dc0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
6dd0: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 73  re(v, addr);.  s
6de0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6df0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 65 70  (v, OP_Close, ep
6e00: 68 65 6d 54 61 62 2c 20 30 29 3b 0a 0a 20 20 2f  hemTab, 0);..  /
6e10: 2a 20 43 6c 65 61 6e 75 70 20 2a 2f 0a 20 20 73  * Cleanup */.  s
6e20: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
6e30: 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
6e40: 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53    .}.#endif /* S
6e50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6e60: 41 4c 54 41 42 4c 45 20 2a 2f 0a                 ALTABLE */.