/ Hex Artifact Content
Login

Artifact c07c5157c58fcdb704f65d5f5e4775276e45bb8b:


0000: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  /*.**.** The aut
0010: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0020: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0030: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0040: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0050: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0060: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0070: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0080: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
0090: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00a0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00b0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00c0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00d0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00e0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
00f0: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0100: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0110: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  *.**.**.** $Id: 
0170: 74 72 69 67 67 65 72 2e 63 2c 76 20 31 2e 31 34  trigger.c,v 1.14
0180: 31 20 32 30 30 39 2f 30 35 2f 32 38 20 30 31 3a  1 2009/05/28 01:
0190: 30 30 3a 35 35 20 64 72 68 20 45 78 70 20 24 0a  00:55 drh Exp $.
01a0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
01b0: 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e 64  iteInt.h"..#ifnd
01c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
01d0: 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 44 65 6c  RIGGER./*.** Del
01e0: 65 74 65 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73  ete a linked lis
01f0: 74 20 6f 66 20 54 72 69 67 67 65 72 53 74 65 70  t of TriggerStep
0200: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
0210: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
0220: 74 65 54 72 69 67 67 65 72 53 74 65 70 28 73 71  teTriggerStep(sq
0230: 6c 69 74 65 33 20 2a 64 62 2c 20 54 72 69 67 67  lite3 *db, Trigg
0240: 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72  erStep *pTrigger
0250: 53 74 65 70 29 7b 0a 20 20 77 68 69 6c 65 28 20  Step){.  while( 
0260: 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a  pTriggerStep ){.
0270: 20 20 20 20 54 72 69 67 67 65 72 53 74 65 70 20      TriggerStep 
0280: 2a 20 70 54 6d 70 20 3d 20 70 54 72 69 67 67 65  * pTmp = pTrigge
0290: 72 53 74 65 70 3b 0a 20 20 20 20 70 54 72 69 67  rStep;.    pTrig
02a0: 67 65 72 53 74 65 70 20 3d 20 70 54 72 69 67 67  gerStep = pTrigg
02b0: 65 72 53 74 65 70 2d 3e 70 4e 65 78 74 3b 0a 0a  erStep->pNext;..
02c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
02d0: 65 6c 65 74 65 28 64 62 2c 20 70 54 6d 70 2d 3e  elete(db, pTmp->
02e0: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c  pWhere);.    sql
02f0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
0300: 74 65 28 64 62 2c 20 70 54 6d 70 2d 3e 70 45 78  te(db, pTmp->pEx
0310: 70 72 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  prList);.    sql
0320: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
0330: 28 64 62 2c 20 70 54 6d 70 2d 3e 70 53 65 6c 65  (db, pTmp->pSele
0340: 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ct);.    sqlite3
0350: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
0360: 20 70 54 6d 70 2d 3e 70 49 64 4c 69 73 74 29 3b   pTmp->pIdList);
0370: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ..    sqlite3DbF
0380: 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20  ree(db, pTmp);. 
0390: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
03a0: 6e 20 74 61 62 6c 65 20 70 54 61 62 2c 20 72 65  n table pTab, re
03b0: 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 61  turn a list of a
03c0: 6c 6c 20 74 68 65 20 74 72 69 67 67 65 72 73 20  ll the triggers 
03d0: 61 74 74 61 63 68 65 64 20 74 6f 20 0a 2a 2a 20  attached to .** 
03e0: 74 68 65 20 74 61 62 6c 65 2e 20 54 68 65 20 6c  the table. The l
03f0: 69 73 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  ist is connected
0400: 20 62 79 20 54 72 69 67 67 65 72 2e 70 4e 65 78   by Trigger.pNex
0410: 74 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2a 0a 2a  t pointers..**.*
0420: 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 74 72 69  * All of the tri
0430: 67 67 65 72 73 20 6f 6e 20 70 54 61 62 20 74 68  ggers on pTab th
0440: 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 73 61  at are in the sa
0450: 6d 65 20 64 61 74 61 62 61 73 65 20 61 73 20 70  me database as p
0460: 54 61 62 0a 2a 2a 20 61 72 65 20 61 6c 72 65 61  Tab.** are alrea
0470: 64 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 70  dy attached to p
0480: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 2e 20 20  Tab->pTrigger.  
0490: 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20  But there might 
04a0: 62 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  be additional.**
04b0: 20 74 72 69 67 67 65 72 73 20 6f 6e 20 70 54 61   triggers on pTa
04c0: 62 20 69 6e 20 74 68 65 20 54 45 4d 50 20 73 63  b in the TEMP sc
04d0: 68 65 6d 61 2e 20 20 54 68 69 73 20 72 6f 75 74  hema.  This rout
04e0: 69 6e 65 20 70 72 65 70 65 6e 64 73 20 61 6c 6c  ine prepends all
04f0: 0a 2a 2a 20 54 45 4d 50 20 74 72 69 67 67 65 72  .** TEMP trigger
0500: 73 20 6f 6e 20 70 54 61 62 20 74 6f 20 74 68 65  s on pTab to the
0510: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
0520: 65 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72  e pTab->pTrigger
0530: 20 6c 69 73 74 0a 2a 2a 20 61 6e 64 20 72 65 74   list.** and ret
0540: 75 72 6e 73 20 74 68 65 20 63 6f 6d 62 69 6e 65  urns the combine
0550: 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f  d list..**.** To
0560: 20 73 74 61 74 65 20 69 74 20 61 6e 6f 74 68 65   state it anothe
0570: 72 20 77 61 79 3a 20 20 54 68 69 73 20 72 6f 75  r way:  This rou
0580: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20 6c  tine returns a l
0590: 69 73 74 20 6f 66 20 61 6c 6c 20 74 72 69 67 67  ist of all trigg
05a0: 65 72 73 0a 2a 2a 20 74 68 61 74 20 66 69 72 65  ers.** that fire
05b0: 20 6f 66 66 20 6f 66 20 70 54 61 62 2e 20 20 54   off of pTab.  T
05c0: 68 65 20 6c 69 73 74 20 77 69 6c 6c 20 69 6e 63  he list will inc
05d0: 6c 75 64 65 20 61 6e 79 20 54 45 4d 50 20 74 72  lude any TEMP tr
05e0: 69 67 67 65 72 73 20 6f 6e 0a 2a 2a 20 70 54 61  iggers on.** pTa
05f0: 62 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  b as well as the
0600: 20 74 72 69 67 67 65 72 73 20 6c 69 73 65 64 20   triggers lised 
0610: 69 6e 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65  in pTab->pTrigge
0620: 72 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 20 2a 73  r..*/.Trigger *s
0630: 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73  qlite3TriggerLis
0640: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
0650: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
0660: 20 53 63 68 65 6d 61 20 2a 20 63 6f 6e 73 74 20   Schema * const 
0670: 70 54 6d 70 53 63 68 65 6d 61 20 3d 20 70 50 61  pTmpSchema = pPa
0680: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e  rse->db->aDb[1].
0690: 70 53 63 68 65 6d 61 3b 0a 20 20 54 72 69 67 67  pSchema;.  Trigg
06a0: 65 72 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20  er *pList = 0;  
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 72 69 67 67  /* List of trigg
06d0: 65 72 73 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ers to return */
06e0: 0a 0a 20 20 69 66 28 20 70 54 6d 70 53 63 68 65  ..  if( pTmpSche
06f0: 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma!=pTab->pSchem
0700: 61 20 29 7b 0a 20 20 20 20 48 61 73 68 45 6c 65  a ){.    HashEle
0710: 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  m *p;.    for(p=
0720: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
0730: 26 70 54 6d 70 53 63 68 65 6d 61 2d 3e 74 72 69  &pTmpSchema->tri
0740: 67 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  gHash); p; p=sql
0750: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
0760: 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a  .      Trigger *
0770: 70 54 72 69 67 20 3d 20 28 54 72 69 67 67 65 72  pTrig = (Trigger
0780: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
0790: 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  a(p);.      if( 
07a0: 70 54 72 69 67 2d 3e 70 54 61 62 53 63 68 65 6d  pTrig->pTabSchem
07b0: 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
07c0: 0a 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71  .       && 0==sq
07d0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 72  lite3StrICmp(pTr
07e0: 69 67 2d 3e 74 61 62 6c 65 2c 20 70 54 61 62 2d  ig->table, pTab-
07f0: 3e 7a 4e 61 6d 65 29 20 0a 20 20 20 20 20 20 29  >zName) .      )
0800: 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 2d  {.        pTrig-
0810: 3e 70 4e 65 78 74 20 3d 20 28 70 4c 69 73 74 20  >pNext = (pList 
0820: 3f 20 70 4c 69 73 74 20 3a 20 70 54 61 62 2d 3e  ? pList : pTab->
0830: 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20  pTrigger);.     
0840: 20 20 20 70 4c 69 73 74 20 3d 20 70 54 72 69 67     pList = pTrig
0850: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
0860: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 70    }..  return (p
0870: 4c 69 73 74 20 3f 20 70 4c 69 73 74 20 3a 20 70  List ? pList : p
0880: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 29 3b 0a  Tab->pTrigger);.
0890: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
08a0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
08b0: 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 73 65  arser when it se
08c0: 65 73 20 61 20 43 52 45 41 54 45 20 54 52 49 47  es a CREATE TRIG
08d0: 47 45 52 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  GER statement.**
08e0: 20 75 70 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   up to the point
08f0: 20 6f 66 20 74 68 65 20 42 45 47 49 4e 20 62 65   of the BEGIN be
0900: 66 6f 72 65 20 74 68 65 20 74 72 69 67 67 65 72  fore the trigger
0910: 20 61 63 74 69 6f 6e 73 2e 20 20 41 20 54 72 69   actions.  A Tri
0920: 67 67 65 72 0a 2a 2a 20 73 74 72 75 63 74 75 72  gger.** structur
0930: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  e is generated b
0940: 61 73 65 64 20 6f 6e 20 74 68 65 20 69 6e 66 6f  ased on the info
0950: 72 6d 61 74 69 6f 6e 20 61 76 61 69 6c 61 62 6c  rmation availabl
0960: 65 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20  e and stored.** 
0970: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
0980: 72 69 67 67 65 72 2e 20 20 41 66 74 65 72 20 74  rigger.  After t
0990: 68 65 20 74 72 69 67 67 65 72 20 61 63 74 69 6f  he trigger actio
09a0: 6e 73 20 68 61 76 65 20 62 65 65 6e 20 70 61 72  ns have been par
09b0: 73 65 64 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69  sed, the.** sqli
09c0: 74 65 33 46 69 6e 69 73 68 54 72 69 67 67 65 72  te3FinishTrigger
09d0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  () function is c
09e0: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
09f0: 65 20 74 68 65 20 74 72 69 67 67 65 72 0a 2a 2a  e the trigger.**
0a00: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 70 72   construction pr
0a10: 6f 63 65 73 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ocess..*/.void s
0a20: 71 6c 69 74 65 33 42 65 67 69 6e 54 72 69 67 67  qlite3BeginTrigg
0a30: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
0a40: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
0a50: 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74 20 6f   parse context o
0a60: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 52 49  f the CREATE TRI
0a70: 47 47 45 52 20 73 74 61 74 65 6d 65 6e 74 20 2a  GGER statement *
0a80: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
0a90: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  1,      /* The n
0aa0: 61 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67 67  ame of the trigg
0ab0: 65 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  er */.  Token *p
0ac0: 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54  Name2,      /* T
0ad0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
0ae0: 72 69 67 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20  rigger */.  int 
0af0: 74 72 5f 74 6d 2c 20 20 20 20 20 20 20 20 20 20  tr_tm,          
0b00: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 42 45 46  /* One of TK_BEF
0b10: 4f 52 45 2c 20 54 4b 5f 41 46 54 45 52 2c 20 54  ORE, TK_AFTER, T
0b20: 4b 5f 49 4e 53 54 45 41 44 20 2a 2f 0a 20 20 69  K_INSTEAD */.  i
0b30: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
0b40: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
0b50: 49 4e 53 45 52 54 2c 20 54 4b 5f 55 50 44 41 54  INSERT, TK_UPDAT
0b60: 45 2c 20 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a  E, TK_DELETE */.
0b70: 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d    IdList *pColum
0b80: 6e 73 2c 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20  ns,   /* column 
0b90: 6c 69 73 74 20 69 66 20 74 68 69 73 20 69 73 20  list if this is 
0ba0: 61 6e 20 55 50 44 41 54 45 20 4f 46 20 74 72 69  an UPDATE OF tri
0bb0: 67 67 65 72 20 2a 2f 0a 20 20 53 72 63 4c 69 73  gger */.  SrcLis
0bc0: 74 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 2f 2a  t *pTableName,/*
0bd0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
0be0: 20 74 61 62 6c 65 2f 76 69 65 77 20 74 68 65 20   table/view the 
0bf0: 74 72 69 67 67 65 72 20 61 70 70 6c 69 65 73 20  trigger applies 
0c00: 74 6f 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  to */.  Expr *pW
0c10: 68 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 57  hen,        /* W
0c20: 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  HEN clause */.  
0c30: 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20  int isTemp,     
0c40: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
0c50: 68 65 20 54 45 4d 50 4f 52 41 52 59 20 6b 65 79  he TEMPORARY key
0c60: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
0c70: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
0c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70           /* Supp
0c90: 72 65 73 73 20 65 72 72 6f 72 73 20 69 66 20 74  ress errors if t
0ca0: 68 65 20 74 72 69 67 67 65 72 20 61 6c 72 65 61  he trigger alrea
0cb0: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
0cc0: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
0cd0: 67 65 72 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  ger = 0;.  Table
0ce0: 20 2a 70 54 61 62 3b 0a 20 20 63 68 61 72 20 2a   *pTab;.  char *
0cf0: 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  zName = 0;      
0d00: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
0d10: 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 73 71   trigger */.  sq
0d20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
0d30: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
0d40: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
0d50: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
0d60: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74  e to store the t
0d70: 72 69 67 67 65 72 20 69 6e 20 2a 2f 0a 20 20 54  rigger in */.  T
0d80: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
0d90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
0da0: 71 75 61 6c 69 66 69 65 64 20 64 62 20 6e 61 6d  qualified db nam
0db0: 65 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73  e */.  DbFixer s
0dc0: 46 69 78 3b 0a 20 20 69 6e 74 20 69 54 61 62 44  Fix;.  int iTabD
0dd0: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  b;..  assert( pN
0de0: 61 6d 65 31 21 3d 30 20 29 3b 20 20 20 2f 2a 20  ame1!=0 );   /* 
0df0: 70 4e 61 6d 65 31 2d 3e 7a 20 6d 69 67 68 74 20  pName1->z might 
0e00: 62 65 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 6f 74  be NULL, but not
0e10: 20 70 4e 61 6d 65 31 20 69 74 73 65 6c 66 20 2a   pName1 itself *
0e20: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  /.  assert( pNam
0e30: 65 32 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  e2!=0 );.  asser
0e40: 74 28 20 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54  t( op==TK_INSERT
0e50: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 44 41 54   || op==TK_UPDAT
0e60: 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45  E || op==TK_DELE
0e70: 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
0e80: 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78 66 66 20  op>0 && op<0xff 
0e90: 29 3b 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20  );.  if( isTemp 
0ea0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 54 45 4d  ){.    /* If TEM
0eb0: 50 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c  P was specified,
0ec0: 20 74 68 65 6e 20 74 68 65 20 74 72 69 67 67 65   then the trigge
0ed0: 72 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62  r name may not b
0ee0: 65 20 71 75 61 6c 69 66 69 65 64 2e 20 2a 2f 0a  e qualified. */.
0ef0: 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e      if( pName2->
0f00: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  n>0 ){.      sql
0f10: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
0f20: 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20  rse, "temporary 
0f30: 74 72 69 67 67 65 72 20 6d 61 79 20 6e 6f 74 20  trigger may not 
0f40: 68 61 76 65 20 71 75 61 6c 69 66 69 65 64 20 6e  have qualified n
0f50: 61 6d 65 22 29 3b 0a 20 20 20 20 20 20 67 6f 74  ame");.      got
0f60: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
0f70: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 44 62  p;.    }.    iDb
0f80: 20 3d 20 31 3b 0a 20 20 20 20 70 4e 61 6d 65 20   = 1;.    pName 
0f90: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73  = pName1;.  }els
0fa0: 65 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  e{.    /* Figure
0fb0: 20 6f 75 74 20 74 68 65 20 64 62 20 74 68 61 74   out the db that
0fc0: 20 74 68 65 20 74 68 65 20 74 72 69 67 67 65 72   the the trigger
0fd0: 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
0fe0: 20 69 6e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d   in */.    iDb =
0ff0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
1000: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
1010: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
1020: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
1030: 3c 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  <0 ){.      goto
1040: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
1050: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1060: 2a 20 49 66 20 74 68 65 20 74 72 69 67 67 65 72  * If the trigger
1070: 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
1080: 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 74  ified, and the t
1090: 61 62 6c 65 20 69 73 20 61 20 74 65 6d 70 20 74  able is a temp t
10a0: 61 62 6c 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  able,.  ** then 
10b0: 73 65 74 20 69 44 62 20 74 6f 20 31 20 74 6f 20  set iDb to 1 to 
10c0: 63 72 65 61 74 65 20 74 68 65 20 74 72 69 67 67  create the trigg
10d0: 65 72 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  er in the tempor
10e0: 61 72 79 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ary database..  
10f0: 2a 2a 20 49 66 20 73 71 6c 69 74 65 33 53 72 63  ** If sqlite3Src
1100: 4c 69 73 74 4c 6f 6f 6b 75 70 28 29 20 72 65 74  ListLookup() ret
1110: 75 72 6e 73 20 30 2c 20 69 6e 64 69 63 61 74 69  urns 0, indicati
1120: 6e 67 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65  ng the table doe
1130: 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 78 69 73 74  s not.  ** exist
1140: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 63  , the error is c
1150: 61 75 67 68 74 20 62 79 20 74 68 65 20 62 6c 6f  aught by the blo
1160: 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  ck below..  */. 
1170: 20 69 66 28 20 21 70 54 61 62 6c 65 4e 61 6d 65   if( !pTableName
1180: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1190: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
11a0: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
11b0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73  ;.  }.  pTab = s
11c0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
11d0: 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62  kup(pParse, pTab
11e0: 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  leName);.  if( p
11f0: 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
1200: 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
1210: 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
1220: 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
1230: 69 44 62 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  iDb = 1;.  }..  
1240: 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 74 61  /* Ensure the ta
1250: 62 6c 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 73  ble name matches
1260: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 61   database name a
1270: 6e 64 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  nd that the tabl
1280: 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66  e exists */.  if
1290: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
12a0: 65 64 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65  ed ) goto trigge
12b0: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 61 73 73  r_cleanup;.  ass
12c0: 65 72 74 28 20 70 54 61 62 6c 65 4e 61 6d 65 2d  ert( pTableName-
12d0: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
12e0: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
12f0: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
1300: 69 44 62 2c 20 22 74 72 69 67 67 65 72 22 2c 20  iDb, "trigger", 
1310: 70 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20  pName) && .     
1320: 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
1330: 73 74 28 26 73 46 69 78 2c 20 70 54 61 62 6c 65  st(&sFix, pTable
1340: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  Name) ){.    got
1350: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
1360: 70 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  p;.  }.  pTab = 
1370: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
1380: 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61  okup(pParse, pTa
1390: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  bleName);.  if( 
13a0: 21 70 54 61 62 20 29 7b 0a 20 20 20 20 2f 2a 20  !pTab ){.    /* 
13b0: 54 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e  The table does n
13c0: 6f 74 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20  ot exist. */.   
13d0: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
13e0: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28  eanup;.  }.  if(
13f0: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
1400: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1410: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1420: 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74  "cannot create t
1430: 72 69 67 67 65 72 73 20 6f 6e 20 76 69 72 74 75  riggers on virtu
1440: 61 6c 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  al tables");.   
1450: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
1460: 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eanup;.  }..  /*
1470: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
1480: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
1490: 6e 6f 74 20 72 65 73 65 72 76 65 64 20 61 6e 64  not reserved and
14a0: 20 74 68 61 74 20 6e 6f 20 74 72 69 67 67 65 72   that no trigger
14b0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 70 65   of the.  ** spe
14c0: 63 69 66 69 65 64 20 6e 61 6d 65 20 65 78 69 73  cified name exis
14d0: 74 73 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20  ts */.  zName = 
14e0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
14f0: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
1500: 0a 20 20 69 66 28 20 21 7a 4e 61 6d 65 20 7c 7c  .  if( !zName ||
1510: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1520: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
1530: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
1540: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
1550: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
1560: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1570: 48 61 73 68 46 69 6e 64 28 26 28 64 62 2d 3e 61  HashFind(&(db->a
1580: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
1590: 3e 74 72 69 67 48 61 73 68 29 2c 0a 20 20 20 20  >trigHash),.    
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b0: 20 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33    zName, sqlite3
15c0: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 29  Strlen30(zName))
15d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6e 6f 45   ){.    if( !noE
15e0: 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rr ){.      sqli
15f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1600: 73 65 2c 20 22 74 72 69 67 67 65 72 20 25 54 20  se, "trigger %T 
1610: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
1620: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   pName);.    }. 
1630: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
1640: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20  cleanup;.  }..  
1650: 2f 2a 20 44 6f 20 6e 6f 74 20 63 72 65 61 74 65  /* Do not create
1660: 20 61 20 74 72 69 67 67 65 72 20 6f 6e 20 61 20   a trigger on a 
1670: 73 79 73 74 65 6d 20 74 61 62 6c 65 20 2a 2f 0a  system table */.
1680: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1690: 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
16a0: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
16b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
16c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16d0: 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74  e, "cannot creat
16e0: 65 20 74 72 69 67 67 65 72 20 6f 6e 20 73 79 73  e trigger on sys
16f0: 74 65 6d 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  tem table");.   
1700: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
1710: 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65  .    goto trigge
1720: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  r_cleanup;.  }..
1730: 20 20 2f 2a 20 49 4e 53 54 45 41 44 20 6f 66 20    /* INSTEAD of 
1740: 74 72 69 67 67 65 72 73 20 61 72 65 20 6f 6e 6c  triggers are onl
1750: 79 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20  y for views and 
1760: 76 69 65 77 73 20 6f 6e 6c 79 20 73 75 70 70 6f  views only suppo
1770: 72 74 20 49 4e 53 54 45 41 44 0a 20 20 2a 2a 20  rt INSTEAD.  ** 
1780: 6f 66 20 74 72 69 67 67 65 72 73 2e 0a 20 20 2a  of triggers..  *
1790: 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  /.  if( pTab->pS
17a0: 65 6c 65 63 74 20 26 26 20 74 72 5f 74 6d 21 3d  elect && tr_tm!=
17b0: 54 4b 5f 49 4e 53 54 45 41 44 20 29 7b 0a 20 20  TK_INSTEAD ){.  
17c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17d0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
17e0: 74 20 63 72 65 61 74 65 20 25 73 20 74 72 69 67  t create %s trig
17f0: 67 65 72 20 6f 6e 20 76 69 65 77 3a 20 25 53 22  ger on view: %S"
1800: 2c 20 0a 20 20 20 20 20 20 20 20 28 74 72 5f 74  , .        (tr_t
1810: 6d 20 3d 3d 20 54 4b 5f 42 45 46 4f 52 45 29 3f  m == TK_BEFORE)?
1820: 22 42 45 46 4f 52 45 22 3a 22 41 46 54 45 52 22  "BEFORE":"AFTER"
1830: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29  , pTableName, 0)
1840: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  ;.    goto trigg
1850: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
1860: 20 20 69 66 28 20 21 70 54 61 62 2d 3e 70 53 65    if( !pTab->pSe
1870: 6c 65 63 74 20 26 26 20 74 72 5f 74 6d 3d 3d 54  lect && tr_tm==T
1880: 4b 5f 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20  K_INSTEAD ){.   
1890: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18a0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
18b0: 20 63 72 65 61 74 65 20 49 4e 53 54 45 41 44 20   create INSTEAD 
18c0: 4f 46 22 0a 20 20 20 20 20 20 20 20 22 20 74 72  OF".        " tr
18d0: 69 67 67 65 72 20 6f 6e 20 74 61 62 6c 65 3a 20  igger on table: 
18e0: 25 53 22 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c  %S", pTableName,
18f0: 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72   0);.    goto tr
1900: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
1910: 20 7d 0a 20 20 69 54 61 62 44 62 20 3d 20 73 71   }.  iTabDb = sq
1920: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1930: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
1940: 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
1950: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
1960: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
1970: 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c    int code = SQL
1980: 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47  ITE_CREATE_TRIGG
1990: 45 52 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ER;.    const ch
19a0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
19b0: 62 5b 69 54 61 62 44 62 5d 2e 7a 4e 61 6d 65 3b  b[iTabDb].zName;
19c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
19d0: 2a 7a 44 62 54 72 69 67 20 3d 20 69 73 54 65 6d  *zDbTrig = isTem
19e0: 70 20 3f 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a  p ? db->aDb[1].z
19f0: 4e 61 6d 65 20 3a 20 7a 44 62 3b 0a 20 20 20 20  Name : zDb;.    
1a00: 69 66 28 20 69 54 61 62 44 62 3d 3d 31 20 7c 7c  if( iTabDb==1 ||
1a10: 20 69 73 54 65 6d 70 20 29 20 63 6f 64 65 20 3d   isTemp ) code =
1a20: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
1a30: 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20  EMP_TRIGGER;.   
1a40: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1a50: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
1a60: 64 65 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  de, zName, pTab-
1a70: 3e 7a 4e 61 6d 65 2c 20 7a 44 62 54 72 69 67 29  >zName, zDbTrig)
1a80: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74   ){.      goto t
1a90: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
1aa0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
1ab0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1ac0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
1ad0: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
1ae0: 4c 45 28 69 54 61 62 44 62 29 2c 30 2c 7a 44 62  LE(iTabDb),0,zDb
1af0: 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74  )){.      goto t
1b00: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
1b10: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1b20: 0a 0a 20 20 2f 2a 20 49 4e 53 54 45 41 44 20 4f  ..  /* INSTEAD O
1b30: 46 20 74 72 69 67 67 65 72 73 20 63 61 6e 20 6f  F triggers can o
1b40: 6e 6c 79 20 61 70 70 65 61 72 20 6f 6e 20 76 69  nly appear on vi
1b50: 65 77 73 20 61 6e 64 20 42 45 46 4f 52 45 20 74  ews and BEFORE t
1b60: 72 69 67 67 65 72 73 0a 20 20 2a 2a 20 63 61 6e  riggers.  ** can
1b70: 6e 6f 74 20 61 70 70 65 61 72 20 6f 6e 20 76 69  not appear on vi
1b80: 65 77 73 2e 20 20 53 6f 20 77 65 20 6d 69 67 68  ews.  So we migh
1b90: 74 20 61 73 20 77 65 6c 6c 20 74 72 61 6e 73 6c  t as well transl
1ba0: 61 74 65 20 65 76 65 72 79 0a 20 20 2a 2a 20 49  ate every.  ** I
1bb0: 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67 67 65  NSTEAD OF trigge
1bc0: 72 20 69 6e 74 6f 20 61 20 42 45 46 4f 52 45 20  r into a BEFORE 
1bd0: 74 72 69 67 67 65 72 2e 20 20 49 74 20 73 69 6d  trigger.  It sim
1be0: 70 6c 69 66 69 65 73 20 63 6f 64 65 0a 20 20 2a  plifies code.  *
1bf0: 2a 20 65 6c 73 65 77 68 65 72 65 2e 0a 20 20 2a  * elsewhere..  *
1c00: 2f 0a 20 20 69 66 20 28 74 72 5f 74 6d 20 3d 3d  /.  if (tr_tm ==
1c10: 20 54 4b 5f 49 4e 53 54 45 41 44 29 7b 0a 20 20   TK_INSTEAD){.  
1c20: 20 20 74 72 5f 74 6d 20 3d 20 54 4b 5f 42 45 46    tr_tm = TK_BEF
1c30: 4f 52 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  ORE;.  }..  /* B
1c40: 75 69 6c 64 20 74 68 65 20 54 72 69 67 67 65 72  uild the Trigger
1c50: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 54 72   object */.  pTr
1c60: 69 67 67 65 72 20 3d 20 28 54 72 69 67 67 65 72  igger = (Trigger
1c70: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
1c80: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1c90: 28 54 72 69 67 67 65 72 29 29 3b 0a 20 20 69 66  (Trigger));.  if
1ca0: 28 20 70 54 72 69 67 67 65 72 3d 3d 30 20 29 20  ( pTrigger==0 ) 
1cb0: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
1cc0: 61 6e 75 70 3b 0a 20 20 70 54 72 69 67 67 65 72  anup;.  pTrigger
1cd0: 2d 3e 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  ->name = zName;.
1ce0: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70    zName = 0;.  p
1cf0: 54 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 20 3d  Trigger->table =
1d00: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
1d10: 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d  (db, pTableName-
1d20: 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[0].zName);.  
1d30: 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
1d40: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
1d50: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 72 69  .pSchema;.  pTri
1d60: 67 67 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61  gger->pTabSchema
1d70: 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61   = pTab->pSchema
1d80: 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 6f 70  ;.  pTrigger->op
1d90: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 54 72   = (u8)op;.  pTr
1da0: 69 67 67 65 72 2d 3e 74 72 5f 74 6d 20 3d 20 74  igger->tr_tm = t
1db0: 72 5f 74 6d 3d 3d 54 4b 5f 42 45 46 4f 52 45 20  r_tm==TK_BEFORE 
1dc0: 3f 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45  ? TRIGGER_BEFORE
1dd0: 20 3a 20 54 52 49 47 47 45 52 5f 41 46 54 45 52   : TRIGGER_AFTER
1de0: 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 70 57  ;.  pTrigger->pW
1df0: 68 65 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  hen = sqlite3Exp
1e00: 72 44 75 70 28 64 62 2c 20 70 57 68 65 6e 2c 20  rDup(db, pWhen, 
1e10: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
1e20: 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 70 43 6f  .  pTrigger->pCo
1e30: 6c 75 6d 6e 73 20 3d 20 73 71 6c 69 74 65 33 49  lumns = sqlite3I
1e40: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 6f  dListDup(db, pCo
1e50: 6c 75 6d 6e 73 29 3b 0a 20 20 61 73 73 65 72 74  lumns);.  assert
1e60: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72  ( pParse->pNewTr
1e70: 69 67 67 65 72 3d 3d 30 20 29 3b 0a 20 20 70 50  igger==0 );.  pP
1e80: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
1e90: 72 20 3d 20 70 54 72 69 67 67 65 72 3b 0a 0a 74  r = pTrigger;..t
1ea0: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a  rigger_cleanup:.
1eb0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1ec0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
1ed0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1ee0: 74 65 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d  te(db, pTableNam
1ef0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  e);.  sqlite3IdL
1f00: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
1f10: 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74  olumns);.  sqlit
1f20: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1f30: 20 70 57 68 65 6e 29 3b 0a 20 20 69 66 28 20 21   pWhen);.  if( !
1f40: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
1f50: 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ger ){.    sqlit
1f60: 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 28  e3DeleteTrigger(
1f70: 64 62 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  db, pTrigger);. 
1f80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
1f90: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
1fa0: 54 72 69 67 67 65 72 3d 3d 70 54 72 69 67 67 65  Trigger==pTrigge
1fb0: 72 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  r );.  }.}../*.*
1fc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1fd0: 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
1fe0: 6c 6c 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  ll of the trigge
1ff0: 72 20 61 63 74 69 6f 6e 73 20 68 61 76 65 20 62  r actions have b
2000: 65 65 6e 20 70 61 72 73 65 64 0a 2a 2a 20 69 6e  een parsed.** in
2010: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
2020: 74 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  te the process o
2030: 66 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 74  f building the t
2040: 72 69 67 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  rigger..*/.void 
2050: 73 71 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69  sqlite3FinishTri
2060: 67 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  gger(.  Parse *p
2070: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
2080: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
2090: 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74  t */.  TriggerSt
20a0: 65 70 20 2a 70 53 74 65 70 4c 69 73 74 2c 20 2f  ep *pStepList, /
20b0: 2a 20 54 68 65 20 74 72 69 67 67 65 72 65 64 20  * The triggered 
20c0: 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 54 6f 6b  program */.  Tok
20d0: 65 6e 20 2a 70 41 6c 6c 20 20 20 20 20 20 20 20  en *pAll        
20e0: 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 68       /* Token th
20f0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
2100: 20 63 6f 6d 70 6c 65 74 65 20 43 52 45 41 54 45   complete CREATE
2110: 20 54 52 49 47 47 45 52 20 2a 2f 0a 29 7b 0a 20   TRIGGER */.){. 
2120: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 20   Trigger *pTrig 
2130: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72  = pParse->pNewTr
2140: 69 67 67 65 72 3b 20 20 20 20 2f 2a 20 54 72 69  igger;    /* Tri
2150: 67 67 65 72 20 62 65 69 6e 67 20 66 69 6e 69 73  gger being finis
2160: 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  hed */.  char *z
2170: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 72 69    /* Name of tri
21a0: 67 67 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gger */.  sqlite
21b0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
21c0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
21d0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
21e0: 73 65 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20  se */.  DbFixer 
21f0: 73 46 69 78 3b 0a 20 20 69 6e 74 20 69 44 62 3b  sFix;.  int iDb;
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
2230: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 72 69 67  taining the trig
2240: 67 65 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 6e  ger */.  Token n
2250: 61 6d 65 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20  ameToken;       
2260: 20 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 6e      /* Trigger n
2270: 61 6d 65 20 66 6f 72 20 65 72 72 6f 72 20 72 65  ame for error re
2280: 70 6f 72 74 69 6e 67 20 2a 2f 0a 0a 20 20 70 54  porting */..  pT
2290: 72 69 67 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  rig = pParse->pN
22a0: 65 77 54 72 69 67 67 65 72 3b 0a 20 20 70 50 61  ewTrigger;.  pPa
22b0: 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72  rse->pNewTrigger
22c0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45   = 0;.  if( NEVE
22d0: 52 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 29 20  R(pParse->nErr) 
22e0: 7c 7c 20 21 70 54 72 69 67 20 29 20 67 6f 74 6f  || !pTrig ) goto
22f0: 20 74 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63   triggerfinish_c
2300: 6c 65 61 6e 75 70 3b 0a 20 20 7a 4e 61 6d 65 20  leanup;.  zName 
2310: 3d 20 70 54 72 69 67 2d 3e 6e 61 6d 65 3b 0a 20  = pTrig->name;. 
2320: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
2330: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
2340: 73 65 2d 3e 64 62 2c 20 70 54 72 69 67 2d 3e 70  se->db, pTrig->p
2350: 53 63 68 65 6d 61 29 3b 0a 20 20 70 54 72 69 67  Schema);.  pTrig
2360: 2d 3e 73 74 65 70 5f 6c 69 73 74 20 3d 20 70 53  ->step_list = pS
2370: 74 65 70 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  tepList;.  while
2380: 28 20 70 53 74 65 70 4c 69 73 74 20 29 7b 0a 20  ( pStepList ){. 
2390: 20 20 20 70 53 74 65 70 4c 69 73 74 2d 3e 70 54     pStepList->pT
23a0: 72 69 67 20 3d 20 70 54 72 69 67 3b 0a 20 20 20  rig = pTrig;.   
23b0: 20 70 53 74 65 70 4c 69 73 74 20 3d 20 70 53 74   pStepList = pSt
23c0: 65 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  epList->pNext;. 
23d0: 20 7d 0a 20 20 6e 61 6d 65 54 6f 6b 65 6e 2e 7a   }.  nameToken.z
23e0: 20 3d 20 70 54 72 69 67 2d 3e 6e 61 6d 65 3b 0a   = pTrig->name;.
23f0: 20 20 6e 61 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20    nameToken.n = 
2400: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2410: 6e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  nameToken.z);.  
2420: 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
2430: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
2440: 2c 20 69 44 62 2c 20 22 74 72 69 67 67 65 72 22  , iDb, "trigger"
2450: 2c 20 26 6e 61 6d 65 54 6f 6b 65 6e 29 20 0a 20  , &nameToken) . 
2460: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
2470: 74 65 33 46 69 78 54 72 69 67 67 65 72 53 74 65  te3FixTriggerSte
2480: 70 28 26 73 46 69 78 2c 20 70 54 72 69 67 2d 3e  p(&sFix, pTrig->
2490: 73 74 65 70 5f 6c 69 73 74 29 20 29 7b 0a 20 20  step_list) ){.  
24a0: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69    goto triggerfi
24b0: 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  nish_cleanup;.  
24c0: 7d 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 72  }..  /* if we ar
24d0: 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  e not initializi
24e0: 6e 67 2c 20 61 6e 64 20 74 68 69 73 20 74 72 69  ng, and this tri
24f0: 67 67 65 72 20 69 73 20 6e 6f 74 20 6f 6e 20 61  gger is not on a
2500: 20 54 45 4d 50 20 74 61 62 6c 65 2c 20 0a 20 20   TEMP table, .  
2510: 2a 2a 20 62 75 69 6c 64 20 74 68 65 20 73 71 6c  ** build the sql
2520: 69 74 65 5f 6d 61 73 74 65 72 20 65 6e 74 72 79  ite_master entry
2530: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
2540: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
2550: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
2560: 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20 2f 2a 20  har *z;..    /* 
2570: 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  Make an entry in
2580: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
2590: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
25a0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
25b0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
25c0: 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
25d0: 74 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c  triggerfinish_cl
25e0: 65 61 6e 75 70 3b 0a 20 20 20 20 73 71 6c 69 74  eanup;.    sqlit
25f0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
2600: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
2610: 20 69 44 62 29 3b 0a 20 20 20 20 7a 20 3d 20 73   iDb);.    z = s
2620: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
2630: 64 62 2c 20 28 63 68 61 72 2a 29 70 41 6c 6c 2d  db, (char*)pAll-
2640: 3e 7a 2c 20 70 41 6c 6c 2d 3e 6e 29 3b 0a 20 20  >z, pAll->n);.  
2650: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
2660: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
2670: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
2680: 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 74   %Q.%s VALUES('t
2690: 72 69 67 67 65 72 27 2c 25 51 2c 25 51 2c 30 2c  rigger',%Q,%Q,0,
26a0: 27 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20  'CREATE TRIGGER 
26b0: 25 71 27 29 22 2c 0a 20 20 20 20 20 20 20 64 62  %q')",.       db
26c0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
26d0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
26e0: 44 62 29 2c 20 7a 4e 61 6d 65 2c 0a 20 20 20 20  Db), zName,.    
26f0: 20 20 20 70 54 72 69 67 2d 3e 74 61 62 6c 65 2c     pTrig->table,
2700: 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
2710: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
2720: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
2730: 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
2740: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
2750: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2760: 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
2770: 62 2c 20 30 2c 20 30 2c 20 73 71 6c 69 74 65 33  b, 0, 0, sqlite3
2780: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
2790: 20 64 62 2c 20 22 74 79 70 65 3d 27 74 72 69 67   db, "type='trig
27a0: 67 65 72 27 20 41 4e 44 20 6e 61 6d 65 3d 27 25  ger' AND name='%
27b0: 71 27 22 2c 20 7a 4e 61 6d 65 29 2c 20 50 34 5f  q'", zName), P4_
27c0: 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20  DYNAMIC.    );. 
27d0: 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   }..  if( db->in
27e0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54  it.busy ){.    T
27f0: 72 69 67 67 65 72 20 2a 70 4c 69 6e 6b 20 3d 20  rigger *pLink = 
2800: 70 54 72 69 67 3b 0a 20 20 20 20 48 61 73 68 20  pTrig;.    Hash 
2810: 2a 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44  *pHash = &db->aD
2820: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
2830: 74 72 69 67 48 61 73 68 3b 0a 20 20 20 20 70 54  trigHash;.    pT
2840: 72 69 67 20 3d 20 73 71 6c 69 74 65 33 48 61 73  rig = sqlite3Has
2850: 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a  hInsert(pHash, z
2860: 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
2870: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 70 54  len30(zName), pT
2880: 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 70 54  rig);.    if( pT
2890: 72 69 67 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  rig ){.      db-
28a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
28b0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
28c0: 20 70 4c 69 6e 6b 2d 3e 70 53 63 68 65 6d 61 3d   pLink->pSchema=
28d0: 3d 70 4c 69 6e 6b 2d 3e 70 54 61 62 53 63 68 65  =pLink->pTabSche
28e0: 6d 61 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  ma ){.      Tabl
28f0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
2900: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
2910: 72 6c 65 6e 33 30 28 70 4c 69 6e 6b 2d 3e 74 61  rlen30(pLink->ta
2920: 62 6c 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  ble);.      pTab
2930: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
2940: 6e 64 28 26 70 4c 69 6e 6b 2d 3e 70 54 61 62 53  nd(&pLink->pTabS
2950: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
2960: 70 4c 69 6e 6b 2d 3e 74 61 62 6c 65 2c 20 6e 29  pLink->table, n)
2970: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2980: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
2990: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLink->pNext = 
29a0: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
29b0: 20 20 20 20 20 20 70 54 61 62 2d 3e 70 54 72 69        pTab->pTri
29c0: 67 67 65 72 20 3d 20 70 4c 69 6e 6b 3b 0a 20 20  gger = pLink;.  
29d0: 20 20 7d 0a 20 20 7d 0a 0a 74 72 69 67 67 65 72    }.  }..trigger
29e0: 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3a 0a  finish_cleanup:.
29f0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
2a00: 72 69 67 67 65 72 28 64 62 2c 20 70 54 72 69 67  rigger(db, pTrig
2a10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  );.  assert( !pP
2a20: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
2a30: 72 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  r );.  sqlite3De
2a40: 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28  leteTriggerStep(
2a50: 64 62 2c 20 70 53 74 65 70 4c 69 73 74 29 3b 0a  db, pStepList);.
2a60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  }../*.** Turn a 
2a70: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2a80: 20 28 74 68 61 74 20 74 68 65 20 70 53 65 6c 65   (that the pSele
2a90: 63 74 20 70 61 72 61 6d 65 74 65 72 20 70 6f 69  ct parameter poi
2aa0: 6e 74 73 20 74 6f 29 20 69 6e 74 6f 0a 2a 2a 20  nts to) into.** 
2ab0: 61 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20  a trigger step. 
2ac0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
2ad0: 72 20 74 6f 20 61 20 54 72 69 67 67 65 72 53 74  r to a TriggerSt
2ae0: 65 70 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ep structure..**
2af0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
2b00: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
2b10: 65 20 77 68 65 6e 20 69 74 20 66 69 6e 64 73 20  e when it finds 
2b20: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2b30: 6e 74 20 69 6e 0a 2a 2a 20 62 6f 64 79 20 6f 66  nt in.** body of
2b40: 20 61 20 54 52 49 47 47 45 52 2e 20 20 0a 2a 2f   a TRIGGER.  .*/
2b50: 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 71  .TriggerStep *sq
2b60: 6c 69 74 65 33 54 72 69 67 67 65 72 53 65 6c 65  lite3TriggerSele
2b70: 63 74 53 74 65 70 28 73 71 6c 69 74 65 33 20 2a  ctStep(sqlite3 *
2b80: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  db, Select *pSel
2b90: 65 63 74 29 7b 0a 20 20 54 72 69 67 67 65 72 53  ect){.  TriggerS
2ba0: 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65  tep *pTriggerSte
2bb0: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
2bc0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
2bd0: 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29 29  of(TriggerStep))
2be0: 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72  ;.  if( pTrigger
2bf0: 53 74 65 70 3d 3d 30 20 29 20 7b 0a 20 20 20 20  Step==0 ) {.    
2c00: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
2c10: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
2c20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2c30: 20 20 7d 0a 20 20 70 54 72 69 67 67 65 72 53 74    }.  pTriggerSt
2c40: 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45  ep->op = TK_SELE
2c50: 43 54 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74  CT;.  pTriggerSt
2c60: 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53  ep->pSelect = pS
2c70: 65 6c 65 63 74 3b 0a 20 20 70 54 72 69 67 67 65  elect;.  pTrigge
2c80: 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20  rStep->orconf = 
2c90: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 72 65  OE_Default;.  re
2ca0: 74 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65  turn pTriggerSte
2cb0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  p;.}../*.** Allo
2cc0: 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 68 6f  cate space to ho
2cd0: 6c 64 20 61 20 6e 65 77 20 74 72 69 67 67 65 72  ld a new trigger
2ce0: 20 73 74 65 70 2e 20 20 54 68 65 20 61 6c 6c 6f   step.  The allo
2cf0: 63 61 74 65 64 20 73 70 61 63 65 0a 2a 2a 20 68  cated space.** h
2d00: 6f 6c 64 73 20 62 6f 74 68 20 74 68 65 20 54 72  olds both the Tr
2d10: 69 67 67 65 72 53 74 65 70 20 6f 62 6a 65 63 74  iggerStep object
2d20: 20 61 6e 64 20 74 68 65 20 54 72 69 67 67 65 72   and the Trigger
2d30: 53 74 65 70 2e 74 61 72 67 65 74 2e 7a 20 73 74  Step.target.z st
2d40: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ring..**.** If a
2d50: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
2d60: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
2d70: 72 6e 65 64 20 61 6e 64 20 64 62 2d 3e 6d 61 6c  rned and db->mal
2d80: 6c 6f 63 46 61 69 6c 65 64 20 69 73 20 73 65 74  locFailed is set
2d90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 67  ..*/.static Trig
2da0: 67 65 72 53 74 65 70 20 2a 74 72 69 67 67 65 72  gerStep *trigger
2db0: 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 0a 20 20  StepAllocate(.  
2dc0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2de0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2df0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  on */.  int op, 
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 6f      /* Trigger o
2e20: 70 63 6f 64 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  pcode */.  Token
2e30: 20 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20   *pName         
2e40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
2e50: 72 67 65 74 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a  rget name */.){.
2e60: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70    TriggerStep *p
2e70: 54 72 69 67 67 65 72 53 74 65 70 3b 0a 0a 20 20  TriggerStep;..  
2e80: 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 73  pTriggerStep = s
2e90: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
2ea0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72  ro(db, sizeof(Tr
2eb0: 69 67 67 65 72 53 74 65 70 29 20 2b 20 70 4e 61  iggerStep) + pNa
2ec0: 6d 65 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70 54  me->n);.  if( pT
2ed0: 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20  riggerStep ){.  
2ee0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61    char *z = (cha
2ef0: 72 2a 29 26 70 54 72 69 67 67 65 72 53 74 65 70  r*)&pTriggerStep
2f00: 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
2f10: 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  z, pName->z, pNa
2f20: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 72 69  me->n);.    pTri
2f30: 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74  ggerStep->target
2f40: 2e 7a 20 3d 20 7a 3b 0a 20 20 20 20 70 54 72 69  .z = z;.    pTri
2f50: 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74  ggerStep->target
2f60: 2e 6e 20 3d 20 70 4e 61 6d 65 2d 3e 6e 3b 0a 20  .n = pName->n;. 
2f70: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
2f80: 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 7d 0a 20 20  >op = op;.  }.  
2f90: 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53  return pTriggerS
2fa0: 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75  tep;.}../*.** Bu
2fb0: 69 6c 64 20 61 20 74 72 69 67 67 65 72 20 73 74  ild a trigger st
2fc0: 65 70 20 6f 75 74 20 6f 66 20 61 6e 20 49 4e 53  ep out of an INS
2fd0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ERT statement.  
2fe0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2ff0: 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 77 20 74  .** to the new t
3000: 72 69 67 67 65 72 20 73 74 65 70 2e 0a 2a 2a 0a  rigger step..**.
3010: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
3020: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
3030: 20 77 68 65 6e 20 69 74 20 73 65 65 73 20 61 6e   when it sees an
3040: 20 49 4e 53 45 52 54 20 69 6e 73 69 64 65 20 74   INSERT inside t
3050: 68 65 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20  he.** body of a 
3060: 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72 69 67  trigger..*/.Trig
3070: 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33  gerStep *sqlite3
3080: 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74 65  TriggerInsertSte
3090: 70 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p(.  sqlite3 *db
30a0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
30b0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
30c0: 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
30d0: 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 2f 2a 20  pTableName,  /* 
30e0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
30f0: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
3100: 69 6e 73 65 72 74 20 2a 2f 0a 20 20 49 64 4c 69  insert */.  IdLi
3110: 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20 20  st *pColumn,    
3120: 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
3130: 6e 73 20 69 6e 20 70 54 61 62 6c 65 4e 61 6d 65  ns in pTableName
3140: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3150: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3160: 45 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20  EList,   /* The 
3170: 56 41 4c 55 45 20 63 6c 61 75 73 65 3a 20 61 20  VALUE clause: a 
3180: 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74  list of values t
3190: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f  o be inserted */
31a0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
31b0: 63 74 2c 20 20 20 20 2f 2a 20 41 20 53 45 4c 45  ct,    /* A SELE
31c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
31d0: 74 20 73 75 70 70 6c 69 65 73 20 76 61 6c 75 65  t supplies value
31e0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e  s */.  int orcon
31f0: 66 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  f          /* Th
3200: 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
3210: 69 74 68 6d 20 28 4f 45 5f 41 62 6f 72 74 2c 20  ithm (OE_Abort, 
3220: 4f 45 5f 52 65 70 6c 61 63 65 2c 20 65 74 63 2e  OE_Replace, etc.
3230: 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65  ) */.){.  Trigge
3240: 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53  rStep *pTriggerS
3250: 74 65 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 70  tep;..  assert(p
3260: 45 4c 69 73 74 20 3d 3d 20 30 20 7c 7c 20 70 53  EList == 0 || pS
3270: 65 6c 65 63 74 20 3d 3d 20 30 29 3b 0a 20 20 61  elect == 0);.  a
3280: 73 73 65 72 74 28 70 45 4c 69 73 74 20 21 3d 20  ssert(pEList != 
3290: 30 20 7c 7c 20 70 53 65 6c 65 63 74 20 21 3d 20  0 || pSelect != 
32a0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
32b0: 61 69 6c 65 64 29 3b 0a 0a 20 20 70 54 72 69 67  ailed);..  pTrig
32c0: 67 65 72 53 74 65 70 20 3d 20 74 72 69 67 67 65  gerStep = trigge
32d0: 72 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62  rStepAllocate(db
32e0: 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 70 54 61  , TK_INSERT, pTa
32f0: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  bleName);.  if( 
3300: 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a  pTriggerStep ){.
3310: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
3320: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
3330: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
3340: 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55   pSelect, EXPRDU
3350: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 70  P_REDUCE);.    p
3360: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 49 64  TriggerStep->pId
3370: 4c 69 73 74 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a  List = pColumn;.
3380: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
3390: 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 73 71  ->pExprList = sq
33a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
33b0: 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 45 58 50  (db, pEList, EXP
33c0: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
33d0: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
33e0: 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b  orconf = orconf;
33f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
3400: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
3410: 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b 0a  e(db, pColumn);.
3420: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
3430: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
3440: 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
3450: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
3460: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 0a 20 20  b, pSelect);..  
3470: 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53  return pTriggerS
3480: 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  tep;.}../*.** Co
3490: 6e 73 74 72 75 63 74 20 61 20 74 72 69 67 67 65  nstruct a trigge
34a0: 72 20 73 74 65 70 20 74 68 61 74 20 69 6d 70 6c  r step that impl
34b0: 65 6d 65 6e 74 73 20 61 6e 20 55 50 44 41 54 45  ements an UPDATE
34c0: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
34d0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
34e0: 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67 67  er to that trigg
34f0: 65 72 20 73 74 65 70 2e 20 20 54 68 65 20 70 61  er step.  The pa
3500: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
3510: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 0a  routine when it.
3520: 2a 2a 20 73 65 65 73 20 61 6e 20 55 50 44 41 54  ** sees an UPDAT
3530: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 69  E statement insi
3540: 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  de the body of a
3550: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 2e   CREATE TRIGGER.
3560: 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20  .*/.TriggerStep 
3570: 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 55  *sqlite3TriggerU
3580: 70 64 61 74 65 53 74 65 70 28 0a 20 20 73 71 6c  pdateStep(.  sql
3590: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
35a0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
35b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
35c0: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e    Token *pTableN
35d0: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
35e0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
35f0: 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 45  e updated */.  E
3600: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
3610: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 54 20 63      /* The SET c
3620: 6c 61 75 73 65 3a 20 6c 69 73 74 20 6f 66 20 63  lause: list of c
3630: 6f 6c 75 6d 6e 20 61 6e 64 20 6e 65 77 20 76 61  olumn and new va
3640: 6c 75 65 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a  lues */.  Expr *
3650: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 2f  pWhere,        /
3660: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
3670: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f  se */.  int orco
3680: 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nf           /* 
3690: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
36a0: 6f 72 69 74 68 6d 2e 20 28 4f 45 5f 41 62 6f 72  orithm. (OE_Abor
36b0: 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74  t, OE_Ignore, et
36c0: 63 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  c) */.){.  Trigg
36d0: 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72  erStep *pTrigger
36e0: 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67 67 65  Step;..  pTrigge
36f0: 72 53 74 65 70 20 3d 20 74 72 69 67 67 65 72 53  rStep = triggerS
3700: 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62 2c 20  tepAllocate(db, 
3710: 54 4b 5f 55 50 44 41 54 45 2c 20 70 54 61 62 6c  TK_UPDATE, pTabl
3720: 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54  eName);.  if( pT
3730: 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20  riggerStep ){.  
3740: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3750: 70 45 78 70 72 4c 69 73 74 20 3d 20 73 71 6c 69  pExprList = sqli
3760: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
3770: 62 2c 20 70 45 4c 69 73 74 2c 20 45 58 50 52 44  b, pEList, EXPRD
3780: 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20  UP_REDUCE);.    
3790: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57  pTriggerStep->pW
37a0: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
37b0: 70 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 65  prDup(db, pWhere
37c0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
37d0: 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53  );.    pTriggerS
37e0: 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72  tep->orconf = or
37f0: 63 6f 6e 66 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  conf;.  }.  sqli
3800: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
3810: 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
3820: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3830: 74 65 28 64 62 2c 20 70 57 68 65 72 65 29 3b 0a  te(db, pWhere);.
3840: 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65    return pTrigge
3850: 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rStep;.}../*.** 
3860: 43 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69 67  Construct a trig
3870: 67 65 72 20 73 74 65 70 20 74 68 61 74 20 69 6d  ger step that im
3880: 70 6c 65 6d 65 6e 74 73 20 61 20 44 45 4c 45 54  plements a DELET
3890: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  E statement and 
38a0: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
38b0: 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67  ter to that trig
38c0: 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20 70  ger step.  The p
38d0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
38e0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74   routine when it
38f0: 0a 2a 2a 20 73 65 65 73 20 61 20 44 45 4c 45 54  .** sees a DELET
3900: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 69  E statement insi
3910: 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  de the body of a
3920: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 2e   CREATE TRIGGER.
3930: 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20  .*/.TriggerStep 
3940: 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 44  *sqlite3TriggerD
3950: 65 6c 65 74 65 53 74 65 70 28 0a 20 20 73 71 6c  eleteStep(.  sql
3960: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3970: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3980: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
3990: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
39a0: 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  me,      /* The 
39b0: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
39c0: 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65   rows are delete
39d0: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
39e0: 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  ere            /
39f0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
3a00: 73 65 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  se */.){.  Trigg
3a10: 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72  erStep *pTrigger
3a20: 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67 67 65  Step;..  pTrigge
3a30: 72 53 74 65 70 20 3d 20 74 72 69 67 67 65 72 53  rStep = triggerS
3a40: 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62 2c 20  tepAllocate(db, 
3a50: 54 4b 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 6c  TK_DELETE, pTabl
3a60: 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54  eName);.  if( pT
3a70: 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20  riggerStep ){.  
3a80: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3a90: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
3aa0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65  ExprDup(db, pWhe
3ab0: 72 65 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  re, EXPRDUP_REDU
3ac0: 43 45 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65  CE);.    pTrigge
3ad0: 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20  rStep->orconf = 
3ae0: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 7d 0a  OE_Default;.  }.
3af0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3b00: 65 74 65 28 64 62 2c 20 70 57 68 65 72 65 29 3b  ete(db, pWhere);
3b10: 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67  .  return pTrigg
3b20: 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  erStep;.}../* .*
3b30: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
3b40: 6c 65 74 65 20 61 20 54 72 69 67 67 65 72 20 73  lete a Trigger s
3b50: 74 72 75 63 74 75 72 65 0a 2a 2f 0a 76 6f 69 64  tructure.*/.void
3b60: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72   sqlite3DeleteTr
3b70: 69 67 67 65 72 28 73 71 6c 69 74 65 33 20 2a 64  igger(sqlite3 *d
3b80: 62 2c 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  b, Trigger *pTri
3b90: 67 67 65 72 29 7b 0a 20 20 69 66 28 20 70 54 72  gger){.  if( pTr
3ba0: 69 67 67 65 72 3d 3d 30 20 29 20 72 65 74 75 72  igger==0 ) retur
3bb0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  n;.  sqlite3Dele
3bc0: 74 65 54 72 69 67 67 65 72 53 74 65 70 28 64 62  teTriggerStep(db
3bd0: 2c 20 70 54 72 69 67 67 65 72 2d 3e 73 74 65 70  , pTrigger->step
3be0: 5f 6c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  _list);.  sqlite
3bf0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 72 69  3DbFree(db, pTri
3c00: 67 67 65 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 73  gger->name);.  s
3c10: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3c20: 20 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c 65   pTrigger->table
3c30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
3c40: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 72 69 67  Delete(db, pTrig
3c50: 67 65 72 2d 3e 70 57 68 65 6e 29 3b 0a 20 20 73  ger->pWhen);.  s
3c60: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
3c70: 74 65 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d  te(db, pTrigger-
3c80: 3e 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73 71  >pColumns);.  sq
3c90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3ca0: 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  pTrigger);.}../*
3cb0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3cc0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64  n is called to d
3cd0: 72 6f 70 20 61 20 74 72 69 67 67 65 72 20 66 72  rop a trigger fr
3ce0: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
3cf0: 73 63 68 65 6d 61 2e 20 0a 2a 2a 0a 2a 2a 20 54  schema. .**.** T
3d00: 68 69 73 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  his may be calle
3d10: 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  d directly from 
3d20: 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 74  the parser and t
3d30: 68 65 72 65 66 6f 72 65 20 69 64 65 6e 74 69 66  herefore identif
3d40: 69 65 73 0a 2a 2a 20 74 68 65 20 74 72 69 67 67  ies.** the trigg
3d50: 65 72 20 62 79 20 6e 61 6d 65 2e 20 20 54 68 65  er by name.  The
3d60: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
3d70: 67 65 72 50 74 72 28 29 20 72 6f 75 74 69 6e 65  gerPtr() routine
3d80: 20 64 6f 65 73 20 74 68 65 0a 2a 2a 20 73 61 6d   does the.** sam
3d90: 65 20 6a 6f 62 20 61 73 20 74 68 69 73 20 72 6f  e job as this ro
3da0: 75 74 69 6e 65 20 65 78 63 65 70 74 20 69 74 20  utine except it 
3db0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
3dc0: 74 6f 20 74 68 65 20 74 72 69 67 67 65 72 0a 2a  to the trigger.*
3dd0: 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  * instead of the
3de0: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 2e 0a 2a   trigger name..*
3df0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3e00: 72 6f 70 54 72 69 67 67 65 72 28 50 61 72 73 65  ropTrigger(Parse
3e10: 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
3e20: 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 6e 6f  t *pName, int no
3e30: 45 72 72 29 7b 0a 20 20 54 72 69 67 67 65 72 20  Err){.  Trigger 
3e40: 2a 70 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20  *pTrigger = 0;. 
3e50: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
3e60: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e  char *zDb;.  con
3e70: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
3e80: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 73    int nName;.  s
3e90: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
3ea0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
3eb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3ec0: 20 29 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69   ) goto drop_tri
3ed0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
3ee0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
3ef0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
3f00: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
3f10: 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 67 65  goto drop_trigge
3f20: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  r_cleanup;.  }..
3f30: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
3f40: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 7a 44  >nSrc==1 );.  zD
3f50: 62 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  b = pName->a[0].
3f60: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7a 4e 61  zDatabase;.  zNa
3f70: 6d 65 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  me = pName->a[0]
3f80: 2e 7a 4e 61 6d 65 3b 0a 20 20 6e 4e 61 6d 65 20  .zName;.  nName 
3f90: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
3fa0: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  0(zName);.  for(
3fb0: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
3fc0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3fd0: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
3fe0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a  ) ? i^1 : i;  /*
3ff0: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
4000: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
4010: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
4020: 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44  e3StrICmp(db->aD
4030: 62 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29  b[j].zName, zDb)
4040: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4050: 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69   pTrigger = sqli
4060: 74 65 33 48 61 73 68 46 69 6e 64 28 26 28 64 62  te3HashFind(&(db
4070: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
4080: 2d 3e 74 72 69 67 48 61 73 68 29 2c 20 7a 4e 61  ->trigHash), zNa
4090: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
40a0: 69 66 28 20 70 54 72 69 67 67 65 72 20 29 20 62  if( pTrigger ) b
40b0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
40c0: 21 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20  !pTrigger ){.   
40d0: 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20   if( !noErr ){. 
40e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
40f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
4100: 20 73 75 63 68 20 74 72 69 67 67 65 72 3a 20 25   such trigger: %
4110: 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
4120: 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 64 72     }.    goto dr
4130: 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  op_trigger_clean
4140: 75 70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  up;.  }.  sqlite
4150: 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
4160: 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
4170: 29 3b 0a 0a 64 72 6f 70 5f 74 72 69 67 67 65 72  );..drop_trigger
4180: 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
4190: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
41a0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
41b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
41c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61  ointer to the Ta
41d0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  ble structure fo
41e0: 72 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  r the table that
41f0: 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 69 73   a trigger.** is
4200: 20 73 65 74 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74   set on..*/.stat
4210: 69 63 20 54 61 62 6c 65 20 2a 74 61 62 6c 65 4f  ic Table *tableO
4220: 66 54 72 69 67 67 65 72 28 54 72 69 67 67 65 72  fTrigger(Trigger
4230: 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20 20 69   *pTrigger){.  i
4240: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
4250: 72 6c 65 6e 33 30 28 70 54 72 69 67 67 65 72 2d  rlen30(pTrigger-
4260: 3e 74 61 62 6c 65 29 3b 0a 20 20 72 65 74 75 72  >table);.  retur
4270: 6e 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  n sqlite3HashFin
4280: 64 28 26 70 54 72 69 67 67 65 72 2d 3e 70 54 61  d(&pTrigger->pTa
4290: 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  bSchema->tblHash
42a0: 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c  , pTrigger->tabl
42b0: 65 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  e, n);.}.../*.**
42c0: 20 44 72 6f 70 20 61 20 74 72 69 67 67 65 72 20   Drop a trigger 
42d0: 67 69 76 65 6e 20 61 20 70 6f 69 6e 74 65 72 20  given a pointer 
42e0: 74 6f 20 74 68 61 74 20 74 72 69 67 67 65 72 2e  to that trigger.
42f0: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
4300: 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
4310: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
4320: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
4330: 29 7b 0a 20 20 54 61 62 6c 65 20 20 20 2a 70 54  ){.  Table   *pT
4340: 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b  able;.  Vdbe *v;
4350: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4360: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
4370: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 44 62 20 3d  nt iDb;..  iDb =
4380: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
4390: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
43a0: 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68  , pTrigger->pSch
43b0: 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
43c0: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
43d0: 2d 3e 6e 44 62 20 29 3b 0a 20 20 70 54 61 62 6c  ->nDb );.  pTabl
43e0: 65 20 3d 20 74 61 62 6c 65 4f 66 54 72 69 67 67  e = tableOfTrigg
43f0: 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20  er(pTrigger);.  
4400: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29  assert( pTable )
4410: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
4420: 6c 65 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 72  le->pSchema==pTr
4430: 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 20 7c  igger->pSchema |
4440: 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 23 69 66 6e  | iDb==1 );.#ifn
4450: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4460: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
4470: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d  {.    int code =
4480: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49   SQLITE_DROP_TRI
4490: 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e 73 74 20  GGER;.    const 
44a0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
44b0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
44c0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
44d0: 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
44e0: 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66  BLE(iDb);.    if
44f0: 28 20 69 44 62 3d 3d 31 20 29 20 63 6f 64 65 20  ( iDb==1 ) code 
4500: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
4510: 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20  MP_TRIGGER;.    
4520: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
4530: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
4540: 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  e, pTrigger->nam
4550: 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  e, pTable->zName
4560: 2c 20 7a 44 62 29 20 7c 7c 0a 20 20 20 20 20 20  , zDb) ||.      
4570: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
4580: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
4590: 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
45a0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 72   zDb) ){.      r
45b0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
45c0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
45d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
45e0: 65 73 74 72 6f 79 20 74 68 65 20 64 61 74 61 62  estroy the datab
45f0: 61 73 65 20 72 65 63 6f 72 64 20 6f 66 20 74 68  ase record of th
4600: 65 20 74 72 69 67 67 65 72 2e 0a 20 20 2a 2f 0a  e trigger..  */.
4610: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
4620: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 76 20  !=0 );.  if( (v 
4630: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
4640: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
4650: 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20      int base;.  
4660: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56    static const V
4670: 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70 54 72  dbeOpList dropTr
4680: 69 67 67 65 72 5b 5d 20 3d 20 7b 0a 20 20 20 20  igger[] = {.    
4690: 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20    { OP_Rewind,  
46a0: 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 20     0, ADDR(9),  
46b0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  0},.      { OP_S
46c0: 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 31 2c  tring8,    0, 1,
46d0: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31          0}, /* 1
46e0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43   */.      { OP_C
46f0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c  olumn,     0, 1,
4700: 20 20 20 20 20 20 20 20 32 7d 2c 0a 20 20 20 20          2},.    
4710: 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20    { OP_Ne,      
4720: 20 20 20 32 2c 20 41 44 44 52 28 38 29 2c 20 20     2, ADDR(8),  
4730: 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  1},.      { OP_S
4740: 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 31 2c  tring8,    0, 1,
4750: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 34          0}, /* 4
4760: 3a 20 22 74 72 69 67 67 65 72 22 20 2a 2f 0a 20  : "trigger" */. 
4770: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
4780: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
4790: 20 20 20 32 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     2},.      { O
47a0: 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 32 2c  P_Ne,         2,
47b0: 20 41 44 44 52 28 38 29 2c 20 20 31 7d 2c 0a 20   ADDR(8),  1},. 
47c0: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
47d0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
47e0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
47f0: 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c  P_Next,       0,
4800: 20 41 44 44 52 28 31 29 2c 20 20 30 7d 2c 20 2f   ADDR(1),  0}, /
4810: 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a 0a 20  * 8 */.    };.. 
4820: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
4830: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
4840: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
4850: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
4860: 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65  sterTable(pParse
4870: 2c 20 69 44 62 29 3b 0a 20 20 20 20 62 61 73 65  , iDb);.    base
4880: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4890: 64 4f 70 4c 69 73 74 28 76 2c 20 20 41 72 72 61  dOpList(v,  Arra
48a0: 79 53 69 7a 65 28 64 72 6f 70 54 72 69 67 67 65  ySize(dropTrigge
48b0: 72 29 2c 20 64 72 6f 70 54 72 69 67 67 65 72 29  r), dropTrigger)
48c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
48d0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 62 61 73  eChangeP4(v, bas
48e0: 65 2b 31 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e  e+1, pTrigger->n
48f0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
4900: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
4910: 28 76 2c 20 62 61 73 65 2b 34 2c 20 22 74 72 69  (v, base+4, "tri
4920: 67 67 65 72 22 2c 20 50 34 5f 53 54 41 54 49 43  gger", P4_STATIC
4930: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
4940: 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
4950: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
4960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4970: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
4980: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4990: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
49a0: 72 6f 70 54 72 69 67 67 65 72 2c 20 69 44 62 2c  ropTrigger, iDb,
49b0: 20 30 2c 20 30 2c 20 70 54 72 69 67 67 65 72 2d   0, 0, pTrigger-
49c0: 3e 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69  >name, 0);.    i
49d0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c  f( pParse->nMem<
49e0: 33 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  3 ){.      pPars
49f0: 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20  e->nMem = 3;.   
4a00: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
4a10: 52 65 6d 6f 76 65 20 61 20 74 72 69 67 67 65 72  Remove a trigger
4a20: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
4a30: 61 62 6c 65 73 20 6f 66 20 74 68 65 20 73 71 6c  ables of the sql
4a40: 69 74 65 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  ite* pointer..*/
4a50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
4a60: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 72 69 67  inkAndDeleteTrig
4a70: 67 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ger(sqlite3 *db,
4a80: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
4a90: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
4aa0: 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 28  Hash *pHash = &(
4ab0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
4ac0: 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 29 3b  hema->trigHash);
4ad0: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
4ae0: 67 67 65 72 3b 0a 20 20 70 54 72 69 67 67 65 72  gger;.  pTrigger
4af0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
4b00: 73 65 72 74 28 70 48 61 73 68 2c 20 7a 4e 61 6d  sert(pHash, zNam
4b10: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
4b20: 33 30 28 7a 4e 61 6d 65 29 2c 20 30 29 3b 0a 20  30(zName), 0);. 
4b30: 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 72 69   if( ALWAYS(pTri
4b40: 67 67 65 72 29 20 29 7b 0a 20 20 20 20 69 66 28  gger) ){.    if(
4b50: 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
4b60: 6d 61 3d 3d 70 54 72 69 67 67 65 72 2d 3e 70 54  ma==pTrigger->pT
4b70: 61 62 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  abSchema ){.    
4b80: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
4b90: 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72 28 70  tableOfTrigger(p
4ba0: 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20  Trigger);.      
4bb0: 54 72 69 67 67 65 72 20 2a 2a 70 70 3b 0a 20 20  Trigger **pp;.  
4bc0: 20 20 20 20 66 6f 72 28 70 70 3d 26 70 54 61 62      for(pp=&pTab
4bd0: 2d 3e 70 54 72 69 67 67 65 72 3b 20 2a 70 70 21  ->pTrigger; *pp!
4be0: 3d 70 54 72 69 67 67 65 72 3b 20 70 70 3d 26 28  =pTrigger; pp=&(
4bf0: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
4c00: 20 20 20 20 20 20 2a 70 70 20 3d 20 28 2a 70 70        *pp = (*pp
4c10: 29 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  )->pNext;.    }.
4c20: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
4c30: 65 54 72 69 67 67 65 72 28 64 62 2c 20 70 54 72  eTrigger(db, pTr
4c40: 69 67 67 65 72 29 3b 0a 20 20 20 20 64 62 2d 3e  igger);.    db->
4c50: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
4c60: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
4c70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69   }.}../*.** pELi
4c80: 73 74 20 69 73 20 74 68 65 20 53 45 54 20 63 6c  st is the SET cl
4c90: 61 75 73 65 20 6f 66 20 61 6e 20 55 50 44 41 54  ause of an UPDAT
4ca0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 45 61  E statement.  Ea
4cb0: 63 68 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70  ch entry.** in p
4cc0: 45 4c 69 73 74 20 69 73 20 6f 66 20 74 68 65 20  EList is of the 
4cd0: 66 6f 72 6d 61 74 20 3c 69 64 3e 3d 3c 65 78 70  format <id>=<exp
4ce0: 72 3e 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 74  r>.  If any of t
4cf0: 68 65 20 65 6e 74 72 69 65 73 0a 2a 2a 20 69 6e  he entries.** in
4d00: 20 70 45 4c 69 73 74 20 68 61 76 65 20 61 6e 20   pEList have an 
4d10: 3c 69 64 3e 20 77 68 69 63 68 20 6d 61 74 63 68  <id> which match
4d20: 65 73 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  es an identifier
4d30: 20 69 6e 20 70 49 64 4c 69 73 74 2c 0a 2a 2a 20   in pIdList,.** 
4d40: 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45  then return TRUE
4d50: 2e 20 20 49 66 20 70 49 64 4c 69 73 74 3d 3d 4e  .  If pIdList==N
4d60: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
4d70: 63 6f 6e 73 69 64 65 72 65 64 20 61 0a 2a 2a 20  considered a.** 
4d80: 77 69 6c 64 63 61 72 64 20 74 68 61 74 20 6d 61  wildcard that ma
4d90: 74 63 68 65 73 20 61 6e 79 74 68 69 6e 67 2e 20  tches anything. 
4da0: 20 4c 69 6b 65 77 69 73 65 20 69 66 20 70 45 4c   Likewise if pEL
4db0: 69 73 74 3d 3d 4e 55 4c 4c 20 74 68 65 6e 0a 2a  ist==NULL then.*
4dc0: 2a 20 69 74 20 6d 61 74 63 68 65 73 20 61 6e 79  * it matches any
4dd0: 74 68 69 6e 67 20 73 6f 20 61 6c 77 61 79 73 20  thing so always 
4de0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 52 65  return true.  Re
4df0: 74 75 72 6e 20 66 61 6c 73 65 20 6f 6e 6c 79 0a  turn false only.
4e00: 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ** if there is n
4e10: 6f 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74  o match..*/.stat
4e20: 69 63 20 69 6e 74 20 63 68 65 63 6b 43 6f 6c 75  ic int checkColu
4e30: 6d 6e 4f 76 65 72 6c 61 70 28 49 64 4c 69 73 74  mnOverlap(IdList
4e40: 20 2a 70 49 64 4c 69 73 74 2c 20 45 78 70 72 4c   *pIdList, ExprL
4e50: 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
4e60: 69 6e 74 20 65 3b 0a 20 20 69 66 28 20 70 49 64  int e;.  if( pId
4e70: 4c 69 73 74 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  List==0 || NEVER
4e80: 28 70 45 4c 69 73 74 3d 3d 30 29 20 29 20 72 65  (pEList==0) ) re
4e90: 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 65 3d  turn 1;.  for(e=
4ea0: 30 3b 20 65 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; e<pEList->nEx
4eb0: 70 72 3b 20 65 2b 2b 29 7b 0a 20 20 20 20 69 66  pr; e++){.    if
4ec0: 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  ( sqlite3IdListI
4ed0: 6e 64 65 78 28 70 49 64 4c 69 73 74 2c 20 70 45  ndex(pIdList, pE
4ee0: 4c 69 73 74 2d 3e 61 5b 65 5d 2e 7a 4e 61 6d 65  List->a[e].zName
4ef0: 29 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )>=0 ) return 1;
4f00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4f10: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   .}../*.** Retur
4f20: 6e 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  n a list of all 
4f30: 74 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c  triggers on tabl
4f40: 65 20 70 54 61 62 20 69 66 20 74 68 65 72 65 20  e pTab if there 
4f50: 65 78 69 73 74 73 20 61 74 20 6c 65 61 73 74 0a  exists at least.
4f60: 2a 2a 20 6f 6e 65 20 74 72 69 67 67 65 72 20 74  ** one trigger t
4f70: 68 61 74 20 6d 75 73 74 20 62 65 20 66 69 72 65  hat must be fire
4f80: 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74  d when an operat
4f90: 69 6f 6e 20 6f 66 20 74 79 70 65 20 27 6f 70 27  ion of type 'op'
4fa0: 20 69 73 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 65   is .** performe
4fb0: 64 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  d on the table, 
4fc0: 61 6e 64 2c 20 69 66 20 74 68 61 74 20 6f 70 65  and, if that ope
4fd0: 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 55 50 44  ration is an UPD
4fe0: 41 54 45 2c 20 69 66 20 61 74 0a 2a 2a 20 6c 65  ATE, if at.** le
4ff0: 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 63  ast one of the c
5000: 6f 6c 75 6d 6e 73 20 69 6e 20 70 43 68 61 6e 67  olumns in pChang
5010: 65 73 20 69 73 20 62 65 69 6e 67 20 6d 6f 64 69  es is being modi
5020: 66 69 65 64 2e 0a 2a 2f 0a 54 72 69 67 67 65 72  fied..*/.Trigger
5030: 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72   *sqlite3Trigger
5040: 73 45 78 69 73 74 28 0a 20 20 50 61 72 73 65 20  sExist(.  Parse 
5050: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
5060: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
5070: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
5080: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
5090: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 65  /* The table the
50a0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 72   contains the tr
50b0: 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  iggers */.  int 
50c0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
50d0: 20 20 20 20 2f 2a 20 6f 6e 65 20 6f 66 20 54 4b      /* one of TK
50e0: 5f 44 45 4c 45 54 45 2c 20 54 4b 5f 49 4e 53 45  _DELETE, TK_INSE
50f0: 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 20 2a 2f  RT, TK_UPDATE */
5100: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68  .  ExprList *pCh
5110: 61 6e 67 65 73 2c 20 20 20 20 20 2f 2a 20 43 6f  anges,     /* Co
5120: 6c 75 6d 6e 73 20 74 68 61 74 20 63 68 61 6e 67  lumns that chang
5130: 65 20 69 6e 20 61 6e 20 55 50 44 41 54 45 20 73  e in an UPDATE s
5140: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
5150: 74 20 2a 70 4d 61 73 6b 20 20 20 20 20 20 20 20  t *pMask        
5160: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
5170: 73 6b 20 6f 66 20 54 52 49 47 47 45 52 5f 42 45  sk of TRIGGER_BE
5180: 46 4f 52 45 7c 54 52 49 47 47 45 52 5f 41 46 54  FORE|TRIGGER_AFT
5190: 45 52 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6d  ER */.){.  int m
51a0: 61 73 6b 20 3d 20 30 3b 0a 20 20 54 72 69 67 67  ask = 0;.  Trigg
51b0: 65 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  er *pList = sqli
51c0: 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70  te3TriggerList(p
51d0: 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
51e0: 54 72 69 67 67 65 72 20 2a 70 3b 0a 20 20 61 73  Trigger *p;.  as
51f0: 73 65 72 74 28 20 70 4c 69 73 74 3d 3d 30 20 7c  sert( pList==0 |
5200: 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  | IsVirtual(pTab
5210: 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d  )==0 );.  for(p=
5220: 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
5230: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
5240: 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 63 68 65 63  ->op==op && chec
5250: 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70 28 70  kColumnOverlap(p
5260: 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70 43 68 61  ->pColumns, pCha
5270: 6e 67 65 73 29 20 29 7b 0a 20 20 20 20 20 20 6d  nges) ){.      m
5280: 61 73 6b 20 7c 3d 20 70 2d 3e 74 72 5f 74 6d 3b  ask |= p->tr_tm;
5290: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
52a0: 20 70 4d 61 73 6b 20 29 7b 0a 20 20 20 20 2a 70   pMask ){.    *p
52b0: 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 20 20 7d  Mask = mask;.  }
52c0: 0a 20 20 72 65 74 75 72 6e 20 28 6d 61 73 6b 20  .  return (mask 
52d0: 3f 20 70 4c 69 73 74 20 3a 20 30 29 3b 0a 7d 0a  ? pList : 0);.}.
52e0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74  ./*.** Convert t
52f0: 68 65 20 70 53 74 65 70 2d 3e 74 61 72 67 65 74  he pStep->target
5300: 20 74 6f 6b 65 6e 20 69 6e 74 6f 20 61 20 53 72   token into a Sr
5310: 63 4c 69 73 74 20 61 6e 64 20 72 65 74 75 72 6e  cList and return
5320: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
5330: 20 74 68 61 74 20 53 72 63 4c 69 73 74 2e 0a 2a   that SrcList..*
5340: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5350: 65 20 61 64 64 73 20 61 20 73 70 65 63 69 66 69  e adds a specifi
5360: 63 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2c  c database name,
5370: 20 69 66 20 6e 65 65 64 65 64 2c 20 74 6f 20 74   if needed, to t
5380: 68 65 20 74 61 72 67 65 74 20 77 68 65 6e 0a 2a  he target when.*
5390: 2a 20 66 6f 72 6d 69 6e 67 20 74 68 65 20 53 72  * forming the Sr
53a0: 63 4c 69 73 74 2e 20 20 54 68 69 73 20 70 72 65  cList.  This pre
53b0: 76 65 6e 74 73 20 61 20 74 72 69 67 67 65 72 20  vents a trigger 
53c0: 69 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  in one database 
53d0: 66 72 6f 6d 0a 2a 2a 20 72 65 66 65 72 72 69 6e  from.** referrin
53e0: 67 20 74 6f 20 61 20 74 61 72 67 65 74 20 69 6e  g to a target in
53f0: 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
5400: 65 2e 20 20 41 6e 20 65 78 63 65 70 74 69 6f 6e  e.  An exception
5410: 20 69 73 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20   is when the.** 
5420: 74 72 69 67 67 65 72 20 69 73 20 69 6e 20 54 45  trigger is in TE
5430: 4d 50 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  MP in which case
5440: 20 69 74 20 63 61 6e 20 72 65 66 65 72 20 74 6f   it can refer to
5450: 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
5460: 61 73 65 20 69 74 0a 2a 2a 20 77 61 6e 74 73 2e  ase it.** wants.
5470: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 72 63 4c 69  .*/.static SrcLi
5480: 73 74 20 2a 74 61 72 67 65 74 53 72 63 4c 69 73  st *targetSrcLis
5490: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
54a0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se,       /* The
54b0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
54c0: 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65   */.  TriggerSte
54d0: 70 20 2a 70 53 74 65 70 20 20 20 2f 2a 20 54 68  p *pStep   /* Th
54e0: 65 20 74 72 69 67 67 65 72 20 63 6f 6e 74 61 69  e trigger contai
54f0: 6e 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20  ning the target 
5500: 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  token */.){.  in
5510: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
5520: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
5530: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 75  he database to u
5540: 73 65 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  se */.  SrcList 
5550: 2a 70 53 72 63 3b 20 20 20 20 20 20 20 2f 2a 20  *pSrc;       /* 
5560: 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 72 65  SrcList to be re
5570: 74 75 72 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  turned */..  pSr
5580: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
5590: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2d  stAppend(pParse-
55a0: 3e 64 62 2c 20 30 2c 20 26 70 53 74 65 70 2d 3e  >db, 0, &pStep->
55b0: 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 69 66  target, 0);.  if
55c0: 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 61 73  ( pSrc ){.    as
55d0: 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63  sert( pSrc->nSrc
55e0: 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
55f0: 28 20 70 53 72 63 2d 3e 61 21 3d 30 20 29 3b 0a  ( pSrc->a!=0 );.
5600: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
5610: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
5620: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 74 65 70  Parse->db, pStep
5630: 2d 3e 70 54 72 69 67 2d 3e 70 53 63 68 65 6d 61  ->pTrig->pSchema
5640: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  );.    if( iDb==
5650: 30 20 7c 7c 20 69 44 62 3e 3d 32 20 29 7b 0a 20  0 || iDb>=2 ){. 
5660: 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
5670: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
5680: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
5690: 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62  <pParse->db->nDb
56a0: 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e   );.      pSrc->
56b0: 61 5b 70 53 72 63 2d 3e 6e 53 72 63 2d 31 5d 2e  a[pSrc->nSrc-1].
56c0: 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
56d0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
56e0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
56f0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
5700: 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a   return pSrc;.}.
5710: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
5720: 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 7a 65  VDBE code for ze
5730: 72 6f 20 6f 72 20 6d 6f 72 65 20 73 74 61 74 65  ro or more state
5740: 6d 65 6e 74 73 20 69 6e 73 69 64 65 20 74 68 65  ments inside the
5750: 20 62 6f 64 79 20 6f 66 20 61 0a 2a 2a 20 74 72   body of a.** tr
5760: 69 67 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61 74  igger.  .*/.stat
5770: 69 63 20 69 6e 74 20 63 6f 64 65 54 72 69 67 67  ic int codeTrigg
5780: 65 72 50 72 6f 67 72 61 6d 28 0a 20 20 50 61 72  erProgram(.  Par
5790: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
57a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
57b0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
57c0: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70    TriggerStep *p
57d0: 53 74 65 70 4c 69 73 74 2c 20 20 20 2f 2a 20 4c  StepList,   /* L
57e0: 69 73 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ist of statement
57f0: 73 20 69 6e 73 69 64 65 20 74 68 65 20 74 72 69  s inside the tri
5800: 67 67 65 72 20 62 6f 64 79 20 2a 2f 0a 20 20 69  gger body */.  i
5810: 6e 74 20 6f 72 63 6f 6e 66 69 6e 20 20 20 20 20  nt orconfin     
5820: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
5830: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 2e 20  lict algorithm. 
5840: 28 4f 45 5f 41 62 6f 72 74 2c 20 65 74 63 29 20  (OE_Abort, etc) 
5850: 2a 2f 20 20 0a 29 7b 0a 20 20 54 72 69 67 67 65  */  .){.  Trigge
5860: 72 53 74 65 70 20 2a 20 70 54 72 69 67 67 65 72  rStep * pTrigger
5870: 53 74 65 70 20 3d 20 70 53 74 65 70 4c 69 73 74  Step = pStepList
5880: 3b 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 3b 0a  ;.  int orconf;.
5890: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
58a0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c  se->pVdbe;.  sql
58b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
58c0: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
58d0: 28 20 70 54 72 69 67 67 65 72 53 74 65 70 21 3d  ( pTriggerStep!=
58e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  0 );.  assert( v
58f0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
5900: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5910: 5f 43 6f 6e 74 65 78 74 50 75 73 68 2c 20 30 2c  _ContextPush, 0,
5920: 20 30 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65   0);.  VdbeComme
5930: 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74 72  nt((v, "begin tr
5940: 69 67 67 65 72 20 25 73 22 2c 20 70 53 74 65 70  igger %s", pStep
5950: 4c 69 73 74 2d 3e 70 54 72 69 67 2d 3e 6e 61 6d  List->pTrig->nam
5960: 65 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54  e));.  while( pT
5970: 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20  riggerStep ){.  
5980: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
5990: 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
59a0: 0a 20 20 20 20 6f 72 63 6f 6e 66 20 3d 20 28 6f  .    orconf = (o
59b0: 72 63 6f 6e 66 69 6e 20 3d 3d 20 4f 45 5f 44 65  rconfin == OE_De
59c0: 66 61 75 6c 74 29 3f 70 54 72 69 67 67 65 72 53  fault)?pTriggerS
59d0: 74 65 70 2d 3e 6f 72 63 6f 6e 66 3a 6f 72 63 6f  tep->orconf:orco
59e0: 6e 66 69 6e 3b 0a 20 20 20 20 70 50 61 72 73 65  nfin;.    pParse
59f0: 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 6f 72 63  ->trigStack->orc
5a00: 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20  onf = orconf;.  
5a10: 20 20 73 77 69 74 63 68 28 20 70 54 72 69 67 67    switch( pTrigg
5a20: 65 72 53 74 65 70 2d 3e 6f 70 20 29 7b 0a 20 20  erStep->op ){.  
5a30: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 44 41      case TK_UPDA
5a40: 54 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 53 72  TE: {.        Sr
5a50: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 20  cList *pSrc;.   
5a60: 20 20 20 20 20 70 53 72 63 20 3d 20 74 61 72 67       pSrc = targ
5a70: 65 74 53 72 63 4c 69 73 74 28 70 50 61 72 73 65  etSrcList(pParse
5a80: 2c 20 70 54 72 69 67 67 65 72 53 74 65 70 29 3b  , pTriggerStep);
5a90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5aa0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5ab0: 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20 30 2c 20  _ResetCount, 0, 
5ac0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
5ad0: 74 65 33 55 70 64 61 74 65 28 70 50 61 72 73 65  te3Update(pParse
5ae0: 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20  , pSrc,.        
5af0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5b00: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
5b10: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 45 78  TriggerStep->pEx
5b20: 70 72 4c 69 73 74 2c 20 30 29 2c 20 0a 20 20 20  prList, 0), .   
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
5b40: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
5b50: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57  pTriggerStep->pW
5b60: 68 65 72 65 2c 20 30 29 2c 20 6f 72 63 6f 6e 66  here, 0), orconf
5b70: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5b80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5b90: 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20 31  OP_ResetCount, 1
5ba0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 0);.        br
5bb0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5bc0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 53 45 52     case TK_INSER
5bd0: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 53 72 63  T: {.        Src
5be0: 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 20 20  List *pSrc;.    
5bf0: 20 20 20 20 70 53 72 63 20 3d 20 74 61 72 67 65      pSrc = targe
5c00: 74 53 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c  tSrcList(pParse,
5c10: 20 70 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a   pTriggerStep);.
5c20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5c30: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5c40: 52 65 73 65 74 43 6f 75 6e 74 2c 20 30 2c 20 30  ResetCount, 0, 0
5c50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5c60: 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c  e3Insert(pParse,
5c70: 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20   pSrc,.         
5c80: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5c90: 44 75 70 28 64 62 2c 20 70 54 72 69 67 67 65 72  Dup(db, pTrigger
5ca0: 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 2c  Step->pExprList,
5cb0: 20 30 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20   0), .          
5cc0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
5cd0: 28 64 62 2c 20 70 54 72 69 67 67 65 72 53 74 65  (db, pTriggerSte
5ce0: 70 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 2c 20  p->pSelect, 0), 
5cf0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
5d00: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
5d10: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 49  pTriggerStep->pI
5d20: 64 4c 69 73 74 29 2c 20 6f 72 63 6f 6e 66 29 3b  dList), orconf);
5d30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5d40: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5d50: 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20 31 2c 20  _ResetCount, 1, 
5d60: 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
5d70: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5d80: 20 63 61 73 65 20 54 4b 5f 44 45 4c 45 54 45 3a   case TK_DELETE:
5d90: 20 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69   {.        SrcLi
5da0: 73 74 20 2a 70 53 72 63 3b 0a 20 20 20 20 20 20  st *pSrc;.      
5db0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5dc0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 65 74 43  Op2(v, OP_ResetC
5dd0: 6f 75 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ount, 0, 0);.   
5de0: 20 20 20 20 20 70 53 72 63 20 3d 20 74 61 72 67       pSrc = targ
5df0: 65 74 53 72 63 4c 69 73 74 28 70 50 61 72 73 65  etSrcList(pParse
5e00: 2c 20 70 54 72 69 67 67 65 72 53 74 65 70 29 3b  , pTriggerStep);
5e10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5e20: 44 65 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73  DeleteFrom(pPars
5e30: 65 2c 20 70 53 72 63 2c 20 0a 20 20 20 20 20 20  e, pSrc, .      
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e50: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5e60: 75 70 28 64 62 2c 20 70 54 72 69 67 67 65 72 53  up(db, pTriggerS
5e70: 74 65 70 2d 3e 70 57 68 65 72 65 2c 20 30 29 29  tep->pWhere, 0))
5e80: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5e90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5ea0: 50 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20 31 2c  P_ResetCount, 1,
5eb0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
5ec0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5ed0: 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
5ee0: 74 28 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  t( pTriggerStep-
5ef0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
5f00: 3b 20 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65  ; {.        Sele
5f10: 63 74 20 2a 73 73 20 3d 20 73 71 6c 69 74 65 33  ct *ss = sqlite3
5f20: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
5f30: 72 69 67 67 65 72 53 74 65 70 2d 3e 70 53 65 6c  riggerStep->pSel
5f40: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
5f50: 20 69 66 28 20 73 73 20 29 7b 0a 20 20 20 20 20   if( ss ){.     
5f60: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
5f70: 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 20  dest;..         
5f80: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
5f90: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
5fa0: 54 5f 44 69 73 63 61 72 64 2c 20 30 29 3b 0a 20  T_Discard, 0);. 
5fb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5fc0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 73  Select(pParse, s
5fd0: 73 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  s, &dest);.     
5fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
5ff0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 73 73 29  ctDelete(db, ss)
6000: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6010: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6020: 20 7d 0a 20 20 20 20 7d 20 0a 20 20 20 20 70 54   }.    } .    pT
6030: 72 69 67 67 65 72 53 74 65 70 20 3d 20 70 54 72  riggerStep = pTr
6040: 69 67 67 65 72 53 74 65 70 2d 3e 70 4e 65 78 74  iggerStep->pNext
6050: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
6060: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6070: 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30  ContextPop, 0, 0
6080: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
6090: 28 28 76 2c 20 22 65 6e 64 20 74 72 69 67 67 65  ((v, "end trigge
60a0: 72 20 25 73 22 2c 20 70 53 74 65 70 4c 69 73 74  r %s", pStepList
60b0: 2d 3e 70 54 72 69 67 2d 3e 6e 61 6d 65 29 29 3b  ->pTrig->name));
60c0: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
60d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
60e0: 61 6c 6c 65 64 20 74 6f 20 63 6f 64 65 20 46 4f  alled to code FO
60f0: 52 20 45 41 43 48 20 52 4f 57 20 74 72 69 67 67  R EACH ROW trigg
6100: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ers..**.** When 
6110: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 74 68  the code that th
6120: 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65  is function gene
6130: 72 61 74 65 73 20 69 73 20 65 78 65 63 75 74 65  rates is execute
6140: 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  d, the following
6150: 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 74 72 75   .** must be tru
6160: 65 3a 0a 2a 2a 0a 2a 2a 20 31 2e 20 4e 6f 20 63  e:.**.** 1. No c
6170: 75 72 73 6f 72 73 20 6d 61 79 20 62 65 20 6f 70  ursors may be op
6180: 65 6e 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  en in the main d
6190: 61 74 61 62 61 73 65 2e 20 20 28 42 75 74 20 6e  atabase.  (But n
61a0: 65 77 49 64 78 20 61 6e 64 20 6f 6c 64 49 64 78  ewIdx and oldIdx
61b0: 0a 2a 2a 20 20 20 20 63 61 6e 20 62 65 20 69 6e  .**    can be in
61c0: 64 69 63 65 73 20 6f 66 20 63 75 72 73 6f 72 73  dices of cursors
61d0: 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
61e0: 62 6c 65 73 2e 20 20 53 65 65 20 62 65 6c 6f 77  bles.  See below
61f0: 2e 29 0a 2a 2a 0a 2a 2a 20 32 2e 20 49 66 20 74  .).**.** 2. If t
6200: 68 65 20 74 72 69 67 67 65 72 73 20 62 65 69 6e  he triggers bein
6210: 67 20 63 6f 64 65 64 20 61 72 65 20 4f 4e 20 49  g coded are ON I
6220: 4e 53 45 52 54 20 6f 72 20 4f 4e 20 55 50 44 41  NSERT or ON UPDA
6230: 54 45 20 74 72 69 67 67 65 72 73 2c 20 74 68 65  TE triggers, the
6240: 6e 0a 2a 2a 20 20 20 20 61 20 74 65 6d 70 6f 72  n.**    a tempor
6250: 61 72 79 20 76 64 62 65 20 63 75 72 73 6f 72 20  ary vdbe cursor 
6260: 28 69 6e 64 65 78 20 6e 65 77 49 64 78 29 20 6d  (index newIdx) m
6270: 75 73 74 20 62 65 20 6f 70 65 6e 20 61 6e 64 20  ust be open and 
6280: 70 6f 69 6e 74 69 6e 67 20 61 74 0a 2a 2a 20 20  pointing at.**  
6290: 20 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69    a row containi
62a0: 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  ng values to be 
62b0: 73 75 62 73 74 69 74 75 74 65 64 20 66 6f 72 20  substituted for 
62c0: 6e 65 77 2e 2a 20 65 78 70 72 65 73 73 69 6f 6e  new.* expression
62d0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 74  s in the.**    t
62e0: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 28 73  rigger program(s
62f0: 29 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 49 66 20 74  )..**.** 3. If t
6300: 68 65 20 74 72 69 67 67 65 72 73 20 62 65 69 6e  he triggers bein
6310: 67 20 63 6f 64 65 64 20 61 72 65 20 4f 4e 20 44  g coded are ON D
6320: 45 4c 45 54 45 20 6f 72 20 4f 4e 20 55 50 44 41  ELETE or ON UPDA
6330: 54 45 20 74 72 69 67 67 65 72 73 2c 20 74 68 65  TE triggers, the
6340: 6e 0a 2a 2a 20 20 20 20 61 20 74 65 6d 70 6f 72  n.**    a tempor
6350: 61 72 79 20 76 64 62 65 20 63 75 72 73 6f 72 20  ary vdbe cursor 
6360: 28 69 6e 64 65 78 20 6f 6c 64 49 64 78 29 20 6d  (index oldIdx) m
6370: 75 73 74 20 62 65 20 6f 70 65 6e 20 61 6e 64 20  ust be open and 
6380: 70 6f 69 6e 74 69 6e 67 20 61 74 0a 2a 2a 20 20  pointing at.**  
6390: 20 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69    a row containi
63a0: 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  ng values to be 
63b0: 73 75 62 73 74 69 74 75 74 65 64 20 66 6f 72 20  substituted for 
63c0: 6f 6c 64 2e 2a 20 65 78 70 72 65 73 73 69 6f 6e  old.* expression
63d0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 74  s in the.**    t
63e0: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 28 73  rigger program(s
63f0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 79  )..**.** If they
6400: 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74   are not NULL, t
6410: 68 65 20 70 69 4f 6c 64 43 6f 6c 4d 61 73 6b 20  he piOldColMask 
6420: 61 6e 64 20 70 69 4e 65 77 43 6f 6c 4d 61 73 6b  and piNewColMask
6430: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
6440: 73 0a 2a 2a 20 61 72 65 20 73 65 74 20 74 6f 20  s.** are set to 
6450: 76 61 6c 75 65 73 20 74 68 61 74 20 64 65 73 63  values that desc
6460: 72 69 62 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73  ribe the columns
6470: 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 69   used by the tri
6480: 67 67 65 72 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  gger program.** 
6490: 69 6e 20 74 68 65 20 4f 4c 44 2e 2a 20 61 6e 64  in the OLD.* and
64a0: 20 4e 45 57 2e 2a 20 74 61 62 6c 65 73 20 72 65   NEW.* tables re
64b0: 73 70 65 63 74 69 76 65 6c 79 2e 20 49 66 20 63  spectively. If c
64c0: 6f 6c 75 6d 6e 20 4e 20 6f 66 20 74 68 65 20 0a  olumn N of the .
64d0: 2a 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  ** pseudo-table 
64e0: 69 73 20 72 65 61 64 20 61 74 20 6c 65 61 73 74  is read at least
64f0: 20 6f 6e 63 65 2c 20 74 68 65 20 63 6f 72 72 65   once, the corre
6500: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 6f 66 20  sponding bit of 
6510: 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 6d 61  the output.** ma
6520: 73 6b 20 69 73 20 73 65 74 2e 20 49 66 20 61 20  sk is set. If a 
6530: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 6e 20 69  column with an i
6540: 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
6550: 6e 20 33 32 20 69 73 20 72 65 61 64 2c 20 74 68  n 32 is read, th
6560: 65 0a 2a 2a 20 6f 75 74 70 75 74 20 6d 61 73 6b  e.** output mask
6570: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
6580: 70 65 63 69 61 6c 20 76 61 6c 75 65 20 30 78 66  pecial value 0xf
6590: 66 66 66 66 66 66 66 2e 0a 2a 2a 0a 2a 2f 0a 69  fffffff..**.*/.i
65a0: 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f  nt sqlite3CodeRo
65b0: 77 54 72 69 67 67 65 72 28 0a 20 20 50 61 72 73  wTrigger(.  Pars
65c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
65d0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
65e0: 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20 2a  t */.  Trigger *
65f0: 70 54 72 69 67 67 65 72 2c 20 20 20 2f 2a 20 4c  pTrigger,   /* L
6600: 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73 20  ist of triggers 
6610: 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 20 2a 2f  on table pTab */
6620: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
6630: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
6640: 66 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f  f TK_UPDATE, TK_
6650: 49 4e 53 45 52 54 2c 20 54 4b 5f 44 45 4c 45 54  INSERT, TK_DELET
6660: 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  E */.  ExprList 
6670: 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f 2a 20 43  *pChanges,  /* C
6680: 68 61 6e 67 65 73 20 6c 69 73 74 20 66 6f 72 20  hanges list for 
6690: 61 6e 79 20 55 50 44 41 54 45 20 4f 46 20 74 72  any UPDATE OF tr
66a0: 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  iggers */.  int 
66b0: 74 72 5f 74 6d 2c 20 20 20 20 20 20 20 20 20 20  tr_tm,          
66c0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 52 49 47 47   /* One of TRIGG
66d0: 45 52 5f 42 45 46 4f 52 45 2c 20 54 52 49 47 47  ER_BEFORE, TRIGG
66e0: 45 52 5f 41 46 54 45 52 20 2a 2f 0a 20 20 54 61  ER_AFTER */.  Ta
66f0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
6700: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
6710: 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72 73  to code triggers
6720: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
6730: 65 77 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  ewIdx,          
6740: 2f 2a 20 54 68 65 20 69 6e 64 69 63 65 20 6f 66  /* The indice of
6750: 20 74 68 65 20 22 6e 65 77 22 20 72 6f 77 20 74   the "new" row t
6760: 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 69 6e  o access */.  in
6770: 74 20 6f 6c 64 49 64 78 2c 20 20 20 20 20 20 20  t oldIdx,       
6780: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 69 63 65     /* The indice
6790: 20 6f 66 20 74 68 65 20 22 6f 6c 64 22 20 72 6f   of the "old" ro
67a0: 77 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20  w to access */. 
67b0: 20 69 6e 74 20 6f 72 63 6f 6e 66 2c 20 20 20 20   int orconf,    
67c0: 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46        /* ON CONF
67d0: 4c 49 43 54 20 70 6f 6c 69 63 79 20 2a 2f 0a 20  LICT policy */. 
67e0: 20 69 6e 74 20 69 67 6e 6f 72 65 4a 75 6d 70 2c   int ignoreJump,
67f0: 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63        /* Instruc
6800: 74 69 6f 6e 20 74 6f 20 6a 75 6d 70 20 74 6f 20  tion to jump to 
6810: 66 6f 72 20 52 41 49 53 45 28 49 47 4e 4f 52 45  for RAISE(IGNORE
6820: 29 20 2a 2f 0a 20 20 75 33 32 20 2a 70 69 4f 6c  ) */.  u32 *piOl
6830: 64 43 6f 6c 4d 61 73 6b 2c 20 20 20 2f 2a 20 4f  dColMask,   /* O
6840: 55 54 3a 20 4d 61 73 6b 20 6f 66 20 63 6f 6c 75  UT: Mask of colu
6850: 6d 6e 73 20 75 73 65 64 20 66 72 6f 6d 20 74 68  mns used from th
6860: 65 20 4f 4c 44 2e 2a 20 74 61 62 6c 65 20 2a 2f  e OLD.* table */
6870: 0a 20 20 75 33 32 20 2a 70 69 4e 65 77 43 6f 6c  .  u32 *piNewCol
6880: 4d 61 73 6b 20 20 20 20 2f 2a 20 4f 55 54 3a 20  Mask    /* OUT: 
6890: 4d 61 73 6b 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  Mask of columns 
68a0: 75 73 65 64 20 66 72 6f 6d 20 74 68 65 20 4e 45  used from the NE
68b0: 57 2e 2a 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  W.* table */.){.
68c0: 20 20 54 72 69 67 67 65 72 20 2a 70 3b 0a 20 20    Trigger *p;.  
68d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
68e0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67  arse->db;.  Trig
68f0: 67 65 72 53 74 61 63 6b 20 74 72 69 67 53 74 61  gerStack trigSta
6900: 63 6b 45 6e 74 72 79 3b 0a 0a 20 20 74 72 69 67  ckEntry;..  trig
6910: 53 74 61 63 6b 45 6e 74 72 79 2e 6f 6c 64 43 6f  StackEntry.oldCo
6920: 6c 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 74 72 69  lMask = 0;.  tri
6930: 67 53 74 61 63 6b 45 6e 74 72 79 2e 6e 65 77 43  gStackEntry.newC
6940: 6f 6c 4d 61 73 6b 20 3d 20 30 3b 0a 0a 20 20 61  olMask = 0;..  a
6950: 73 73 65 72 74 28 6f 70 20 3d 3d 20 54 4b 5f 55  ssert(op == TK_U
6960: 50 44 41 54 45 20 7c 7c 20 6f 70 20 3d 3d 20 54  PDATE || op == T
6970: 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f 70 20 3d  K_INSERT || op =
6980: 3d 20 54 4b 5f 44 45 4c 45 54 45 29 3b 0a 20 20  = TK_DELETE);.  
6990: 61 73 73 65 72 74 28 74 72 5f 74 6d 20 3d 3d 20  assert(tr_tm == 
69a0: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 7c  TRIGGER_BEFORE |
69b0: 7c 20 74 72 5f 74 6d 20 3d 3d 20 54 52 49 47 47  | tr_tm == TRIGG
69c0: 45 52 5f 41 46 54 45 52 20 29 3b 0a 0a 20 20 61  ER_AFTER );..  a
69d0: 73 73 65 72 74 28 6e 65 77 49 64 78 20 21 3d 20  ssert(newIdx != 
69e0: 2d 31 20 7c 7c 20 6f 6c 64 49 64 78 20 21 3d 20  -1 || oldIdx != 
69f0: 2d 31 29 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 54  -1);..  for(p=pT
6a00: 72 69 67 67 65 72 3b 20 70 3b 20 70 3d 70 2d 3e  rigger; p; p=p->
6a10: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
6a20: 66 69 72 65 5f 74 68 69 73 20 3d 20 30 3b 0a 0a  fire_this = 0;..
6a30: 20 20 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68      /* Sanity ch
6a40: 65 63 6b 69 6e 67 3a 20 20 54 68 65 20 73 63 68  ecking:  The sch
6a50: 65 6d 61 20 66 6f 72 20 74 68 65 20 74 72 69 67  ema for the trig
6a60: 67 65 72 20 61 6e 64 20 66 6f 72 20 74 68 65 20  ger and for the 
6a70: 74 61 62 6c 65 20 61 72 65 0a 20 20 20 20 2a 2a  table are.    **
6a80: 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64 2e   always defined.
6a90: 20 20 54 68 65 20 74 72 69 67 67 65 72 20 6d 75    The trigger mu
6aa0: 73 74 20 62 65 20 69 6e 20 74 68 65 20 73 61 6d  st be in the sam
6ab0: 65 20 73 63 68 65 6d 61 20 61 73 20 74 68 65 20  e schema as the 
6ac0: 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6f 72 20  table.    ** or 
6ad0: 65 6c 73 65 20 69 74 20 6d 75 73 74 20 62 65 20  else it must be 
6ae0: 61 20 54 45 4d 50 20 74 72 69 67 67 65 72 2e 20  a TEMP trigger. 
6af0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
6b00: 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a  ->pSchema!=0 );.
6b10: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
6b20: 54 61 62 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a  TabSchema!=0 );.
6b30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
6b40: 53 63 68 65 6d 61 3d 3d 70 2d 3e 70 54 61 62 53  Schema==p->pTabS
6b50: 63 68 65 6d 61 20 7c 7c 20 70 2d 3e 70 53 63 68  chema || p->pSch
6b60: 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
6b70: 70 53 63 68 65 6d 61 20 29 3b 0a 0a 20 20 20 20  pSchema );..    
6b80: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  /* Determine whe
6b90: 74 68 65 72 20 77 65 20 73 68 6f 75 6c 64 20 63  ther we should c
6ba0: 6f 64 65 20 74 68 69 73 20 74 72 69 67 67 65 72  ode this trigger
6bb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 0a 20 20 20   */.    if( .   
6bc0: 20 20 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20     p->op==op && 
6bd0: 0a 20 20 20 20 20 20 70 2d 3e 74 72 5f 74 6d 3d  .      p->tr_tm=
6be0: 3d 74 72 5f 74 6d 20 26 26 20 0a 20 20 20 20 20  =tr_tm && .     
6bf0: 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72   checkColumnOver
6c00: 6c 61 70 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c  lap(p->pColumns,
6c10: 70 43 68 61 6e 67 65 73 29 0a 20 20 20 20 29 7b  pChanges).    ){
6c20: 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74  .      TriggerSt
6c30: 61 63 6b 20 2a 70 53 3b 20 20 20 20 20 20 2f 2a  ack *pS;      /*
6c40: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 72 69 67   Pointer to trig
6c50: 67 65 72 2d 73 74 61 63 6b 20 65 6e 74 72 79 20  ger-stack entry 
6c60: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 70 53 3d  */.      for(pS=
6c70: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
6c80: 6b 3b 20 70 53 20 26 26 20 70 21 3d 70 53 2d 3e  k; pS && p!=pS->
6c90: 70 54 72 69 67 67 65 72 3b 20 70 53 3d 70 53 2d  pTrigger; pS=pS-
6ca0: 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20  >pNext){}.      
6cb0: 69 66 28 20 21 70 53 20 29 7b 0a 20 20 20 20 20  if( !pS ){.     
6cc0: 20 20 20 66 69 72 65 5f 74 68 69 73 20 3d 20 31     fire_this = 1
6cd0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 30 20  ;.      }.#if 0 
6ce0: 20 20 20 2f 2a 20 47 69 76 65 20 6e 6f 20 77 61     /* Give no wa
6cf0: 72 6e 69 6e 67 20 66 6f 72 20 72 65 63 75 72 73  rning for recurs
6d00: 69 76 65 20 74 72 69 67 67 65 72 73 2e 20 20 4a  ive triggers.  J
6d10: 75 73 74 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  ust do not do th
6d20: 65 6d 20 2a 2f 0a 20 20 20 20 20 20 65 6c 73 65  em */.      else
6d30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6d40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6d50: 2c 20 22 72 65 63 75 72 73 69 76 65 20 74 72 69  , "recursive tri
6d60: 67 67 65 72 73 20 6e 6f 74 20 73 75 70 70 6f 72  ggers not suppor
6d70: 74 65 64 20 28 25 73 29 22 2c 0a 20 20 20 20 20  ted (%s)",.     
6d80: 20 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65 29 3b         p->name);
6d90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6da0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
6db0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
6dc0: 20 7d 0a 20 0a 20 20 20 20 69 66 28 20 66 69 72   }. .    if( fir
6dd0: 65 5f 74 68 69 73 20 29 7b 0a 20 20 20 20 20 20  e_this ){.      
6de0: 69 6e 74 20 65 6e 64 54 72 69 67 67 65 72 3b 0a  int endTrigger;.
6df0: 20 20 20 20 20 20 45 78 70 72 20 2a 20 77 68 65        Expr * whe
6e00: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 41 75 74  nExpr;.      Aut
6e10: 68 43 6f 6e 74 65 78 74 20 73 43 6f 6e 74 65 78  hContext sContex
6e20: 74 3b 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  t;.      NameCon
6e30: 74 65 78 74 20 73 4e 43 3b 0a 0a 23 69 66 6e 64  text sNC;..#ifnd
6e40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
6e50: 52 41 43 45 0a 20 20 20 20 20 20 73 71 6c 69 74  RACE.      sqlit
6e60: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61  e3VdbeAddOp4(pPa
6e70: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 54  rse->pVdbe, OP_T
6e80: 72 61 63 65 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  race, 0, 0, 0,. 
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
6eb0: 72 69 6e 74 66 28 64 62 2c 20 22 2d 2d 20 54 52  rintf(db, "-- TR
6ec0: 49 47 47 45 52 20 25 73 22 2c 20 70 2d 3e 6e 61  IGGER %s", p->na
6ed0: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
6ef0: 44 59 4e 41 4d 49 43 29 3b 0a 23 65 6e 64 69 66  DYNAMIC);.#endif
6f00: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73  .      memset(&s
6f10: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
6f20: 43 29 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  C));.      sNC.p
6f30: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
6f40: 0a 20 20 20 20 20 20 2f 2a 20 50 75 73 68 20 61  .      /* Push a
6f50: 6e 20 65 6e 74 72 79 20 6f 6e 20 74 6f 20 74 68  n entry on to th
6f60: 65 20 74 72 69 67 67 65 72 20 73 74 61 63 6b 20  e trigger stack 
6f70: 2a 2f 0a 20 20 20 20 20 20 74 72 69 67 53 74 61  */.      trigSta
6f80: 63 6b 45 6e 74 72 79 2e 70 54 72 69 67 67 65 72  ckEntry.pTrigger
6f90: 20 3d 20 70 3b 0a 20 20 20 20 20 20 74 72 69 67   = p;.      trig
6fa0: 53 74 61 63 6b 45 6e 74 72 79 2e 6e 65 77 49 64  StackEntry.newId
6fb0: 78 20 3d 20 6e 65 77 49 64 78 3b 0a 20 20 20 20  x = newIdx;.    
6fc0: 20 20 74 72 69 67 53 74 61 63 6b 45 6e 74 72 79    trigStackEntry
6fd0: 2e 6f 6c 64 49 64 78 20 3d 20 6f 6c 64 49 64 78  .oldIdx = oldIdx
6fe0: 3b 0a 20 20 20 20 20 20 74 72 69 67 53 74 61 63  ;.      trigStac
6ff0: 6b 45 6e 74 72 79 2e 70 54 61 62 20 3d 20 70 54  kEntry.pTab = pT
7000: 61 62 3b 0a 20 20 20 20 20 20 74 72 69 67 53 74  ab;.      trigSt
7010: 61 63 6b 45 6e 74 72 79 2e 70 4e 65 78 74 20 3d  ackEntry.pNext =
7020: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
7030: 63 6b 3b 0a 20 20 20 20 20 20 74 72 69 67 53 74  ck;.      trigSt
7040: 61 63 6b 45 6e 74 72 79 2e 69 67 6e 6f 72 65 4a  ackEntry.ignoreJ
7050: 75 6d 70 20 3d 20 69 67 6e 6f 72 65 4a 75 6d 70  ump = ignoreJump
7060: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
7070: 74 72 69 67 53 74 61 63 6b 20 3d 20 26 74 72 69  trigStack = &tri
7080: 67 53 74 61 63 6b 45 6e 74 72 79 3b 0a 20 20 20  gStackEntry;.   
7090: 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 6f     sqlite3AuthCo
70a0: 6e 74 65 78 74 50 75 73 68 28 70 50 61 72 73 65  ntextPush(pParse
70b0: 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20 70 2d 3e  , &sContext, p->
70c0: 6e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  name);..      /*
70d0: 20 63 6f 64 65 20 74 68 65 20 57 48 45 4e 20 63   code the WHEN c
70e0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 65  lause */.      e
70f0: 6e 64 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69  ndTrigger = sqli
7100: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
7110: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 29 3b  (pParse->pVdbe);
7120: 0a 20 20 20 20 20 20 77 68 65 6e 45 78 70 72 20  .      whenExpr 
7130: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7140: 28 64 62 2c 20 70 2d 3e 70 57 68 65 6e 2c 20 30  (db, p->pWhen, 0
7150: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
7160: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
7170: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
7180: 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 77  xprNames(&sNC, w
7190: 68 65 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  henExpr) ){.    
71a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 74 72 69 67      pParse->trig
71b0: 53 74 61 63 6b 20 3d 20 74 72 69 67 53 74 61 63  Stack = trigStac
71c0: 6b 45 6e 74 72 79 2e 70 4e 65 78 74 3b 0a 20 20  kEntry.pNext;.  
71d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
71e0: 72 44 65 6c 65 74 65 28 64 62 2c 20 77 68 65 6e  rDelete(db, when
71f0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72  Expr);.        r
7200: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
7210: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
7220: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
7230: 2c 20 77 68 65 6e 45 78 70 72 2c 20 65 6e 64 54  , whenExpr, endT
7240: 72 69 67 67 65 72 2c 20 53 51 4c 49 54 45 5f 4a  rigger, SQLITE_J
7250: 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
7260: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7270: 65 74 65 28 64 62 2c 20 77 68 65 6e 45 78 70 72  ete(db, whenExpr
7280: 29 3b 0a 0a 20 20 20 20 20 20 63 6f 64 65 54 72  );..      codeTr
7290: 69 67 67 65 72 50 72 6f 67 72 61 6d 28 70 50 61  iggerProgram(pPa
72a0: 72 73 65 2c 20 70 2d 3e 73 74 65 70 5f 6c 69 73  rse, p->step_lis
72b0: 74 2c 20 6f 72 63 6f 6e 66 29 3b 20 0a 0a 20 20  t, orconf); ..  
72c0: 20 20 20 20 2f 2a 20 50 6f 70 20 74 68 65 20 65      /* Pop the e
72d0: 6e 74 72 79 20 6f 66 66 20 74 68 65 20 74 72 69  ntry off the tri
72e0: 67 67 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20  gger stack */.  
72f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 74 72 69 67      pParse->trig
7300: 53 74 61 63 6b 20 3d 20 74 72 69 67 53 74 61 63  Stack = trigStac
7310: 6b 45 6e 74 72 79 2e 70 4e 65 78 74 3b 0a 20 20  kEntry.pNext;.  
7320: 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43      sqlite3AuthC
7330: 6f 6e 74 65 78 74 50 6f 70 28 26 73 43 6f 6e 74  ontextPop(&sCont
7340: 65 78 74 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  ext);..      sql
7350: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
7360: 61 62 65 6c 28 70 50 61 72 73 65 2d 3e 70 56 64  abel(pParse->pVd
7370: 62 65 2c 20 65 6e 64 54 72 69 67 67 65 72 29 3b  be, endTrigger);
7380: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
7390: 20 70 69 4f 6c 64 43 6f 6c 4d 61 73 6b 20 29 20   piOldColMask ) 
73a0: 2a 70 69 4f 6c 64 43 6f 6c 4d 61 73 6b 20 7c 3d  *piOldColMask |=
73b0: 20 74 72 69 67 53 74 61 63 6b 45 6e 74 72 79 2e   trigStackEntry.
73c0: 6f 6c 64 43 6f 6c 4d 61 73 6b 3b 0a 20 20 69 66  oldColMask;.  if
73d0: 28 20 70 69 4e 65 77 43 6f 6c 4d 61 73 6b 20 29  ( piNewColMask )
73e0: 20 2a 70 69 4e 65 77 43 6f 6c 4d 61 73 6b 20 7c   *piNewColMask |
73f0: 3d 20 74 72 69 67 53 74 61 63 6b 45 6e 74 72 79  = trigStackEntry
7400: 2e 6e 65 77 43 6f 6c 4d 61 73 6b 3b 0a 20 20 72  .newColMask;.  r
7410: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
7420: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
7430: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
7440: 52 29 20 2a 2f 0a                                R) */.