/ Hex Artifact Content
Login

Artifact b4aa2e8b6bda3b4d917c9427568fe5c85b4a0ea8:


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 2a 0a 2a 2a  tatements..**.**
01e0: 20 24 49 64 3a 20 75 70 64 61 74 65 2e 63 2c 76   $Id: update.c,v
01f0: 20 31 2e 31 35 34 20 32 30 30 38 2f 30 31 2f 30   1.154 2008/01/0
0200: 33 20 31 38 3a 30 33 3a 30 39 20 64 72 68 20 45  3 18:03:09 drh E
0210: 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  xp $.*/.#include
0220: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0230: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0240: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
0250: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
0260: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
0270: 63 20 76 6f 69 64 20 75 70 64 61 74 65 56 69 72  c void updateVir
0280: 74 75 61 6c 54 61 62 6c 65 28 0a 20 20 50 61 72  tualTable(.  Par
0290: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
02a0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
02b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
02c0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
02d0: 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
02e0: 6c 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6d 6f  l table to be mo
02f0: 64 69 66 69 65 64 20 2a 2f 0a 20 20 54 61 62 6c  dified */.  Tabl
0300: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
0310: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
0320: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
0330: 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20  ist *pChanges,  
0340: 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 74  /* The columns t
0350: 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20  o change in the 
0360: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
0370: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 6f 77   */.  Expr *pRow
0380: 69 64 45 78 70 72 2c 20 20 20 20 2f 2a 20 45 78  idExpr,    /* Ex
0390: 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 6f  pression used to
03a0: 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20 72   recompute the r
03b0: 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  owid */.  int *a
03c0: 58 52 65 66 2c 20 20 20 20 20 20 20 20 20 20 2f  XRef,          /
03d0: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 63  * Mapping from c
03e0: 6f 6c 75 6d 6e 73 20 6f 66 20 70 54 61 62 20 74  olumns of pTab t
03f0: 6f 20 65 6e 74 72 69 65 73 20 69 6e 20 70 43 68  o entries in pCh
0400: 61 6e 67 65 73 20 2a 2f 0a 20 20 45 78 70 72 20  anges */.  Expr 
0410: 2a 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  *pWhere         
0420: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
0430: 6f 66 20 74 68 65 20 55 50 44 41 54 45 20 73 74  of the UPDATE st
0440: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 3b 0a 23 65  atement */.);.#e
0450: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
0460: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
0470: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d   */../*.** The m
0480: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
0490: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  ed instruction w
04a0: 61 73 20 61 6e 20 4f 50 5f 43 6f 6c 75 6d 6e 20  as an OP_Column 
04b0: 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a  to retrieve the.
04c0: 2a 2a 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  ** i-th column o
04d0: 66 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68  f table pTab. Th
04e0: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
04f0: 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72  the P4 parameter
0500: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 4f 50 5f 43   of the .** OP_C
0510: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 64 65 66  olumn to the def
0520: 61 75 6c 74 20 76 61 6c 75 65 2c 20 69 66 20 61  ault value, if a
0530: 6e 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ny..**.** The de
0540: 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 61  fault value of a
0550: 20 63 6f 6c 75 6d 6e 20 69 73 20 73 70 65 63 69   column is speci
0560: 66 69 65 64 20 62 79 20 61 20 44 45 46 41 55 4c  fied by a DEFAUL
0570: 54 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  T clause in the 
0580: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  .** column defin
0590: 69 74 69 6f 6e 2e 20 54 68 69 73 20 77 61 73 20  ition. This was 
05a0: 65 69 74 68 65 72 20 73 75 70 70 6c 69 65 64 20  either supplied 
05b0: 62 79 20 74 68 65 20 75 73 65 72 20 77 68 65 6e  by the user when
05c0: 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 77 61   the table.** wa
05d0: 73 20 63 72 65 61 74 65 64 2c 20 6f 72 20 61 64  s created, or ad
05e0: 64 65 64 20 6c 61 74 65 72 20 74 6f 20 74 68 65  ded later to the
05f0: 20 74 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f   table definitio
0600: 6e 20 62 79 20 61 6e 20 41 4c 54 45 52 20 54 41  n by an ALTER TA
0610: 42 4c 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20  BLE.** command. 
0620: 49 66 20 74 68 65 20 6c 61 74 74 65 72 2c 20 74  If the latter, t
0630: 68 65 6e 20 74 68 65 20 72 6f 77 2d 72 65 63 6f  hen the row-reco
0640: 72 64 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  rds in the table
0650: 20 62 74 72 65 65 20 6f 6e 20 64 69 73 6b 0a 2a   btree on disk.*
0660: 2a 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69  * may not contai
0670: 6e 20 61 20 76 61 6c 75 65 20 66 6f 72 20 74 68  n a value for th
0680: 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65  e column and the
0690: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2c 20   default value, 
06a0: 74 61 6b 65 6e 0a 2a 2a 20 66 72 6f 6d 20 74 68  taken.** from th
06b0: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 6f  e P4 parameter o
06c0: 66 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  f the OP_Column 
06d0: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 69 73 20  instruction, is 
06e0: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
06f0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 72 6d  ..** If the form
0700: 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 72 6f 77  er, then all row
0710: 2d 72 65 63 6f 72 64 73 20 61 72 65 20 67 75 61  -records are gua
0720: 72 61 6e 74 65 65 64 20 74 6f 20 69 6e 63 6c 75  ranteed to inclu
0730: 64 65 20 61 20 76 61 6c 75 65 0a 2a 2a 20 66 6f  de a value.** fo
0740: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  r the column and
0750: 20 74 68 65 20 50 34 20 76 61 6c 75 65 20 69 73   the P4 value is
0760: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 2a   not required..*
0770: 2a 0a 2a 2a 20 43 6f 6c 75 6d 6e 20 64 65 66 69  *.** Column defi
0780: 6e 69 74 69 6f 6e 73 20 63 72 65 61 74 65 64 20  nitions created 
0790: 62 79 20 61 6e 20 41 4c 54 45 52 20 54 41 42 4c  by an ALTER TABL
07a0: 45 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 6f 6e  E command may on
07b0: 6c 79 20 68 61 76 65 20 0a 2a 2a 20 6c 69 74 65  ly have .** lite
07c0: 72 61 6c 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ral default valu
07d0: 65 73 20 73 70 65 63 69 66 69 65 64 3a 20 61 20  es specified: a 
07e0: 6e 75 6d 62 65 72 2c 20 6e 75 6c 6c 20 6f 72 20  number, null or 
07f0: 61 20 73 74 72 69 6e 67 2e 20 28 49 66 20 61 20  a string. (If a 
0800: 6d 6f 72 65 0a 2a 2a 20 63 6f 6d 70 6c 69 63 61  more.** complica
0810: 74 65 64 20 64 65 66 61 75 6c 74 20 65 78 70 72  ted default expr
0820: 65 73 73 69 6f 6e 20 76 61 6c 75 65 20 77 61 73  ession value was
0830: 20 70 72 6f 76 69 64 65 64 2c 20 69 74 20 69 73   provided, it is
0840: 20 65 76 61 6c 75 61 74 65 64 20 0a 2a 2a 20 77   evaluated .** w
0850: 68 65 6e 20 74 68 65 20 41 4c 54 45 52 20 54 41  hen the ALTER TA
0860: 42 4c 45 20 69 73 20 65 78 65 63 75 74 65 64 20  BLE is executed 
0870: 61 6e 64 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c  and one of the l
0880: 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20 77 72  iteral values wr
0890: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68  itten.** into th
08a0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
08b0: 74 61 62 6c 65 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  table.).**.** Th
08c0: 65 72 65 66 6f 72 65 2c 20 74 68 65 20 50 34 20  erefore, the P4 
08d0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 6c  parameter is onl
08e0: 79 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  y required if th
08f0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
0900: 66 6f 72 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d  for.** the colum
0910: 6e 20 69 73 20 61 20 6c 69 74 65 72 61 6c 20 6e  n is a literal n
0920: 75 6d 62 65 72 2c 20 73 74 72 69 6e 67 20 6f 72  umber, string or
0930: 20 6e 75 6c 6c 2e 20 54 68 65 20 73 71 6c 69 74   null. The sqlit
0940: 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
0950: 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  ).** function is
0960: 20 63 61 70 61 62 6c 65 20 6f 66 20 74 72 61 6e   capable of tran
0970: 73 66 6f 72 6d 69 6e 67 20 74 68 65 73 65 20 74  sforming these t
0980: 79 70 65 73 20 6f 66 20 65 78 70 72 65 73 73 69  ypes of expressi
0990: 6f 6e 73 20 69 6e 74 6f 0a 2a 2a 20 73 71 6c 69  ons into.** sqli
09a0: 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74  te3_value object
09b0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
09c0: 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28  e3ColumnDefault(
09d0: 56 64 62 65 20 2a 76 2c 20 54 61 62 6c 65 20 2a  Vdbe *v, Table *
09e0: 70 54 61 62 2c 20 69 6e 74 20 69 29 7b 0a 20 20  pTab, int i){.  
09f0: 69 66 28 20 70 54 61 62 20 26 26 20 21 70 54 61  if( pTab && !pTa
0a00: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
0a10: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
0a20: 2a 70 56 61 6c 75 65 3b 0a 20 20 20 20 75 38 20  *pValue;.    u8 
0a30: 65 6e 63 20 3d 20 45 4e 43 28 73 71 6c 69 74 65  enc = ENC(sqlite
0a40: 33 56 64 62 65 44 62 28 76 29 29 3b 0a 20 20 20  3VdbeDb(v));.   
0a50: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20   Column *pCol = 
0a60: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a  &pTab->aCol[i];.
0a70: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
0a80: 28 76 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  (v, "%s.%s", pTa
0a90: 62 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f 6c 2d 3e  b->zName, pCol->
0aa0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 61 73 73  zName));.    ass
0ab0: 65 72 74 28 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  ert( i<pTab->nCo
0ac0: 6c 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  l );.    sqlite3
0ad0: 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 73 71  ValueFromExpr(sq
0ae0: 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
0af0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 2c 20 65 6e 63  pCol->pDflt, enc
0b00: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
0b20: 2d 3e 61 66 66 69 6e 69 74 79 2c 20 26 70 56 61  ->affinity, &pVa
0b30: 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 70 56  lue);.    if( pV
0b40: 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 73 71  alue ){.      sq
0b50: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0b60: 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20  4(v, -1, (const 
0b70: 63 68 61 72 20 2a 29 70 56 61 6c 75 65 2c 20 50  char *)pValue, P
0b80: 34 5f 4d 45 4d 29 3b 0a 20 20 20 20 7d 0a 20 20  4_MEM);.    }.  
0b90: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  }.}../*.** Proce
0ba0: 73 73 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  ss an UPDATE sta
0bb0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
0bc0: 55 50 44 41 54 45 20 4f 52 20 49 47 4e 4f 52 45  UPDATE OR IGNORE
0bd0: 20 74 61 62 6c 65 5f 77 78 79 7a 20 53 45 54 20   table_wxyz SET 
0be0: 61 3d 62 2c 20 63 3d 64 20 57 48 45 52 45 20 65  a=b, c=d WHERE e
0bf0: 3c 35 20 41 4e 44 20 66 20 4e 4f 54 20 4e 55 4c  <5 AND f NOT NUL
0c00: 4c 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 5c  L;.**          \
0c10: 5f 5f 5f 5f 5f 5f 5f 2f 20 5c 5f 5f 5f 5f 5f 5f  _______/ \______
0c20: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 2f  __/     \______/
0c30: 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
0c40: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 20 20 20 20 20  ________/.*     
0c50: 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 20         onError  
0c60: 20 70 54 61 62 4c 69 73 74 20 20 20 20 20 20 70   pTabList      p
0c70: 43 68 61 6e 67 65 73 20 20 20 20 20 20 20 20 20  Changes         
0c80: 20 20 20 20 70 57 68 65 72 65 0a 2a 2f 0a 76 6f      pWhere.*/.vo
0c90: 69 64 20 73 71 6c 69 74 65 33 55 70 64 61 74 65  id sqlite3Update
0ca0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0cb0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
0cc0: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
0cd0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
0ce0: 54 61 62 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20  TabList,     /* 
0cf0: 54 68 65 20 74 61 62 6c 65 20 69 6e 20 77 68 69  The table in whi
0d00: 63 68 20 77 65 20 73 68 6f 75 6c 64 20 63 68 61  ch we should cha
0d10: 6e 67 65 20 74 68 69 6e 67 73 20 2a 2f 0a 20 20  nge things */.  
0d20: 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67  ExprList *pChang
0d30: 65 73 2c 20 20 20 20 2f 2a 20 54 68 69 6e 67 73  es,    /* Things
0d40: 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20 2a   to be changed *
0d50: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
0d60: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
0d70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
0d80: 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f 0a   May be null */.
0d90: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20 20    int onError   
0da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
0db0: 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74 72  to handle constr
0dc0: 61 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a 29  aint errors */.)
0dd0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
0de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
0df0: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
0e00: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
0e10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
0e20: 61 62 6c 65 20 74 6f 20 62 65 20 75 70 64 61 74  able to be updat
0e30: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
0e40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
0e50: 2a 20 56 44 42 45 20 69 6e 73 74 72 75 63 74 69  * VDBE instructi
0e60: 6f 6e 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  on address of th
0e70: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6c  e start of the l
0e80: 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  oop */.  WhereIn
0e90: 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
0ea0: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
0eb0: 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20 63  bout the WHERE c
0ec0: 6c 61 75 73 65 20 2a 2f 0a 20 20 56 64 62 65 20  lause */.  Vdbe 
0ed0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
0ee0: 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
0ef0: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0f00: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
0f10: 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x;           /* 
0f20: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
0f30: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
0f40: 74 20 6e 49 64 78 3b 20 20 20 20 20 20 20 20 20  t nIdx;         
0f50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0f60: 66 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 6e  f indices that n
0f70: 65 65 64 20 75 70 64 61 74 69 6e 67 20 2a 2f 0a  eed updating */.
0f80: 20 20 69 6e 74 20 6e 49 64 78 54 6f 74 61 6c 3b    int nIdxTotal;
0f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
0fa0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 69  l number of indi
0fb0: 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ces */.  int iCu
0fc0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
0fd0: 2f 2a 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e  /* VDBE Cursor n
0fe0: 75 6d 62 65 72 20 6f 66 20 70 54 61 62 20 2a 2f  umber of pTab */
0ff0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
1000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1010: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
1020: 75 72 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ure */.  Index *
1030: 2a 61 70 49 64 78 20 3d 20 30 3b 20 20 20 20 20  *apIdx = 0;     
1040: 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20 69  /* An array of i
1050: 6e 64 69 63 65 73 20 74 68 61 74 20 6e 65 65 64  ndices that need
1060: 20 75 70 64 61 74 69 6e 67 20 74 6f 6f 20 2a 2f   updating too */
1070: 0a 20 20 63 68 61 72 20 2a 61 49 64 78 55 73 65  .  char *aIdxUse
1080: 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 61 49 64  d = 0;    /* aId
1090: 78 55 73 65 64 5b 69 5d 3d 3d 31 20 69 66 20 74  xUsed[i]==1 if t
10a0: 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 69 73  he i-th index is
10b0: 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a   used */.  int *
10c0: 61 58 52 65 66 20 3d 20 30 3b 20 20 20 20 20 20  aXRef = 0;      
10d0: 20 20 2f 2a 20 61 58 52 65 66 5b 69 5d 20 69 73    /* aXRef[i] is
10e0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 43   the index in pC
10f0: 68 61 6e 67 65 73 2d 3e 61 5b 5d 20 6f 66 20 74  hanges->a[] of t
1100: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
1110: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
1120: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  n expression for
1130: 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   the i-th column
1140: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   of the table.. 
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1160: 20 20 20 20 20 20 20 20 2a 2a 20 61 58 52 65 66          ** aXRef
1170: 5b 69 5d 3d 3d 2d 31 20 69 66 20 74 68 65 20 69  [i]==-1 if the i
1180: 2d 74 68 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  -th column is no
1190: 74 20 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 20 20  t changed. */.  
11a0: 69 6e 74 20 63 68 6e 67 52 6f 77 69 64 3b 20 20  int chngRowid;  
11b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
11c0: 66 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  f the record num
11d0: 62 65 72 20 69 73 20 62 65 69 6e 67 20 63 68 61  ber is being cha
11e0: 6e 67 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nged */.  Expr *
11f0: 70 52 6f 77 69 64 45 78 70 72 20 3d 20 30 3b 20  pRowidExpr = 0; 
1200: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 64   /* Expression d
1210: 65 66 69 6e 69 6e 67 20 74 68 65 20 6e 65 77 20  efining the new 
1220: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a 2f  record number */
1230: 0a 20 20 69 6e 74 20 6f 70 65 6e 41 6c 6c 20 3d  .  int openAll =
1240: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75   0;       /* Tru
1250: 65 20 69 66 20 61 6c 6c 20 69 6e 64 69 63 65 73  e if all indices
1260: 20 6e 65 65 64 20 74 6f 20 62 65 20 6f 70 65 6e   need to be open
1270: 65 64 20 2a 2f 0a 20 20 41 75 74 68 43 6f 6e 74  ed */.  AuthCont
1280: 65 78 74 20 73 43 6f 6e 74 65 78 74 3b 20 20 2f  ext sContext;  /
1290: 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61 74  * The authorizat
12a0: 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ion context */. 
12b0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
12c0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  ;       /* The n
12d0: 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 72  ame-context to r
12e0: 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f  esolve expressio
12f0: 6e 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ns in */.  int i
1300: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1310: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
1320: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
1330: 6c 65 20 62 65 69 6e 67 20 75 70 64 61 74 65 64  le being updated
1340: 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 43 6e 74   */.  int memCnt
1350: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
1360: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 75 73 65 64  Memory cell used
1370: 20 66 6f 72 20 63 6f 75 6e 74 69 6e 67 20 72 6f   for counting ro
1380: 77 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ws changed */.  
1390: 69 6e 74 20 6d 65 6d 31 3b 20 20 20 20 20 20 2f  int mem1;      /
13a0: 2a 20 4d 65 6d 6f 72 79 20 61 64 64 72 65 73 73  * Memory address
13b0: 20 73 74 6f 72 69 6e 67 20 74 68 65 20 72 6f 77   storing the row
13c0: 69 64 20 66 6f 72 20 6e 65 78 74 20 72 6f 77 20  id for next row 
13d0: 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 0a 23 69  to update */..#i
13e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13f0: 54 5f 54 52 49 47 47 45 52 0a 20 20 69 6e 74 20  T_TRIGGER.  int 
1400: 69 73 56 69 65 77 3b 20 20 20 20 20 20 20 20 20  isView;         
1410: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 79 69           /* Tryi
1420: 6e 67 20 74 6f 20 75 70 64 61 74 65 20 61 20 76  ng to update a v
1430: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 74 72 69  iew */.  int tri
1440: 67 67 65 72 73 5f 65 78 69 73 74 20 3d 20 30 3b  ggers_exist = 0;
1450: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1460: 20 61 6e 79 20 72 6f 77 20 74 72 69 67 67 65 72   any row trigger
1470: 73 20 65 78 69 73 74 20 2a 2f 0a 23 65 6e 64 69  s exist */.#endi
1480: 66 0a 20 20 69 6e 74 20 69 42 65 67 69 6e 41 66  f.  int iBeginAf
1490: 74 65 72 54 72 69 67 67 65 72 3b 20 20 20 20 20  terTrigger;     
14a0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
14b0: 66 74 65 72 20 74 72 69 67 67 65 72 20 70 72 6f  fter trigger pro
14c0: 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 45  gram */.  int iE
14d0: 6e 64 41 66 74 65 72 54 72 69 67 67 65 72 3b 20  ndAfterTrigger; 
14e0: 20 20 20 20 20 20 20 2f 2a 20 45 78 69 74 20 6f         /* Exit o
14f0: 66 20 61 66 74 65 72 20 74 72 69 67 67 65 72 20  f after trigger 
1500: 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74  program */.  int
1510: 20 69 42 65 67 69 6e 42 65 66 6f 72 65 54 72 69   iBeginBeforeTri
1520: 67 67 65 72 3b 20 20 20 20 20 2f 2a 20 41 64 64  gger;     /* Add
1530: 72 65 73 73 20 6f 66 20 62 65 66 6f 72 65 20 74  ress of before t
1540: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 2a  rigger program *
1550: 2f 0a 20 20 69 6e 74 20 69 45 6e 64 42 65 66 6f  /.  int iEndBefo
1560: 72 65 54 72 69 67 67 65 72 3b 20 20 20 20 20 20  reTrigger;      
1570: 20 2f 2a 20 45 78 69 74 20 6f 66 20 62 65 66 6f   /* Exit of befo
1580: 72 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  re trigger progr
1590: 61 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 6c 64 5f  am */.  u32 old_
15a0: 63 6f 6c 5f 6d 61 73 6b 20 3d 20 30 3b 20 20 20  col_mask = 0;   
15b0: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
15c0: 4f 4c 44 2e 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e  OLD.* columns in
15d0: 20 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 6e 65   use */.  u32 ne
15e0: 77 5f 63 6f 6c 5f 6d 61 73 6b 20 3d 20 30 3b 20  w_col_mask = 0; 
15f0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1600: 66 20 4e 45 57 2e 2a 20 63 6f 6c 75 6d 6e 73 20  f NEW.* columns 
1610: 69 6e 20 75 73 65 20 2a 2f 0a 0a 20 20 69 6e 74  in use */..  int
1620: 20 6e 65 77 49 64 78 20 20 20 20 20 20 3d 20 2d   newIdx      = -
1630: 31 3b 20 20 2f 2a 20 69 6e 64 65 78 20 6f 66 20  1;  /* index of 
1640: 74 72 69 67 67 65 72 20 22 6e 65 77 22 20 74 65  trigger "new" te
1650: 6d 70 20 74 61 62 6c 65 20 20 20 20 20 20 20 2a  mp table       *
1660: 2f 0a 20 20 69 6e 74 20 6f 6c 64 49 64 78 20 20  /.  int oldIdx  
1670: 20 20 20 20 3d 20 2d 31 3b 20 20 2f 2a 20 69 6e      = -1;  /* in
1680: 64 65 78 20 6f 66 20 74 72 69 67 67 65 72 20 22  dex of trigger "
1690: 6f 6c 64 22 20 74 65 6d 70 20 74 61 62 6c 65 20  old" temp table 
16a0: 20 20 20 20 20 20 2a 2f 0a 0a 20 20 73 43 6f 6e        */..  sCon
16b0: 74 65 78 74 2e 70 50 61 72 73 65 20 3d 20 30 3b  text.pParse = 0;
16c0: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
16d0: 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  db;.  if( pParse
16e0: 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
16f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1700: 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c    goto update_cl
1710: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73  eanup;.  }.  ass
1720: 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e  ert( pTabList->n
1730: 53 72 63 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  Src==1 );..  /* 
1740: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
1750: 20 77 68 69 63 68 20 77 65 20 77 61 6e 74 20 74   which we want t
1760: 6f 20 75 70 64 61 74 65 2e 20 0a 20 20 2a 2f 0a  o update. .  */.
1770: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
1780: 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
1790: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
17a0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
17b0: 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65   goto update_cle
17c0: 61 6e 75 70 3b 0a 20 20 69 44 62 20 3d 20 73 71  anup;.  iDb = sq
17d0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
17e0: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
17f0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  Tab->pSchema);..
1800: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1810: 69 66 20 77 65 20 68 61 76 65 20 61 6e 79 20 74  if we have any t
1820: 72 69 67 67 65 72 73 20 61 6e 64 20 69 66 20 74  riggers and if t
1830: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 0a 20  he table being. 
1840: 20 2a 2a 20 75 70 64 61 74 65 64 20 69 73 20 61   ** updated is a
1850: 20 76 69 65 77 0a 20 20 2a 2f 0a 23 69 66 6e 64   view.  */.#ifnd
1860: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1870: 52 49 47 47 45 52 0a 20 20 74 72 69 67 67 65 72  RIGGER.  trigger
1880: 73 5f 65 78 69 73 74 20 3d 20 73 71 6c 69 74 65  s_exist = sqlite
1890: 33 54 72 69 67 67 65 72 73 45 78 69 73 74 28 70  3TriggersExist(p
18a0: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f  Parse, pTab, TK_
18b0: 55 50 44 41 54 45 2c 20 70 43 68 61 6e 67 65 73  UPDATE, pChanges
18c0: 29 3b 0a 20 20 69 73 56 69 65 77 20 3d 20 70 54  );.  isView = pT
18d0: 61 62 2d 3e 70 53 65 6c 65 63 74 21 3d 30 3b 0a  ab->pSelect!=0;.
18e0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 74  #else.# define t
18f0: 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 30 0a  riggers_exist 0.
1900: 23 20 64 65 66 69 6e 65 20 69 73 56 69 65 77 20  # define isView 
1910: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
1920: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1930: 0a 23 20 75 6e 64 65 66 20 69 73 56 69 65 77 0a  .# undef isView.
1940: 23 20 64 65 66 69 6e 65 20 69 73 56 69 65 77 20  # define isView 
1950: 30 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  0.#endif..  if( 
1960: 73 71 6c 69 74 65 33 49 73 52 65 61 64 4f 6e 6c  sqlite3IsReadOnl
1970: 79 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  y(pParse, pTab, 
1980: 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 29 20  triggers_exist) 
1990: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61  ){.    goto upda
19a0: 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  te_cleanup;.  }.
19b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
19c0: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
19d0: 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
19e0: 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65  .    goto update
19f0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
1a00: 61 58 52 65 66 20 3d 20 73 71 6c 69 74 65 33 44  aXRef = sqlite3D
1a10: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
1a20: 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20 70 54 61  izeof(int) * pTa
1a30: 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 69 66 28  b->nCol );.  if(
1a40: 20 61 58 52 65 66 3d 3d 30 20 29 20 67 6f 74 6f   aXRef==0 ) goto
1a50: 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b   update_cleanup;
1a60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1a70: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 20 61  ab->nCol; i++) a
1a80: 58 52 65 66 5b 69 5d 20 3d 20 2d 31 3b 0a 0a 20  XRef[i] = -1;.. 
1a90: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1aa0: 20 46 4f 52 20 45 41 43 48 20 52 4f 57 20 74 72   FOR EACH ROW tr
1ab0: 69 67 67 65 72 73 2c 20 61 6c 6c 6f 63 61 74 65  iggers, allocate
1ac0: 20 63 75 72 73 6f 72 73 20 66 6f 72 20 74 68 65   cursors for the
1ad0: 0a 20 20 2a 2a 20 73 70 65 63 69 61 6c 20 4f 4c  .  ** special OL
1ae0: 44 20 61 6e 64 20 4e 45 57 20 74 61 62 6c 65 73  D and NEW tables
1af0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74 72 69 67  .  */.  if( trig
1b00: 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20  gers_exist ){.  
1b10: 20 20 6e 65 77 49 64 78 20 3d 20 70 50 61 72 73    newIdx = pPars
1b20: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 6f  e->nTab++;.    o
1b30: 6c 64 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ldIdx = pParse->
1b40: 6e 54 61 62 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  nTab++;.  }..  /
1b50: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 63 75 72  * Allocate a cur
1b60: 73 6f 72 73 20 66 6f 72 20 74 68 65 20 6d 61 69  sors for the mai
1b70: 6e 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  n database table
1b80: 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6e 64   and for all ind
1b90: 69 63 65 73 2e 0a 20 20 2a 2a 20 54 68 65 20 69  ices..  ** The i
1ba0: 6e 64 65 78 20 63 75 72 73 6f 72 73 20 6d 69 67  ndex cursors mig
1bb0: 68 74 20 6e 6f 74 20 62 65 20 75 73 65 64 2c 20  ht not be used, 
1bc0: 62 75 74 20 69 66 20 74 68 65 79 20 61 72 65 20  but if they are 
1bd0: 75 73 65 64 20 74 68 65 79 0a 20 20 2a 2a 20 6e  used they.  ** n
1be0: 65 65 64 20 74 6f 20 6f 63 63 75 72 20 72 69 67  eed to occur rig
1bf0: 68 74 20 61 66 74 65 72 20 74 68 65 20 64 61 74  ht after the dat
1c00: 61 62 61 73 65 20 63 75 72 73 6f 72 2e 20 20 53  abase cursor.  S
1c10: 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 0a 20  o go ahead and. 
1c20: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 65 6e 6f   ** allocate eno
1c30: 75 67 68 20 73 70 61 63 65 2c 20 6a 75 73 74 20  ugh space, just 
1c40: 69 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  in case..  */.  
1c50: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
1c60: 43 75 72 73 6f 72 20 3d 20 69 43 75 72 20 3d 20  Cursor = iCur = 
1c70: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1c80: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
1c90: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
1ca0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
1cb0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  {.    pParse->nT
1cc0: 61 62 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ab++;.  }..  /* 
1cd0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e  Initialize the n
1ce0: 61 6d 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ame-context */. 
1cf0: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
1d00: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
1d10: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
1d20: 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 53 72 63  arse;.  sNC.pSrc
1d30: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
1d40: 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74  ..  /* Resolve t
1d50: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
1d60: 69 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65  in all the expre
1d70: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
1d80: 2a 2a 20 6f 66 20 74 68 65 20 55 50 44 41 54 45  ** of the UPDATE
1d90: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 6c 73   statement.  Als
1da0: 6f 20 66 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d  o find the colum
1db0: 6e 20 69 6e 64 65 78 0a 20 20 2a 2a 20 66 6f 72  n index.  ** for
1dc0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 74 6f 20   each column to 
1dd0: 62 65 20 75 70 64 61 74 65 64 20 69 6e 20 74 68  be updated in th
1de0: 65 20 70 43 68 61 6e 67 65 73 20 61 72 72 61 79  e pChanges array
1df0: 2e 20 20 46 6f 72 20 65 61 63 68 0a 20 20 2a 2a  .  For each.  **
1e00: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 75 70   column to be up
1e10: 64 61 74 65 64 2c 20 6d 61 6b 65 20 73 75 72 65  dated, make sure
1e20: 20 77 65 20 68 61 76 65 20 61 75 74 68 6f 72 69   we have authori
1e30: 7a 61 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65  zation to change
1e40: 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d  .  ** that colum
1e50: 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 6e 67 52 6f  n..  */.  chngRo
1e60: 77 69 64 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  wid = 0;.  for(i
1e70: 3d 30 3b 20 69 3c 70 43 68 61 6e 67 65 73 2d 3e  =0; i<pChanges->
1e80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1e90: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1ea0: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
1eb0: 43 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69  C, pChanges->a[i
1ec0: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
1ed0: 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c    goto update_cl
1ee0: 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20  eanup;.    }.   
1ef0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
1f00: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
1f10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1f20: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
1f30: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 43 68 61  l[j].zName, pCha
1f40: 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  nges->a[i].zName
1f50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1f60: 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( j==pTab->iPK
1f70: 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1f80: 63 68 6e 67 52 6f 77 69 64 20 3d 20 31 3b 0a 20  chngRowid = 1;. 
1f90: 20 20 20 20 20 20 20 20 20 70 52 6f 77 69 64 45           pRowidE
1fa0: 78 70 72 20 3d 20 70 43 68 61 6e 67 65 73 2d 3e  xpr = pChanges->
1fb0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
1fc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 58      }.        aX
1fd0: 52 65 66 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20  Ref[j] = i;.    
1fe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ff0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2000: 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   j>=pTab->nCol )
2010: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
2020: 74 65 33 49 73 52 6f 77 69 64 28 70 43 68 61 6e  te3IsRowid(pChan
2030: 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ges->a[i].zName)
2040: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67   ){.        chng
2050: 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Rowid = 1;.     
2060: 20 20 20 70 52 6f 77 69 64 45 78 70 72 20 3d 20     pRowidExpr = 
2070: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 70  pChanges->a[i].p
2080: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Expr;.      }els
2090: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
20a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20b0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75  e, "no such colu
20c0: 6d 6e 3a 20 25 73 22 2c 20 70 43 68 61 6e 67 65  mn: %s", pChange
20d0: 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  s->a[i].zName);.
20e0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 75 70 64          goto upd
20f0: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ate_cleanup;.   
2100: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
2110: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2120: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
2130: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b   {.      int rc;
2140: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2150: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
2160: 72 73 65 2c 20 53 51 4c 49 54 45 5f 55 50 44 41  rse, SQLITE_UPDA
2170: 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
2180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2190: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
21a0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
21b0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
21c0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
21d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20  rc==SQLITE_DENY 
21e0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
21f0: 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a  update_cleanup;.
2200: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2210: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 47 4e 4f 52  rc==SQLITE_IGNOR
2220: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 61 58 52  E ){.        aXR
2230: 65 66 5b 6a 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  ef[j] = -1;.    
2240: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
2250: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
2260: 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
2270: 68 65 20 61 72 72 61 79 20 61 70 49 64 78 5b 5d  he array apIdx[]
2280: 20 61 6e 64 20 66 69 6c 6c 20 69 74 20 77 69 74   and fill it wit
2290: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 65 76  h pointers to ev
22a0: 65 72 79 0a 20 20 2a 2a 20 69 6e 64 65 78 20 74  ery.  ** index t
22b0: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
22c0: 75 70 64 61 74 65 64 2e 20 20 49 6e 64 69 63 65  updated.  Indice
22d0: 73 20 6f 6e 6c 79 20 6e 65 65 64 20 75 70 64 61  s only need upda
22e0: 74 69 6e 67 20 69 66 20 74 68 65 69 72 0a 20 20  ting if their.  
22f0: 2a 2a 20 6b 65 79 20 69 6e 63 6c 75 64 65 73 20  ** key includes 
2300: 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  one of the colum
2310: 6e 73 20 6e 61 6d 65 64 20 69 6e 20 70 43 68 61  ns named in pCha
2320: 6e 67 65 73 20 6f 72 20 69 66 20 74 68 65 20 72  nges or if the r
2330: 65 63 6f 72 64 0a 20 20 2a 2a 20 6e 75 6d 62 65  ecord.  ** numbe
2340: 72 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  r of the origina
2350: 6c 20 74 61 62 6c 65 20 65 6e 74 72 79 20 69 73  l table entry is
2360: 20 63 68 61 6e 67 69 6e 67 2e 0a 20 20 2a 2f 0a   changing..  */.
2370: 20 20 66 6f 72 28 6e 49 64 78 3d 6e 49 64 78 54    for(nIdx=nIdxT
2380: 6f 74 61 6c 3d 30 2c 20 70 49 64 78 3d 70 54 61  otal=0, pIdx=pTa
2390: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
23a0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
23b0: 74 2c 20 6e 49 64 78 54 6f 74 61 6c 2b 2b 29 7b  t, nIdxTotal++){
23c0: 0a 20 20 20 20 69 66 28 20 63 68 6e 67 52 6f 77  .    if( chngRow
23d0: 69 64 20 29 7b 0a 20 20 20 20 20 20 69 20 3d 20  id ){.      i = 
23e0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20  0;.    }else {. 
23f0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2400: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
2410: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2420: 20 61 58 52 65 66 5b 70 49 64 78 2d 3e 61 69 43   aXRef[pIdx->aiC
2430: 6f 6c 75 6d 6e 5b 69 5d 5d 3e 3d 30 20 29 20 62  olumn[i]]>=0 ) b
2440: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2450: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49    }.    if( i<pI
2460: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 6e 49  dx->nColumn ) nI
2470: 64 78 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dx++;.  }.  if( 
2480: 6e 49 64 78 54 6f 74 61 6c 3e 30 20 29 7b 0a 20  nIdxTotal>0 ){. 
2490: 20 20 20 61 70 49 64 78 20 3d 20 73 71 6c 69 74     apIdx = sqlit
24a0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
24b0: 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 2a 29  , sizeof(Index*)
24c0: 20 2a 20 6e 49 64 78 20 2b 20 6e 49 64 78 54 6f   * nIdx + nIdxTo
24d0: 74 61 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 61  tal );.    if( a
24e0: 70 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20 75  pIdx==0 ) goto u
24f0: 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  pdate_cleanup;. 
2500: 20 20 20 61 49 64 78 55 73 65 64 20 3d 20 28 63     aIdxUsed = (c
2510: 68 61 72 2a 29 26 61 70 49 64 78 5b 6e 49 64 78  har*)&apIdx[nIdx
2520: 5d 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 49 64  ];.  }.  for(nId
2530: 78 3d 6a 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  x=j=0, pIdx=pTab
2540: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
2550: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
2560: 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , j++){.    if( 
2570: 63 68 6e 67 52 6f 77 69 64 20 29 7b 0a 20 20 20  chngRowid ){.   
2580: 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 7d 65     i = 0;.    }e
2590: 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  lse{.      for(i
25a0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
25b0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
25c0: 20 20 20 69 66 28 20 61 58 52 65 66 5b 70 49 64     if( aXRef[pId
25d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 3e  x->aiColumn[i]]>
25e0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
25f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2600: 28 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ( i<pIdx->nColum
2610: 6e 20 29 7b 0a 20 20 20 20 20 20 61 70 49 64 78  n ){.      apIdx
2620: 5b 6e 49 64 78 2b 2b 5d 20 3d 20 70 49 64 78 3b  [nIdx++] = pIdx;
2630: 0a 20 20 20 20 20 20 61 49 64 78 55 73 65 64 5b  .      aIdxUsed[
2640: 6a 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  j] = 1;.    }els
2650: 65 7b 0a 20 20 20 20 20 20 61 49 64 78 55 73 65  e{.      aIdxUse
2660: 64 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  d[j] = 0;.    }.
2670: 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
2680: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
2690: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
26a0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
26b0: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
26c0: 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65   goto update_cle
26d0: 61 6e 75 70 3b 0a 20 20 69 66 28 20 70 50 61 72  anup;.  if( pPar
26e0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 20  se->nested==0 ) 
26f0: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
2700: 43 68 61 6e 67 65 73 28 76 29 3b 0a 20 20 73 71  Changes(v);.  sq
2710: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
2720: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
2730: 20 31 2c 20 69 44 62 29 3b 0a 20 20 6d 65 6d 31   1, iDb);.  mem1
2740: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2750: 6d 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  m;..#ifndef SQLI
2760: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2770: 41 42 4c 45 0a 20 20 2f 2a 20 56 69 72 74 75 61  ABLE.  /* Virtua
2780: 6c 20 74 61 62 6c 65 73 20 6d 75 73 74 20 62 65  l tables must be
2790: 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
27a0: 65 6c 79 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ely */.  if( IsV
27b0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
27c0: 20 20 20 20 75 70 64 61 74 65 56 69 72 74 75 61      updateVirtua
27d0: 6c 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  lTable(pParse, p
27e0: 54 61 62 4c 69 73 74 2c 20 70 54 61 62 2c 20 70  TabList, pTab, p
27f0: 43 68 61 6e 67 65 73 2c 20 70 52 6f 77 69 64 45  Changes, pRowidE
2800: 78 70 72 2c 20 61 58 52 65 66 2c 0a 20 20 20 20  xpr, aXRef,.    
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 20 20 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20     pWhere);.    
2830: 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20  pWhere = 0;.    
2840: 70 54 61 62 4c 69 73 74 20 3d 20 30 3b 0a 20 20  pTabList = 0;.  
2850: 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c    goto update_cl
2860: 65 61 6e 75 70 3b 0a 20 20 7d 0a 23 65 6e 64 69  eanup;.  }.#endi
2870: 66 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  f..  /* Resolve 
2880: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
2890: 20 69 6e 20 61 6c 6c 20 74 68 65 20 65 78 70 72   in all the expr
28a0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20  essions in the. 
28b0: 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   ** WHERE clause
28c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
28d0: 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
28e0: 61 6d 65 73 28 26 73 4e 43 2c 20 70 57 68 65 72  ames(&sNC, pWher
28f0: 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 75  e) ){.    goto u
2900: 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  pdate_cleanup;. 
2910: 20 7d 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 74   }..  /* Start t
2920: 68 65 20 76 69 65 77 20 63 6f 6e 74 65 78 74 0a  he view context.
2930: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
2940: 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  w ){.    sqlite3
2950: 41 75 74 68 43 6f 6e 74 65 78 74 50 75 73 68 28  AuthContextPush(
2960: 70 50 61 72 73 65 2c 20 26 73 43 6f 6e 74 65 78  pParse, &sContex
2970: 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  t, pTab->zName);
2980: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
2990: 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72  ate the code for
29a0: 20 74 72 69 67 67 65 72 73 2e 0a 20 20 2a 2f 0a   triggers..  */.
29b0: 20 20 69 66 28 20 74 72 69 67 67 65 72 73 5f 65    if( triggers_e
29c0: 78 69 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  xist ){.    int 
29d0: 69 47 6f 74 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43  iGoto;..    /* C
29e0: 72 65 61 74 65 20 70 73 65 75 64 6f 2d 74 61 62  reate pseudo-tab
29f0: 6c 65 73 20 66 6f 72 20 4e 45 57 20 61 6e 64 20  les for NEW and 
2a00: 4f 4c 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  OLD.    */.    s
2a10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a20: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
2a30: 6f 2c 20 6f 6c 64 49 64 78 2c 20 30 29 3b 0a 20  o, oldIdx, 0);. 
2a40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a50: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75  dOp2(v, OP_SetNu
2a60: 6d 43 6f 6c 75 6d 6e 73 2c 20 6f 6c 64 49 64 78  mColumns, oldIdx
2a70: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20  , pTab->nCol);. 
2a80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a90: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp2(v, OP_OpenP
2aa0: 73 65 75 64 6f 2c 20 6e 65 77 49 64 78 2c 20 30  seudo, newIdx, 0
2ab0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2ac0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2ad0: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 6e 65  etNumColumns, ne
2ae0: 77 49 64 78 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  wIdx, pTab->nCol
2af0: 29 3b 0a 0a 20 20 20 20 69 47 6f 74 6f 20 3d 20  );..    iGoto = 
2b00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b10: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
2b20: 20 30 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20   0);.    addr = 
2b30: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2b40: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 42 65  abel(v);.    iBe
2b50: 67 69 6e 42 65 66 6f 72 65 54 72 69 67 67 65 72  ginBeforeTrigger
2b60: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2b70: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2b80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 64    if( sqlite3Cod
2b90: 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72  eRowTrigger(pPar
2ba0: 73 65 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 70  se, TK_UPDATE, p
2bb0: 43 68 61 6e 67 65 73 2c 20 54 52 49 47 47 45 52  Changes, TRIGGER
2bc0: 5f 42 45 46 4f 52 45 2c 20 70 54 61 62 2c 0a 20  _BEFORE, pTab,. 
2bd0: 20 20 20 20 20 20 20 20 20 6e 65 77 49 64 78 2c           newIdx,
2be0: 20 6f 6c 64 49 64 78 2c 20 6f 6e 45 72 72 6f 72   oldIdx, onError
2bf0: 2c 20 61 64 64 72 2c 20 26 6f 6c 64 5f 63 6f 6c  , addr, &old_col
2c00: 5f 6d 61 73 6b 2c 20 26 6e 65 77 5f 63 6f 6c 5f  _mask, &new_col_
2c10: 6d 61 73 6b 29 20 29 7b 0a 20 20 20 20 20 20 67  mask) ){.      g
2c20: 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e  oto update_clean
2c30: 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 45  up;.    }.    iE
2c40: 6e 64 42 65 66 6f 72 65 54 72 69 67 67 65 72 20  ndBeforeTrigger 
2c50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2c60: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
2c70: 30 2c 20 30 29 3b 0a 20 20 20 20 69 42 65 67 69  0, 0);.    iBegi
2c80: 6e 41 66 74 65 72 54 72 69 67 67 65 72 20 3d 20  nAfterTrigger = 
2c90: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2ca0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 69  ntAddr(v);.    i
2cb0: 66 28 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f  f( sqlite3CodeRo
2cc0: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
2cd0: 20 54 4b 5f 55 50 44 41 54 45 2c 20 70 43 68 61   TK_UPDATE, pCha
2ce0: 6e 67 65 73 2c 20 54 52 49 47 47 45 52 5f 41 46  nges, TRIGGER_AF
2cf0: 54 45 52 2c 20 70 54 61 62 2c 20 0a 20 20 20 20  TER, pTab, .    
2d00: 20 20 20 20 20 20 6e 65 77 49 64 78 2c 20 6f 6c        newIdx, ol
2d10: 64 49 64 78 2c 20 6f 6e 45 72 72 6f 72 2c 20 61  dIdx, onError, a
2d20: 64 64 72 2c 20 26 6f 6c 64 5f 63 6f 6c 5f 6d 61  ddr, &old_col_ma
2d30: 73 6b 2c 20 26 6e 65 77 5f 63 6f 6c 5f 6d 61 73  sk, &new_col_mas
2d40: 6b 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  k) ){.      goto
2d50: 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b   update_cleanup;
2d60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 45 6e 64 41  .    }.    iEndA
2d70: 66 74 65 72 54 72 69 67 67 65 72 20 3d 20 73 71  fterTrigger = sq
2d80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d90: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
2da0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2db0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 47  beJumpHere(v, iG
2dc0: 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  oto);.  }..  /* 
2dd0: 49 66 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  If we are trying
2de0: 20 74 6f 20 75 70 64 61 74 65 20 61 20 76 69 65   to update a vie
2df0: 77 2c 20 72 65 61 6c 69 7a 65 20 74 68 61 74 20  w, realize that 
2e00: 76 69 65 77 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  view into.  ** a
2e10: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
2e20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
2e30: 69 65 77 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  iew ){.    Selec
2e40: 74 20 2a 70 56 69 65 77 3b 0a 20 20 20 20 53 65  t *pView;.    Se
2e50: 6c 65 63 74 44 65 73 74 20 64 65 73 74 20 3d 20  lectDest dest = 
2e60: 7b 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 30  {SRT_EphemTab, 0
2e70: 2c 20 30 7d 3b 0a 20 20 20 20 70 56 69 65 77 20  , 0};.    pView 
2e80: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
2e90: 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
2ea0: 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
2eb0: 65 33 53 65 6c 65 63 74 4d 61 73 6b 28 70 50 61  e3SelectMask(pPa
2ec0: 72 73 65 2c 20 70 56 69 65 77 2c 20 6f 6c 64 5f  rse, pView, old_
2ed0: 63 6f 6c 5f 6d 61 73 6b 7c 6e 65 77 5f 63 6f 6c  col_mask|new_col
2ee0: 5f 6d 61 73 6b 29 3b 0a 20 20 20 20 64 65 73 74  _mask);.    dest
2ef0: 2e 69 50 61 72 6d 20 3d 20 69 43 75 72 3b 0a 20  .iParm = iCur;. 
2f00: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2f10: 28 70 50 61 72 73 65 2c 20 70 56 69 65 77 2c 20  (pParse, pView, 
2f20: 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  &dest, 0, 0, 0, 
2f30: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  0);.    sqlite3S
2f40: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 56 69 65  electDelete(pVie
2f50: 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  w);.  }..  /* Be
2f60: 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
2f70: 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70 57 49   scan.  */.  pWI
2f80: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
2f90: 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
2fa0: 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
2fb0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 57 49 6e  , 0);.  if( pWIn
2fc0: 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64  fo==0 ) goto upd
2fd0: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20  ate_cleanup;..  
2fe0: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
2ff0: 72 6f 77 69 64 20 6f 66 20 65 76 65 72 79 20 69  rowid of every i
3000: 74 65 6d 20 74 6f 20 62 65 20 75 70 64 61 74 65  tem to be update
3010: 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
3020: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 49  3VdbeAddOp2(v, I
3030: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f  sVirtual(pTab) ?
3040: 20 4f 50 5f 56 52 6f 77 69 64 20 3a 20 4f 50 5f   OP_VRowid : OP_
3050: 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 30 29 3b  Rowid, iCur, 0);
3060: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3070: 64 4f 70 32 28 76 2c 20 4f 50 5f 46 69 66 6f 57  dOp2(v, OP_FifoW
3080: 72 69 74 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  rite, 0, 0);..  
3090: 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
30a0: 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
30b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
30c0: 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
30d0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
30e0: 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 75 70 64  the count of upd
30f0: 61 74 65 64 20 72 6f 77 73 0a 20 20 2a 2f 0a 20  ated rows.  */. 
3100: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
3110: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
3120: 73 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72  s && !pParse->tr
3130: 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 6d  igStack ){.    m
3140: 65 6d 43 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65  emCnt = ++pParse
3150: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
3160: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3170: 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 6d   OP_MemInt, 0, m
3180: 65 6d 43 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69  emCnt);.  }..  i
3190: 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49  f( !isView && !I
31a0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
31b0: 7b 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a  {.    /* .    **
31c0: 20 4f 70 65 6e 20 65 76 65 72 79 20 69 6e 64 65   Open every inde
31d0: 78 20 74 68 61 74 20 6e 65 65 64 73 20 75 70 64  x that needs upd
31e0: 61 74 69 6e 67 2e 20 20 4e 6f 74 65 20 74 68 61  ating.  Note tha
31f0: 74 20 69 66 20 61 6e 79 0a 20 20 20 20 2a 2a 20  t if any.    ** 
3200: 69 6e 64 65 78 20 63 6f 75 6c 64 20 70 6f 74 65  index could pote
3210: 6e 74 69 61 6c 6c 79 20 69 6e 76 6f 6b 65 20 61  ntially invoke a
3220: 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63   REPLACE conflic
3230: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 0a 20 20  t resolution .  
3240: 20 20 2a 2a 20 61 63 74 69 6f 6e 2c 20 74 68 65    ** action, the
3250: 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 6f 70 65  n we need to ope
3260: 6e 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 62 65  n all indices be
3270: 63 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  cause we might n
3280: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
3290: 20 64 65 6c 65 74 69 6e 67 20 73 6f 6d 65 20 72   deleting some r
32a0: 65 63 6f 72 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  ecords..    */. 
32b0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
32c0: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ble(pParse, iCur
32d0: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
32e0: 4f 70 65 6e 57 72 69 74 65 29 3b 20 0a 20 20 20  OpenWrite); .   
32f0: 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
3300: 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
3310: 20 20 6f 70 65 6e 41 6c 6c 20 3d 20 31 3b 0a 20    openAll = 1;. 
3320: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3330: 6f 70 65 6e 41 6c 6c 20 3d 20 30 3b 0a 20 20 20  openAll = 0;.   
3340: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
3350: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
3360: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
3370: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
3380: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
3390: 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
33a0: 20 20 20 20 20 20 6f 70 65 6e 41 6c 6c 20 3d 20        openAll = 
33b0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
33c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
33d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
33e0: 66 6f 72 28 69 3d 30 2c 20 70 49 64 78 3d 70 54  for(i=0, pIdx=pT
33f0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
3400: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
3410: 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  xt, i++){.      
3420: 69 66 28 20 6f 70 65 6e 41 6c 6c 20 7c 7c 20 61  if( openAll || a
3430: 49 64 78 55 73 65 64 5b 69 5d 20 29 7b 0a 20 20  IdxUsed[i] ){.  
3440: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
3450: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  Key = sqlite3Ind
3460: 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
3470: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
3480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3490: 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p4(v, OP_OpenWri
34a0: 74 65 2c 20 69 43 75 72 2b 69 2b 31 2c 20 70 49  te, iCur+i+1, pI
34b0: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20  dx->tnum, iDb,. 
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
34e0: 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
34f0: 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20  NDOFF);.        
3500: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
3510: 6e 54 61 62 3e 69 43 75 72 2b 69 2b 31 20 29 3b  nTab>iCur+i+1 );
3520: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
3530: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70    }.  .  /* Jump
3540: 20 62 61 63 6b 20 74 6f 20 74 68 69 73 20 70 6f   back to this po
3550: 69 6e 74 20 69 66 20 61 20 74 72 69 67 67 65 72  int if a trigger
3560: 20 65 6e 63 6f 75 6e 74 65 72 73 20 61 6e 20 49   encounters an I
3570: 47 4e 4f 52 45 20 63 6f 6e 73 74 72 61 69 6e 74  GNORE constraint
3580: 2e 20 2a 2f 0a 20 20 69 66 28 20 74 72 69 67 67  . */.  if( trigg
3590: 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20 20  ers_exist ){.   
35a0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
35b0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
35c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 70  );.  }..  /* Top
35d0: 20 6f 66 20 74 68 65 20 75 70 64 61 74 65 20 6c   of the update l
35e0: 6f 6f 70 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20  oop */.  addr = 
35f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3600: 32 28 76 2c 20 4f 50 5f 46 69 66 6f 52 65 61 64  2(v, OP_FifoRead
3610: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
3620: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3630: 4f 50 5f 53 74 61 63 6b 44 65 70 74 68 2c 20 2d  OP_StackDepth, -
3640: 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  1, 0);.  sqlite3
3650: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3660: 5f 4d 65 6d 53 74 6f 72 65 2c 20 6d 65 6d 31 2c  _MemStore, mem1,
3670: 20 30 29 3b 0a 0a 20 20 69 66 28 20 74 72 69 67   0);..  if( trig
3680: 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20  gers_exist ){.  
3690: 20 20 2f 2a 20 4d 61 6b 65 20 63 75 72 73 6f 72    /* Make cursor
36a0: 20 69 43 75 72 20 70 6f 69 6e 74 20 74 6f 20 74   iCur point to t
36b0: 68 65 20 72 65 63 6f 72 64 20 74 68 61 74 20 69  he record that i
36c0: 73 20 62 65 69 6e 67 20 75 70 64 61 74 65 64 2e  s being updated.
36d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
36e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
36f0: 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
3700: 43 75 72 2c 20 61 64 64 72 29 3b 0a 0a 20 20 20  Cur, addr);..   
3710: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
3720: 20 4f 4c 44 20 74 61 62 6c 65 0a 20 20 20 20 2a   OLD table.    *
3730: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
3740: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
3750: 77 69 64 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  wid, iCur, 0);. 
3760: 20 20 20 69 66 28 20 21 6f 6c 64 5f 63 6f 6c 5f     if( !old_col_
3770: 6d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  mask ){.      sq
3780: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3790: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
37a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
37b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44  ddOp2(v, OP_RowD
37d0: 61 74 61 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  ata, iCur, 0);. 
37e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
37f0: 43 6f 64 65 49 6e 73 65 72 74 28 70 50 61 72 73  CodeInsert(pPars
3800: 65 2c 20 6f 6c 64 49 64 78 2c 20 30 29 3b 0a 0a  e, oldIdx, 0);..
3810: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
3820: 74 68 65 20 4e 45 57 20 74 61 62 6c 65 0a 20 20  the NEW table.  
3830: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 68 6e    */.    if( chn
3840: 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  gRowid ){.      
3850: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
3860: 6e 64 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  ndCache(pParse, 
3870: 70 52 6f 77 69 64 45 78 70 72 29 3b 0a 20 20 20  pRowidExpr);.   
3880: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
3890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
38a0: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75  v, OP_Rowid, iCu
38b0: 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 0);.    }.   
38c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
38d0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
38e0: 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d      if( i==pTab-
38f0: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
3900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3910: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
3920: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 63  0, 0);.        c
3930: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
3940: 0a 20 20 20 20 20 20 6a 20 3d 20 61 58 52 65 66  .      j = aXRef
3950: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  [i];.      if( n
3960: 65 77 5f 63 6f 6c 5f 6d 61 73 6b 26 28 28 75 33  ew_col_mask&((u3
3970: 32 29 31 3c 3c 69 29 20 7c 7c 20 6e 65 77 5f 63  2)1<<i) || new_c
3980: 6f 6c 5f 6d 61 73 6b 3d 3d 30 78 66 66 66 66 66  ol_mask==0xfffff
3990: 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  fff ){.        i
39a0: 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( j<0 ){.      
39b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
39c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp2(v, OP_Colu
39d0: 6d 6e 2c 20 69 43 75 72 2c 20 69 29 3b 0a 20 20  mn, iCur, i);.  
39e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
39f0: 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
3a00: 70 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 20 20  pTab, i);.      
3a10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3a20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
3a30: 64 65 41 6e 64 43 61 63 68 65 28 70 50 61 72 73  deAndCache(pPars
3a40: 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 6a  e, pChanges->a[j
3a50: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
3a60: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
3a70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3a80: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3a90: 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
3aa0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3ab0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3ac0: 32 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  2(v, OP_MakeReco
3ad0: 72 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  rd, pTab->nCol, 
3ae0: 30 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56  0);.    if( !isV
3af0: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  iew ){.      sql
3b00: 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74  ite3TableAffinit
3b10: 79 53 74 72 28 76 2c 20 70 54 61 62 29 3b 0a 20  yStr(v, pTab);. 
3b20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
3b30: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
3b40: 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b   update_cleanup;
3b50: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
3b60: 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c 20 6e  Insert(pParse, n
3b70: 65 77 49 64 78 2c 20 30 29 3b 0a 0a 20 20 20 20  ewIdx, 0);..    
3b80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3b90: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
3ba0: 20 69 42 65 67 69 6e 42 65 66 6f 72 65 54 72 69   iBeginBeforeTri
3bb0: 67 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  gger);.    sqlit
3bc0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
3bd0: 2c 20 69 45 6e 64 42 65 66 6f 72 65 54 72 69 67  , iEndBeforeTrig
3be0: 67 65 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  ger);..    if( !
3bf0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
3c00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3c10: 32 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  2(v, OP_MemLoad,
3c20: 20 6d 65 6d 31 2c 20 30 29 3b 0a 20 20 20 20 7d   mem1, 0);.    }
3c30: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 56  .  }..  if( !isV
3c40: 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61  iew && !IsVirtua
3c50: 6c 28 70 54 61 62 29 20 29 7b 0a 0a 20 20 20 20  l(pTab) ){..    
3c60: 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 65 76 65  /* Loop over eve
3c70: 72 79 20 72 65 63 6f 72 64 20 74 68 61 74 20 6e  ry record that n
3c80: 65 65 64 73 20 75 70 64 61 74 69 6e 67 2e 20 20  eeds updating.  
3c90: 57 65 20 68 61 76 65 20 74 6f 20 6c 6f 61 64 0a  We have to load.
3ca0: 20 20 20 20 2a 2a 20 74 68 65 20 6f 6c 64 20 64      ** the old d
3cb0: 61 74 61 20 66 6f 72 20 65 61 63 68 20 72 65 63  ata for each rec
3cc0: 6f 72 64 20 74 6f 20 62 65 20 75 70 64 61 74 65  ord to be update
3cd0: 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 20 63  d because some c
3ce0: 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 6d 69  olumns.    ** mi
3cf0: 67 68 74 20 6e 6f 74 20 63 68 61 6e 67 65 20 61  ght not change a
3d00: 6e 64 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  nd we will need 
3d10: 74 6f 20 63 6f 70 79 20 74 68 65 20 6f 6c 64 20  to copy the old 
3d20: 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2a 20 41 6c  value..    ** Al
3d30: 73 6f 2c 20 74 68 65 20 6f 6c 64 20 64 61 74 61  so, the old data
3d40: 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 64 65   is needed to de
3d50: 6c 65 74 65 20 74 68 65 20 6f 6c 64 20 69 6e 64  lete the old ind
3d60: 65 78 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  ex entries..    
3d70: 2a 2a 20 53 6f 20 6d 61 6b 65 20 74 68 65 20 63  ** So make the c
3d80: 75 72 73 6f 72 20 70 6f 69 6e 74 20 61 74 20 74  ursor point at t
3d90: 68 65 20 6f 6c 64 20 72 65 63 6f 72 64 2e 0a 20  he old record.. 
3da0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
3db0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3dc0: 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
3dd0: 72 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71  r, addr);.    sq
3de0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3df0: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d  v, OP_MemLoad, m
3e00: 65 6d 31 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  em1, 0);..    /*
3e10: 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 6e   If the record n
3e20: 75 6d 62 65 72 20 77 69 6c 6c 20 63 68 61 6e 67  umber will chang
3e30: 65 2c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f  e, push the reco
3e40: 72 64 20 6e 75 6d 62 65 72 20 61 73 20 69 74 0a  rd number as it.
3e50: 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 61      ** will be a
3e60: 66 74 65 72 20 74 68 65 20 75 70 64 61 74 65 2e  fter the update.
3e70: 20 28 54 68 65 20 6f 6c 64 20 72 65 63 6f 72 64   (The old record
3e80: 20 6e 75 6d 62 65 72 20 69 73 20 63 75 72 72 65   number is curre
3e90: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ntly.    ** on t
3ea0: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
3eb0: 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ).    */.    if(
3ec0: 20 63 68 6e 67 52 6f 77 69 64 20 29 7b 0a 20 20   chngRowid ){.  
3ed0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
3ee0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 6f 77  ode(pParse, pRow
3ef0: 69 64 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  idExpr);.      s
3f00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3f10: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
3f20: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  , 0, 0);.    }..
3f30: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6e      /* Compute n
3f40: 65 77 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  ew data for this
3f50: 20 72 65 63 6f 72 64 2e 20 20 0a 20 20 20 20 2a   record.  .    *
3f60: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
3f70: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
3f80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  ){.      if( i==
3f90: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
3fa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
3fb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
3fc0: 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ull, 0, 0);.    
3fd0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
3fe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20      }.      j = 
3ff0: 61 58 52 65 66 5b 69 5d 3b 0a 20 20 20 20 20 20  aXRef[i];.      
4000: 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20  if( j<0 ){.     
4010: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4020: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp2(v, OP_Colum
4030: 6e 2c 20 69 43 75 72 2c 20 69 29 3b 0a 20 20 20  n, iCur, i);.   
4040: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75       sqlite3Colu
4050: 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61  mnDefault(v, pTa
4060: 62 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c  b, i);.      }el
4070: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4080: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
4090: 73 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b  se, pChanges->a[
40a0: 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  j].pExpr);.     
40b0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
40c0: 20 44 6f 20 63 6f 6e 73 74 72 61 69 6e 74 20 63   Do constraint c
40d0: 68 65 63 6b 73 0a 20 20 20 20 2a 2f 0a 20 20 20  hecks.    */.   
40e0: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
40f0: 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73  ConstraintChecks
4100: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
4110: 43 75 72 2c 20 61 49 64 78 55 73 65 64 2c 20 63  Cur, aIdxUsed, c
4120: 68 6e 67 52 6f 77 69 64 2c 20 31 2c 0a 20 20 20  hngRowid, 1,.   
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 6f 6e 45 72 72 6f 72 2c 20 61 64 64 72 29 3b 0a  onError, addr);.
4160: 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  .    /* Delete t
4170: 68 65 20 6f 6c 64 20 69 6e 64 69 63 65 73 20 66  he old indices f
4180: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
4190: 65 63 6f 72 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ecord..    */.  
41a0: 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
41b0: 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28  eRowIndexDelete(
41c0: 76 2c 20 70 54 61 62 2c 20 69 43 75 72 2c 20 61  v, pTab, iCur, a
41d0: 49 64 78 55 73 65 64 29 3b 0a 0a 20 20 20 20 2f  IdxUsed);..    /
41e0: 2a 20 49 66 20 63 68 61 6e 67 69 6e 67 20 74 68  * If changing th
41f0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2c  e record number,
4200: 20 64 65 6c 65 74 65 20 74 68 65 20 6f 6c 64 20   delete the old 
4210: 72 65 63 6f 72 64 2e 0a 20 20 20 20 2a 2f 0a 20  record..    */. 
4220: 20 20 20 69 66 28 20 63 68 6e 67 52 6f 77 69 64     if( chngRowid
4230: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4240: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4250: 50 5f 44 65 6c 65 74 65 2c 20 69 43 75 72 2c 20  P_Delete, iCur, 
4260: 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
4270: 2a 20 43 72 65 61 74 65 20 74 68 65 20 6e 65 77  * Create the new
4280: 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61   index entries a
4290: 6e 64 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  nd the new recor
42a0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
42b0: 6c 69 74 65 33 43 6f 6d 70 6c 65 74 65 49 6e 73  lite3CompleteIns
42c0: 65 72 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  ertion(pParse, p
42d0: 54 61 62 2c 20 69 43 75 72 2c 20 61 49 64 78 55  Tab, iCur, aIdxU
42e0: 73 65 64 2c 20 63 68 6e 67 52 6f 77 69 64 2c 20  sed, chngRowid, 
42f0: 31 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a  1, -1, 0);.  }..
4300: 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
4310: 68 65 20 72 6f 77 20 63 6f 75 6e 74 65 72 20 0a  he row counter .
4320: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66    */.  if( db->f
4330: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
4340: 75 6e 74 52 6f 77 73 20 26 26 20 21 70 50 61 72  untRows && !pPar
4350: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 29 7b 0a  se->trigStack){.
4360: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4370: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 65 6d 49  ddOp2(v, OP_MemI
4380: 6e 63 72 2c 20 31 2c 20 6d 65 6d 43 6e 74 29 3b  ncr, 1, memCnt);
4390: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
43a0: 65 72 65 20 61 72 65 20 74 72 69 67 67 65 72 73  ere are triggers
43b0: 2c 20 63 6c 6f 73 65 20 61 6c 6c 20 74 68 65 20  , close all the 
43c0: 63 75 72 73 6f 72 73 20 61 66 74 65 72 20 65 61  cursors after ea
43d0: 63 68 20 69 74 65 72 61 74 69 6f 6e 0a 20 20 2a  ch iteration.  *
43e0: 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  * through the lo
43f0: 6f 70 2e 20 20 54 68 65 20 66 69 72 65 20 74 68  op.  The fire th
4400: 65 20 61 66 74 65 72 20 74 72 69 67 67 65 72 73  e after triggers
4410: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74 72 69  ..  */.  if( tri
4420: 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20  ggers_exist ){. 
4430: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4440: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
4450: 20 30 2c 20 69 42 65 67 69 6e 41 66 74 65 72 54   0, iBeginAfterT
4460: 72 69 67 67 65 72 29 3b 0a 20 20 20 20 73 71 6c  rigger);.    sql
4470: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4480: 28 76 2c 20 69 45 6e 64 41 66 74 65 72 54 72 69  (v, iEndAfterTri
4490: 67 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  gger);.  }..  /*
44a0: 20 52 65 70 65 61 74 20 74 68 65 20 61 62 6f 76   Repeat the abov
44b0: 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
44c0: 72 65 63 6f 72 64 20 74 6f 20 62 65 20 75 70 64  record to be upd
44d0: 61 74 65 64 2c 20 75 6e 74 69 6c 0a 20 20 2a 2a  ated, until.  **
44e0: 20 61 6c 6c 20 72 65 63 6f 72 64 20 73 65 6c 65   all record sele
44f0: 63 74 65 64 20 62 79 20 74 68 65 20 57 48 45 52  cted by the WHER
4500: 45 20 63 6c 61 75 73 65 20 68 61 76 65 20 62 65  E clause have be
4510: 65 6e 20 75 70 64 61 74 65 64 2e 0a 20 20 2a 2f  en updated..  */
4520: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
4530: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
4540: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c   0, addr);.  sql
4550: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4560: 28 76 2c 20 61 64 64 72 29 3b 0a 0a 20 20 2f 2a  (v, addr);..  /*
4570: 20 43 6c 6f 73 65 20 61 6c 6c 20 74 61 62 6c 65   Close all table
4580: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  s */.  for(i=0, 
4590: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
45a0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
45b0: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
45c0: 0a 20 20 20 20 69 66 28 20 6f 70 65 6e 41 6c 6c  .    if( openAll
45d0: 20 7c 7c 20 61 49 64 78 55 73 65 64 5b 69 5d 20   || aIdxUsed[i] 
45e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
45f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4600: 5f 43 6c 6f 73 65 2c 20 69 43 75 72 2b 69 2b 31  _Close, iCur+i+1
4610: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
4620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4630: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
4640: 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 69 66 28   iCur, 0);.  if(
4650: 20 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20   triggers_exist 
4660: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
4680: 6c 6f 73 65 2c 20 6e 65 77 49 64 78 2c 20 30 29  lose, newIdx, 0)
4690: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
46a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
46b0: 6f 73 65 2c 20 6f 6c 64 49 64 78 2c 20 30 29 3b  ose, oldIdx, 0);
46c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
46d0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
46e0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
46f0: 65 72 65 20 63 68 61 6e 67 65 64 2e 20 49 66 20  ere changed. If 
4700: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
4710: 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67  .  ** generating
4720: 20 63 6f 64 65 20 62 65 63 61 75 73 65 20 6f 66   code because of
4730: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
4740: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 29 2c  e3NestedParse(),
4750: 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 69 6e 76   do not.  ** inv
4760: 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
4770: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
4780: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
4790: 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
47a0: 77 73 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74  ws && !pParse->t
47b0: 72 69 67 53 74 61 63 6b 20 26 26 20 70 50 61 72  rigStack && pPar
47c0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b  se->nested==0 ){
47d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
47e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
47f0: 75 6c 74 52 6f 77 2c 20 6d 65 6d 43 6e 74 2c 20  ultRow, memCnt, 
4800: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
4810: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
4820: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
4830: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
4840: 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 0, COLNAME_NAM
4850: 45 2c 20 22 72 6f 77 73 20 75 70 64 61 74 65 64  E, "rows updated
4860: 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ", P4_STATIC);. 
4870: 20 7d 0a 0a 75 70 64 61 74 65 5f 63 6c 65 61 6e   }..update_clean
4880: 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 41 75 74  up:.  sqlite3Aut
4890: 68 43 6f 6e 74 65 78 74 50 6f 70 28 26 73 43 6f  hContextPop(&sCo
48a0: 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65  ntext);.  sqlite
48b0: 33 5f 66 72 65 65 28 61 70 49 64 78 29 3b 0a 20  3_free(apIdx);. 
48c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 58   sqlite3_free(aX
48d0: 52 65 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Ref);.  sqlite3S
48e0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61  rcListDelete(pTa
48f0: 62 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  bList);.  sqlite
4900: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
4910: 70 43 68 61 6e 67 65 73 29 3b 0a 20 20 73 71 6c  pChanges);.  sql
4920: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
4930: 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e  Where);.  return
4940: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
4950: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
4960: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  TABLE./*.** Gene
4970: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
4980: 20 55 50 44 41 54 45 20 6f 66 20 61 20 76 69 72   UPDATE of a vir
4990: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
49a0: 2a 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69  * The strategy i
49b0: 73 20 74 68 61 74 20 77 65 20 63 72 65 61 74 65  s that we create
49c0: 20 61 6e 20 65 70 68 65 6d 65 72 69 61 6c 20 74   an ephemerial t
49d0: 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
49e0: 6e 73 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 72  ns.** for each r
49f0: 6f 77 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ow to be changed
4a00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 41 29 20 20 54  :.**.**   (A)  T
4a10: 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 6f 77 69  he original rowi
4a20: 64 20 6f 66 20 74 68 61 74 20 72 6f 77 2e 0a 2a  d of that row..*
4a30: 2a 20 20 20 28 42 29 20 20 54 68 65 20 72 65 76  *   (B)  The rev
4a40: 69 73 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74  ised rowid for t
4a50: 68 65 20 72 6f 77 2e 20 28 6e 6f 74 65 31 29 0a  he row. (note1).
4a60: 2a 2a 20 20 20 28 43 29 20 20 54 68 65 20 63 6f  **   (C)  The co
4a70: 6e 74 65 6e 74 20 6f 66 20 65 76 65 72 79 20 63  ntent of every c
4a80: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 6f 77  olumn in the row
4a90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 77 65 20  ..**.** Then we 
4aa0: 6c 6f 6f 70 20 6f 76 65 72 20 74 68 69 73 20 65  loop over this e
4ab0: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 61  phemeral table a
4ac0: 6e 64 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  nd for each row 
4ad0: 69 6e 0a 2a 2a 20 74 68 65 20 65 70 68 65 72 6d  in.** the epherm
4ae0: 65 72 61 6c 20 74 61 62 6c 65 20 63 61 6c 6c 20  eral table call 
4af0: 56 55 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 57  VUpdate..**.** W
4b00: 68 65 6e 20 66 69 6e 69 73 68 65 64 2c 20 64 72  hen finished, dr
4b10: 6f 70 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  op the ephemeral
4b20: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 6e   table..**.** (n
4b30: 6f 74 65 31 29 20 41 63 74 75 61 6c 6c 79 2c 20  ote1) Actually, 
4b40: 69 66 20 77 65 20 6b 6e 6f 77 20 69 6e 20 61 64  if we know in ad
4b50: 76 61 6e 63 65 20 74 68 61 74 20 28 41 29 20 69  vance that (A) i
4b60: 73 20 61 6c 77 61 79 73 20 74 68 65 20 73 61 6d  s always the sam
4b70: 65 0a 2a 2a 20 61 73 20 28 42 29 20 77 65 20 6f  e.** as (B) we o
4b80: 6e 6c 79 20 73 74 6f 72 65 20 28 41 29 2c 20 74  nly store (A), t
4b90: 68 65 6e 20 64 75 70 6c 69 63 61 74 65 20 28 41  hen duplicate (A
4ba0: 29 20 77 68 65 6e 20 70 75 6c 6c 69 6e 67 0a 2a  ) when pulling.*
4bb0: 2a 20 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20  * it out of the 
4bc0: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
4bd0: 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 56  before calling V
4be0: 55 70 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  Update..*/.stati
4bf0: 63 20 76 6f 69 64 20 75 70 64 61 74 65 56 69 72  c void updateVir
4c00: 74 75 61 6c 54 61 62 6c 65 28 0a 20 20 50 61 72  tualTable(.  Par
4c10: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4c20: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
4c30: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
4c40: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
4c50: 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
4c60: 6c 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6d 6f  l table to be mo
4c70: 64 69 66 69 65 64 20 2a 2f 0a 20 20 54 61 62 6c  dified */.  Tabl
4c80: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
4c90: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
4ca0: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
4cb0: 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20  ist *pChanges,  
4cc0: 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 74  /* The columns t
4cd0: 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20  o change in the 
4ce0: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
4cf0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 6f 77   */.  Expr *pRow
4d00: 69 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  id,        /* Ex
4d10: 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 6f  pression used to
4d20: 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20 72   recompute the r
4d30: 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  owid */.  int *a
4d40: 58 52 65 66 2c 20 20 20 20 20 20 20 20 20 20 2f  XRef,          /
4d50: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 63  * Mapping from c
4d60: 6f 6c 75 6d 6e 73 20 6f 66 20 70 54 61 62 20 74  olumns of pTab t
4d70: 6f 20 65 6e 74 72 69 65 73 20 69 6e 20 70 43 68  o entries in pCh
4d80: 61 6e 67 65 73 20 2a 2f 0a 20 20 45 78 70 72 20  anges */.  Expr 
4d90: 2a 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  *pWhere         
4da0: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
4db0: 6f 66 20 74 68 65 20 55 50 44 41 54 45 20 73 74  of the UPDATE st
4dc0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
4dd0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
4de0: 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 56 69 72  ->pVdbe;  /* Vir
4df0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
4e00: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
4e10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
4e20: 45 4c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 2f  EList = 0;     /
4e30: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
4e40: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
4e50: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65  tatement */.  Se
4e60: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20  lect *pSelect = 
4e70: 30 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53  0;      /* The S
4e80: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
4e90: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
4ea0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4eb0: 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72  * Temporary expr
4ec0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
4ed0: 65 70 68 65 6d 54 61 62 3b 20 20 20 20 20 20 20  ephemTab;       
4ee0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 68        /* Table h
4ef0: 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 73 75 6c  olding the resul
4f00: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
4f10: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4f30: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
4f40: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20  /.  int addr;   
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4f60: 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20   Address of top 
4f70: 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  of loop */.  sql
4f80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
4f90: 65 2d 3e 64 62 3b 20 2f 2a 20 44 61 74 61 62 61  e->db; /* Databa
4fa0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
4fb0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
4fc0: 73 74 20 3d 20 7b 53 52 54 5f 54 61 62 6c 65 2c  st = {SRT_Table,
4fd0: 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a 20 43 6f   0, 0};..  /* Co
4fe0: 6e 73 74 72 75 63 74 20 74 68 65 20 53 45 4c 45  nstruct the SELE
4ff0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
5000: 74 20 77 69 6c 6c 20 66 69 6e 64 20 74 68 65 20  t will find the 
5010: 6e 65 77 20 76 61 6c 75 65 73 20 66 6f 72 0a 20  new values for. 
5020: 20 2a 2a 20 61 6c 6c 20 75 70 64 61 74 65 64 20   ** all updated 
5030: 72 6f 77 73 2e 20 0a 20 20 2a 2f 0a 20 20 70 45  rows. .  */.  pE
5040: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
5050: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
5060: 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  rse, 0, .       
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5080: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5090: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50  3CreateIdExpr(pP
50a0: 61 72 73 65 2c 20 22 5f 72 6f 77 69 64 5f 22 29  arse, "_rowid_")
50b0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 52 6f 77  , 0);.  if( pRow
50c0: 69 64 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74  id ){.    pEList
50d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
50e0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
50f0: 20 70 45 4c 69 73 74 2c 0a 20 20 20 20 20 20 20   pEList,.       
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
5120: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
5130: 52 6f 77 69 64 29 2c 20 30 29 3b 0a 20 20 7d 0a  Rowid), 0);.  }.
5140: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
5150: 69 50 4b 65 79 3c 30 20 29 3b 0a 20 20 66 6f 72  iPKey<0 );.  for
5160: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
5170: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
5180: 28 20 61 58 52 65 66 5b 69 5d 3e 3d 30 20 29 7b  ( aXRef[i]>=0 ){
5190: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73  .      pExpr = s
51a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
51b0: 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 61 58  , pChanges->a[aX
51c0: 52 65 66 5b 69 5d 5d 2e 70 45 78 70 72 29 3b 0a  Ref[i]].pExpr);.
51d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
51e0: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
51f0: 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61  CreateIdExpr(pPa
5200: 72 73 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  rse, pTab->aCol[
5210: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  i].zName);.    }
5220: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
5230: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
5240: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 45 4c 69  end(pParse, pELi
5250: 73 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  st, pExpr, 0);. 
5260: 20 7d 0a 20 20 70 53 65 6c 65 63 74 20 3d 20 73   }.  pSelect = s
5270: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
5280: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
5290: 70 53 72 63 2c 20 70 57 68 65 72 65 2c 20 30 2c  pSrc, pWhere, 0,
52a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b   0, 0, 0, 0, 0);
52b0: 0a 20 20 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  .  .  /* Create 
52c0: 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
52d0: 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74  ble into which t
52e0: 68 65 20 75 70 64 61 74 65 20 72 65 73 75 6c 74  he update result
52f0: 73 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 73  s will.  ** be s
5300: 74 6f 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  tored..  */.  as
5310: 73 65 72 74 28 20 76 20 29 3b 0a 20 20 65 70 68  sert( v );.  eph
5320: 65 6d 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  emTab = pParse->
5330: 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
5340: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5350: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
5360: 20 65 70 68 65 6d 54 61 62 2c 20 70 54 61 62 2d   ephemTab, pTab-
5370: 3e 6e 43 6f 6c 2b 31 2b 28 70 52 6f 77 69 64 21  >nCol+1+(pRowid!
5380: 3d 30 29 29 3b 0a 0a 20 20 2f 2a 20 66 69 6c 6c  =0));..  /* fill
5390: 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
53a0: 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 64 65 73  able .  */.  des
53b0: 74 2e 69 50 61 72 6d 20 3d 20 65 70 68 65 6d 54  t.iParm = ephemT
53c0: 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  ab;.  sqlite3Sel
53d0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
53e0: 65 63 74 2c 20 26 64 65 73 74 2c 20 30 2c 20 30  ect, &dest, 0, 0
53f0: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 2f 2a 0a 20  , 0, 0);..  /*. 
5400: 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
5410: 65 20 74 6f 20 73 63 61 6e 20 74 68 65 20 65 70  e to scan the ep
5420: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 61 6e  hemeral table an
5430: 64 20 63 61 6c 6c 20 56 44 65 6c 65 74 65 20 61  d call VDelete a
5440: 6e 64 0a 20 20 2a 2a 20 56 49 6e 73 65 72 74 0a  nd.  ** VInsert.
5450: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
5460: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
5470: 65 77 69 6e 64 2c 20 65 70 68 65 6d 54 61 62 2c  ewind, ephemTab,
5480: 20 30 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71   0);.  addr = sq
5490: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
54a0: 41 64 64 72 28 76 29 3b 0a 20 20 73 71 6c 69 74  Addr(v);.  sqlit
54b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
54c0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 65 70 68 65  OP_Column,  ephe
54d0: 6d 54 61 62 2c 20 30 29 3b 0a 20 20 69 66 28 20  mTab, 0);.  if( 
54e0: 70 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71  pRowid ){.    sq
54f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5500: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 65 70  v, OP_Column, ep
5510: 68 65 6d 54 61 62 2c 20 31 29 3b 0a 20 20 7d 65  hemTab, 1);.  }e
5520: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
5530: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5540: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  _Dup, 0, 0);.  }
5550: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
5560: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
5570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5580: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp2(v, OP_Colu
5590: 6d 6e 2c 20 65 70 68 65 6d 54 61 62 2c 20 69 2b  mn, ephemTab, i+
55a0: 31 2b 28 70 52 6f 77 69 64 21 3d 30 29 29 3b 0a  1+(pRowid!=0));.
55b0: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 70 56    }.  pParse->pV
55c0: 69 72 74 75 61 6c 4c 6f 63 6b 20 3d 20 70 54 61  irtualLock = pTa
55d0: 62 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  b;.  sqlite3Vdbe
55e0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 55 70  AddOp4(v, OP_VUp
55f0: 64 61 74 65 2c 20 30 2c 20 70 54 61 62 2d 3e 6e  date, 0, pTab->n
5600: 43 6f 6c 2b 32 2c 20 0a 20 20 20 20 20 20 73 71  Col+2, .      sq
5610: 6c 69 74 65 33 53 74 61 63 6b 54 6f 52 65 67 28  lite3StackToReg(
5620: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43  pParse, pTab->nC
5630: 6f 6c 2b 32 29 2c 20 0a 20 20 20 20 20 20 28 63  ol+2), .      (c
5640: 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 61 62 2d  onst char*)pTab-
5650: 3e 70 56 74 61 62 2c 20 50 34 5f 56 54 41 42 0a  >pVtab, P4_VTAB.
5660: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64    );.  sqlite3Vd
5670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
5680: 65 78 74 2c 20 65 70 68 65 6d 54 61 62 2c 20 61  ext, ephemTab, a
5690: 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ddr);.  sqlite3V
56a0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
56b0: 64 64 72 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  ddr-1);.  sqlite
56c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
56d0: 50 5f 43 6c 6f 73 65 2c 20 65 70 68 65 6d 54 61  P_Close, ephemTa
56e0: 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65  b, 0);..  /* Cle
56f0: 61 6e 75 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  anup */.  sqlite
5700: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
5710: 65 6c 65 63 74 29 3b 20 20 0a 7d 0a 23 65 6e 64  elect);  .}.#end
5720: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
5730: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
5740: 2f 0a                                            /.