/ Hex Artifact Content
Login

Artifact f9a03233577e0c3d57234d1957963875fc941da2:


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 38 34 20 32 30 30 34 2f 30 36 2f 31 36   1.84 2004/06/16
0200: 20 31 32 3a 30 32 3a 35 32 20 64 61 6e 69 65 6c   12:02:52 daniel
0210: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  nt.h"../*.** Pro
0240: 63 65 73 73 20 61 6e 20 55 50 44 41 54 45 20 73  cess an UPDATE s
0250: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
0260: 20 20 55 50 44 41 54 45 20 4f 52 20 49 47 4e 4f    UPDATE OR IGNO
0270: 52 45 20 74 61 62 6c 65 5f 77 78 79 7a 20 53 45  RE table_wxyz SE
0280: 54 20 61 3d 62 2c 20 63 3d 64 20 57 48 45 52 45  T a=b, c=d WHERE
0290: 20 65 3c 35 20 41 4e 44 20 66 20 4e 4f 54 20 4e   e<5 AND f NOT N
02a0: 55 4c 4c 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ULL;.**         
02b0: 20 5c 5f 5f 5f 5f 5f 5f 5f 2f 20 5c 5f 5f 5f 5f   \_______/ \____
02c0: 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f  ____/     \_____
02d0: 5f 2f 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  _/       \______
02e0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 20 20 20  __________/.*   
02f0: 20 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72           onError
0300: 20 20 20 70 54 61 62 4c 69 73 74 20 20 20 20 20     pTabList     
0310: 20 70 43 68 61 6e 67 65 73 20 20 20 20 20 20 20   pChanges       
0320: 20 20 20 20 20 20 70 57 68 65 72 65 0a 2a 2f 0a        pWhere.*/.
0330: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 70 64 61  void sqlite3Upda
0340: 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  te(.  Parse *pPa
0350: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
0360: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
0370: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
0380: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 2f  *pTabList,     /
0390: 2a 20 54 68 65 20 74 61 62 6c 65 20 69 6e 20 77  * The table in w
03a0: 68 69 63 68 20 77 65 20 73 68 6f 75 6c 64 20 63  hich we should c
03b0: 68 61 6e 67 65 20 74 68 69 6e 67 73 20 2a 2f 0a  hange things */.
03c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61    ExprList *pCha
03d0: 6e 67 65 73 2c 20 20 20 20 2f 2a 20 54 68 69 6e  nges,    /* Thin
03e0: 67 73 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  gs to be changed
03f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0400: 72 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re,          /* 
0410: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
0420: 2e 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a  .  May be null *
0430: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20  /.  int onError 
0440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
0450: 77 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73  w to handle cons
0460: 74 72 61 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f  traint errors */
0470: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
0480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0490: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
04a0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
04b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
04c0: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 75 70 64   table to be upd
04d0: 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ated */.  int ad
04e0: 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dr = 0;         
04f0: 20 2f 2a 20 56 44 42 45 20 69 6e 73 74 72 75 63   /* VDBE instruc
0500: 74 69 6f 6e 20 61 64 64 72 65 73 73 20 6f 66 20  tion address of 
0510: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0520: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
0530: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
0540: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
0550: 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45   about the WHERE
0560: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 56 64 62   clause */.  Vdb
0570: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
0580: 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
0590: 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  al database engi
05a0: 6e 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ne */.  Index *p
05b0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Idx;           /
05c0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
05d0: 65 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  er indices */.  
05e0: 69 6e 74 20 6e 49 64 78 3b 20 20 20 20 20 20 20  int nIdx;       
05f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0600: 20 6f 66 20 69 6e 64 69 63 65 73 20 74 68 61 74   of indices that
0610: 20 6e 65 65 64 20 75 70 64 61 74 69 6e 67 20 2a   need updating *
0620: 2f 0a 20 20 69 6e 74 20 6e 49 64 78 54 6f 74 61  /.  int nIdxTota
0630: 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  l;         /* To
0640: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
0650: 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  dices */.  int i
0660: 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
0670: 20 20 2f 2a 20 56 44 42 45 20 43 75 72 73 6f 72    /* VDBE Cursor
0680: 20 6e 75 6d 62 65 72 20 6f 66 20 70 54 61 62 20   number of pTab 
0690: 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  */.  sqlite *db;
06a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
06b0: 68 65 20 64 61 74 61 62 61 73 65 20 73 74 72 75  he database stru
06c0: 63 74 75 72 65 20 2a 2f 0a 20 20 49 6e 64 65 78  cture */.  Index
06d0: 20 2a 2a 61 70 49 64 78 20 3d 20 30 3b 20 20 20   **apIdx = 0;   
06e0: 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66    /* An array of
06f0: 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 6e 65   indices that ne
0700: 65 64 20 75 70 64 61 74 69 6e 67 20 74 6f 6f 20  ed updating too 
0710: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 49 64 78 55  */.  char *aIdxU
0720: 73 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 61  sed = 0;    /* a
0730: 49 64 78 55 73 65 64 5b 69 5d 3d 3d 31 20 69 66  IdxUsed[i]==1 if
0740: 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   the i-th index 
0750: 69 73 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  is used */.  int
0760: 20 2a 61 58 52 65 66 20 3d 20 30 3b 20 20 20 20   *aXRef = 0;    
0770: 20 20 20 20 2f 2a 20 61 58 52 65 66 5b 69 5d 20      /* aXRef[i] 
0780: 69 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  is the index in 
0790: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 5d 20 6f 66  pChanges->a[] of
07a0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
07b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
07c0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   an expression f
07d0: 6f 72 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75  or the i-th colu
07e0: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  mn of the table.
07f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0800: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 58 52            ** aXR
0810: 65 66 5b 69 5d 3d 3d 2d 31 20 69 66 20 74 68 65  ef[i]==-1 if the
0820: 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 69 73 20   i-th column is 
0830: 6e 6f 74 20 63 68 61 6e 67 65 64 2e 20 2a 2f 0a  not changed. */.
0840: 20 20 69 6e 74 20 63 68 6e 67 52 65 63 6e 6f 3b    int chngRecno;
0850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
0860: 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 6e   if the record n
0870: 75 6d 62 65 72 20 69 73 20 62 65 69 6e 67 20 63  umber is being c
0880: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 45 78 70 72  hanged */.  Expr
0890: 20 2a 70 52 65 63 6e 6f 45 78 70 72 20 3d 20 30   *pRecnoExpr = 0
08a0: 3b 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e  ;  /* Expression
08b0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 6e 65   defining the ne
08c0: 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  w record number 
08d0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 41 6c 6c  */.  int openAll
08e0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
08f0: 72 75 65 20 69 66 20 61 6c 6c 20 69 6e 64 69 63  rue if all indic
0900: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6f 70  es need to be op
0910: 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ened */.  int is
0920: 56 69 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  View;           
0930: 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 75 70   /* Trying to up
0940: 64 61 74 65 20 61 20 76 69 65 77 20 2a 2f 0a 20  date a view */. 
0950: 20 41 75 74 68 43 6f 6e 74 65 78 74 20 73 43 6f   AuthContext sCo
0960: 6e 74 65 78 74 3b 20 20 2f 2a 20 54 68 65 20 61  ntext;  /* The a
0970: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 6f 6e  uthorization con
0980: 74 65 78 74 20 2a 2f 0a 0a 20 20 69 6e 74 20 62  text */..  int b
0990: 65 66 6f 72 65 5f 74 72 69 67 67 65 72 73 3b 20  efore_triggers; 
09a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
09b0: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
09c0: 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73   BEFORE triggers
09d0: 20 2a 2f 0a 20 20 69 6e 74 20 61 66 74 65 72 5f   */.  int after_
09e0: 74 72 69 67 67 65 72 73 3b 20 20 20 20 20 20 20  triggers;       
09f0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
0a00: 65 72 65 20 61 72 65 20 61 6e 79 20 41 46 54 45  ere are any AFTE
0a10: 52 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20  R triggers */.  
0a20: 69 6e 74 20 72 6f 77 5f 74 72 69 67 67 65 72 73  int row_triggers
0a30: 5f 65 78 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20  _exist = 0;  /* 
0a40: 54 72 75 65 20 69 66 20 61 6e 79 20 72 6f 77 20  True if any row 
0a50: 74 72 69 67 67 65 72 73 20 65 78 69 73 74 20 2a  triggers exist *
0a60: 2f 0a 0a 20 20 69 6e 74 20 6e 65 77 49 64 78 20  /..  int newIdx 
0a70: 20 20 20 20 20 3d 20 2d 31 3b 20 20 2f 2a 20 69       = -1;  /* i
0a80: 6e 64 65 78 20 6f 66 20 74 72 69 67 67 65 72 20  ndex of trigger 
0a90: 22 6e 65 77 22 20 74 65 6d 70 20 74 61 62 6c 65  "new" temp table
0aa0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 69 6e 74 20         */.  int 
0ab0: 6f 6c 64 49 64 78 20 20 20 20 20 20 3d 20 2d 31  oldIdx      = -1
0ac0: 3b 20 20 2f 2a 20 69 6e 64 65 78 20 6f 66 20 74  ;  /* index of t
0ad0: 72 69 67 67 65 72 20 22 6f 6c 64 22 20 74 65 6d  rigger "old" tem
0ae0: 70 20 74 61 62 6c 65 20 20 20 20 20 20 20 2a 2f  p table       */
0af0: 0a 0a 20 20 73 43 6f 6e 74 65 78 74 2e 70 50 61  ..  sContext.pPa
0b00: 72 73 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rse = 0;.  if( p
0b10: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
0b20: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
0b30: 69 6c 65 64 20 29 20 67 6f 74 6f 20 75 70 64 61  iled ) goto upda
0b40: 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 64 62  te_cleanup;.  db
0b50: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0b60: 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73   assert( pTabLis
0b70: 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 0a 20  t->nSrc==1 );.. 
0b80: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74   /* Locate the t
0b90: 61 62 6c 65 20 77 68 69 63 68 20 77 65 20 77 61  able which we wa
0ba0: 6e 74 20 74 6f 20 75 70 64 61 74 65 2e 20 0a 20  nt to update. . 
0bb0: 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   */.  pTab = sql
0bc0: 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
0bd0: 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  p(pParse, pTabLi
0be0: 73 74 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  st);.  if( pTab=
0bf0: 3d 30 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65  =0 ) goto update
0c00: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 62 65 66 6f  _cleanup;.  befo
0c10: 72 65 5f 74 72 69 67 67 65 72 73 20 3d 20 73 71  re_triggers = sq
0c20: 6c 69 74 65 33 54 72 69 67 67 65 72 73 45 78 69  lite3TriggersExi
0c30: 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  st(pParse, pTab-
0c40: 3e 70 54 72 69 67 67 65 72 2c 20 0a 20 20 20 20  >pTrigger, .    
0c50: 20 20 20 20 20 20 20 20 54 4b 5f 55 50 44 41 54          TK_UPDAT
0c60: 45 2c 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54 4b  E, TK_BEFORE, TK
0c70: 5f 52 4f 57 2c 20 70 43 68 61 6e 67 65 73 29 3b  _ROW, pChanges);
0c80: 0a 20 20 61 66 74 65 72 5f 74 72 69 67 67 65 72  .  after_trigger
0c90: 73 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  s = sqlite3Trigg
0ca0: 65 72 73 45 78 69 73 74 28 70 50 61 72 73 65 2c  ersExist(pParse,
0cb0: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 2c   pTab->pTrigger,
0cc0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 4b   .            TK
0cd0: 5f 55 50 44 41 54 45 2c 20 54 4b 5f 41 46 54 45  _UPDATE, TK_AFTE
0ce0: 52 2c 20 54 4b 5f 52 4f 57 2c 20 70 43 68 61 6e  R, TK_ROW, pChan
0cf0: 67 65 73 29 3b 0a 20 20 72 6f 77 5f 74 72 69 67  ges);.  row_trig
0d00: 67 65 72 73 5f 65 78 69 73 74 20 3d 20 62 65 66  gers_exist = bef
0d10: 6f 72 65 5f 74 72 69 67 67 65 72 73 20 7c 7c 20  ore_triggers || 
0d20: 61 66 74 65 72 5f 74 72 69 67 67 65 72 73 3b 0a  after_triggers;.
0d30: 20 20 69 73 56 69 65 77 20 3d 20 70 54 61 62 2d    isView = pTab-
0d40: 3e 70 53 65 6c 65 63 74 21 3d 30 3b 0a 20 20 69  >pSelect!=0;.  i
0d50: 66 28 20 73 71 6c 69 74 65 33 49 73 52 65 61 64  f( sqlite3IsRead
0d60: 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20 70 54 61  Only(pParse, pTa
0d70: 62 2c 20 62 65 66 6f 72 65 5f 74 72 69 67 67 65  b, before_trigge
0d80: 72 73 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  rs) ){.    goto 
0d90: 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a  update_cleanup;.
0da0: 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69 65 77    }.  if( isView
0db0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
0dc0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
0dd0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
0de0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ab) ){.      got
0df0: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
0e00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 58  ;.    }.  }.  aX
0e10: 52 65 66 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Ref = sqliteMall
0e20: 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 69 6e  ocRaw( sizeof(in
0e30: 74 29 20 2a 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  t) * pTab->nCol 
0e40: 29 3b 0a 20 20 69 66 28 20 61 58 52 65 66 3d 3d  );.  if( aXRef==
0e50: 30 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65 5f  0 ) goto update_
0e60: 63 6c 65 61 6e 75 70 3b 0a 20 20 66 6f 72 28 69  cleanup;.  for(i
0e70: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
0e80: 3b 20 69 2b 2b 29 20 61 58 52 65 66 5b 69 5d 20  ; i++) aXRef[i] 
0e90: 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  = -1;..  /* If t
0ea0: 68 65 72 65 20 61 72 65 20 46 4f 52 20 45 41 43  here are FOR EAC
0eb0: 48 20 52 4f 57 20 74 72 69 67 67 65 72 73 2c 20  H ROW triggers, 
0ec0: 61 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  allocate cursors
0ed0: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 70   for the.  ** sp
0ee0: 65 63 69 61 6c 20 4f 4c 44 20 61 6e 64 20 4e 45  ecial OLD and NE
0ef0: 57 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20  W tables.  */.  
0f00: 69 66 28 20 72 6f 77 5f 74 72 69 67 67 65 72 73  if( row_triggers
0f10: 5f 65 78 69 73 74 20 29 7b 0a 20 20 20 20 6e 65  _exist ){.    ne
0f20: 77 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  wIdx = pParse->n
0f30: 54 61 62 2b 2b 3b 0a 20 20 20 20 6f 6c 64 49 64  Tab++;.    oldId
0f40: 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
0f50: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  ++;.  }..  /* Al
0f60: 6c 6f 63 61 74 65 20 61 20 63 75 72 73 6f 72 73  locate a cursors
0f70: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
0f80: 74 61 62 61 73 65 20 74 61 62 6c 65 20 61 6e 64  tabase table and
0f90: 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73   for all indices
0fa0: 2e 0a 20 20 2a 2a 20 54 68 65 20 69 6e 64 65 78  ..  ** The index
0fb0: 20 63 75 72 73 6f 72 73 20 6d 69 67 68 74 20 6e   cursors might n
0fc0: 6f 74 20 62 65 20 75 73 65 64 2c 20 62 75 74 20  ot be used, but 
0fd0: 69 66 20 74 68 65 79 20 61 72 65 20 75 73 65 64  if they are used
0fe0: 20 74 68 65 79 0a 20 20 2a 2a 20 6e 65 65 64 20   they.  ** need 
0ff0: 74 6f 20 6f 63 63 75 72 20 72 69 67 68 74 20 61  to occur right a
1000: 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73  fter the databas
1010: 65 20 63 75 72 73 6f 72 2e 20 20 53 6f 20 67 6f  e cursor.  So go
1020: 20 61 68 65 61 64 20 61 6e 64 0a 20 20 2a 2a 20   ahead and.  ** 
1030: 61 6c 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20  allocate enough 
1040: 73 70 61 63 65 2c 20 6a 75 73 74 20 69 6e 20 63  space, just in c
1050: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ase..  */.  pTab
1060: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
1070: 6f 72 20 3d 20 69 43 75 72 20 3d 20 70 50 61 72  or = iCur = pPar
1080: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 66 6f  se->nTab++;.  fo
1090: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
10a0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
10b0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
10c0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b    pParse->nTab++
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f  ;.  }..  /* Reso
10e0: 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  lve the column n
10f0: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 74 68 65 20  ames in all the 
1100: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
1110: 68 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 55  he.  ** of the U
1120: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
1130: 20 20 41 6c 73 6f 20 66 69 6e 64 20 74 68 65 20    Also find the 
1140: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 20 20 2a  column index.  *
1150: 2a 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  * for each colum
1160: 6e 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  n to be updated 
1170: 69 6e 20 74 68 65 20 70 43 68 61 6e 67 65 73 20  in the pChanges 
1180: 61 72 72 61 79 2e 20 20 46 6f 72 20 65 61 63 68  array.  For each
1190: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 74 6f 20  .  ** column to 
11a0: 62 65 20 75 70 64 61 74 65 64 2c 20 6d 61 6b 65  be updated, make
11b0: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61 75   sure we have au
11c0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63  thorization to c
11d0: 68 61 6e 67 65 0a 20 20 2a 2a 20 74 68 61 74 20  hange.  ** that 
11e0: 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2f 0a 20 20 63  column..  */.  c
11f0: 68 6e 67 52 65 63 6e 6f 20 3d 20 30 3b 0a 20 20  hngRecno = 0;.  
1200: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 61 6e  for(i=0; i<pChan
1210: 67 65 73 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ges->nExpr; i++)
1220: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1230: 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  3ExprResolveIds(
1240: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
1250: 2c 20 30 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61  , 0, pChanges->a
1260: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
1270: 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
1280: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
1290: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
12a0: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
12b0: 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 70  pChanges->a[i].p
12c0: 45 78 70 72 2c 20 30 2c 20 30 29 20 29 7b 0a 20  Expr, 0, 0) ){. 
12d0: 20 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65       goto update
12e0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a  _cleanup;.    }.
12f0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1300: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
1310: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1320: 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e  e3StrICmp(pTab->
1330: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
1340: 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e  Changes->a[i].zN
1350: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
1360: 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e     if( j==pTab->
1370: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
1380: 20 20 20 63 68 6e 67 52 65 63 6e 6f 20 3d 20 31     chngRecno = 1
1390: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 63  ;.          pRec
13a0: 6e 6f 45 78 70 72 20 3d 20 70 43 68 61 6e 67 65  noExpr = pChange
13b0: 73 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  s->a[i].pExpr;. 
13c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13d0: 20 61 58 52 65 66 5b 6a 5d 20 3d 20 69 3b 0a 20   aXRef[j] = i;. 
13e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1400: 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
1410: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  l ){.      if( s
1420: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 70 43  qlite3IsRowid(pC
1430: 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e 61  hanges->a[i].zNa
1440: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  me) ){.        c
1450: 68 6e 67 52 65 63 6e 6f 20 3d 20 31 3b 0a 20 20  hngRecno = 1;.  
1460: 20 20 20 20 20 20 70 52 65 63 6e 6f 45 78 70 72        pRecnoExpr
1470: 20 3d 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69   = pChanges->a[i
1480: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  ].pExpr;.      }
1490: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
14a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14b0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63  arse, "no such c
14c0: 6f 6c 75 6d 6e 3a 20 25 73 22 2c 20 70 43 68 61  olumn: %s", pCha
14d0: 6e 67 65 73 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  nges->a[i].zName
14e0: 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
14f0: 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a  update_cleanup;.
1500: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
1510: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1520: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
1530: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
1540: 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  rc;.      rc = s
1550: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1560: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 55  pParse, SQLITE_U
1570: 50 44 41 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  PDATE, pTab->zNa
1580: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15a0: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
15b0: 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 70 54 61 62  me, db->aDb[pTab
15c0: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->iDb].zName);. 
15d0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
15e0: 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20  ITE_DENY ){.    
15f0: 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
1600: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d  cleanup;.      }
1610: 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1620: 49 54 45 5f 49 47 4e 4f 52 45 20 29 7b 0a 20 20  ITE_IGNORE ){.  
1630: 20 20 20 20 20 20 61 58 52 65 66 5b 6a 5d 20 3d        aXRef[j] =
1640: 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1650: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
1660: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
1670: 6f 72 79 20 66 6f 72 20 74 68 65 20 61 72 72 61  ory for the arra
1680: 79 20 61 70 49 64 78 5b 5d 20 61 6e 64 20 66 69  y apIdx[] and fi
1690: 6c 6c 20 69 74 20 77 69 74 68 20 70 6f 69 6e 74  ll it with point
16a0: 65 72 73 20 74 6f 20 65 76 65 72 79 0a 20 20 2a  ers to every.  *
16b0: 2a 20 69 6e 64 65 78 20 74 68 61 74 20 6e 65 65  * index that nee
16c0: 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
16d0: 2e 20 20 49 6e 64 69 63 65 73 20 6f 6e 6c 79 20  .  Indices only 
16e0: 6e 65 65 64 20 75 70 64 61 74 69 6e 67 20 69 66  need updating if
16f0: 20 74 68 65 69 72 0a 20 20 2a 2a 20 6b 65 79 20   their.  ** key 
1700: 69 6e 63 6c 75 64 65 73 20 6f 6e 65 20 6f 66 20  includes one of 
1710: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
1720: 64 20 69 6e 20 70 43 68 61 6e 67 65 73 20 6f 72  d in pChanges or
1730: 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 0a 20   if the record. 
1740: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 74 68   ** number of th
1750: 65 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65  e original table
1760: 20 65 6e 74 72 79 20 69 73 20 63 68 61 6e 67 69   entry is changi
1770: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6e  ng..  */.  for(n
1780: 49 64 78 3d 6e 49 64 78 54 6f 74 61 6c 3d 30 2c  Idx=nIdxTotal=0,
1790: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
17a0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
17b0: 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78  Idx->pNext, nIdx
17c0: 54 6f 74 61 6c 2b 2b 29 7b 0a 20 20 20 20 69 66  Total++){.    if
17d0: 28 20 63 68 6e 67 52 65 63 6e 6f 20 29 7b 0a 20  ( chngRecno ){. 
17e0: 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20       i = 0;.    
17f0: 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 66 6f  }else {.      fo
1800: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
1810: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
1820: 20 20 20 20 20 20 69 66 28 20 61 58 52 65 66 5b        if( aXRef[
1830: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
1840: 5d 5d 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ]]>=0 ) break;. 
1850: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1860: 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43 6f   if( i<pIdx->nCo
1870: 6c 75 6d 6e 20 29 20 6e 49 64 78 2b 2b 3b 0a 20  lumn ) nIdx++;. 
1880: 20 7d 0a 20 20 69 66 28 20 6e 49 64 78 54 6f 74   }.  if( nIdxTot
1890: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 61 70 49 64  al>0 ){.    apId
18a0: 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
18b0: 52 61 77 28 20 73 69 7a 65 6f 66 28 49 6e 64 65  Raw( sizeof(Inde
18c0: 78 2a 29 20 2a 20 6e 49 64 78 20 2b 20 6e 49 64  x*) * nIdx + nId
18d0: 78 54 6f 74 61 6c 20 29 3b 0a 20 20 20 20 69 66  xTotal );.    if
18e0: 28 20 61 70 49 64 78 3d 3d 30 20 29 20 67 6f 74  ( apIdx==0 ) got
18f0: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
1900: 3b 0a 20 20 20 20 61 49 64 78 55 73 65 64 20 3d  ;.    aIdxUsed =
1910: 20 28 63 68 61 72 2a 29 26 61 70 49 64 78 5b 6e   (char*)&apIdx[n
1920: 49 64 78 5d 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Idx];.  }.  for(
1930: 6e 49 64 78 3d 6a 3d 30 2c 20 70 49 64 78 3d 70  nIdx=j=0, pIdx=p
1940: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
1950: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
1960: 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  ext, j++){.    i
1970: 66 28 20 63 68 6e 67 52 65 63 6e 6f 20 29 7b 0a  f( chngRecno ){.
1980: 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20        i = 0;.   
1990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
19a0: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
19b0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
19c0: 20 20 20 20 20 20 69 66 28 20 61 58 52 65 66 5b        if( aXRef[
19d0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
19e0: 5d 5d 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ]]>=0 ) break;. 
19f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a00: 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43 6f   if( i<pIdx->nCo
1a10: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  lumn ){.      if
1a20: 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e  ( sqlite3CheckIn
1a30: 64 65 78 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  dexCollSeq(pPars
1a40: 65 2c 20 70 49 64 78 29 20 29 20 67 6f 74 6f 20  e, pIdx) ) goto 
1a50: 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a  update_cleanup;.
1a60: 20 20 20 20 20 20 61 70 49 64 78 5b 6e 49 64 78        apIdx[nIdx
1a70: 2b 2b 5d 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  ++] = pIdx;.    
1a80: 20 20 61 49 64 78 55 73 65 64 5b 6a 5d 20 3d 20    aIdxUsed[j] = 
1a90: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1aa0: 20 20 20 20 61 49 64 78 55 73 65 64 5b 6a 5d 20      aIdxUsed[j] 
1ab0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
1ac0: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    /* Resolve the
1ad0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e   column names in
1ae0: 20 61 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73   all the express
1af0: 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a  ions in the.  **
1b00: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
1b10: 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65   */.  if( pWhere
1b20: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
1b30: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64  te3ExprResolveId
1b40: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
1b50: 73 74 2c 20 30 2c 20 70 57 68 65 72 65 29 20 29  st, 0, pWhere) )
1b60: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 75 70 64  {.      goto upd
1b70: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ate_cleanup;.   
1b80: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
1b90: 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  e3ExprCheck(pPar
1ba0: 73 65 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30  se, pWhere, 0, 0
1bb0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1bc0: 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a  update_cleanup;.
1bd0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1be0: 53 74 61 72 74 20 74 68 65 20 76 69 65 77 20 63  Start the view c
1bf0: 6f 6e 74 65 78 74 0a 20 20 2a 2f 0a 20 20 69 66  ontext.  */.  if
1c00: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
1c10: 73 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65  sqlite3AuthConte
1c20: 78 74 50 75 73 68 28 70 50 61 72 73 65 2c 20 26  xtPush(pParse, &
1c30: 73 43 6f 6e 74 65 78 74 2c 20 70 54 61 62 2d 3e  sContext, pTab->
1c40: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  zName);.  }..  /
1c50: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
1c60: 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
1c70: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1c80: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1c90: 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70  ( v==0 ) goto up
1ca0: 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  date_cleanup;.  
1cb0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1cc0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1cd0: 65 2c 20 31 2c 20 70 54 61 62 2d 3e 69 44 62 29  e, 1, pTab->iDb)
1ce0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  ;..  /* If we ar
1cf0: 65 20 74 72 79 69 6e 67 20 74 6f 20 75 70 64 61  e trying to upda
1d00: 74 65 20 61 20 76 69 65 77 2c 20 63 6f 6e 73 74  te a view, const
1d10: 72 75 63 74 20 74 68 61 74 20 76 69 65 77 20 69  ruct that view i
1d20: 6e 74 6f 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  nto.  ** a tempo
1d30: 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  rary table..  */
1d40: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b  .  if( isView ){
1d50: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 56 69  .    Select *pVi
1d60: 65 77 3b 0a 20 20 20 20 70 56 69 65 77 20 3d 20  ew;.    pView = 
1d70: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
1d80: 28 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b  (pTab->pSelect);
1d90: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1da0: 63 74 28 70 50 61 72 73 65 2c 20 70 56 69 65 77  ct(pParse, pView
1db0: 2c 20 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 2c  , SRT_TempTable,
1dc0: 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 30 2c 20   iCur, 0, 0, 0, 
1dd0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  0);.    sqlite3S
1de0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 56 69 65  electDelete(pVie
1df0: 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  w);.  }..  /* Be
1e00: 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
1e10: 20 73 63 61 6e 0a 20 20 2a 2f 0a 20 20 70 57 49   scan.  */.  pWI
1e20: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
1e30: 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
1e40: 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
1e50: 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  , 1, 0);.  if( p
1e60: 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
1e70: 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a  update_cleanup;.
1e80: 0a 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74  .  /* Remember t
1e90: 68 65 20 69 6e 64 65 78 20 6f 66 20 65 76 65 72  he index of ever
1ea0: 79 20 69 74 65 6d 20 74 6f 20 62 65 20 75 70 64  y item to be upd
1eb0: 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ated..  */.  sql
1ec0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1ed0: 20 4f 50 5f 4c 69 73 74 57 72 69 74 65 2c 20 30   OP_ListWrite, 0
1ee0: 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20  , 0);..  /* End 
1ef0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
1f00: 6e 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73  n loop..  */.  s
1f10: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
1f20: 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 6e  WInfo);..  /* In
1f30: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75  itialize the cou
1f40: 6e 74 20 6f 66 20 75 70 64 61 74 65 64 20 72 6f  nt of updated ro
1f50: 77 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  ws.  */.  if( db
1f60: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1f70: 5f 43 6f 75 6e 74 52 6f 77 73 20 26 26 20 21 70  _CountRows && !p
1f80: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
1f90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1fa0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
1fb0: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
1fc0: 20 7d 0a 0a 20 20 69 66 28 20 72 6f 77 5f 74 72   }..  if( row_tr
1fd0: 69 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a  iggers_exist ){.
1fe0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 70 73      /* Create ps
1ff0: 65 75 64 6f 2d 74 61 62 6c 65 73 20 66 6f 72 20  eudo-tables for 
2000: 4e 45 57 20 61 6e 64 20 4f 4c 44 0a 20 20 20 20  NEW and OLD.    
2010: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
2020: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
2030: 65 6e 50 73 65 75 64 6f 2c 20 6f 6c 64 49 64 78  enPseudo, oldIdx
2040: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2050: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2060: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
2070: 6f 6c 64 49 64 78 2c 20 70 54 61 62 2d 3e 6e 43  oldIdx, pTab->nC
2080: 6f 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ol);.    sqlite3
2090: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
20a0: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 6e 65 77 49  OpenPseudo, newI
20b0: 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  dx, 0);.    sqli
20c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
20d0: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
20e0: 2c 20 6e 65 77 49 64 78 2c 20 70 54 61 62 2d 3e  , newIdx, pTab->
20f0: 6e 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  nCol);..    /* T
2100: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 75 70  he top of the up
2110: 64 61 74 65 20 6c 6f 6f 70 20 66 6f 72 20 77 68  date loop for wh
2120: 65 6e 20 74 68 65 72 65 20 61 72 65 20 74 72 69  en there are tri
2130: 67 67 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ggers..    */.  
2140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2150: 4f 70 28 76 2c 20 4f 50 5f 4c 69 73 74 52 65 77  Op(v, OP_ListRew
2160: 69 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ind, 0, 0);.    
2170: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2180: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 69  beAddOp(v, OP_Li
2190: 73 74 52 65 61 64 2c 20 30 2c 20 30 29 3b 0a 20  stRead, 0, 0);. 
21a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21b0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
21c0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  , 0);..    /* Op
21d0: 65 6e 20 61 20 63 75 72 73 6f 72 20 61 6e 64 20  en a cursor and 
21e0: 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
21f0: 20 74 68 65 20 72 65 63 6f 72 64 20 74 68 61 74   the record that
2200: 20 69 73 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67   is.    ** being
2210: 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2f   updated..    */
2220: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2230: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
2240: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
2250: 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20  !isView ){.     
2260: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2270: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
2280: 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a   pTab->iDb, 0);.
2290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
22b0: 6e 52 65 61 64 2c 20 69 43 75 72 2c 20 70 54 61  nRead, iCur, pTa
22c0: 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  b->tnum);.      
22d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22e0: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
22f0: 75 6d 6e 73 2c 20 69 43 75 72 2c 20 70 54 61 62  umns, iCur, pTab
2300: 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  ->nCol);.    }. 
2310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2320: 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65  dOp(v, OP_MoveGe
2330: 2c 20 69 43 75 72 2c 20 30 29 3b 0a 0a 20 20 20  , iCur, 0);..   
2340: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
2350: 20 4f 4c 44 20 74 61 62 6c 65 0a 20 20 20 20 2a   OLD table.    *
2360: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
2370: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63  eAddOp(v, OP_Rec
2380: 6e 6f 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20  no, iCur, 0);.  
2390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23a0: 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  Op(v, OP_RowData
23b0: 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  , iCur, 0);.    
23c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23d0: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
23e0: 2c 20 6f 6c 64 49 64 78 2c 20 30 29 3b 0a 0a 20  , oldIdx, 0);.. 
23f0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74     /* Generate t
2400: 68 65 20 4e 45 57 20 74 61 62 6c 65 0a 20 20 20  he NEW table.   
2410: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 68 6e 67   */.    if( chng
2420: 52 65 63 6e 6f 20 29 7b 0a 20 20 20 20 20 20 73  Recno ){.      s
2430: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
2440: 50 61 72 73 65 2c 20 70 52 65 63 6e 6f 45 78 70  Parse, pRecnoExp
2450: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
2460: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2470: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e  AddOp(v, OP_Recn
2480: 6f 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20  o, iCur, 0);.   
2490: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
24a0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
24b0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  +){.      if( i=
24c0: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
24d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
24f0: 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20  tring8, 0, 0);. 
2500: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2510: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
2520: 20 3d 20 61 58 52 65 66 5b 69 5d 3b 0a 20 20 20   = aXRef[i];.   
2530: 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
2540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2550: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
2560: 75 6d 6e 2c 20 69 43 75 72 2c 20 69 29 3b 0a 20  umn, iCur, i);. 
2570: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2580: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2590: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 68 61  ode(pParse, pCha
25a0: 6e 67 65 73 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  nges->a[j].pExpr
25b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
25c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
25d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
25e0: 52 65 63 6f 72 64 2c 20 70 54 61 62 2d 3e 6e 43  Record, pTab->nC
25f0: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ol, 0);.    if( 
2600: 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20  !isView ){.     
2610: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66   sqlite3TableAff
2620: 69 6e 69 74 79 53 74 72 28 76 2c 20 70 54 61 62  inityStr(v, pTab
2630: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2640: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
2650: 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61  goto update_clea
2660: 6e 75 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nup;.    sqlite3
2670: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2680: 50 75 74 49 6e 74 4b 65 79 2c 20 6e 65 77 49 64  PutIntKey, newId
2690: 78 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  x, 0);.    if( !
26a0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
26b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26c0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43  (v, OP_Close, iC
26d0: 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  ur, 0);.    }.. 
26e0: 20 20 20 2f 2a 20 46 69 72 65 20 74 68 65 20 42     /* Fire the B
26f0: 45 46 4f 52 45 20 61 6e 64 20 49 4e 53 54 45 41  EFORE and INSTEA
2700: 44 20 4f 46 20 74 72 69 67 67 65 72 73 0a 20 20  D OF triggers.  
2710: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
2720: 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67  ite3CodeRowTrigg
2730: 65 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 55 50  er(pParse, TK_UP
2740: 44 41 54 45 2c 20 70 43 68 61 6e 67 65 73 2c 20  DATE, pChanges, 
2750: 54 4b 5f 42 45 46 4f 52 45 2c 20 70 54 61 62 2c  TK_BEFORE, pTab,
2760: 20 0a 20 20 20 20 20 20 20 20 20 20 6e 65 77 49   .          newI
2770: 64 78 2c 20 6f 6c 64 49 64 78 2c 20 6f 6e 45 72  dx, oldIdx, onEr
2780: 72 6f 72 2c 20 61 64 64 72 29 20 29 7b 0a 20 20  ror, addr) ){.  
2790: 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
27a0: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
27b0: 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 56 69 65   }..  if( !isVie
27c0: 77 20 29 7b 0a 20 20 20 20 2f 2a 20 0a 20 20 20  w ){.    /* .   
27d0: 20 2a 2a 20 4f 70 65 6e 20 65 76 65 72 79 20 69   ** Open every i
27e0: 6e 64 65 78 20 74 68 61 74 20 6e 65 65 64 73 20  ndex that needs 
27f0: 75 70 64 61 74 69 6e 67 2e 20 20 4e 6f 74 65 20  updating.  Note 
2800: 74 68 61 74 20 69 66 20 61 6e 79 0a 20 20 20 20  that if any.    
2810: 2a 2a 20 69 6e 64 65 78 20 63 6f 75 6c 64 20 70  ** index could p
2820: 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6e 76 6f 6b  otentially invok
2830: 65 20 61 20 52 45 50 4c 41 43 45 20 63 6f 6e 66  e a REPLACE conf
2840: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
2850: 0a 20 20 20 20 2a 2a 20 61 63 74 69 6f 6e 2c 20  .    ** action, 
2860: 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
2870: 6f 70 65 6e 20 61 6c 6c 20 69 6e 64 69 63 65 73  open all indices
2880: 20 62 65 63 61 75 73 65 20 77 65 20 6d 69 67 68   because we migh
2890: 74 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  t need.    ** to
28a0: 20 62 65 20 64 65 6c 65 74 69 6e 67 20 73 6f 6d   be deleting som
28b0: 65 20 72 65 63 6f 72 64 73 2e 0a 20 20 20 20 2a  e records..    *
28c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
28d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
28e0: 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c  eger, pTab->iDb,
28f0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2900: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2910: 4f 70 65 6e 57 72 69 74 65 2c 20 69 43 75 72 2c  OpenWrite, iCur,
2920: 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20   pTab->tnum);.  
2930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2940: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
2950: 6f 6c 75 6d 6e 73 2c 20 69 43 75 72 2c 20 70 54  olumns, iCur, pT
2960: 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 69  ab->nCol);.    i
2970: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  f( onError==OE_R
2980: 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eplace ){.      
2990: 6f 70 65 6e 41 6c 6c 20 3d 20 31 3b 0a 20 20 20  openAll = 1;.   
29a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 70   }else{.      op
29b0: 65 6e 41 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  enAll = 0;.     
29c0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
29d0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
29e0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
29f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
2a00: 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
2a10: 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eplace ){.      
2a20: 20 20 20 20 6f 70 65 6e 41 6c 6c 20 3d 20 31 3b      openAll = 1;
2a30: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2a40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
2a60: 72 28 69 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  r(i=0, pIdx=pTab
2a70: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
2a80: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
2a90: 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  , i++){.      if
2aa0: 28 20 6f 70 65 6e 41 6c 6c 20 7c 7c 20 61 49 64  ( openAll || aId
2ab0: 78 55 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20  xUsed[i] ){.    
2ac0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ad0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
2ae0: 65 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30  er, pIdx->iDb, 0
2af0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2b00: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
2b10: 4f 70 65 6e 57 72 69 74 65 2c 20 69 43 75 72 2b  OpenWrite, iCur+
2b20: 69 2b 31 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  i+1, pIdx->tnum,
2b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b40: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26          (char*)&
2b50: 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50  pIdx->keyInfo, P
2b60: 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  3_KEYINFO);.    
2b70: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
2b80: 73 65 2d 3e 6e 54 61 62 3e 69 43 75 72 2b 69 2b  se->nTab>iCur+i+
2b90: 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1 );.      }.   
2ba0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20   }..    /* Loop 
2bb0: 6f 76 65 72 20 65 76 65 72 79 20 72 65 63 6f 72  over every recor
2bc0: 64 20 74 68 61 74 20 6e 65 65 64 73 20 75 70 64  d that needs upd
2bd0: 61 74 69 6e 67 2e 20 20 57 65 20 68 61 76 65 20  ating.  We have 
2be0: 74 6f 20 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 74  to load.    ** t
2bf0: 68 65 20 6f 6c 64 20 64 61 74 61 20 66 6f 72 20  he old data for 
2c00: 65 61 63 68 20 72 65 63 6f 72 64 20 74 6f 20 62  each record to b
2c10: 65 20 75 70 64 61 74 65 64 20 62 65 63 61 75 73  e updated becaus
2c20: 65 20 73 6f 6d 65 20 63 6f 6c 75 6d 6e 73 0a 20  e some columns. 
2c30: 20 20 20 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20     ** might not 
2c40: 63 68 61 6e 67 65 20 61 6e 64 20 77 65 20 77 69  change and we wi
2c50: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 6f 70 79 20  ll need to copy 
2c60: 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 20  the old value.. 
2c70: 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 74 68 65 20     ** Also, the 
2c80: 6f 6c 64 20 64 61 74 61 20 69 73 20 6e 65 65 64  old data is need
2c90: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ed to delete the
2ca0: 20 6f 6c 64 20 69 6e 64 65 78 20 65 6e 74 69 72   old index entir
2cb0: 65 73 2e 0a 20 20 20 20 2a 2a 20 53 6f 20 6d 61  es..    ** So ma
2cc0: 6b 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ke the cursor po
2cd0: 69 6e 74 20 61 74 20 74 68 65 20 6f 6c 64 20 72  int at the old r
2ce0: 65 63 6f 72 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ecord..    */.  
2cf0: 20 20 69 66 28 20 21 72 6f 77 5f 74 72 69 67 67    if( !row_trigg
2d00: 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20 20  ers_exist ){.   
2d10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d20: 64 4f 70 28 76 2c 20 4f 50 5f 4c 69 73 74 52 65  dOp(v, OP_ListRe
2d30: 77 69 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  wind, 0, 0);.   
2d40: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
2d50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2d60: 5f 4c 69 73 74 52 65 61 64 2c 20 30 2c 20 30 29  _ListRead, 0, 0)
2d70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2d80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
2d90: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  up, 0, 0);.    }
2da0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2db0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 45  AddOp(v, OP_NotE
2dc0: 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64  xists, iCur, add
2dd0: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  r);..    /* If t
2de0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
2df0: 20 77 69 6c 6c 20 63 68 61 6e 67 65 2c 20 70 75   will change, pu
2e00: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  sh the record nu
2e10: 6d 62 65 72 20 61 73 20 69 74 0a 20 20 20 20 2a  mber as it.    *
2e20: 2a 20 77 69 6c 6c 20 62 65 20 61 66 74 65 72 20  * will be after 
2e30: 74 68 65 20 75 70 64 61 74 65 2e 20 28 54 68 65  the update. (The
2e40: 20 6f 6c 64 20 72 65 63 6f 72 64 20 6e 75 6d 62   old record numb
2e50: 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  er is currently.
2e60: 20 20 20 20 2a 2a 20 6f 6e 20 74 6f 70 20 6f 66      ** on top of
2e70: 20 74 68 65 20 73 74 61 63 6b 2e 29 0a 20 20 20   the stack.).   
2e80: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 68 6e 67   */.    if( chng
2e90: 52 65 63 6e 6f 20 29 7b 0a 20 20 20 20 20 20 73  Recno ){.      s
2ea0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
2eb0: 50 61 72 73 65 2c 20 70 52 65 63 6e 6f 45 78 70  Parse, pRecnoExp
2ec0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
2ed0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2ee0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30  _MustBeInt, 0, 0
2ef0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
2f00: 20 43 6f 6d 70 75 74 65 20 6e 65 77 20 64 61 74   Compute new dat
2f10: 61 20 66 6f 72 20 74 68 69 73 20 72 65 63 6f 72  a for this recor
2f20: 64 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  d.  .    */.    
2f30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
2f40: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
2f50: 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e     if( i==pTab->
2f60: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
2f70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f80: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
2f90: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
2fa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2fb0: 7d 0a 20 20 20 20 20 20 6a 20 3d 20 61 58 52 65  }.      j = aXRe
2fc0: 66 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  f[i];.      if( 
2fd0: 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  j<0 ){.        s
2fe0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2ff0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43  v, OP_Column, iC
3000: 75 72 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 65  ur, i);.      }e
3010: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3020: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
3030: 72 73 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61  rse, pChanges->a
3040: 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [j].pExpr);.    
3050: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
3060: 2a 20 44 6f 20 63 6f 6e 73 74 72 61 69 6e 74 20  * Do constraint 
3070: 63 68 65 63 6b 73 0a 20 20 20 20 2a 2f 0a 20 20  checks.    */.  
3080: 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
3090: 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b  eConstraintCheck
30a0: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  s(pParse, pTab, 
30b0: 69 43 75 72 2c 20 61 49 64 78 55 73 65 64 2c 20  iCur, aIdxUsed, 
30c0: 63 68 6e 67 52 65 63 6e 6f 2c 20 31 2c 0a 20 20  chngRecno, 1,.  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f0: 20 6f 6e 45 72 72 6f 72 2c 20 61 64 64 72 29 3b   onError, addr);
3100: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
3110: 74 68 65 20 6f 6c 64 20 69 6e 64 69 63 65 73 20  the old indices 
3120: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
3130: 72 65 63 6f 72 64 2e 0a 20 20 20 20 2a 2f 0a 20  record..    */. 
3140: 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61     sqlite3Genera
3150: 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65  teRowIndexDelete
3160: 28 64 62 2c 20 76 2c 20 70 54 61 62 2c 20 69 43  (db, v, pTab, iC
3170: 75 72 2c 20 61 49 64 78 55 73 65 64 29 3b 0a 0a  ur, aIdxUsed);..
3180: 20 20 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 69      /* If changi
3190: 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  ng the record nu
31a0: 6d 62 65 72 2c 20 64 65 6c 65 74 65 20 74 68 65  mber, delete the
31b0: 20 6f 6c 64 20 72 65 63 6f 72 64 2e 0a 20 20 20   old record..   
31c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 68 6e 67   */.    if( chng
31d0: 52 65 63 6e 6f 20 29 7b 0a 20 20 20 20 20 20 73  Recno ){.      s
31e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
31f0: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 43  v, OP_Delete, iC
3200: 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  ur, 0);.    }.. 
3210: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
3220: 20 6e 65 77 20 69 6e 64 65 78 20 65 6e 74 72 69   new index entri
3230: 65 73 20 61 6e 64 20 74 68 65 20 6e 65 77 20 72  es and the new r
3240: 65 63 6f 72 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ecord..    */.  
3250: 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 6c 65 74    sqlite3Complet
3260: 65 49 6e 73 65 72 74 69 6f 6e 28 70 50 61 72 73  eInsertion(pPars
3270: 65 2c 20 70 54 61 62 2c 20 69 43 75 72 2c 20 61  e, pTab, iCur, a
3280: 49 64 78 55 73 65 64 2c 20 63 68 6e 67 52 65 63  IdxUsed, chngRec
3290: 6e 6f 2c 20 31 2c 20 2d 31 29 3b 0a 20 20 7d 0a  no, 1, -1);.  }.
32a0: 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
32b0: 74 68 65 20 72 6f 77 20 63 6f 75 6e 74 65 72 20  the row counter 
32c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
32d0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
32e0: 6f 75 6e 74 52 6f 77 73 20 26 26 20 21 70 50 61  ountRows && !pPa
32f0: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 29 7b  rse->trigStack){
3300: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3310: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
3320: 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a  mm, 1, 0);.  }..
3330: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
3340: 65 20 74 72 69 67 67 65 72 73 2c 20 63 6c 6f 73  e triggers, clos
3350: 65 20 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72  e all the cursor
3360: 73 20 61 66 74 65 72 20 65 61 63 68 20 69 74 65  s after each ite
3370: 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 72 6f  ration.  ** thro
3380: 75 67 68 20 74 68 65 20 6c 6f 6f 70 2e 20 20 54  ugh the loop.  T
3390: 68 65 20 66 69 72 65 20 74 68 65 20 61 66 74 65  he fire the afte
33a0: 72 20 74 72 69 67 67 65 72 73 2e 0a 20 20 2a 2f  r triggers..  */
33b0: 0a 20 20 69 66 28 20 72 6f 77 5f 74 72 69 67 67  .  if( row_trigg
33c0: 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20 20  ers_exist ){.   
33d0: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
33e0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
33f0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
3400: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
3410: 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a  x->pNext, i++){.
3420: 20 20 20 20 20 20 20 20 69 66 28 20 6f 70 65 6e          if( open
3430: 41 6c 6c 20 7c 7c 20 61 49 64 78 55 73 65 64 5b  All || aIdxUsed[
3440: 69 5d 20 29 0a 20 20 20 20 20 20 20 20 20 20 73  i] ).          s
3450: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3460: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 75  v, OP_Close, iCu
3470: 72 2b 69 2b 31 2c 20 30 29 3b 0a 20 20 20 20 20  r+i+1, 0);.     
3480: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
3490: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
34a0: 43 6c 6f 73 65 2c 20 69 43 75 72 2c 20 30 29 3b  Close, iCur, 0);
34b0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
34c0: 54 61 62 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  Tab = iCur;.    
34d0: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
34e0: 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28  3CodeRowTrigger(
34f0: 70 50 61 72 73 65 2c 20 54 4b 5f 55 50 44 41 54  pParse, TK_UPDAT
3500: 45 2c 20 70 43 68 61 6e 67 65 73 2c 20 54 4b 5f  E, pChanges, TK_
3510: 41 46 54 45 52 2c 20 70 54 61 62 2c 20 0a 20 20  AFTER, pTab, .  
3520: 20 20 20 20 20 20 20 20 6e 65 77 49 64 78 2c 20          newIdx, 
3530: 6f 6c 64 49 64 78 2c 20 6f 6e 45 72 72 6f 72 2c  oldIdx, onError,
3540: 20 61 64 64 72 29 20 29 7b 0a 20 20 20 20 20 20   addr) ){.      
3550: 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61  goto update_clea
3560: 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nup;.    }.  }..
3570: 20 20 2f 2a 20 52 65 70 65 61 74 20 74 68 65 20    /* Repeat the 
3580: 61 62 6f 76 65 20 77 69 74 68 20 74 68 65 20 6e  above with the n
3590: 65 78 74 20 72 65 63 6f 72 64 20 74 6f 20 62 65  ext record to be
35a0: 20 75 70 64 61 74 65 64 2c 20 75 6e 74 69 6c 0a   updated, until.
35b0: 20 20 2a 2a 20 61 6c 6c 20 72 65 63 6f 72 64 20    ** all record 
35c0: 73 65 6c 65 63 74 65 64 20 62 79 20 74 68 65 20  selected by the 
35d0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 68 61 76  WHERE clause hav
35e0: 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 2e 0a  e been updated..
35f0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
3600: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
3610: 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20  to, 0, addr);.  
3620: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3630: 65 50 32 28 76 2c 20 61 64 64 72 2c 20 73 71 6c  eP2(v, addr, sql
3640: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
3650: 64 64 72 28 76 29 29 3b 0a 20 20 73 71 6c 69 74  ddr(v));.  sqlit
3660: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3670: 50 5f 4c 69 73 74 52 65 73 65 74 2c 20 30 2c 20  P_ListReset, 0, 
3680: 30 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  0);..  /* Close 
3690: 61 6c 6c 20 74 61 62 6c 65 73 20 69 66 20 74 68  all tables if th
36a0: 65 72 65 20 77 65 72 65 20 6e 6f 20 46 4f 52 20  ere were no FOR 
36b0: 45 41 43 48 20 52 4f 57 20 74 72 69 67 67 65 72  EACH ROW trigger
36c0: 73 20 2a 2f 0a 20 20 69 66 28 20 21 72 6f 77 5f  s */.  if( !row_
36d0: 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 29  triggers_exist )
36e0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
36f0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
3700: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
3710: 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a  x->pNext, i++){.
3720: 20 20 20 20 20 20 69 66 28 20 6f 70 65 6e 41 6c        if( openAl
3730: 6c 20 7c 7c 20 61 49 64 78 55 73 65 64 5b 69 5d  l || aIdxUsed[i]
3740: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3750: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3760: 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 75 72 2b 69  OP_Close, iCur+i
3770: 2b 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  +1, 0);.      }.
3780: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
3790: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
37a0: 5f 43 6c 6f 73 65 2c 20 69 43 75 72 2c 20 30 29  _Close, iCur, 0)
37b0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  ;.    pParse->nT
37c0: 61 62 20 3d 20 69 43 75 72 3b 0a 20 20 7d 65 6c  ab = iCur;.  }el
37d0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
37e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
37f0: 6c 6f 73 65 2c 20 6e 65 77 49 64 78 2c 20 30 29  lose, newIdx, 0)
3800: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3810: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
3820: 73 65 2c 20 6f 6c 64 49 64 78 2c 20 30 29 3b 0a  se, oldIdx, 0);.
3830: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64    }..  sqlite3Vd
3840: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
3850: 74 43 6f 75 6e 74 73 2c 20 30 2c 20 30 29 3b 0a  tCounts, 0, 0);.
3860: 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74    sqlite3EndWrit
3870: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
3880: 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52  e);..  /*.  ** R
3890: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
38a0: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65   of rows that we
38b0: 72 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f  re changed..  */
38c0: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
38d0: 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52   & SQLITE_CountR
38e0: 6f 77 73 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ows && !pParse->
38f0: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
3900: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3910: 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
3920: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 1, 0);.    sql
3930: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
3940: 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73 71  ls(v, 1);.    sq
3950: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
3960: 61 6d 65 28 76 2c 20 30 2c 20 22 72 6f 77 73 20  ame(v, 0, "rows 
3970: 75 70 64 61 74 65 64 22 2c 20 50 33 5f 53 54 41  updated", P3_STA
3980: 54 49 43 29 3b 0a 20 20 7d 0a 0a 75 70 64 61 74  TIC);.  }..updat
3990: 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
39a0: 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78 74 50  ite3AuthContextP
39b0: 6f 70 28 26 73 43 6f 6e 74 65 78 74 29 3b 0a 20  op(&sContext);. 
39c0: 20 73 71 6c 69 74 65 46 72 65 65 28 61 70 49 64   sqliteFree(apId
39d0: 78 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  x);.  sqliteFree
39e0: 28 61 58 52 65 66 29 3b 0a 20 20 73 71 6c 69 74  (aXRef);.  sqlit
39f0: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
3a00: 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 73 71 6c  pTabList);.  sql
3a10: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
3a20: 74 65 28 70 43 68 61 6e 67 65 73 29 3b 0a 20 20  te(pChanges);.  
3a30: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3a40: 65 28 70 57 68 65 72 65 29 3b 0a 20 20 72 65 74  e(pWhere);.  ret
3a50: 75 72 6e 3b 0a 7d 0a                             urn;.}.