System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 7be1b109d984747fbce5bc2775270366fab5b5d5:


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 39 20 32 30 30 35 2f 31 30 2f 30 35 20   1.9 2005/10/05 
0200: 31 39 3a 33 38 3a 32 39 20 72 6d 73 69 6d 70 73  19:38:29 rmsimps
0210: 6f 6e 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  on Exp $.*/.#inc
0220: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0230: 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 6f  h"../*.** The mo
0240: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
0250: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 61  d instruction wa
0260: 73 20 61 6e 20 4f 50 5f 43 6f 6c 75 6d 6e 20 74  s an OP_Column t
0270: 6f 20 72 65 74 72 69 65 76 65 20 63 6f 6c 75 6d  o retrieve colum
0280: 6e 0a 2a 2a 20 27 69 27 20 6f 66 20 74 61 62 6c  n.** 'i' of tabl
0290: 65 20 70 54 61 62 2e 20 54 68 69 73 20 72 6f 75  e pTab. This rou
02a0: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 50 33  tine sets the P3
02b0: 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68   parameter of th
02c0: 65 20 0a 2a 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e .** OP_Column 
02d0: 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  to the default v
02e0: 61 6c 75 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a  alue, if any..**
02f0: 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
0300: 76 61 6c 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d  value of a colum
0310: 6e 20 69 73 20 73 70 65 63 69 66 69 65 64 20 62  n is specified b
0320: 79 20 61 20 44 45 46 41 55 4c 54 20 63 6c 61 75  y a DEFAULT clau
0330: 73 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 63 6f  se in the .** co
0340: 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2e  lumn definition.
0350: 20 54 68 69 73 20 77 61 73 20 65 69 74 68 65 72   This was either
0360: 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65   supplied by the
0370: 20 75 73 65 72 20 77 68 65 6e 20 74 68 65 20 74   user when the t
0380: 61 62 6c 65 0a 2a 2a 20 77 61 73 20 63 72 65 61  able.** was crea
0390: 74 65 64 2c 20 6f 72 20 61 64 64 65 64 20 6c 61  ted, or added la
03a0: 74 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ter to the table
03b0: 20 64 65 66 69 6e 69 74 69 6f 6e 20 62 79 20 61   definition by a
03c0: 6e 20 41 4c 54 45 52 20 54 41 42 4c 45 0a 2a 2a  n ALTER TABLE.**
03d0: 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74 68 65   command. If the
03e0: 20 6c 61 74 74 65 72 2c 20 74 68 65 6e 20 74 68   latter, then th
03f0: 65 20 72 6f 77 2d 72 65 63 6f 72 64 73 20 69 6e  e row-records in
0400: 20 74 68 65 20 74 61 62 6c 65 20 62 74 72 65 65   the table btree
0410: 20 6f 6e 20 64 69 73 6b 0a 2a 2a 20 6d 61 79 20   on disk.** may 
0420: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 76 61  not contain a va
0430: 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  lue for the colu
0440: 6d 6e 20 61 6e 64 20 74 68 65 20 64 65 66 61 75  mn and the defau
0450: 6c 74 20 76 61 6c 75 65 2c 20 74 61 6b 65 6e 0a  lt value, taken.
0460: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 50 33 20 70  ** from the P3 p
0470: 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20  arameter of the 
0480: 4f 50 5f 43 6f 6c 75 6d 6e 20 69 6e 73 74 72 75  OP_Column instru
0490: 63 74 69 6f 6e 2c 20 69 73 20 72 65 74 75 72 6e  ction, is return
04a0: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 49  ed instead..** I
04b0: 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68  f the former, th
04c0: 65 6e 20 61 6c 6c 20 72 6f 77 2d 72 65 63 6f 72  en all row-recor
04d0: 64 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ds are guarantee
04e0: 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 61 20 76  d to include a v
04f0: 61 6c 75 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20  alue.** for the 
0500: 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 50  column and the P
0510: 33 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 72  3 value is not r
0520: 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  equired..**.** C
0530: 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
0540: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  s created by an 
0550: 41 4c 54 45 52 20 54 41 42 4c 45 20 63 6f 6d 6d  ALTER TABLE comm
0560: 61 6e 64 20 6d 61 79 20 6f 6e 6c 79 20 68 61 76  and may only hav
0570: 65 20 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 64 65  e .** literal de
0580: 66 61 75 6c 74 20 76 61 6c 75 65 73 20 73 70 65  fault values spe
0590: 63 69 66 69 65 64 3a 20 61 20 6e 75 6d 62 65 72  cified: a number
05a0: 2c 20 6e 75 6c 6c 20 6f 72 20 61 20 73 74 72 69  , null or a stri
05b0: 6e 67 2e 20 28 49 66 20 61 20 6d 6f 72 65 0a 2a  ng. (If a more.*
05c0: 2a 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 64 65  * complicated de
05d0: 66 61 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e  fault expression
05e0: 20 76 61 6c 75 65 20 77 61 73 20 70 72 6f 76 69   value was provi
05f0: 64 65 64 2c 20 69 74 20 69 73 20 65 76 61 6c 75  ded, it is evalu
0600: 61 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 74 68  ated .** when th
0610: 65 20 41 4c 54 45 52 20 54 41 42 4c 45 20 69 73  e ALTER TABLE is
0620: 20 65 78 65 63 75 74 65 64 20 61 6e 64 20 6f 6e   executed and on
0630: 65 20 6f 66 20 74 68 65 20 6c 69 74 65 72 61 6c  e of the literal
0640: 20 76 61 6c 75 65 73 20 77 72 69 74 74 65 6e 0a   values written.
0650: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 71 6c 69  ** into the sqli
0660: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
0670: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 66 6f 72  ).**.** Therefor
0680: 65 2c 20 74 68 65 20 50 33 20 70 61 72 61 6d 65  e, the P3 parame
0690: 74 65 72 20 69 73 20 6f 6e 6c 79 20 72 65 71 75  ter is only requ
06a0: 69 72 65 64 20 69 66 20 74 68 65 20 64 65 66 61  ired if the defa
06b0: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 0a 2a 2a  ult value for.**
06c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 61   the column is a
06d0: 20 6c 69 74 65 72 61 6c 20 6e 75 6d 62 65 72 2c   literal number,
06e0: 20 73 74 72 69 6e 67 20 6f 72 20 6e 75 6c 6c 2e   string or null.
06f0: 20 54 68 65 20 73 71 6c 69 74 65 33 56 61 6c 75   The sqlite3Valu
0700: 65 46 72 6f 6d 45 78 70 72 28 29 0a 2a 2a 20 66  eFromExpr().** f
0710: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 70 61 62  unction is capab
0720: 6c 65 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69  le of transformi
0730: 6e 67 20 74 68 65 73 65 20 74 79 70 65 73 20 6f  ng these types o
0740: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  f expressions in
0750: 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61  to.** sqlite3_va
0760: 6c 75 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a  lue objects..*/.
0770: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75  void sqlite3Colu
0780: 6d 6e 44 65 66 61 75 6c 74 28 56 64 62 65 20 2a  mnDefault(Vdbe *
0790: 76 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  v, Table *pTab, 
07a0: 69 6e 74 20 69 29 7b 0a 20 20 69 66 28 20 70 54  int i){.  if( pT
07b0: 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
07c0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
07d0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 75  te3_value *pValu
07e0: 65 3b 0a 20 20 20 20 75 38 20 65 6e 63 20 3d 20  e;.    u8 enc = 
07f0: 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
0800: 2d 3e 65 6e 63 3b 0a 20 20 20 20 43 6f 6c 75 6d  ->enc;.    Colum
0810: 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d  n *pCol = &pTab-
0820: 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 73 71  >aCol[i];.    sq
0830: 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78  lite3ValueFromEx
0840: 70 72 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 2c 20  pr(pCol->pDflt, 
0850: 65 6e 63 2c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  enc, pCol->affin
0860: 69 74 79 2c 20 26 70 56 61 6c 75 65 29 3b 0a 20  ity, &pValue);. 
0870: 20 20 20 69 66 28 20 70 56 61 6c 75 65 20 29 7b     if( pValue ){
0880: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
0890: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
08a0: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
08b0: 70 56 61 6c 75 65 2c 20 50 33 5f 4d 45 4d 29 3b  pValue, P3_MEM);
08c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
08d0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
08e0: 2c 20 22 23 20 25 73 2e 25 73 22 2c 20 70 54 61  , "# %s.%s", pTa
08f0: 62 2d 3e 7a 4e 61 6d 65 2c 20 70 43 6f 6c 2d 3e  b->zName, pCol->
0900: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
0910: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63   }.}../*.** Proc
0920: 65 73 73 20 61 6e 20 55 50 44 41 54 45 20 73 74  ess an UPDATE st
0930: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
0940: 20 55 50 44 41 54 45 20 4f 52 20 49 47 4e 4f 52   UPDATE OR IGNOR
0950: 45 20 74 61 62 6c 65 5f 77 78 79 7a 20 53 45 54  E table_wxyz SET
0960: 20 61 3d 62 2c 20 63 3d 64 20 57 48 45 52 45 20   a=b, c=d WHERE 
0970: 65 3c 35 20 41 4e 44 20 66 20 4e 4f 54 20 4e 55  e<5 AND f NOT NU
0980: 4c 4c 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  LL;.**          
0990: 5c 5f 5f 5f 5f 5f 5f 5f 2f 20 5c 5f 5f 5f 5f 5f  \_______/ \_____
09a0: 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  ___/     \______
09b0: 2f 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  /       \_______
09c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 20 20 20 20  _________/.*    
09d0: 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20          onError 
09e0: 20 20 70 54 61 62 4c 69 73 74 20 20 20 20 20 20    pTabList      
09f0: 70 43 68 61 6e 67 65 73 20 20 20 20 20 20 20 20  pChanges        
0a00: 20 20 20 20 20 70 57 68 65 72 65 0a 2a 2f 0a 76       pWhere.*/.v
0a10: 6f 69 64 20 73 71 6c 69 74 65 33 55 70 64 61 74  oid sqlite3Updat
0a20: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
0a30: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
0a40: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
0a50: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
0a60: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 2f 2a  pTabList,     /*
0a70: 20 54 68 65 20 74 61 62 6c 65 20 69 6e 20 77 68   The table in wh
0a80: 69 63 68 20 77 65 20 73 68 6f 75 6c 64 20 63 68  ich we should ch
0a90: 61 6e 67 65 20 74 68 69 6e 67 73 20 2a 2f 0a 20  ange things */. 
0aa0: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e   ExprList *pChan
0ab0: 67 65 73 2c 20 20 20 20 2f 2a 20 54 68 69 6e 67  ges,    /* Thing
0ac0: 73 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20  s to be changed 
0ad0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
0ae0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
0af0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
0b00: 20 20 4d 61 79 20 62 65 20 6e 75 6c 6c 20 2a 2f    May be null */
0b10: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20  .  int onError  
0b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
0b30: 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74   to handle const
0b40: 72 61 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a  raint errors */.
0b50: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
0b70: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
0b80: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
0b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0ba0: 74 61 62 6c 65 20 74 6f 20 62 65 20 75 70 64 61  table to be upda
0bb0: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ted */.  int add
0bc0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
0bd0: 2f 2a 20 56 44 42 45 20 69 6e 73 74 72 75 63 74  /* VDBE instruct
0be0: 69 6f 6e 20 61 64 64 72 65 73 73 20 6f 66 20 74  ion address of t
0bf0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
0c00: 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 49  loop */.  WhereI
0c10: 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
0c20: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
0c30: 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45 20  about the WHERE 
0c40: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 56 64 62 65  clause */.  Vdbe
0c50: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
0c60: 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
0c70: 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
0c80: 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
0c90: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dx;           /*
0ca0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
0cb0: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
0cc0: 6e 74 20 6e 49 64 78 3b 20 20 20 20 20 20 20 20  nt nIdx;        
0cd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0ce0: 6f 66 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  of indices that 
0cf0: 6e 65 65 64 20 75 70 64 61 74 69 6e 67 20 2a 2f  need updating */
0d00: 0a 20 20 69 6e 74 20 6e 49 64 78 54 6f 74 61 6c  .  int nIdxTotal
0d10: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74  ;         /* Tot
0d20: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64  al number of ind
0d30: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ices */.  int iC
0d40: 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
0d50: 20 2f 2a 20 56 44 42 45 20 43 75 72 73 6f 72 20   /* VDBE Cursor 
0d60: 6e 75 6d 62 65 72 20 6f 66 20 70 54 61 62 20 2a  number of pTab *
0d70: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
0d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0d90: 65 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  e database struc
0da0: 74 75 72 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ture */.  Index 
0db0: 2a 2a 61 70 49 64 78 20 3d 20 30 3b 20 20 20 20  **apIdx = 0;    
0dc0: 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20   /* An array of 
0dd0: 69 6e 64 69 63 65 73 20 74 68 61 74 20 6e 65 65  indices that nee
0de0: 64 20 75 70 64 61 74 69 6e 67 20 74 6f 6f 20 2a  d updating too *
0df0: 2f 0a 20 20 63 68 61 72 20 2a 61 49 64 78 55 73  /.  char *aIdxUs
0e00: 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 61 49  ed = 0;    /* aI
0e10: 64 78 55 73 65 64 5b 69 5d 3d 3d 31 20 69 66 20  dxUsed[i]==1 if 
0e20: 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 69  the i-th index i
0e30: 73 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  s used */.  int 
0e40: 2a 61 58 52 65 66 20 3d 20 30 3b 20 20 20 20 20  *aXRef = 0;     
0e50: 20 20 20 2f 2a 20 61 58 52 65 66 5b 69 5d 20 69     /* aXRef[i] i
0e60: 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  s the index in p
0e70: 43 68 61 6e 67 65 73 2d 3e 61 5b 5d 20 6f 66 20  Changes->a[] of 
0e80: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
0ea0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f  an expression fo
0eb0: 72 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  r the i-th colum
0ec0: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  n of the table..
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 58 52 65           ** aXRe
0ef0: 66 5b 69 5d 3d 3d 2d 31 20 69 66 20 74 68 65 20  f[i]==-1 if the 
0f00: 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 69 73 20 6e  i-th column is n
0f10: 6f 74 20 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 20  ot changed. */. 
0f20: 20 69 6e 74 20 63 68 6e 67 52 6f 77 69 64 3b 20   int chngRowid; 
0f30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0f40: 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  if the record nu
0f50: 6d 62 65 72 20 69 73 20 62 65 69 6e 67 20 63 68  mber is being ch
0f60: 61 6e 67 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  anged */.  Expr 
0f70: 2a 70 52 6f 77 69 64 45 78 70 72 20 3d 20 30 3b  *pRowidExpr = 0;
0f80: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
0f90: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 6e 65 77  defining the new
0fa0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 2a   record number *
0fb0: 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 41 6c 6c 20  /.  int openAll 
0fc0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
0fd0: 75 65 20 69 66 20 61 6c 6c 20 69 6e 64 69 63 65  ue if all indice
0fe0: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6f 70 65  s need to be ope
0ff0: 6e 65 64 20 2a 2f 0a 20 20 41 75 74 68 43 6f 6e  ned */.  AuthCon
1000: 74 65 78 74 20 73 43 6f 6e 74 65 78 74 3b 20 20  text sContext;  
1010: 2f 2a 20 54 68 65 20 61 75 74 68 6f 72 69 7a 61  /* The authoriza
1020: 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  tion context */.
1030: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
1040: 43 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C;       /* The 
1050: 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20  name-context to 
1060: 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69  resolve expressi
1070: 6f 6e 73 20 69 6e 20 2a 2f 0a 0a 23 69 66 6e 64  ons in */..#ifnd
1080: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1090: 52 49 47 47 45 52 0a 20 20 69 6e 74 20 69 73 56  RIGGER.  int isV
10a0: 69 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  iew;            
10b0: 20 20 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20        /* Trying 
10c0: 74 6f 20 75 70 64 61 74 65 20 61 20 76 69 65 77  to update a view
10d0: 20 2a 2f 0a 20 20 69 6e 74 20 74 72 69 67 67 65   */.  int trigge
10e0: 72 73 5f 65 78 69 73 74 20 3d 20 30 3b 20 20 20  rs_exist = 0;   
10f0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
1100: 79 20 72 6f 77 20 74 72 69 67 67 65 72 73 20 65  y row triggers e
1110: 78 69 73 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  xist */.#endif..
1120: 20 20 69 6e 74 20 6e 65 77 49 64 78 20 20 20 20    int newIdx    
1130: 20 20 3d 20 2d 31 3b 20 20 2f 2a 20 69 6e 64 65    = -1;  /* inde
1140: 78 20 6f 66 20 74 72 69 67 67 65 72 20 22 6e 65  x of trigger "ne
1150: 77 22 20 74 65 6d 70 20 74 61 62 6c 65 20 20 20  w" temp table   
1160: 20 20 20 20 2a 2f 0a 20 20 69 6e 74 20 6f 6c 64      */.  int old
1170: 49 64 78 20 20 20 20 20 20 3d 20 2d 31 3b 20 20  Idx      = -1;  
1180: 2f 2a 20 69 6e 64 65 78 20 6f 66 20 74 72 69 67  /* index of trig
1190: 67 65 72 20 22 6f 6c 64 22 20 74 65 6d 70 20 74  ger "old" temp t
11a0: 61 62 6c 65 20 20 20 20 20 20 20 2a 2f 0a 0a 20  able       */.. 
11b0: 20 73 43 6f 6e 74 65 78 74 2e 70 50 61 72 73 65   sContext.pParse
11c0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 72   = 0;.  if( pPar
11d0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
11e0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
11f0: 64 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65 5f  d ) goto update_
1200: 63 6c 65 61 6e 75 70 3b 0a 20 20 64 62 20 3d 20  cleanup;.  db = 
1210: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
1220: 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e  sert( pTabList->
1230: 6e 53 72 63 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  nSrc==1 );..  /*
1240: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
1250: 65 20 77 68 69 63 68 20 77 65 20 77 61 6e 74 20  e which we want 
1260: 74 6f 20 75 70 64 61 74 65 2e 20 0a 20 20 2a 2f  to update. .  */
1270: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
1280: 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
1290: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
12a0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
12b0: 29 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c  ) goto update_cl
12c0: 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 20 46 69 67  eanup;..  /* Fig
12d0: 75 72 65 20 6f 75 74 20 69 66 20 77 65 20 68 61  ure out if we ha
12e0: 76 65 20 61 6e 79 20 74 72 69 67 67 65 72 73 20  ve any triggers 
12f0: 61 6e 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  and if the table
1300: 20 62 65 69 6e 67 0a 20 20 2a 2a 20 75 70 64 61   being.  ** upda
1310: 74 65 64 20 69 73 20 61 20 76 69 65 77 0a 20 20  ted is a view.  
1320: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1330: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
1340: 20 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20   triggers_exist 
1350: 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
1360: 73 45 78 69 73 74 28 70 50 61 72 73 65 2c 20 70  sExist(pParse, p
1370: 54 61 62 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20  Tab, TK_UPDATE, 
1380: 70 43 68 61 6e 67 65 73 29 3b 0a 20 20 69 73 56  pChanges);.  isV
1390: 69 65 77 20 3d 20 70 54 61 62 2d 3e 70 53 65 6c  iew = pTab->pSel
13a0: 65 63 74 21 3d 30 3b 0a 23 65 6c 73 65 0a 23 20  ect!=0;.#else.# 
13b0: 64 65 66 69 6e 65 20 74 72 69 67 67 65 72 73 5f  define triggers_
13c0: 65 78 69 73 74 20 30 0a 23 20 64 65 66 69 6e 65  exist 0.# define
13d0: 20 69 73 56 69 65 77 20 30 0a 23 65 6e 64 69 66   isView 0.#endif
13e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13f0: 4d 49 54 5f 56 49 45 57 0a 23 20 75 6e 64 65 66  MIT_VIEW.# undef
1400: 20 69 73 56 69 65 77 0a 23 20 64 65 66 69 6e 65   isView.# define
1410: 20 69 73 56 69 65 77 20 30 0a 23 65 6e 64 69 66   isView 0.#endif
1420: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ..  if( sqlite3I
1430: 73 52 65 61 64 4f 6e 6c 79 28 70 50 61 72 73 65  sReadOnly(pParse
1440: 2c 20 70 54 61 62 2c 20 74 72 69 67 67 65 72 73  , pTab, triggers
1450: 5f 65 78 69 73 74 29 20 29 7b 0a 20 20 20 20 67  _exist) ){.    g
1460: 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e  oto update_clean
1470: 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  up;.  }.  if( is
1480: 56 69 65 77 20 29 7b 0a 20 20 20 20 69 66 28 20  View ){.    if( 
1490: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
14a0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
14b0: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  , pTab) ){.     
14c0: 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65   goto update_cle
14d0: 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  anup;.    }.  }.
14e0: 20 20 61 58 52 65 66 20 3d 20 73 71 6c 69 74 65    aXRef = sqlite
14f0: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
1500: 66 28 69 6e 74 29 20 2a 20 70 54 61 62 2d 3e 6e  f(int) * pTab->n
1510: 43 6f 6c 20 29 3b 0a 20 20 69 66 28 20 61 58 52  Col );.  if( aXR
1520: 65 66 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64  ef==0 ) goto upd
1530: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 66  ate_cleanup;.  f
1540: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
1550: 6e 43 6f 6c 3b 20 69 2b 2b 29 20 61 58 52 65 66  nCol; i++) aXRef
1560: 5b 69 5d 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20  [i] = -1;..  /* 
1570: 49 66 20 74 68 65 72 65 20 61 72 65 20 46 4f 52  If there are FOR
1580: 20 45 41 43 48 20 52 4f 57 20 74 72 69 67 67 65   EACH ROW trigge
1590: 72 73 2c 20 61 6c 6c 6f 63 61 74 65 20 63 75 72  rs, allocate cur
15a0: 73 6f 72 73 20 66 6f 72 20 74 68 65 0a 20 20 2a  sors for the.  *
15b0: 2a 20 73 70 65 63 69 61 6c 20 4f 4c 44 20 61 6e  * special OLD an
15c0: 64 20 4e 45 57 20 74 61 62 6c 65 73 0a 20 20 2a  d NEW tables.  *
15d0: 2f 0a 20 20 69 66 28 20 74 72 69 67 67 65 72 73  /.  if( triggers
15e0: 5f 65 78 69 73 74 20 29 7b 0a 20 20 20 20 6e 65  _exist ){.    ne
15f0: 77 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  wIdx = pParse->n
1600: 54 61 62 2b 2b 3b 0a 20 20 20 20 6f 6c 64 49 64  Tab++;.    oldId
1610: 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
1620: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  ++;.  }..  /* Al
1630: 6c 6f 63 61 74 65 20 61 20 63 75 72 73 6f 72 73  locate a cursors
1640: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
1650: 74 61 62 61 73 65 20 74 61 62 6c 65 20 61 6e 64  tabase table and
1660: 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73   for all indices
1670: 2e 0a 20 20 2a 2a 20 54 68 65 20 69 6e 64 65 78  ..  ** The index
1680: 20 63 75 72 73 6f 72 73 20 6d 69 67 68 74 20 6e   cursors might n
1690: 6f 74 20 62 65 20 75 73 65 64 2c 20 62 75 74 20  ot be used, but 
16a0: 69 66 20 74 68 65 79 20 61 72 65 20 75 73 65 64  if they are used
16b0: 20 74 68 65 79 0a 20 20 2a 2a 20 6e 65 65 64 20   they.  ** need 
16c0: 74 6f 20 6f 63 63 75 72 20 72 69 67 68 74 20 61  to occur right a
16d0: 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73  fter the databas
16e0: 65 20 63 75 72 73 6f 72 2e 20 20 53 6f 20 67 6f  e cursor.  So go
16f0: 20 61 68 65 61 64 20 61 6e 64 0a 20 20 2a 2a 20   ahead and.  ** 
1700: 61 6c 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20  allocate enough 
1710: 73 70 61 63 65 2c 20 6a 75 73 74 20 69 6e 20 63  space, just in c
1720: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ase..  */.  pTab
1730: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
1740: 6f 72 20 3d 20 69 43 75 72 20 3d 20 70 50 61 72  or = iCur = pPar
1750: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 66 6f  se->nTab++;.  fo
1760: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
1770: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
1780: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
1790: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b    pParse->nTab++
17a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
17b0: 69 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65 2d  ialize the name-
17c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 6d 65 6d  context */.  mem
17d0: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
17e0: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
17f0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
1800: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
1810: 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 0a 20 20   = pTabList;..  
1820: 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 63  /* Resolve the c
1830: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 61  olumn names in a
1840: 6c 6c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ll the expressio
1850: 6e 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ns of the.  ** o
1860: 66 20 74 68 65 20 55 50 44 41 54 45 20 73 74 61  f the UPDATE sta
1870: 74 65 6d 65 6e 74 2e 20 20 41 6c 73 6f 20 66 69  tement.  Also fi
1880: 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  nd the column in
1890: 64 65 78 0a 20 20 2a 2a 20 66 6f 72 20 65 61 63  dex.  ** for eac
18a0: 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 75  h column to be u
18b0: 70 64 61 74 65 64 20 69 6e 20 74 68 65 20 70 43  pdated in the pC
18c0: 68 61 6e 67 65 73 20 61 72 72 61 79 2e 20 20 46  hanges array.  F
18d0: 6f 72 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 6c  or each.  ** col
18e0: 75 6d 6e 20 74 6f 20 62 65 20 75 70 64 61 74 65  umn to be update
18f0: 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20  d, make sure we 
1900: 68 61 76 65 20 61 75 74 68 6f 72 69 7a 61 74 69  have authorizati
1910: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a  on to change.  *
1920: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 0a 20  * that column.. 
1930: 20 2a 2f 0a 20 20 63 68 6e 67 52 6f 77 69 64 20   */.  chngRowid 
1940: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
1950: 69 3c 70 43 68 61 6e 67 65 73 2d 3e 6e 45 78 70  i<pChanges->nExp
1960: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
1970: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
1980: 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
1990: 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d 2e 70 45  Changes->a[i].pE
19a0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  xpr) ){.      go
19b0: 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75  to update_cleanu
19c0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  p;.    }.    for
19d0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
19e0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
19f0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1a00: 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  mp(pTab->aCol[j]
1a10: 2e 7a 4e 61 6d 65 2c 20 70 43 68 61 6e 67 65 73  .zName, pChanges
1a20: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
1a30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1a40: 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  j==pTab->iPKey )
1a50: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 6e 67  {.          chng
1a60: 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Rowid = 1;.     
1a70: 20 20 20 20 20 70 52 6f 77 69 64 45 78 70 72 20       pRowidExpr 
1a80: 3d 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 69 5d  = pChanges->a[i]
1a90: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
1aa0: 7d 0a 20 20 20 20 20 20 20 20 61 58 52 65 66 5b  }.        aXRef[
1ab0: 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  j] = i;.        
1ac0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1ad0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
1ae0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
1af0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1b00: 73 52 6f 77 69 64 28 70 43 68 61 6e 67 65 73 2d  sRowid(pChanges-
1b10: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  >a[i].zName) ){.
1b20: 20 20 20 20 20 20 20 20 63 68 6e 67 52 6f 77 69          chngRowi
1b30: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  d = 1;.        p
1b40: 52 6f 77 69 64 45 78 70 72 20 3d 20 70 43 68 61  RowidExpr = pCha
1b50: 6e 67 65 73 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  nges->a[i].pExpr
1b60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1b80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1b90: 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20  no such column: 
1ba0: 25 73 22 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61  %s", pChanges->a
1bb0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
1bc0: 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
1bd0: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d  cleanup;.      }
1be0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1bf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
1c00: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 7b 0a 20  RIZATION.    {. 
1c10: 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1c20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41     rc = sqlite3A
1c30: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1c40: 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 2c 20   SQLITE_UPDATE, 
1c50: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
1c80: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 64 62 2d  ol[j].zName, db-
1c90: 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e  >aDb[pTab->iDb].
1ca0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
1cb0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  ( rc==SQLITE_DEN
1cc0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  Y ){.        got
1cd0: 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70  o update_cleanup
1ce0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1cf0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 47 4e  ( rc==SQLITE_IGN
1d00: 4f 52 45 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ORE ){.        a
1d10: 58 52 65 66 5b 6a 5d 20 3d 20 2d 31 3b 0a 20 20  XRef[j] = -1;.  
1d20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
1d30: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  if.  }..  /* All
1d40: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
1d50: 20 74 68 65 20 61 72 72 61 79 20 61 70 49 64 78   the array apIdx
1d60: 5b 5d 20 61 6e 64 20 66 69 6c 6c 20 69 74 20 77  [] and fill it w
1d70: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
1d80: 65 76 65 72 79 0a 20 20 2a 2a 20 69 6e 64 65 78  every.  ** index
1d90: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
1da0: 65 20 75 70 64 61 74 65 64 2e 20 20 49 6e 64 69  e updated.  Indi
1db0: 63 65 73 20 6f 6e 6c 79 20 6e 65 65 64 20 75 70  ces only need up
1dc0: 64 61 74 69 6e 67 20 69 66 20 74 68 65 69 72 0a  dating if their.
1dd0: 20 20 2a 2a 20 6b 65 79 20 69 6e 63 6c 75 64 65    ** key include
1de0: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f 6c  s one of the col
1df0: 75 6d 6e 73 20 6e 61 6d 65 64 20 69 6e 20 70 43  umns named in pC
1e00: 68 61 6e 67 65 73 20 6f 72 20 69 66 20 74 68 65  hanges or if the
1e10: 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 6e 75 6d   record.  ** num
1e20: 62 65 72 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ber of the origi
1e30: 6e 61 6c 20 74 61 62 6c 65 20 65 6e 74 72 79 20  nal table entry 
1e40: 69 73 20 63 68 61 6e 67 69 6e 67 2e 0a 20 20 2a  is changing..  *
1e50: 2f 0a 20 20 66 6f 72 28 6e 49 64 78 3d 6e 49 64  /.  for(nIdx=nId
1e60: 78 54 6f 74 61 6c 3d 30 2c 20 70 49 64 78 3d 70  xTotal=0, pIdx=p
1e70: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
1e80: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
1e90: 65 78 74 2c 20 6e 49 64 78 54 6f 74 61 6c 2b 2b  ext, nIdxTotal++
1ea0: 29 7b 0a 20 20 20 20 69 66 28 20 63 68 6e 67 52  ){.    if( chngR
1eb0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 69 20  owid ){.      i 
1ec0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b  = 0;.    }else {
1ed0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1ee0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
1ef0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
1f00: 66 28 20 61 58 52 65 66 5b 70 49 64 78 2d 3e 61  f( aXRef[pIdx->a
1f10: 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 3e 3d 30 20 29  iColumn[i]]>=0 )
1f20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1f30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
1f40: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  pIdx->nColumn ) 
1f50: 6e 49 64 78 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  nIdx++;.  }.  if
1f60: 28 20 6e 49 64 78 54 6f 74 61 6c 3e 30 20 29 7b  ( nIdxTotal>0 ){
1f70: 0a 20 20 20 20 61 70 49 64 78 20 3d 20 73 71 6c  .    apIdx = sql
1f80: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
1f90: 7a 65 6f 66 28 49 6e 64 65 78 2a 29 20 2a 20 6e  zeof(Index*) * n
1fa0: 49 64 78 20 2b 20 6e 49 64 78 54 6f 74 61 6c 20  Idx + nIdxTotal 
1fb0: 29 3b 0a 20 20 20 20 69 66 28 20 61 70 49 64 78  );.    if( apIdx
1fc0: 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64 61 74  ==0 ) goto updat
1fd0: 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61  e_cleanup;.    a
1fe0: 49 64 78 55 73 65 64 20 3d 20 28 63 68 61 72 2a  IdxUsed = (char*
1ff0: 29 26 61 70 49 64 78 5b 6e 49 64 78 5d 3b 0a 20  )&apIdx[nIdx];. 
2000: 20 7d 0a 20 20 66 6f 72 28 6e 49 64 78 3d 6a 3d   }.  for(nIdx=j=
2010: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
2020: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
2030: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b  =pIdx->pNext, j+
2040: 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 68 6e 67  +){.    if( chng
2050: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 69  Rowid ){.      i
2060: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
2070: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2080: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
2090: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
20a0: 66 28 20 61 58 52 65 66 5b 70 49 64 78 2d 3e 61  f( aXRef[pIdx->a
20b0: 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 3e 3d 30 20 29  iColumn[i]]>=0 )
20c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
20d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
20e0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
20f0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2100: 65 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c  e3CheckIndexColl
2110: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 64 78  Seq(pParse, pIdx
2120: 29 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65 5f  ) ) goto update_
2130: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
2140: 70 49 64 78 5b 6e 49 64 78 2b 2b 5d 20 3d 20 70  pIdx[nIdx++] = p
2150: 49 64 78 3b 0a 20 20 20 20 20 20 61 49 64 78 55  Idx;.      aIdxU
2160: 73 65 64 5b 6a 5d 20 3d 20 31 3b 0a 20 20 20 20  sed[j] = 1;.    
2170: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 49 64  }else{.      aId
2180: 78 55 73 65 64 5b 6a 5d 20 3d 20 30 3b 0a 20 20  xUsed[j] = 0;.  
2190: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
21a0: 73 6f 6c 76 65 20 74 68 65 20 63 6f 6c 75 6d 6e  solve the column
21b0: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 74 68   names in all th
21c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
21d0: 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 20   the.  ** WHERE 
21e0: 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  clause..  */.  i
21f0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
2200: 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
2210: 20 70 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20   pWhere) ){.    
2220: 67 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61  goto update_clea
2230: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  nup;.  }..  /* S
2240: 74 61 72 74 20 74 68 65 20 76 69 65 77 20 63 6f  tart the view co
2250: 6e 74 65 78 74 0a 20 20 2a 2f 0a 20 20 69 66 28  ntext.  */.  if(
2260: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 73   isView ){.    s
2270: 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78  qlite3AuthContex
2280: 74 50 75 73 68 28 70 50 61 72 73 65 2c 20 26 73  tPush(pParse, &s
2290: 43 6f 6e 74 65 78 74 2c 20 70 54 61 62 2d 3e 7a  Context, pTab->z
22a0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Name);.  }..  /*
22b0: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
22c0: 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76  g code..  */.  v
22d0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
22e0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
22f0: 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 75 70 64   v==0 ) goto upd
2300: 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69  ate_cleanup;.  i
2310: 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  f( pParse->neste
2320: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  d==0 ) sqlite3Vd
2330: 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 76  beCountChanges(v
2340: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
2350: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
2360: 70 50 61 72 73 65 2c 20 31 2c 20 70 54 61 62 2d  pParse, 1, pTab-
2370: 3e 69 44 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  >iDb);..  /* If 
2380: 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
2390: 20 75 70 64 61 74 65 20 61 20 76 69 65 77 2c 20   update a view, 
23a0: 72 65 61 6c 69 7a 65 20 74 68 61 74 20 76 69 65  realize that vie
23b0: 77 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 65 70  w into.  ** a ep
23c0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20  hemeral table.. 
23d0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
23e0: 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
23f0: 70 56 69 65 77 3b 0a 20 20 20 20 70 56 69 65 77  pView;.    pView
2400: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
2410: 44 75 70 28 70 54 61 62 2d 3e 70 53 65 6c 65 63  Dup(pTab->pSelec
2420: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
2430: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 56  elect(pParse, pV
2440: 69 65 77 2c 20 53 52 54 5f 56 69 72 74 75 61 6c  iew, SRT_Virtual
2450: 54 61 62 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c  Tab, iCur, 0, 0,
2460: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
2470: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
2480: 70 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pView);.  }..  /
2490: 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
24a0: 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20  base scan.  */. 
24b0: 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
24c0: 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
24d0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
24e0: 68 65 72 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  here, 0);.  if( 
24f0: 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
2500: 20 75 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b   update_cleanup;
2510: 0a 0a 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20  ..  /* Remember 
2520: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 65 76 65  the index of eve
2530: 72 79 20 69 74 65 6d 20 74 6f 20 62 65 20 75 70  ry item to be up
2540: 64 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  dated..  */.  sq
2550: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2560: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72  , OP_Rowid, iCur
2570: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
2580: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
2590: 69 66 6f 57 72 69 74 65 2c 20 30 2c 20 30 29 3b  ifoWrite, 0, 0);
25a0: 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64  ..  /* End the d
25b0: 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
25c0: 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  p..  */.  sqlite
25d0: 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
25e0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
25f0: 69 7a 65 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ize the count of
2600: 20 75 70 64 61 74 65 64 20 72 6f 77 73 0a 20 20   updated rows.  
2610: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  */.  if( db->fla
2620: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e  gs & SQLITE_Coun
2630: 74 52 6f 77 73 20 26 26 20 21 70 50 61 72 73 65  tRows && !pParse
2640: 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20  ->trigStack ){. 
2650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2660: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
2670: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  r, 0, 0);.  }.. 
2680: 20 69 66 28 20 74 72 69 67 67 65 72 73 5f 65 78   if( triggers_ex
2690: 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72  ist ){.    /* Cr
26a0: 65 61 74 65 20 70 73 65 75 64 6f 2d 74 61 62 6c  eate pseudo-tabl
26b0: 65 73 20 66 6f 72 20 4e 45 57 20 61 6e 64 20 4f  es for NEW and O
26c0: 4c 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  LD.    */.    sq
26d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
26e0: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
26f0: 20 6f 6c 64 49 64 78 2c 20 30 29 3b 0a 20 20 20   oldIdx, 0);.   
2700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2710: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
2720: 6c 75 6d 6e 73 2c 20 6f 6c 64 49 64 78 2c 20 70  lumns, oldIdx, p
2730: 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20  Tab->nCol);.    
2740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2750: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
2760: 6f 2c 20 6e 65 77 49 64 78 2c 20 30 29 3b 0a 20  o, newIdx, 0);. 
2770: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2780: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
2790: 43 6f 6c 75 6d 6e 73 2c 20 6e 65 77 49 64 78 2c  Columns, newIdx,
27a0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 0a 20   pTab->nCol);.. 
27b0: 20 20 20 2f 2a 20 54 68 65 20 74 6f 70 20 6f 66     /* The top of
27c0: 20 74 68 65 20 75 70 64 61 74 65 20 6c 6f 6f 70   the update loop
27d0: 20 66 6f 72 20 77 68 65 6e 20 74 68 65 72 65 20   for when there 
27e0: 61 72 65 20 74 72 69 67 67 65 72 73 2e 0a 20 20  are triggers..  
27f0: 20 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20    */.    addr = 
2800: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2810: 28 76 2c 20 4f 50 5f 46 69 66 6f 52 65 61 64 2c  (v, OP_FifoRead,
2820: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28   0, 0);..    if(
2830: 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
2840: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2850: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
2860: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2870: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2880: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
2890: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 63 75      /* Open a cu
28a0: 72 73 6f 72 20 61 6e 64 20 6d 61 6b 65 20 69 74  rsor and make it
28b0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 65   point to the re
28c0: 63 6f 72 64 20 74 68 61 74 20 69 73 0a 20 20 20  cord that is.   
28d0: 20 20 20 2a 2a 20 62 65 69 6e 67 20 75 70 64 61     ** being upda
28e0: 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
28f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
2900: 61 62 6c 65 46 6f 72 52 65 61 64 69 6e 67 28 76  ableForReading(v
2910: 2c 20 69 43 75 72 2c 20 70 54 61 62 29 3b 0a 20  , iCur, pTab);. 
2920: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2930: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2940: 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30 29  MoveGe, iCur, 0)
2950: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
2960: 74 65 20 74 68 65 20 4f 4c 44 20 74 61 62 6c 65  te the OLD table
2970: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
2980: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2990: 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
29a0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
29b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
29c0: 6f 77 44 61 74 61 2c 20 69 43 75 72 2c 20 30 29  owData, iCur, 0)
29d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
29e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73  eAddOp(v, OP_Ins
29f0: 65 72 74 2c 20 6f 6c 64 49 64 78 2c 20 30 29 3b  ert, oldIdx, 0);
2a00: 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
2a10: 65 20 74 68 65 20 4e 45 57 20 74 61 62 6c 65 0a  e the NEW table.
2a20: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
2a30: 68 6e 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  hngRowid ){.    
2a40: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2a50: 65 41 6e 64 43 61 63 68 65 28 70 50 61 72 73 65  eAndCache(pParse
2a60: 2c 20 70 52 6f 77 69 64 45 78 70 72 29 3b 0a 20  , pRowidExpr);. 
2a70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a90: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43  (v, OP_Rowid, iC
2aa0: 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ur, 0);.    }.  
2ab0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2ac0: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
2ad0: 20 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62       if( i==pTab
2ae0: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
2af0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b00: 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  dOp(v, OP_Null, 
2b10: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 63  0, 0);.        c
2b20: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
2b30: 0a 20 20 20 20 20 20 6a 20 3d 20 61 58 52 65 66  .      j = aXRef
2b40: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  [i];.      if( j
2b50: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  <0 ){.        sq
2b60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2b70: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75  , OP_Column, iCu
2b80: 72 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 73  r, i);.        s
2b90: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
2ba0: 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 29 3b  ult(v, pTab, i);
2bb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2bc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2bd0: 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 70 50  rCodeAndCache(pP
2be0: 61 72 73 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e  arse, pChanges->
2bf0: 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[j].pExpr);.   
2c00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
2c10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2c20: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
2c30: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 30 29  , pTab->nCol, 0)
2c40: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ;.    if( !isVie
2c50: 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  w ){.      sqlit
2c60: 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 53  e3TableAffinityS
2c70: 74 72 28 76 2c 20 70 54 61 62 29 3b 0a 20 20 20  tr(v, pTab);.   
2c80: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73   }.    if( pPars
2c90: 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 75  e->nErr ) goto u
2ca0: 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  pdate_cleanup;. 
2cb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2cc0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  dOp(v, OP_Insert
2cd0: 2c 20 6e 65 77 49 64 78 2c 20 30 29 3b 0a 20 20  , newIdx, 0);.  
2ce0: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b    if( !isView ){
2cf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2d00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
2d10: 6f 73 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  ose, iCur, 0);. 
2d20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 72     }..    /* Fir
2d30: 65 20 74 68 65 20 42 45 46 4f 52 45 20 61 6e 64  e the BEFORE and
2d40: 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67   INSTEAD OF trig
2d50: 67 65 72 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  gers.    */.    
2d60: 69 66 28 20 73 71 6c 69 74 65 33 43 6f 64 65 52  if( sqlite3CodeR
2d70: 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65  owTrigger(pParse
2d80: 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 70 43 68  , TK_UPDATE, pCh
2d90: 61 6e 67 65 73 2c 20 54 52 49 47 47 45 52 5f 42  anges, TRIGGER_B
2da0: 45 46 4f 52 45 2c 20 70 54 61 62 2c 0a 20 20 20  EFORE, pTab,.   
2db0: 20 20 20 20 20 20 20 6e 65 77 49 64 78 2c 20 6f         newIdx, o
2dc0: 6c 64 49 64 78 2c 20 6f 6e 45 72 72 6f 72 2c 20  ldIdx, onError, 
2dd0: 61 64 64 72 29 20 29 7b 0a 20 20 20 20 20 20 67  addr) ){.      g
2de0: 6f 74 6f 20 75 70 64 61 74 65 5f 63 6c 65 61 6e  oto update_clean
2df0: 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  up;.    }.  }.. 
2e00: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
2e10: 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 4f      /* .    ** O
2e20: 70 65 6e 20 65 76 65 72 79 20 69 6e 64 65 78 20  pen every index 
2e30: 74 68 61 74 20 6e 65 65 64 73 20 75 70 64 61 74  that needs updat
2e40: 69 6e 67 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ing.  Note that 
2e50: 69 66 20 61 6e 79 0a 20 20 20 20 2a 2a 20 69 6e  if any.    ** in
2e60: 64 65 78 20 63 6f 75 6c 64 20 70 6f 74 65 6e 74  dex could potent
2e70: 69 61 6c 6c 79 20 69 6e 76 6f 6b 65 20 61 20 52  ially invoke a R
2e80: 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20  EPLACE conflict 
2e90: 72 65 73 6f 6c 75 74 69 6f 6e 20 0a 20 20 20 20  resolution .    
2ea0: 2a 2a 20 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ** action, then 
2eb0: 77 65 20 6e 65 65 64 20 74 6f 20 6f 70 65 6e 20  we need to open 
2ec0: 61 6c 6c 20 69 6e 64 69 63 65 73 20 62 65 63 61  all indices beca
2ed0: 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
2ee0: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 64  d.    ** to be d
2ef0: 65 6c 65 74 69 6e 67 20 73 6f 6d 65 20 72 65 63  eleting some rec
2f00: 6f 72 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ords..    */.   
2f10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f20: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
2f30: 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a   pTab->iDb, 0);.
2f40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f50: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  ddOp(v, OP_OpenW
2f60: 72 69 74 65 2c 20 69 43 75 72 2c 20 70 54 61 62  rite, iCur, pTab
2f70: 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c  ->tnum);.    sql
2f80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2f90: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
2fa0: 73 2c 20 69 43 75 72 2c 20 70 54 61 62 2d 3e 6e  s, iCur, pTab->n
2fb0: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 6f 6e  Col);.    if( on
2fc0: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
2fd0: 65 20 29 7b 0a 20 20 20 20 20 20 6f 70 65 6e 41  e ){.      openA
2fe0: 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ll = 1;.    }els
2ff0: 65 7b 0a 20 20 20 20 20 20 6f 70 65 6e 41 6c 6c  e{.      openAll
3000: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
3010: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
3020: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
3030: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
3040: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
3050: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
3060: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  e ){.          o
3070: 70 65 6e 41 6c 6c 20 3d 20 31 3b 0a 20 20 20 20  penAll = 1;.    
3080: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30a0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
30b0: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
30c0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
30d0: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b  pIdx->pNext, i++
30e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 65  ){.      if( ope
30f0: 6e 41 6c 6c 20 7c 7c 20 61 49 64 78 55 73 65 64  nAll || aIdxUsed
3100: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  [i] ){.        s
3110: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3120: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
3130: 49 64 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20  Idx->iDb, 0);.  
3140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3150: 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  eOp3(v, OP_OpenW
3160: 72 69 74 65 2c 20 69 43 75 72 2b 69 2b 31 2c 20  rite, iCur+i+1, 
3170: 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20  pIdx->tnum,.    
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 20 20 20 28 63 68 61 72 2a 29 26 70 49 64 78 2d     (char*)&pIdx-
31a0: 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  >keyInfo, P3_KEY
31b0: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 61  INFO);.        a
31c0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
31d0: 54 61 62 3e 69 43 75 72 2b 69 2b 31 20 29 3b 0a  Tab>iCur+i+1 );.
31e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
31f0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20     /* Loop over 
3200: 65 76 65 72 79 20 72 65 63 6f 72 64 20 74 68 61  every record tha
3210: 74 20 6e 65 65 64 73 20 75 70 64 61 74 69 6e 67  t needs updating
3220: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 6c 6f  .  We have to lo
3230: 61 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 6c  ad.    ** the ol
3240: 64 20 64 61 74 61 20 66 6f 72 20 65 61 63 68 20  d data for each 
3250: 72 65 63 6f 72 64 20 74 6f 20 62 65 20 75 70 64  record to be upd
3260: 61 74 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d  ated because som
3270: 65 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a  e columns.    **
3280: 20 6d 69 67 68 74 20 6e 6f 74 20 63 68 61 6e 67   might not chang
3290: 65 20 61 6e 64 20 77 65 20 77 69 6c 6c 20 6e 65  e and we will ne
32a0: 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6f  ed to copy the o
32b0: 6c 64 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2a  ld value..    **
32c0: 20 41 6c 73 6f 2c 20 74 68 65 20 6f 6c 64 20 64   Also, the old d
32d0: 61 74 61 20 69 73 20 6e 65 65 64 65 64 20 74 6f  ata is needed to
32e0: 20 64 65 6c 65 74 65 20 74 68 65 20 6f 6c 64 20   delete the old 
32f0: 69 6e 64 65 78 20 65 6e 74 69 72 65 73 2e 0a 20  index entires.. 
3300: 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 74 68     ** So make th
3310: 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 20 61  e cursor point a
3320: 74 20 74 68 65 20 6f 6c 64 20 72 65 63 6f 72 64  t the old record
3330: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3340: 20 21 74 72 69 67 67 65 72 73 5f 65 78 69 73 74   !triggers_exist
3350: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   ){.      addr =
3360: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3370: 70 28 76 2c 20 4f 50 5f 46 69 66 6f 52 65 61 64  p(v, OP_FifoRead
3380: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
3390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
33a0: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
33b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
33c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
33d0: 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43  OP_NotExists, iC
33e0: 75 72 2c 20 61 64 64 72 29 3b 0a 0a 20 20 20 20  ur, addr);..    
33f0: 2f 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64  /* If the record
3400: 20 6e 75 6d 62 65 72 20 77 69 6c 6c 20 63 68 61   number will cha
3410: 6e 67 65 2c 20 70 75 73 68 20 74 68 65 20 72 65  nge, push the re
3420: 63 6f 72 64 20 6e 75 6d 62 65 72 20 61 73 20 69  cord number as i
3430: 74 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65  t.    ** will be
3440: 20 61 66 74 65 72 20 74 68 65 20 75 70 64 61 74   after the updat
3450: 65 2e 20 28 54 68 65 20 6f 6c 64 20 72 65 63 6f  e. (The old reco
3460: 72 64 20 6e 75 6d 62 65 72 20 69 73 20 63 75 72  rd number is cur
3470: 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6f 6e  rently.    ** on
3480: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
3490: 6b 2e 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  k.).    */.    i
34a0: 66 28 20 63 68 6e 67 52 6f 77 69 64 20 29 7b 0a  f( chngRowid ){.
34b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
34c0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
34d0: 6f 77 69 64 45 78 70 72 29 3b 0a 20 20 20 20 20  owidExpr);.     
34e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34f0: 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  p(v, OP_MustBeIn
3500: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
3510: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
3520: 6e 65 77 20 64 61 74 61 20 66 6f 72 20 74 68 69  new data for thi
3530: 73 20 72 65 63 6f 72 64 2e 20 20 0a 20 20 20 20  s record.  .    
3540: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
3550: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
3560: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  +){.      if( i=
3570: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
3580: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3590: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
35a0: 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ull, 0, 0);.    
35b0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
35c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20      }.      j = 
35d0: 61 58 52 65 66 5b 69 5d 3b 0a 20 20 20 20 20 20  aXRef[i];.      
35e0: 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20  if( j<0 ){.     
35f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3600: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
3610: 2c 20 69 43 75 72 2c 20 69 29 3b 0a 20 20 20 20  , iCur, i);.    
3620: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
3630: 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
3640: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , i);.      }els
3650: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
3660: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
3670: 65 2c 20 70 43 68 61 6e 67 65 73 2d 3e 61 5b 6a  e, pChanges->a[j
3680: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
3690: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
36a0: 44 6f 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68  Do constraint ch
36b0: 65 63 6b 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ecks.    */.    
36c0: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
36d0: 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
36e0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43  pParse, pTab, iC
36f0: 75 72 2c 20 61 49 64 78 55 73 65 64 2c 20 63 68  ur, aIdxUsed, ch
3700: 6e 67 52 6f 77 69 64 2c 20 31 2c 0a 20 20 20 20  ngRowid, 1,.    
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
3730: 6e 45 72 72 6f 72 2c 20 61 64 64 72 29 3b 0a 0a  nError, addr);..
3740: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
3750: 65 20 6f 6c 64 20 69 6e 64 69 63 65 73 20 66 6f  e old indices fo
3760: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  r the current re
3770: 63 6f 72 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cord..    */.   
3780: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
3790: 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28 64  RowIndexDelete(d
37a0: 62 2c 20 76 2c 20 70 54 61 62 2c 20 69 43 75 72  b, v, pTab, iCur
37b0: 2c 20 61 49 64 78 55 73 65 64 29 3b 0a 0a 20 20  , aIdxUsed);..  
37c0: 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 69 6e 67    /* If changing
37d0: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
37e0: 65 72 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6f  er, delete the o
37f0: 6c 64 20 72 65 63 6f 72 64 2e 0a 20 20 20 20 2a  ld record..    *
3800: 2f 0a 20 20 20 20 69 66 28 20 63 68 6e 67 52 6f  /.    if( chngRo
3810: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  wid ){.      sql
3820: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3830: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 43 75 72   OP_Delete, iCur
3840: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
3850: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 6e   /* Create the n
3860: 65 77 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  ew index entries
3870: 20 61 6e 64 20 74 68 65 20 6e 65 77 20 72 65 63   and the new rec
3880: 6f 72 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ord..    */.    
3890: 73 71 6c 69 74 65 33 43 6f 6d 70 6c 65 74 65 49  sqlite3CompleteI
38a0: 6e 73 65 72 74 69 6f 6e 28 70 50 61 72 73 65 2c  nsertion(pParse,
38b0: 20 70 54 61 62 2c 20 69 43 75 72 2c 20 61 49 64   pTab, iCur, aId
38c0: 78 55 73 65 64 2c 20 63 68 6e 67 52 6f 77 69 64  xUsed, chngRowid
38d0: 2c 20 31 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20  , 1, -1);.  }.. 
38e0: 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
38f0: 65 20 72 6f 77 20 63 6f 75 6e 74 65 72 20 0a 20  e row counter . 
3900: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c   */.  if( db->fl
3910: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
3920: 6e 74 52 6f 77 73 20 26 26 20 21 70 50 61 72 73  ntRows && !pPars
3930: 65 2d 3e 74 72 69 67 53 74 61 63 6b 29 7b 0a 20  e->trigStack){. 
3940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3950: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
3960: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
3970: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
3980: 74 72 69 67 67 65 72 73 2c 20 63 6c 6f 73 65 20  triggers, close 
3990: 61 6c 6c 20 74 68 65 20 63 75 72 73 6f 72 73 20  all the cursors 
39a0: 61 66 74 65 72 20 65 61 63 68 20 69 74 65 72 61  after each itera
39b0: 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 72 6f 75 67  tion.  ** throug
39c0: 68 20 74 68 65 20 6c 6f 6f 70 2e 20 20 54 68 65  h the loop.  The
39d0: 20 66 69 72 65 20 74 68 65 20 61 66 74 65 72 20   fire the after 
39e0: 74 72 69 67 67 65 72 73 2e 0a 20 20 2a 2f 0a 20  triggers..  */. 
39f0: 20 69 66 28 20 74 72 69 67 67 65 72 73 5f 65 78   if( triggers_ex
3a00: 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ist ){.    if( !
3a10: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
3a20: 66 6f 72 28 69 3d 30 2c 20 70 49 64 78 3d 70 54  for(i=0, pIdx=pT
3a30: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
3a40: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
3a50: 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  xt, i++){.      
3a60: 20 20 69 66 28 20 6f 70 65 6e 41 6c 6c 20 7c 7c    if( openAll ||
3a70: 20 61 49 64 78 55 73 65 64 5b 69 5d 20 29 0a 20   aIdxUsed[i] ). 
3a80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3a90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3aa0: 43 6c 6f 73 65 2c 20 69 43 75 72 2b 69 2b 31 2c  Close, iCur+i+1,
3ab0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
3ac0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3ad0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
3ae0: 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d   iCur, 0);.    }
3af0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
3b00: 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 70  CodeRowTrigger(p
3b10: 50 61 72 73 65 2c 20 54 4b 5f 55 50 44 41 54 45  Parse, TK_UPDATE
3b20: 2c 20 70 43 68 61 6e 67 65 73 2c 20 54 52 49 47  , pChanges, TRIG
3b30: 47 45 52 5f 41 46 54 45 52 2c 20 70 54 61 62 2c  GER_AFTER, pTab,
3b40: 20 0a 20 20 20 20 20 20 20 20 20 20 6e 65 77 49   .          newI
3b50: 64 78 2c 20 6f 6c 64 49 64 78 2c 20 6f 6e 45 72  dx, oldIdx, onEr
3b60: 72 6f 72 2c 20 61 64 64 72 29 20 29 7b 0a 20 20  ror, addr) ){.  
3b70: 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
3b80: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
3b90: 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 65 61 74 20   }..  /* Repeat 
3ba0: 74 68 65 20 61 62 6f 76 65 20 77 69 74 68 20 74  the above with t
3bb0: 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 74  he next record t
3bc0: 6f 20 62 65 20 75 70 64 61 74 65 64 2c 20 75 6e  o be updated, un
3bd0: 74 69 6c 0a 20 20 2a 2a 20 61 6c 6c 20 72 65 63  til.  ** all rec
3be0: 6f 72 64 20 73 65 6c 65 63 74 65 64 20 62 79 20  ord selected by 
3bf0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3c00: 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
3c10: 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
3c20: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3c30: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29  P_Goto, 0, addr)
3c40: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
3c50: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
3c60: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
3c70: 6c 20 74 61 62 6c 65 73 20 69 66 20 74 68 65 72  l tables if ther
3c80: 65 20 77 65 72 65 20 6e 6f 20 46 4f 52 20 45 41  e were no FOR EA
3c90: 43 48 20 52 4f 57 20 74 72 69 67 67 65 72 73 20  CH ROW triggers 
3ca0: 2a 2f 0a 20 20 69 66 28 20 21 74 72 69 67 67 65  */.  if( !trigge
3cb0: 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20 20 20  rs_exist ){.    
3cc0: 66 6f 72 28 69 3d 30 2c 20 70 49 64 78 3d 70 54  for(i=0, pIdx=pT
3cd0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
3ce0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
3cf0: 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  xt, i++){.      
3d00: 69 66 28 20 6f 70 65 6e 41 6c 6c 20 7c 7c 20 61  if( openAll || a
3d10: 49 64 78 55 73 65 64 5b 69 5d 20 29 7b 0a 20 20  IdxUsed[i] ){.  
3d20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3d30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
3d40: 73 65 2c 20 69 43 75 72 2b 69 2b 31 2c 20 30 29  se, iCur+i+1, 0)
3d50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3d70: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
3d80: 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 7d 65  , iCur, 0);.  }e
3d90: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
3da0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3db0: 43 6c 6f 73 65 2c 20 6e 65 77 49 64 78 2c 20 30  Close, newIdx, 0
3dc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3dd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
3de0: 6f 73 65 2c 20 6f 6c 64 49 64 78 2c 20 30 29 3b  ose, oldIdx, 0);
3df0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
3e00: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
3e10: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
3e20: 65 72 65 20 63 68 61 6e 67 65 64 2e 20 49 66 20  ere changed. If 
3e30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
3e40: 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67  .  ** generating
3e50: 20 63 6f 64 65 20 62 65 63 61 75 73 65 20 6f 66   code because of
3e60: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
3e70: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 29 2c  e3NestedParse(),
3e80: 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 69 6e 76   do not.  ** inv
3e90: 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
3ea0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
3eb0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
3ec0: 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
3ed0: 77 73 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74  ws && !pParse->t
3ee0: 72 69 67 53 74 61 63 6b 20 26 26 20 70 50 61 72  rigStack && pPar
3ef0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b  se->nested==0 ){
3f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3f10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
3f20: 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a 20 20 20  back, 1, 0);.   
3f30: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
3f40: 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20  umCols(v, 1);.  
3f50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
3f60: 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 22 72  ColName(v, 0, "r
3f70: 6f 77 73 20 75 70 64 61 74 65 64 22 2c 20 50 33  ows updated", P3
3f80: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 0a 75  _STATIC);.  }..u
3f90: 70 64 61 74 65 5f 63 6c 65 61 6e 75 70 3a 0a 20  pdate_cleanup:. 
3fa0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74   sqlite3AuthCont
3fb0: 65 78 74 50 6f 70 28 26 73 43 6f 6e 74 65 78 74  extPop(&sContext
3fc0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3fd0: 61 70 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65  apIdx);.  sqlite
3fe0: 46 72 65 65 28 61 58 52 65 66 29 3b 0a 20 20 73  Free(aXRef);.  s
3ff0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
4000: 65 74 65 28 70 54 61 62 4c 69 73 74 29 3b 0a 20  ete(pTabList);. 
4010: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4020: 44 65 6c 65 74 65 28 70 43 68 61 6e 67 65 73 29  Delete(pChanges)
4030: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
4040: 65 6c 65 74 65 28 70 57 68 65 72 65 29 3b 0a 20  elete(pWhere);. 
4050: 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.