/ Hex Artifact Content
Login

Artifact 45a2f8a80ea0bdf2b0c35c26c36024ccee3e4835:


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: 33 20 32 30 30 39 2f 30 38 2f 31 30 20 30 33 3a  3 2009/08/10 03:
0190: 35 37 3a 35 38 20 73 68 61 6e 65 20 45 78 70 20  57:58 shane Exp 
01a0: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
01b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66  qliteInt.h"..#if
01c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
01d0: 5f 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 44  _TRIGGER./*.** D
01e0: 65 6c 65 74 65 20 61 20 6c 69 6e 6b 65 64 20 6c  elete a linked l
01f0: 69 73 74 20 6f 66 20 54 72 69 67 67 65 72 53 74  ist of TriggerSt
0200: 65 70 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ep structures..*
0210: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
0220: 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28  leteTriggerStep(
0230: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 72 69  sqlite3 *db, Tri
0240: 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67  ggerStep *pTrigg
0250: 65 72 53 74 65 70 29 7b 0a 20 20 77 68 69 6c 65  erStep){.  while
0260: 28 20 70 54 72 69 67 67 65 72 53 74 65 70 20 29  ( pTriggerStep )
0270: 7b 0a 20 20 20 20 54 72 69 67 67 65 72 53 74 65  {.    TriggerSte
0280: 70 20 2a 20 70 54 6d 70 20 3d 20 70 54 72 69 67  p * pTmp = pTrig
0290: 67 65 72 53 74 65 70 3b 0a 20 20 20 20 70 54 72  gerStep;.    pTr
02a0: 69 67 67 65 72 53 74 65 70 20 3d 20 70 54 72 69  iggerStep = pTri
02b0: 67 67 65 72 53 74 65 70 2d 3e 70 4e 65 78 74 3b  ggerStep->pNext;
02c0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ..    sqlite3Exp
02d0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6d 70  rDelete(db, pTmp
02e0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73  ->pWhere);.    s
02f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
0300: 6c 65 74 65 28 64 62 2c 20 70 54 6d 70 2d 3e 70  lete(db, pTmp->p
0310: 45 78 70 72 4c 69 73 74 29 3b 0a 20 20 20 20 73  ExprList);.    s
0320: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
0330: 74 65 28 64 62 2c 20 70 54 6d 70 2d 3e 70 53 65  te(db, pTmp->pSe
0340: 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
0350: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
0360: 62 2c 20 70 54 6d 70 2d 3e 70 49 64 4c 69 73 74  b, pTmp->pIdList
0370: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 44  );..    sqlite3D
0380: 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b  bFree(db, pTmp);
0390: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
03a0: 76 65 6e 20 74 61 62 6c 65 20 70 54 61 62 2c 20  ven table pTab, 
03b0: 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66  return a list of
03c0: 20 61 6c 6c 20 74 68 65 20 74 72 69 67 67 65 72   all the trigger
03d0: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 0a 2a  s attached to .*
03e0: 2a 20 74 68 65 20 74 61 62 6c 65 2e 20 54 68 65  * the table. The
03f0: 20 6c 69 73 74 20 69 73 20 63 6f 6e 6e 65 63 74   list is connect
0400: 65 64 20 62 79 20 54 72 69 67 67 65 72 2e 70 4e  ed by Trigger.pN
0410: 65 78 74 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2a  ext pointers..**
0420: 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 74  .** All of the t
0430: 72 69 67 67 65 72 73 20 6f 6e 20 70 54 61 62 20  riggers on pTab 
0440: 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20  that are in the 
0450: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 61 73  same database as
0460: 20 70 54 61 62 0a 2a 2a 20 61 72 65 20 61 6c 72   pTab.** are alr
0470: 65 61 64 79 20 61 74 74 61 63 68 65 64 20 74 6f  eady attached to
0480: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 2e   pTab->pTrigger.
0490: 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68    But there migh
04a0: 74 20 62 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a  t be additional.
04b0: 2a 2a 20 74 72 69 67 67 65 72 73 20 6f 6e 20 70  ** triggers on p
04c0: 54 61 62 20 69 6e 20 74 68 65 20 54 45 4d 50 20  Tab in the TEMP 
04d0: 73 63 68 65 6d 61 2e 20 20 54 68 69 73 20 72 6f  schema.  This ro
04e0: 75 74 69 6e 65 20 70 72 65 70 65 6e 64 73 20 61  utine prepends a
04f0: 6c 6c 0a 2a 2a 20 54 45 4d 50 20 74 72 69 67 67  ll.** TEMP trigg
0500: 65 72 73 20 6f 6e 20 70 54 61 62 20 74 6f 20 74  ers on pTab to t
0510: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
0520: 74 68 65 20 70 54 61 62 2d 3e 70 54 72 69 67 67  the pTab->pTrigg
0530: 65 72 20 6c 69 73 74 0a 2a 2a 20 61 6e 64 20 72  er list.** and r
0540: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6d 62 69  eturns the combi
0550: 6e 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ned list..**.** 
0560: 54 6f 20 73 74 61 74 65 20 69 74 20 61 6e 6f 74  To state it anot
0570: 68 65 72 20 77 61 79 3a 20 20 54 68 69 73 20 72  her way:  This r
0580: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
0590: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 72 69   list of all tri
05a0: 67 67 65 72 73 0a 2a 2a 20 74 68 61 74 20 66 69  ggers.** that fi
05b0: 72 65 20 6f 66 66 20 6f 66 20 70 54 61 62 2e 20  re off of pTab. 
05c0: 20 54 68 65 20 6c 69 73 74 20 77 69 6c 6c 20 69   The list will i
05d0: 6e 63 6c 75 64 65 20 61 6e 79 20 54 45 4d 50 20  nclude any TEMP 
05e0: 74 72 69 67 67 65 72 73 20 6f 6e 0a 2a 2a 20 70  triggers on.** p
05f0: 54 61 62 20 61 73 20 77 65 6c 6c 20 61 73 20 74  Tab as well as t
0600: 68 65 20 74 72 69 67 67 65 72 73 20 6c 69 73 65  he triggers lise
0610: 64 20 69 6e 20 70 54 61 62 2d 3e 70 54 72 69 67  d in pTab->pTrig
0620: 67 65 72 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 20  ger..*/.Trigger 
0630: 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c  *sqlite3TriggerL
0640: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
0650: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
0660: 0a 20 20 53 63 68 65 6d 61 20 2a 20 63 6f 6e 73  .  Schema * cons
0670: 74 20 70 54 6d 70 53 63 68 65 6d 61 20 3d 20 70  t pTmpSchema = p
0680: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31  Parse->db->aDb[1
0690: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 54 72 69  ].pSchema;.  Tri
06a0: 67 67 65 72 20 2a 70 4c 69 73 74 20 3d 20 30 3b  gger *pList = 0;
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 72 69    /* List of tri
06d0: 67 67 65 72 73 20 74 6f 20 72 65 74 75 72 6e 20  ggers to return 
06e0: 2a 2f 0a 0a 20 20 69 66 28 20 70 54 6d 70 53 63  */..  if( pTmpSc
06f0: 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68  hema!=pTab->pSch
0700: 65 6d 61 20 29 7b 0a 20 20 20 20 48 61 73 68 45  ema ){.    HashE
0710: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
0720: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
0730: 74 28 26 70 54 6d 70 53 63 68 65 6d 61 2d 3e 74  t(&pTmpSchema->t
0740: 72 69 67 48 61 73 68 29 3b 20 70 3b 20 70 3d 73  rigHash); p; p=s
0750: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
0760: 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72  ){.      Trigger
0770: 20 2a 70 54 72 69 67 20 3d 20 28 54 72 69 67 67   *pTrig = (Trigg
0780: 65 72 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  er *)sqliteHashD
0790: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
07a0: 28 20 70 54 72 69 67 2d 3e 70 54 61 62 53 63 68  ( pTrig->pTabSch
07b0: 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
07c0: 6d 61 0a 20 20 20 20 20 20 20 26 26 20 30 3d 3d  ma.       && 0==
07d0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
07e0: 54 72 69 67 2d 3e 74 61 62 6c 65 2c 20 70 54 61  Trig->table, pTa
07f0: 62 2d 3e 7a 4e 61 6d 65 29 20 0a 20 20 20 20 20  b->zName) .     
0800: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69   ){.        pTri
0810: 67 2d 3e 70 4e 65 78 74 20 3d 20 28 70 4c 69 73  g->pNext = (pLis
0820: 74 20 3f 20 70 4c 69 73 74 20 3a 20 70 54 61 62  t ? pList : pTab
0830: 2d 3e 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  ->pTrigger);.   
0840: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 54 72       pList = pTr
0850: 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ig;.      }.    
0860: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
0870: 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 20 3a  (pList ? pList :
0880: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 29   pTab->pTrigger)
0890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
08a0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
08b0: 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20   parser when it 
08c0: 73 65 65 73 20 61 20 43 52 45 41 54 45 20 54 52  sees a CREATE TR
08d0: 49 47 47 45 52 20 73 74 61 74 65 6d 65 6e 74 0a  IGGER statement.
08e0: 2a 2a 20 75 70 20 74 6f 20 74 68 65 20 70 6f 69  ** up to the poi
08f0: 6e 74 20 6f 66 20 74 68 65 20 42 45 47 49 4e 20  nt of the BEGIN 
0900: 62 65 66 6f 72 65 20 74 68 65 20 74 72 69 67 67  before the trigg
0910: 65 72 20 61 63 74 69 6f 6e 73 2e 20 20 41 20 54  er actions.  A T
0920: 72 69 67 67 65 72 0a 2a 2a 20 73 74 72 75 63 74  rigger.** struct
0930: 75 72 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ure is generated
0940: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 69 6e   based on the in
0950: 66 6f 72 6d 61 74 69 6f 6e 20 61 76 61 69 6c 61  formation availa
0960: 62 6c 65 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a  ble and stored.*
0970: 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  * in pParse->pNe
0980: 77 54 72 69 67 67 65 72 2e 20 20 41 66 74 65 72  wTrigger.  After
0990: 20 74 68 65 20 74 72 69 67 67 65 72 20 61 63 74   the trigger act
09a0: 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 70  ions have been p
09b0: 61 72 73 65 64 2c 20 74 68 65 0a 2a 2a 20 73 71  arsed, the.** sq
09c0: 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67 67  lite3FinishTrigg
09d0: 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  er() function is
09e0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
09f0: 65 74 65 20 74 68 65 20 74 72 69 67 67 65 72 0a  ete the trigger.
0a00: 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  ** construction 
0a10: 70 72 6f 63 65 73 73 2e 0a 2a 2f 0a 76 6f 69 64  process..*/.void
0a20: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 69   sqlite3BeginTri
0a30: 67 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  gger(.  Parse *p
0a40: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
0a50: 68 65 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74  he parse context
0a60: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
0a70: 52 49 47 47 45 52 20 73 74 61 74 65 6d 65 6e 74  RIGGER statement
0a80: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
0a90: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
0aa0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 72 69   name of the tri
0ab0: 67 67 65 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  gger */.  Token 
0ac0: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a  *pName2,      /*
0ad0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
0ae0: 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 69 6e   trigger */.  in
0af0: 74 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20 20  t tr_tm,        
0b00: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 42    /* One of TK_B
0b10: 45 46 4f 52 45 2c 20 54 4b 5f 41 46 54 45 52 2c  EFORE, TK_AFTER,
0b20: 20 54 4b 5f 49 4e 53 54 45 41 44 20 2a 2f 0a 20   TK_INSTEAD */. 
0b30: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
0b40: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
0b50: 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 55 50 44  K_INSERT, TK_UPD
0b60: 41 54 45 2c 20 54 4b 5f 44 45 4c 45 54 45 20 2a  ATE, TK_DELETE *
0b70: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c  /.  IdList *pCol
0b80: 75 6d 6e 73 2c 20 20 20 2f 2a 20 63 6f 6c 75 6d  umns,   /* colum
0b90: 6e 20 6c 69 73 74 20 69 66 20 74 68 69 73 20 69  n list if this i
0ba0: 73 20 61 6e 20 55 50 44 41 54 45 20 4f 46 20 74  s an UPDATE OF t
0bb0: 72 69 67 67 65 72 20 2a 2f 0a 20 20 53 72 63 4c  rigger */.  SrcL
0bc0: 69 73 74 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c  ist *pTableName,
0bd0: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  /* The name of t
0be0: 68 65 20 74 61 62 6c 65 2f 76 69 65 77 20 74 68  he table/view th
0bf0: 65 20 74 72 69 67 67 65 72 20 61 70 70 6c 69 65  e trigger applie
0c00: 73 20 74 6f 20 2a 2f 0a 20 20 45 78 70 72 20 2a  s to */.  Expr *
0c10: 70 57 68 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a  pWhen,        /*
0c20: 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
0c30: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
0c40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0c50: 20 74 68 65 20 54 45 4d 50 4f 52 41 52 59 20 6b   the TEMPORARY k
0c60: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
0c70: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  t */.  int noErr
0c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
0c90: 70 70 72 65 73 73 20 65 72 72 6f 72 73 20 69 66  ppress errors if
0ca0: 20 74 68 65 20 74 72 69 67 67 65 72 20 61 6c 72   the trigger alr
0cb0: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
0cc0: 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  {.  Trigger *pTr
0cd0: 69 67 67 65 72 20 3d 20 30 3b 20 20 2f 2a 20 54  igger = 0;  /* T
0ce0: 68 65 20 6e 65 77 20 74 72 69 67 67 65 72 20 2a  he new trigger *
0cf0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0d10: 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 74 72  able that the tr
0d20: 69 67 67 65 72 20 66 69 72 65 73 20 6f 66 66 20  igger fires off 
0d30: 6f 66 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  of */.  char *zN
0d40: 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ame = 0;        
0d50: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0d60: 72 69 67 67 65 72 20 2a 2f 0a 20 20 73 71 6c 69  rigger */.  sqli
0d70: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0d80: 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61  ->db;  /* The da
0d90: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
0da0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  n */.  int iDb; 
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0dc0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 74  * The database t
0dd0: 6f 20 73 74 6f 72 65 20 74 68 65 20 74 72 69 67  o store the trig
0de0: 67 65 72 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ger in */.  Toke
0df0: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 20 20 20  n *pName;       
0e00: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 71 75 61      /* The unqua
0e10: 6c 69 66 69 65 64 20 64 62 20 6e 61 6d 65 20 2a  lified db name *
0e20: 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
0e30: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
0e40: 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f 72 20  tate vector for 
0e50: 74 68 65 20 44 42 20 66 69 78 65 72 20 2a 2f 0a  the DB fixer */.
0e60: 20 20 69 6e 74 20 69 54 61 62 44 62 3b 20 20 20    int iTabDb;   
0e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0e80: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0e90: 73 65 20 68 6f 6c 64 69 6e 67 20 70 54 61 62 20  se holding pTab 
0ea0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  */..  assert( pN
0eb0: 61 6d 65 31 21 3d 30 20 29 3b 20 20 20 2f 2a 20  ame1!=0 );   /* 
0ec0: 70 4e 61 6d 65 31 2d 3e 7a 20 6d 69 67 68 74 20  pName1->z might 
0ed0: 62 65 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 6f 74  be NULL, but not
0ee0: 20 70 4e 61 6d 65 31 20 69 74 73 65 6c 66 20 2a   pName1 itself *
0ef0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  /.  assert( pNam
0f00: 65 32 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  e2!=0 );.  asser
0f10: 74 28 20 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54  t( op==TK_INSERT
0f20: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 44 41 54   || op==TK_UPDAT
0f30: 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45  E || op==TK_DELE
0f40: 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
0f50: 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78 66 66 20  op>0 && op<0xff 
0f60: 29 3b 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20  );.  if( isTemp 
0f70: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 54 45 4d  ){.    /* If TEM
0f80: 50 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c  P was specified,
0f90: 20 74 68 65 6e 20 74 68 65 20 74 72 69 67 67 65   then the trigge
0fa0: 72 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62  r name may not b
0fb0: 65 20 71 75 61 6c 69 66 69 65 64 2e 20 2a 2f 0a  e qualified. */.
0fc0: 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e      if( pName2->
0fd0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  n>0 ){.      sql
0fe0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
0ff0: 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20  rse, "temporary 
1000: 74 72 69 67 67 65 72 20 6d 61 79 20 6e 6f 74 20  trigger may not 
1010: 68 61 76 65 20 71 75 61 6c 69 66 69 65 64 20 6e  have qualified n
1020: 61 6d 65 22 29 3b 0a 20 20 20 20 20 20 67 6f 74  ame");.      got
1030: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
1040: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 44 62  p;.    }.    iDb
1050: 20 3d 20 31 3b 0a 20 20 20 20 70 4e 61 6d 65 20   = 1;.    pName 
1060: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73  = pName1;.  }els
1070: 65 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  e{.    /* Figure
1080: 20 6f 75 74 20 74 68 65 20 64 62 20 74 68 61 74   out the db that
1090: 20 74 68 65 20 74 68 65 20 74 72 69 67 67 65 72   the the trigger
10a0: 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
10b0: 20 69 6e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d   in */.    iDb =
10c0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
10d0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
10e0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
10f0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
1100: 3c 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  <0 ){.      goto
1110: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
1120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1130: 2a 20 49 66 20 74 68 65 20 74 72 69 67 67 65 72  * If the trigger
1140: 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
1150: 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 74  ified, and the t
1160: 61 62 6c 65 20 69 73 20 61 20 74 65 6d 70 20 74  able is a temp t
1170: 61 62 6c 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  able,.  ** then 
1180: 73 65 74 20 69 44 62 20 74 6f 20 31 20 74 6f 20  set iDb to 1 to 
1190: 63 72 65 61 74 65 20 74 68 65 20 74 72 69 67 67  create the trigg
11a0: 65 72 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  er in the tempor
11b0: 61 72 79 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ary database..  
11c0: 2a 2a 20 49 66 20 73 71 6c 69 74 65 33 53 72 63  ** If sqlite3Src
11d0: 4c 69 73 74 4c 6f 6f 6b 75 70 28 29 20 72 65 74  ListLookup() ret
11e0: 75 72 6e 73 20 30 2c 20 69 6e 64 69 63 61 74 69  urns 0, indicati
11f0: 6e 67 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65  ng the table doe
1200: 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 78 69 73 74  s not.  ** exist
1210: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 63  , the error is c
1220: 61 75 67 68 74 20 62 79 20 74 68 65 20 62 6c 6f  aught by the blo
1230: 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  ck below..  */. 
1240: 20 69 66 28 20 21 70 54 61 62 6c 65 4e 61 6d 65   if( !pTableName
1250: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1260: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1270: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
1280: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73  ;.  }.  pTab = s
1290: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
12a0: 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62  kup(pParse, pTab
12b0: 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  leName);.  if( p
12c0: 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
12d0: 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
12e0: 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
12f0: 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
1300: 69 44 62 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  iDb = 1;.  }..  
1310: 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 74 61  /* Ensure the ta
1320: 62 6c 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 73  ble name matches
1330: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 61   database name a
1340: 6e 64 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  nd that the tabl
1350: 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66  e exists */.  if
1360: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1370: 65 64 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65  ed ) goto trigge
1380: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 61 73 73  r_cleanup;.  ass
1390: 65 72 74 28 20 70 54 61 62 6c 65 4e 61 6d 65 2d  ert( pTableName-
13a0: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
13b0: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
13c0: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
13d0: 69 44 62 2c 20 22 74 72 69 67 67 65 72 22 2c 20  iDb, "trigger", 
13e0: 70 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20  pName) && .     
13f0: 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
1400: 73 74 28 26 73 46 69 78 2c 20 70 54 61 62 6c 65  st(&sFix, pTable
1410: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  Name) ){.    got
1420: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
1430: 70 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  p;.  }.  pTab = 
1440: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
1450: 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61  okup(pParse, pTa
1460: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  bleName);.  if( 
1470: 21 70 54 61 62 20 29 7b 0a 20 20 20 20 2f 2a 20  !pTab ){.    /* 
1480: 54 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e  The table does n
1490: 6f 74 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20  ot exist. */.   
14a0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44   if( db->init.iD
14b0: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b==1 ){.      /*
14c0: 20 54 69 63 6b 65 74 20 23 33 38 31 30 2e 0a 20   Ticket #3810.. 
14d0: 20 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79       ** Normally
14e0: 2c 20 77 68 65 6e 65 76 65 72 20 61 20 74 61 62  , whenever a tab
14f0: 6c 65 20 69 73 20 64 72 6f 70 70 65 64 2c 20 61  le is dropped, a
1500: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 74 72  ll associated tr
1510: 69 67 67 65 72 73 20 61 72 65 0a 20 20 20 20 20  iggers are.     
1520: 20 2a 2a 20 64 72 6f 70 70 65 64 20 74 6f 6f 2e   ** dropped too.
1530: 20 20 42 75 74 20 69 66 20 61 20 54 45 4d 50 20    But if a TEMP 
1540: 74 72 69 67 67 65 72 20 69 73 20 63 72 65 61 74  trigger is creat
1550: 65 64 20 6f 6e 20 61 20 6e 6f 6e 2d 54 45 4d 50  ed on a non-TEMP
1560: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
1570: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69 73  and the table is
1580: 20 64 72 6f 70 70 65 64 20 62 79 20 61 20 64 69   dropped by a di
1590: 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73 65  fferent database
15a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 74 68 65   connection, the
15b0: 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65  .      ** trigge
15c0: 72 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65  r is not visible
15d0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74   connection that
15f0: 20 64 6f 65 73 20 74 68 65 0a 20 20 20 20 20 20   does the.      
1600: 2a 2a 20 64 72 6f 70 20 73 6f 20 74 68 65 20 74  ** drop so the t
1610: 72 69 67 67 65 72 20 63 61 6e 6e 6f 74 20 62 65  rigger cannot be
1620: 20 64 72 6f 70 70 65 64 2e 20 20 54 68 69 73 20   dropped.  This 
1630: 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 20 20  results in an.  
1640: 20 20 20 20 2a 2a 20 22 6f 72 70 68 61 6e 65 64      ** "orphaned
1650: 20 74 72 69 67 67 65 72 22 20 2d 20 61 20 74 72   trigger" - a tr
1660: 69 67 67 65 72 20 77 68 6f 73 65 20 61 73 73 6f  igger whose asso
1670: 63 69 61 74 65 64 20 74 61 62 6c 65 20 69 73 20  ciated table is 
1680: 6d 69 73 73 69 6e 67 2e 0a 20 20 20 20 20 20 2a  missing..      *
1690: 2f 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74  /.      db->init
16a0: 2e 6f 72 70 68 61 6e 54 72 69 67 67 65 72 20 3d  .orphanTrigger =
16b0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f   1;.    }.    go
16c0: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
16d0: 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73  up;.  }.  if( Is
16e0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
16f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1700: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
1710: 6e 6e 6f 74 20 63 72 65 61 74 65 20 74 72 69 67  nnot create trig
1720: 67 65 72 73 20 6f 6e 20 76 69 72 74 75 61 6c 20  gers on virtual 
1730: 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 67 6f  tables");.    go
1740: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
1750: 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  up;.  }..  /* Ch
1760: 65 63 6b 20 74 68 61 74 20 74 68 65 20 74 72 69  eck that the tri
1770: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 6e 6f 74  gger name is not
1780: 20 72 65 73 65 72 76 65 64 20 61 6e 64 20 74 68   reserved and th
1790: 61 74 20 6e 6f 20 74 72 69 67 67 65 72 20 6f 66  at no trigger of
17a0: 20 74 68 65 0a 20 20 2a 2a 20 73 70 65 63 69 66   the.  ** specif
17b0: 69 65 64 20 6e 61 6d 65 20 65 78 69 73 74 73 20  ied name exists 
17c0: 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
17d0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
17e0: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
17f0: 69 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 53 51  if( !zName || SQ
1800: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1810: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
1820: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
1830: 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  {.    goto trigg
1840: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
1850: 20 20 69 66 28 20 73 71 6c 69 74 65 33 48 61 73    if( sqlite3Has
1860: 68 46 69 6e 64 28 26 28 64 62 2d 3e 61 44 62 5b  hFind(&(db->aDb[
1870: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72  iDb].pSchema->tr
1880: 69 67 48 61 73 68 29 2c 0a 20 20 20 20 20 20 20  igHash),.       
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
18a0: 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
18b0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 29 20 29 7b  len30(zName)) ){
18c0: 0a 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20  .    if( !noErr 
18d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18f0: 20 22 74 72 69 67 67 65 72 20 25 54 20 61 6c 72   "trigger %T alr
1900: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
1910: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
1920: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
1930: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  anup;.  }..  /* 
1940: 44 6f 20 6e 6f 74 20 63 72 65 61 74 65 20 61 20  Do not create a 
1950: 74 72 69 67 67 65 72 20 6f 6e 20 61 20 73 79 73  trigger on a sys
1960: 74 65 6d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  tem table */.  i
1970: 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
1980: 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
1990: 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
19a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
19b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
19c0: 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74  "cannot create t
19d0: 72 69 67 67 65 72 20 6f 6e 20 73 79 73 74 65 6d  rigger on system
19e0: 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 70 50   table");.    pP
19f0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
1a00: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
1a10: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  leanup;.  }..  /
1a20: 2a 20 49 4e 53 54 45 41 44 20 6f 66 20 74 72 69  * INSTEAD of tri
1a30: 67 67 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 66  ggers are only f
1a40: 6f 72 20 76 69 65 77 73 20 61 6e 64 20 76 69 65  or views and vie
1a50: 77 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  ws only support 
1a60: 49 4e 53 54 45 41 44 0a 20 20 2a 2a 20 6f 66 20  INSTEAD.  ** of 
1a70: 74 72 69 67 67 65 72 73 2e 0a 20 20 2a 2f 0a 20  triggers..  */. 
1a80: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
1a90: 63 74 20 26 26 20 74 72 5f 74 6d 21 3d 54 4b 5f  ct && tr_tm!=TK_
1aa0: 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73  INSTEAD ){.    s
1ab0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ac0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63  Parse, "cannot c
1ad0: 72 65 61 74 65 20 25 73 20 74 72 69 67 67 65 72  reate %s trigger
1ae0: 20 6f 6e 20 76 69 65 77 3a 20 25 53 22 2c 20 0a   on view: %S", .
1af0: 20 20 20 20 20 20 20 20 28 74 72 5f 74 6d 20 3d          (tr_tm =
1b00: 3d 20 54 4b 5f 42 45 46 4f 52 45 29 3f 22 42 45  = TK_BEFORE)?"BE
1b10: 46 4f 52 45 22 3a 22 41 46 54 45 52 22 2c 20 70  FORE":"AFTER", p
1b20: 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a 20  TableName, 0);. 
1b30: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
1b40: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69  cleanup;.  }.  i
1b50: 66 28 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63  f( !pTab->pSelec
1b60: 74 20 26 26 20 74 72 5f 74 6d 3d 3d 54 4b 5f 49  t && tr_tm==TK_I
1b70: 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73 71  NSTEAD ){.    sq
1b80: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b90: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72  arse, "cannot cr
1ba0: 65 61 74 65 20 49 4e 53 54 45 41 44 20 4f 46 22  eate INSTEAD OF"
1bb0: 0a 20 20 20 20 20 20 20 20 22 20 74 72 69 67 67  .        " trigg
1bc0: 65 72 20 6f 6e 20 74 61 62 6c 65 3a 20 25 53 22  er on table: %S"
1bd0: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29  , pTableName, 0)
1be0: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  ;.    goto trigg
1bf0: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
1c00: 20 20 69 54 61 62 44 62 20 3d 20 73 71 6c 69 74    iTabDb = sqlit
1c10: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
1c20: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1c30: 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
1c40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1c50: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
1c60: 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
1c70: 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 3b  _CREATE_TRIGGER;
1c80: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1c90: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
1ca0: 54 61 62 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  TabDb].zName;.  
1cb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1cc0: 62 54 72 69 67 20 3d 20 69 73 54 65 6d 70 20 3f  bTrig = isTemp ?
1cd0: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d   db->aDb[1].zNam
1ce0: 65 20 3a 20 7a 44 62 3b 0a 20 20 20 20 69 66 28  e : zDb;.    if(
1cf0: 20 69 54 61 62 44 62 3d 3d 31 20 7c 7c 20 69 73   iTabDb==1 || is
1d00: 54 65 6d 70 20 29 20 63 6f 64 65 20 3d 20 53 51  Temp ) code = SQ
1d10: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
1d20: 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 69 66  _TRIGGER;.    if
1d30: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1d40: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
1d50: 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
1d60: 61 6d 65 2c 20 7a 44 62 54 72 69 67 29 20 29 7b  ame, zDbTrig) ){
1d70: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67  .      goto trig
1d80: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ger_cleanup;.   
1d90: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
1da0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1db0: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
1dc0: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
1dd0: 69 54 61 62 44 62 29 2c 30 2c 7a 44 62 29 29 7b  iTabDb),0,zDb)){
1de0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67  .      goto trig
1df0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ger_cleanup;.   
1e00: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1e10: 20 2f 2a 20 49 4e 53 54 45 41 44 20 4f 46 20 74   /* INSTEAD OF t
1e20: 72 69 67 67 65 72 73 20 63 61 6e 20 6f 6e 6c 79  riggers can only
1e30: 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65 77 73   appear on views
1e40: 20 61 6e 64 20 42 45 46 4f 52 45 20 74 72 69 67   and BEFORE trig
1e50: 67 65 72 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74  gers.  ** cannot
1e60: 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65 77 73   appear on views
1e70: 2e 20 20 53 6f 20 77 65 20 6d 69 67 68 74 20 61  .  So we might a
1e80: 73 20 77 65 6c 6c 20 74 72 61 6e 73 6c 61 74 65  s well translate
1e90: 20 65 76 65 72 79 0a 20 20 2a 2a 20 49 4e 53 54   every.  ** INST
1ea0: 45 41 44 20 4f 46 20 74 72 69 67 67 65 72 20 69  EAD OF trigger i
1eb0: 6e 74 6f 20 61 20 42 45 46 4f 52 45 20 74 72 69  nto a BEFORE tri
1ec0: 67 67 65 72 2e 20 20 49 74 20 73 69 6d 70 6c 69  gger.  It simpli
1ed0: 66 69 65 73 20 63 6f 64 65 0a 20 20 2a 2a 20 65  fies code.  ** e
1ee0: 6c 73 65 77 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  lsewhere..  */. 
1ef0: 20 69 66 20 28 74 72 5f 74 6d 20 3d 3d 20 54 4b   if (tr_tm == TK
1f00: 5f 49 4e 53 54 45 41 44 29 7b 0a 20 20 20 20 74  _INSTEAD){.    t
1f10: 72 5f 74 6d 20 3d 20 54 4b 5f 42 45 46 4f 52 45  r_tm = TK_BEFORE
1f20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c  ;.  }..  /* Buil
1f30: 64 20 74 68 65 20 54 72 69 67 67 65 72 20 6f 62  d the Trigger ob
1f40: 6a 65 63 74 20 2a 2f 0a 20 20 70 54 72 69 67 67  ject */.  pTrigg
1f50: 65 72 20 3d 20 28 54 72 69 67 67 65 72 2a 29 73  er = (Trigger*)s
1f60: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1f70: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72  ro(db, sizeof(Tr
1f80: 69 67 67 65 72 29 29 3b 0a 20 20 69 66 28 20 70  igger));.  if( p
1f90: 54 72 69 67 67 65 72 3d 3d 30 20 29 20 67 6f 74  Trigger==0 ) got
1fa0: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
1fb0: 70 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 7a  p;.  pTrigger->z
1fc0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
1fd0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 72  zName = 0;.  pTr
1fe0: 69 67 67 65 72 2d 3e 74 61 62 6c 65 20 3d 20 73  igger->table = s
1ff0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
2000: 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 61  b, pTableName->a
2010: 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 70 54  [0].zName);.  pT
2020: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 20  rigger->pSchema 
2030: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
2040: 53 63 68 65 6d 61 3b 0a 20 20 70 54 72 69 67 67  Schema;.  pTrigg
2050: 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 3d  er->pTabSchema =
2060: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a   pTab->pSchema;.
2070: 20 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 20 3d    pTrigger->op =
2080: 20 28 75 38 29 6f 70 3b 0a 20 20 70 54 72 69 67   (u8)op;.  pTrig
2090: 67 65 72 2d 3e 74 72 5f 74 6d 20 3d 20 74 72 5f  ger->tr_tm = tr_
20a0: 74 6d 3d 3d 54 4b 5f 42 45 46 4f 52 45 20 3f 20  tm==TK_BEFORE ? 
20b0: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 3a  TRIGGER_BEFORE :
20c0: 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 3b 0a   TRIGGER_AFTER;.
20d0: 20 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65    pTrigger->pWhe
20e0: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
20f0: 75 70 28 64 62 2c 20 70 57 68 65 6e 2c 20 45 58  up(db, pWhen, EX
2100: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
2110: 20 70 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75   pTrigger->pColu
2120: 6d 6e 73 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  mns = sqlite3IdL
2130: 69 73 74 44 75 70 28 64 62 2c 20 70 43 6f 6c 75  istDup(db, pColu
2140: 6d 6e 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mns);.  assert( 
2150: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
2160: 67 65 72 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72  ger==0 );.  pPar
2170: 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20  se->pNewTrigger 
2180: 3d 20 70 54 72 69 67 67 65 72 3b 0a 0a 74 72 69  = pTrigger;..tri
2190: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  gger_cleanup:.  
21a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
21b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
21c0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
21d0: 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29  (db, pTableName)
21e0: 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
21f0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  tDelete(db, pCol
2200: 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  umns);.  sqlite3
2210: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
2220: 57 68 65 6e 29 3b 0a 20 20 69 66 28 20 21 70 50  When);.  if( !pP
2230: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
2240: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
2250: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62  DeleteTrigger(db
2260: 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 7d  , pTrigger);.  }
2270: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2280: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72  ( pParse->pNewTr
2290: 69 67 67 65 72 3d 3d 70 54 72 69 67 67 65 72 20  igger==pTrigger 
22a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
22b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
22c0: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c  called after all
22d0: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
22e0: 61 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65  actions have bee
22f0: 6e 20 70 61 72 73 65 64 0a 2a 2a 20 69 6e 20 6f  n parsed.** in o
2300: 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
2310: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
2320: 62 75 69 6c 64 69 6e 67 20 74 68 65 20 74 72 69  building the tri
2330: 67 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gger..*/.void sq
2340: 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67 67  lite3FinishTrigg
2350: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
2360: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
2370: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
2380: 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  */.  TriggerStep
2390: 20 2a 70 53 74 65 70 4c 69 73 74 2c 20 2f 2a 20   *pStepList, /* 
23a0: 54 68 65 20 74 72 69 67 67 65 72 65 64 20 70 72  The triggered pr
23b0: 6f 67 72 61 6d 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ogram */.  Token
23c0: 20 2a 70 41 6c 6c 20 20 20 20 20 20 20 20 20 20   *pAll          
23d0: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 68 61 74     /* Token that
23e0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63   describes the c
23f0: 6f 6d 70 6c 65 74 65 20 43 52 45 41 54 45 20 54  omplete CREATE T
2400: 52 49 47 47 45 52 20 2a 2f 0a 29 7b 0a 20 20 54  RIGGER */.){.  T
2410: 72 69 67 67 65 72 20 2a 70 54 72 69 67 20 3d 20  rigger *pTrig = 
2420: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
2430: 67 65 72 3b 20 20 20 20 2f 2a 20 54 72 69 67 67  ger;    /* Trigg
2440: 65 72 20 62 65 69 6e 67 20 66 69 6e 69 73 68 65  er being finishe
2450: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
2460: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67  /* Name of trigg
2490: 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
24a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
24b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24c0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
24d0: 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46   */.  DbFixer sF
24e0: 69 78 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  ix;.  int iDb;  
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2510: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * Database conta
2520: 69 6e 69 6e 67 20 74 68 65 20 74 72 69 67 67 65  ining the trigge
2530: 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 6e 61 6d  r */.  Token nam
2540: 65 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20  eToken;         
2550: 20 20 2f 2a 20 54 72 69 67 67 65 72 20 6e 61 6d    /* Trigger nam
2560: 65 20 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f  e for error repo
2570: 72 74 69 6e 67 20 2a 2f 0a 0a 20 20 70 54 72 69  rting */..  pTri
2580: 67 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  g = pParse->pNew
2590: 54 72 69 67 67 65 72 3b 0a 20 20 70 50 61 72 73  Trigger;.  pPars
25a0: 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20 3d  e->pNewTrigger =
25b0: 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   0;.  if( NEVER(
25c0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 29 20 7c 7c  pParse->nErr) ||
25d0: 20 21 70 54 72 69 67 20 29 20 67 6f 74 6f 20 74   !pTrig ) goto t
25e0: 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65  riggerfinish_cle
25f0: 61 6e 75 70 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  anup;.  zName = 
2600: 70 54 72 69 67 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTrig->zName;.  
2610: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2620: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
2630: 65 2d 3e 64 62 2c 20 70 54 72 69 67 2d 3e 70 53  e->db, pTrig->pS
2640: 63 68 65 6d 61 29 3b 0a 20 20 70 54 72 69 67 2d  chema);.  pTrig-
2650: 3e 73 74 65 70 5f 6c 69 73 74 20 3d 20 70 53 74  >step_list = pSt
2660: 65 70 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  epList;.  while(
2670: 20 70 53 74 65 70 4c 69 73 74 20 29 7b 0a 20 20   pStepList ){.  
2680: 20 20 70 53 74 65 70 4c 69 73 74 2d 3e 70 54 72    pStepList->pTr
2690: 69 67 20 3d 20 70 54 72 69 67 3b 0a 20 20 20 20  ig = pTrig;.    
26a0: 70 53 74 65 70 4c 69 73 74 20 3d 20 70 53 74 65  pStepList = pSte
26b0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
26c0: 7d 0a 20 20 6e 61 6d 65 54 6f 6b 65 6e 2e 7a 20  }.  nameToken.z 
26d0: 3d 20 70 54 72 69 67 2d 3e 7a 4e 61 6d 65 3b 0a  = pTrig->zName;.
26e0: 20 20 6e 61 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20    nameToken.n = 
26f0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2700: 6e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  nameToken.z);.  
2710: 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
2720: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
2730: 2c 20 69 44 62 2c 20 22 74 72 69 67 67 65 72 22  , iDb, "trigger"
2740: 2c 20 26 6e 61 6d 65 54 6f 6b 65 6e 29 20 0a 20  , &nameToken) . 
2750: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
2760: 74 65 33 46 69 78 54 72 69 67 67 65 72 53 74 65  te3FixTriggerSte
2770: 70 28 26 73 46 69 78 2c 20 70 54 72 69 67 2d 3e  p(&sFix, pTrig->
2780: 73 74 65 70 5f 6c 69 73 74 29 20 29 7b 0a 20 20  step_list) ){.  
2790: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69    goto triggerfi
27a0: 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  nish_cleanup;.  
27b0: 7d 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 72  }..  /* if we ar
27c0: 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  e not initializi
27d0: 6e 67 2c 20 61 6e 64 20 74 68 69 73 20 74 72 69  ng, and this tri
27e0: 67 67 65 72 20 69 73 20 6e 6f 74 20 6f 6e 20 61  gger is not on a
27f0: 20 54 45 4d 50 20 74 61 62 6c 65 2c 20 0a 20 20   TEMP table, .  
2800: 2a 2a 20 62 75 69 6c 64 20 74 68 65 20 73 71 6c  ** build the sql
2810: 69 74 65 5f 6d 61 73 74 65 72 20 65 6e 74 72 79  ite_master entry
2820: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
2830: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
2840: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
2850: 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20 2f 2a 20  har *z;..    /* 
2860: 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  Make an entry in
2870: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
2880: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
2890: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
28a0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
28b0: 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
28c0: 74 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c  triggerfinish_cl
28d0: 65 61 6e 75 70 3b 0a 20 20 20 20 73 71 6c 69 74  eanup;.    sqlit
28e0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
28f0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
2900: 20 69 44 62 29 3b 0a 20 20 20 20 7a 20 3d 20 73   iDb);.    z = s
2910: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
2920: 64 62 2c 20 28 63 68 61 72 2a 29 70 41 6c 6c 2d  db, (char*)pAll-
2930: 3e 7a 2c 20 70 41 6c 6c 2d 3e 6e 29 3b 0a 20 20  >z, pAll->n);.  
2940: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
2950: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
2960: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
2970: 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 74   %Q.%s VALUES('t
2980: 72 69 67 67 65 72 27 2c 25 51 2c 25 51 2c 30 2c  rigger',%Q,%Q,0,
2990: 27 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20  'CREATE TRIGGER 
29a0: 25 71 27 29 22 2c 0a 20 20 20 20 20 20 20 64 62  %q')",.       db
29b0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
29c0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
29d0: 44 62 29 2c 20 7a 4e 61 6d 65 2c 0a 20 20 20 20  Db), zName,.    
29e0: 20 20 20 70 54 72 69 67 2d 3e 74 61 62 6c 65 2c     pTrig->table,
29f0: 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
2a00: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
2a10: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
2a20: 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
2a30: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
2a40: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2a50: 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
2a60: 62 2c 20 30 2c 20 30 2c 20 73 71 6c 69 74 65 33  b, 0, 0, sqlite3
2a70: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
2a80: 20 64 62 2c 20 22 74 79 70 65 3d 27 74 72 69 67   db, "type='trig
2a90: 67 65 72 27 20 41 4e 44 20 6e 61 6d 65 3d 27 25  ger' AND name='%
2aa0: 71 27 22 2c 20 7a 4e 61 6d 65 29 2c 20 50 34 5f  q'", zName), P4_
2ab0: 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20  DYNAMIC.    );. 
2ac0: 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   }..  if( db->in
2ad0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54  it.busy ){.    T
2ae0: 72 69 67 67 65 72 20 2a 70 4c 69 6e 6b 20 3d 20  rigger *pLink = 
2af0: 70 54 72 69 67 3b 0a 20 20 20 20 48 61 73 68 20  pTrig;.    Hash 
2b00: 2a 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44  *pHash = &db->aD
2b10: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
2b20: 74 72 69 67 48 61 73 68 3b 0a 20 20 20 20 70 54  trigHash;.    pT
2b30: 72 69 67 20 3d 20 73 71 6c 69 74 65 33 48 61 73  rig = sqlite3Has
2b40: 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a  hInsert(pHash, z
2b50: 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
2b60: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 70 54  len30(zName), pT
2b70: 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 70 54  rig);.    if( pT
2b80: 72 69 67 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  rig ){.      db-
2b90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
2ba0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
2bb0: 20 70 4c 69 6e 6b 2d 3e 70 53 63 68 65 6d 61 3d   pLink->pSchema=
2bc0: 3d 70 4c 69 6e 6b 2d 3e 70 54 61 62 53 63 68 65  =pLink->pTabSche
2bd0: 6d 61 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  ma ){.      Tabl
2be0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
2bf0: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
2c00: 72 6c 65 6e 33 30 28 70 4c 69 6e 6b 2d 3e 74 61  rlen30(pLink->ta
2c10: 62 6c 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  ble);.      pTab
2c20: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
2c30: 6e 64 28 26 70 4c 69 6e 6b 2d 3e 70 54 61 62 53  nd(&pLink->pTabS
2c40: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
2c50: 70 4c 69 6e 6b 2d 3e 74 61 62 6c 65 2c 20 6e 29  pLink->table, n)
2c60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2c70: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
2c80: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLink->pNext = 
2c90: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
2ca0: 20 20 20 20 20 20 70 54 61 62 2d 3e 70 54 72 69        pTab->pTri
2cb0: 67 67 65 72 20 3d 20 70 4c 69 6e 6b 3b 0a 20 20  gger = pLink;.  
2cc0: 20 20 7d 0a 20 20 7d 0a 0a 74 72 69 67 67 65 72    }.  }..trigger
2cd0: 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3a 0a  finish_cleanup:.
2ce0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
2cf0: 72 69 67 67 65 72 28 64 62 2c 20 70 54 72 69 67  rigger(db, pTrig
2d00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  );.  assert( !pP
2d10: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
2d20: 72 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  r );.  sqlite3De
2d30: 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28  leteTriggerStep(
2d40: 64 62 2c 20 70 53 74 65 70 4c 69 73 74 29 3b 0a  db, pStepList);.
2d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  }../*.** Turn a 
2d60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2d70: 20 28 74 68 61 74 20 74 68 65 20 70 53 65 6c 65   (that the pSele
2d80: 63 74 20 70 61 72 61 6d 65 74 65 72 20 70 6f 69  ct parameter poi
2d90: 6e 74 73 20 74 6f 29 20 69 6e 74 6f 0a 2a 2a 20  nts to) into.** 
2da0: 61 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20  a trigger step. 
2db0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
2dc0: 72 20 74 6f 20 61 20 54 72 69 67 67 65 72 53 74  r to a TriggerSt
2dd0: 65 70 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ep structure..**
2de0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
2df0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
2e00: 65 20 77 68 65 6e 20 69 74 20 66 69 6e 64 73 20  e when it finds 
2e10: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2e20: 6e 74 20 69 6e 0a 2a 2a 20 62 6f 64 79 20 6f 66  nt in.** body of
2e30: 20 61 20 54 52 49 47 47 45 52 2e 20 20 0a 2a 2f   a TRIGGER.  .*/
2e40: 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 71  .TriggerStep *sq
2e50: 6c 69 74 65 33 54 72 69 67 67 65 72 53 65 6c 65  lite3TriggerSele
2e60: 63 74 53 74 65 70 28 73 71 6c 69 74 65 33 20 2a  ctStep(sqlite3 *
2e70: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  db, Select *pSel
2e80: 65 63 74 29 7b 0a 20 20 54 72 69 67 67 65 72 53  ect){.  TriggerS
2e90: 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65  tep *pTriggerSte
2ea0: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
2eb0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
2ec0: 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29 29  of(TriggerStep))
2ed0: 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72  ;.  if( pTrigger
2ee0: 53 74 65 70 3d 3d 30 20 29 20 7b 0a 20 20 20 20  Step==0 ) {.    
2ef0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
2f00: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
2f10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2f20: 20 20 7d 0a 20 20 70 54 72 69 67 67 65 72 53 74    }.  pTriggerSt
2f30: 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45  ep->op = TK_SELE
2f40: 43 54 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74  CT;.  pTriggerSt
2f50: 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53  ep->pSelect = pS
2f60: 65 6c 65 63 74 3b 0a 20 20 70 54 72 69 67 67 65  elect;.  pTrigge
2f70: 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20  rStep->orconf = 
2f80: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 72 65  OE_Default;.  re
2f90: 74 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65  turn pTriggerSte
2fa0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  p;.}../*.** Allo
2fb0: 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 68 6f  cate space to ho
2fc0: 6c 64 20 61 20 6e 65 77 20 74 72 69 67 67 65 72  ld a new trigger
2fd0: 20 73 74 65 70 2e 20 20 54 68 65 20 61 6c 6c 6f   step.  The allo
2fe0: 63 61 74 65 64 20 73 70 61 63 65 0a 2a 2a 20 68  cated space.** h
2ff0: 6f 6c 64 73 20 62 6f 74 68 20 74 68 65 20 54 72  olds both the Tr
3000: 69 67 67 65 72 53 74 65 70 20 6f 62 6a 65 63 74  iggerStep object
3010: 20 61 6e 64 20 74 68 65 20 54 72 69 67 67 65 72   and the Trigger
3020: 53 74 65 70 2e 74 61 72 67 65 74 2e 7a 20 73 74  Step.target.z st
3030: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ring..**.** If a
3040: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
3050: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
3060: 72 6e 65 64 20 61 6e 64 20 64 62 2d 3e 6d 61 6c  rned and db->mal
3070: 6c 6f 63 46 61 69 6c 65 64 20 69 73 20 73 65 74  locFailed is set
3080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 67  ..*/.static Trig
3090: 67 65 72 53 74 65 70 20 2a 74 72 69 67 67 65 72  gerStep *trigger
30a0: 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 0a 20 20  StepAllocate(.  
30b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
30d0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
30e0: 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20  on */.  u8 op,  
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 6f      /* Trigger o
3110: 70 63 6f 64 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  pcode */.  Token
3120: 20 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20   *pName         
3130: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
3140: 72 67 65 74 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a  rget name */.){.
3150: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70    TriggerStep *p
3160: 54 72 69 67 67 65 72 53 74 65 70 3b 0a 0a 20 20  TriggerStep;..  
3170: 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 73  pTriggerStep = s
3180: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
3190: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72  ro(db, sizeof(Tr
31a0: 69 67 67 65 72 53 74 65 70 29 20 2b 20 70 4e 61  iggerStep) + pNa
31b0: 6d 65 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70 54  me->n);.  if( pT
31c0: 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20  riggerStep ){.  
31d0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61    char *z = (cha
31e0: 72 2a 29 26 70 54 72 69 67 67 65 72 53 74 65 70  r*)&pTriggerStep
31f0: 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
3200: 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  z, pName->z, pNa
3210: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 72 69  me->n);.    pTri
3220: 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74  ggerStep->target
3230: 2e 7a 20 3d 20 7a 3b 0a 20 20 20 20 70 54 72 69  .z = z;.    pTri
3240: 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74  ggerStep->target
3250: 2e 6e 20 3d 20 70 4e 61 6d 65 2d 3e 6e 3b 0a 20  .n = pName->n;. 
3260: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
3270: 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 7d 0a 20 20  >op = op;.  }.  
3280: 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53  return pTriggerS
3290: 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75  tep;.}../*.** Bu
32a0: 69 6c 64 20 61 20 74 72 69 67 67 65 72 20 73 74  ild a trigger st
32b0: 65 70 20 6f 75 74 20 6f 66 20 61 6e 20 49 4e 53  ep out of an INS
32c0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ERT statement.  
32d0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
32e0: 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 77 20 74  .** to the new t
32f0: 72 69 67 67 65 72 20 73 74 65 70 2e 0a 2a 2a 0a  rigger step..**.
3300: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
3310: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
3320: 20 77 68 65 6e 20 69 74 20 73 65 65 73 20 61 6e   when it sees an
3330: 20 49 4e 53 45 52 54 20 69 6e 73 69 64 65 20 74   INSERT inside t
3340: 68 65 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20  he.** body of a 
3350: 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72 69 67  trigger..*/.Trig
3360: 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33  gerStep *sqlite3
3370: 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74 65  TriggerInsertSte
3380: 70 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p(.  sqlite3 *db
3390: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
33a0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
33b0: 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
33c0: 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 2f 2a 20  pTableName,  /* 
33d0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
33e0: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
33f0: 69 6e 73 65 72 74 20 2a 2f 0a 20 20 49 64 4c 69  insert */.  IdLi
3400: 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20 20  st *pColumn,    
3410: 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
3420: 6e 73 20 69 6e 20 70 54 61 62 6c 65 4e 61 6d 65  ns in pTableName
3430: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3440: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3450: 45 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20  EList,   /* The 
3460: 56 41 4c 55 45 20 63 6c 61 75 73 65 3a 20 61 20  VALUE clause: a 
3470: 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74  list of values t
3480: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f  o be inserted */
3490: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
34a0: 63 74 2c 20 20 20 20 2f 2a 20 41 20 53 45 4c 45  ct,    /* A SELE
34b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
34c0: 74 20 73 75 70 70 6c 69 65 73 20 76 61 6c 75 65  t supplies value
34d0: 73 20 2a 2f 0a 20 20 75 38 20 6f 72 63 6f 6e 66  s */.  u8 orconf
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
34f0: 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
3500: 69 74 68 6d 20 28 4f 45 5f 41 62 6f 72 74 2c 20  ithm (OE_Abort, 
3510: 4f 45 5f 52 65 70 6c 61 63 65 2c 20 65 74 63 2e  OE_Replace, etc.
3520: 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65  ) */.){.  Trigge
3530: 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53  rStep *pTriggerS
3540: 74 65 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 70  tep;..  assert(p
3550: 45 4c 69 73 74 20 3d 3d 20 30 20 7c 7c 20 70 53  EList == 0 || pS
3560: 65 6c 65 63 74 20 3d 3d 20 30 29 3b 0a 20 20 61  elect == 0);.  a
3570: 73 73 65 72 74 28 70 45 4c 69 73 74 20 21 3d 20  ssert(pEList != 
3580: 30 20 7c 7c 20 70 53 65 6c 65 63 74 20 21 3d 20  0 || pSelect != 
3590: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
35a0: 61 69 6c 65 64 29 3b 0a 0a 20 20 70 54 72 69 67  ailed);..  pTrig
35b0: 67 65 72 53 74 65 70 20 3d 20 74 72 69 67 67 65  gerStep = trigge
35c0: 72 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62  rStepAllocate(db
35d0: 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 70 54 61  , TK_INSERT, pTa
35e0: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  bleName);.  if( 
35f0: 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a  pTriggerStep ){.
3600: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
3610: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
3620: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
3630: 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55   pSelect, EXPRDU
3640: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 70  P_REDUCE);.    p
3650: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 49 64  TriggerStep->pId
3660: 4c 69 73 74 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a  List = pColumn;.
3670: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
3680: 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 73 71  ->pExprList = sq
3690: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
36a0: 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 45 58 50  (db, pEList, EXP
36b0: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
36c0: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
36d0: 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b  orconf = orconf;
36e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
36f0: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
3700: 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b 0a  e(db, pColumn);.
3710: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
3720: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
3730: 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
3740: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
3750: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 0a 20 20  b, pSelect);..  
3760: 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53  return pTriggerS
3770: 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  tep;.}../*.** Co
3780: 6e 73 74 72 75 63 74 20 61 20 74 72 69 67 67 65  nstruct a trigge
3790: 72 20 73 74 65 70 20 74 68 61 74 20 69 6d 70 6c  r step that impl
37a0: 65 6d 65 6e 74 73 20 61 6e 20 55 50 44 41 54 45  ements an UPDATE
37b0: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
37c0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
37d0: 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67 67  er to that trigg
37e0: 65 72 20 73 74 65 70 2e 20 20 54 68 65 20 70 61  er step.  The pa
37f0: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
3800: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 0a  routine when it.
3810: 2a 2a 20 73 65 65 73 20 61 6e 20 55 50 44 41 54  ** sees an UPDAT
3820: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 69  E statement insi
3830: 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  de the body of a
3840: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 2e   CREATE TRIGGER.
3850: 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20  .*/.TriggerStep 
3860: 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 55  *sqlite3TriggerU
3870: 70 64 61 74 65 53 74 65 70 28 0a 20 20 73 71 6c  pdateStep(.  sql
3880: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3890: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
38a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
38b0: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e    Token *pTableN
38c0: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
38d0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
38e0: 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 45  e updated */.  E
38f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
3900: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 54 20 63      /* The SET c
3910: 6c 61 75 73 65 3a 20 6c 69 73 74 20 6f 66 20 63  lause: list of c
3920: 6f 6c 75 6d 6e 20 61 6e 64 20 6e 65 77 20 76 61  olumn and new va
3930: 6c 75 65 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a  lues */.  Expr *
3940: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 2f  pWhere,        /
3950: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
3960: 73 65 20 2a 2f 0a 20 20 75 38 20 6f 72 63 6f 6e  se */.  u8 orcon
3970: 66 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f            /* 
3980: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
3990: 6f 72 69 74 68 6d 2e 20 28 4f 45 5f 41 62 6f 72  orithm. (OE_Abor
39a0: 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74  t, OE_Ignore, et
39b0: 63 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  c) */.){.  Trigg
39c0: 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72  erStep *pTrigger
39d0: 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67 67 65  Step;..  pTrigge
39e0: 72 53 74 65 70 20 3d 20 74 72 69 67 67 65 72 53  rStep = triggerS
39f0: 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62 2c 20  tepAllocate(db, 
3a00: 54 4b 5f 55 50 44 41 54 45 2c 20 70 54 61 62 6c  TK_UPDATE, pTabl
3a10: 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54  eName);.  if( pT
3a20: 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20  riggerStep ){.  
3a30: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3a40: 70 45 78 70 72 4c 69 73 74 20 3d 20 73 71 6c 69  pExprList = sqli
3a50: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
3a60: 62 2c 20 70 45 4c 69 73 74 2c 20 45 58 50 52 44  b, pEList, EXPRD
3a70: 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20  UP_REDUCE);.    
3a80: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57  pTriggerStep->pW
3a90: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
3aa0: 70 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 65  prDup(db, pWhere
3ab0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
3ac0: 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53  );.    pTriggerS
3ad0: 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72  tep->orconf = or
3ae0: 63 6f 6e 66 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  conf;.  }.  sqli
3af0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
3b00: 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
3b10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3b20: 74 65 28 64 62 2c 20 70 57 68 65 72 65 29 3b 0a  te(db, pWhere);.
3b30: 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65    return pTrigge
3b40: 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rStep;.}../*.** 
3b50: 43 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69 67  Construct a trig
3b60: 67 65 72 20 73 74 65 70 20 74 68 61 74 20 69 6d  ger step that im
3b70: 70 6c 65 6d 65 6e 74 73 20 61 20 44 45 4c 45 54  plements a DELET
3b80: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  E statement and 
3b90: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
3ba0: 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67  ter to that trig
3bb0: 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20 70  ger step.  The p
3bc0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
3bd0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74   routine when it
3be0: 0a 2a 2a 20 73 65 65 73 20 61 20 44 45 4c 45 54  .** sees a DELET
3bf0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 69  E statement insi
3c00: 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  de the body of a
3c10: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 2e   CREATE TRIGGER.
3c20: 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20  .*/.TriggerStep 
3c30: 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 44  *sqlite3TriggerD
3c40: 65 6c 65 74 65 53 74 65 70 28 0a 20 20 73 71 6c  eleteStep(.  sql
3c50: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3c60: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
3c80: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
3c90: 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  me,      /* The 
3ca0: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
3cb0: 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65   rows are delete
3cc0: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
3cd0: 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  ere            /
3ce0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
3cf0: 73 65 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  se */.){.  Trigg
3d00: 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72  erStep *pTrigger
3d10: 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67 67 65  Step;..  pTrigge
3d20: 72 53 74 65 70 20 3d 20 74 72 69 67 67 65 72 53  rStep = triggerS
3d30: 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62 2c 20  tepAllocate(db, 
3d40: 54 4b 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 6c  TK_DELETE, pTabl
3d50: 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54  eName);.  if( pT
3d60: 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20  riggerStep ){.  
3d70: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3d80: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
3d90: 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65  ExprDup(db, pWhe
3da0: 72 65 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  re, EXPRDUP_REDU
3db0: 43 45 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65  CE);.    pTrigge
3dc0: 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20  rStep->orconf = 
3dd0: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 7d 0a  OE_Default;.  }.
3de0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3df0: 65 74 65 28 64 62 2c 20 70 57 68 65 72 65 29 3b  ete(db, pWhere);
3e00: 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67  .  return pTrigg
3e10: 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  erStep;.}../* .*
3e20: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
3e30: 6c 65 74 65 20 61 20 54 72 69 67 67 65 72 20 73  lete a Trigger s
3e40: 74 72 75 63 74 75 72 65 0a 2a 2f 0a 76 6f 69 64  tructure.*/.void
3e50: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72   sqlite3DeleteTr
3e60: 69 67 67 65 72 28 73 71 6c 69 74 65 33 20 2a 64  igger(sqlite3 *d
3e70: 62 2c 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  b, Trigger *pTri
3e80: 67 67 65 72 29 7b 0a 20 20 69 66 28 20 70 54 72  gger){.  if( pTr
3e90: 69 67 67 65 72 3d 3d 30 20 29 20 72 65 74 75 72  igger==0 ) retur
3ea0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  n;.  sqlite3Dele
3eb0: 74 65 54 72 69 67 67 65 72 53 74 65 70 28 64 62  teTriggerStep(db
3ec0: 2c 20 70 54 72 69 67 67 65 72 2d 3e 73 74 65 70  , pTrigger->step
3ed0: 5f 6c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  _list);.  sqlite
3ee0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 72 69  3DbFree(db, pTri
3ef0: 67 67 65 72 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  gger->zName);.  
3f00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3f10: 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c  , pTrigger->tabl
3f20: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
3f30: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 54 72 69  rDelete(db, pTri
3f40: 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b 0a 20 20  gger->pWhen);.  
3f50: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
3f60: 65 74 65 28 64 62 2c 20 70 54 72 69 67 67 65 72  ete(db, pTrigger
3f70: 2d 3e 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73  ->pColumns);.  s
3f80: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3f90: 20 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a 2f   pTrigger);.}../
3fa0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3fb0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
3fc0: 64 72 6f 70 20 61 20 74 72 69 67 67 65 72 20 66  drop a trigger f
3fd0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
3fe0: 20 73 63 68 65 6d 61 2e 20 0a 2a 2a 0a 2a 2a 20   schema. .**.** 
3ff0: 54 68 69 73 20 6d 61 79 20 62 65 20 63 61 6c 6c  This may be call
4000: 65 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ed directly from
4010: 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20   the parser and 
4020: 74 68 65 72 65 66 6f 72 65 20 69 64 65 6e 74 69  therefore identi
4030: 66 69 65 73 0a 2a 2a 20 74 68 65 20 74 72 69 67  fies.** the trig
4040: 67 65 72 20 62 79 20 6e 61 6d 65 2e 20 20 54 68  ger by name.  Th
4050: 65 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69  e sqlite3DropTri
4060: 67 67 65 72 50 74 72 28 29 20 72 6f 75 74 69 6e  ggerPtr() routin
4070: 65 20 64 6f 65 73 20 74 68 65 0a 2a 2a 20 73 61  e does the.** sa
4080: 6d 65 20 6a 6f 62 20 61 73 20 74 68 69 73 20 72  me job as this r
4090: 6f 75 74 69 6e 65 20 65 78 63 65 70 74 20 69 74  outine except it
40a0: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
40b0: 20 74 6f 20 74 68 65 20 74 72 69 67 67 65 72 0a   to the trigger.
40c0: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ** instead of th
40d0: 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 2e 0a  e trigger name..
40e0: 2a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  **/.void sqlite3
40f0: 44 72 6f 70 54 72 69 67 67 65 72 28 50 61 72 73  DropTrigger(Pars
4100: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
4110: 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 6e  st *pName, int n
4120: 6f 45 72 72 29 7b 0a 20 20 54 72 69 67 67 65 72  oErr){.  Trigger
4130: 20 2a 70 54 72 69 67 67 65 72 20 3d 20 30 3b 0a   *pTrigger = 0;.
4140: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
4150: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f   char *zDb;.  co
4160: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
4170: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20  .  int nName;.  
4180: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
4190: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
41a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
41b0: 64 20 29 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72  d ) goto drop_tr
41c0: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
41d0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
41e0: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
41f0: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
4200: 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 67   goto drop_trigg
4210: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
4220: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
4230: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 7a  ->nSrc==1 );.  z
4240: 44 62 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  Db = pName->a[0]
4250: 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7a 4e  .zDatabase;.  zN
4260: 61 6d 65 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30  ame = pName->a[0
4270: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 6e 4e 61 6d 65  ].zName;.  nName
4280: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
4290: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  30(zName);.  for
42a0: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
42b0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
42c0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
42d0: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
42e0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
42f0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
4300: 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69   if( zDb && sqli
4310: 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61  te3StrICmp(db->a
4320: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62  Db[j].zName, zDb
4330: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
4340: 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
4350: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 28 64  ite3HashFind(&(d
4360: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d  b->aDb[j].pSchem
4370: 61 2d 3e 74 72 69 67 48 61 73 68 29 2c 20 7a 4e  a->trigHash), zN
4380: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
4390: 20 69 66 28 20 70 54 72 69 67 67 65 72 20 29 20   if( pTrigger ) 
43a0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
43b0: 20 21 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20   !pTrigger ){.  
43c0: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
43d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
43e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
43f0: 6f 20 73 75 63 68 20 74 72 69 67 67 65 72 3a 20  o such trigger: 
4400: 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
4410: 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 64      }.    goto d
4420: 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 61  rop_trigger_clea
4430: 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nup;.  }.  sqlit
4440: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
4450: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
4460: 72 29 3b 0a 0a 64 72 6f 70 5f 74 72 69 67 67 65  r);..drop_trigge
4470: 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  r_cleanup:.  sql
4480: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
4490: 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
44a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
44b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
44c0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  able structure f
44d0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  or the table tha
44e0: 74 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 69  t a trigger.** i
44f0: 73 20 73 65 74 20 6f 6e 2e 0a 2a 2f 0a 73 74 61  s set on..*/.sta
4500: 74 69 63 20 54 61 62 6c 65 20 2a 74 61 62 6c 65  tic Table *table
4510: 4f 66 54 72 69 67 67 65 72 28 54 72 69 67 67 65  OfTrigger(Trigge
4520: 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20 20  r *pTrigger){.  
4530: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
4540: 74 72 6c 65 6e 33 30 28 70 54 72 69 67 67 65 72  trlen30(pTrigger
4550: 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 72 65 74 75  ->table);.  retu
4560: 72 6e 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  rn sqlite3HashFi
4570: 6e 64 28 26 70 54 72 69 67 67 65 72 2d 3e 70 54  nd(&pTrigger->pT
4580: 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  abSchema->tblHas
4590: 68 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61 62  h, pTrigger->tab
45a0: 6c 65 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  le, n);.}.../*.*
45b0: 2a 20 44 72 6f 70 20 61 20 74 72 69 67 67 65 72  * Drop a trigger
45c0: 20 67 69 76 65 6e 20 61 20 70 6f 69 6e 74 65 72   given a pointer
45d0: 20 74 6f 20 74 68 61 74 20 74 72 69 67 67 65 72   to that trigger
45e0: 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
45f0: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
4600: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4610: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
4620: 72 29 7b 0a 20 20 54 61 62 6c 65 20 20 20 2a 70  r){.  Table   *p
4630: 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76  Table;.  Vdbe *v
4640: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
4650: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
4660: 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 44 62 20  int iDb;..  iDb 
4670: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
4680: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
4690: 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  b, pTrigger->pSc
46a0: 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
46b0: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
46c0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 70 54 61 62  b->nDb );.  pTab
46d0: 6c 65 20 3d 20 74 61 62 6c 65 4f 66 54 72 69 67  le = tableOfTrig
46e0: 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20  ger(pTrigger);. 
46f0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
4700: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
4710: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ble->pSchema==pT
4720: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 20  rigger->pSchema 
4730: 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 23 69 66  || iDb==1 );.#if
4740: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4750: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
4760: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
4770: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  = SQLITE_DROP_TR
4780: 49 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e 73 74  IGGER;.    const
4790: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
47a0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
47b0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
47c0: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
47d0: 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69  ABLE(iDb);.    i
47e0: 66 28 20 69 44 62 3d 3d 31 20 29 20 63 6f 64 65  f( iDb==1 ) code
47f0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
4800: 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20  EMP_TRIGGER;.   
4810: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
4820: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
4830: 64 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e  de, pTrigger->zN
4840: 61 6d 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ame, pTable->zNa
4850: 6d 65 2c 20 7a 44 62 29 20 7c 7c 0a 20 20 20 20  me, zDb) ||.    
4860: 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65    sqlite3AuthChe
4870: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
4880: 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
4890: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
48a0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
48b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
48c0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
48d0: 20 64 65 73 74 72 6f 79 20 74 68 65 20 64 61 74   destroy the dat
48e0: 61 62 61 73 65 20 72 65 63 6f 72 64 20 6f 66 20  abase record of 
48f0: 74 68 65 20 74 72 69 67 67 65 72 2e 0a 20 20 2a  the trigger..  *
4900: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
4910: 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  le!=0 );.  if( (
4920: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
4930: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
4940: 7b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a  {.    int base;.
4950: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
4960: 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70   VdbeOpList drop
4970: 54 72 69 67 67 65 72 5b 5d 20 3d 20 7b 0a 20 20  Trigger[] = {.  
4980: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
4990: 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c       0, ADDR(9),
49a0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
49b0: 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20  _String8,    0, 
49c0: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  1,        0}, /*
49d0: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
49e0: 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20  _Column,     0, 
49f0: 31 2c 20 20 20 20 20 20 20 20 32 7d 2c 0a 20 20  1,        2},.  
4a00: 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20      { OP_Ne,    
4a10: 20 20 20 20 20 32 2c 20 41 44 44 52 28 38 29 2c       2, ADDR(8),
4a20: 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    1},.      { OP
4a30: 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20  _String8,    0, 
4a40: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  1,        0}, /*
4a50: 20 34 3a 20 22 74 72 69 67 67 65 72 22 20 2a 2f   4: "trigger" */
4a60: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
4a70: 6d 6e 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  mn,     0, 0,   
4a80: 20 20 20 20 20 32 7d 2c 0a 20 20 20 20 20 20 7b       2},.      {
4a90: 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20   OP_Ne,         
4aa0: 32 2c 20 41 44 44 52 28 38 29 2c 20 20 31 7d 2c  2, ADDR(8),  1},
4ab0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
4ac0: 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
4ad0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
4ae0: 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
4af0: 30 2c 20 41 44 44 52 28 31 29 2c 20 20 30 7d 2c  0, ADDR(1),  0},
4b00: 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a   /* 8 */.    };.
4b10: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
4b20: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
4b30: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
4b40: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
4b50: 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72  MasterTable(pPar
4b60: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 62 61  se, iDb);.    ba
4b70: 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
4b80: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 20 41 72  AddOpList(v,  Ar
4b90: 72 61 79 53 69 7a 65 28 64 72 6f 70 54 72 69 67  raySize(dropTrig
4ba0: 67 65 72 29 2c 20 64 72 6f 70 54 72 69 67 67 65  ger), dropTrigge
4bb0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
4bc0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 62  dbeChangeP4(v, b
4bd0: 61 73 65 2b 31 2c 20 70 54 72 69 67 67 65 72 2d  ase+1, pTrigger-
4be0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
4bf0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4c00: 65 50 34 28 76 2c 20 62 61 73 65 2b 34 2c 20 22  eP4(v, base+4, "
4c10: 74 72 69 67 67 65 72 22 2c 20 50 34 5f 53 54 41  trigger", P4_STA
4c20: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
4c30: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
4c40: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
4c50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c60: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  2(v, OP_Close, 0
4c70: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4c80: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
4c90: 50 5f 44 72 6f 70 54 72 69 67 67 65 72 2c 20 69  P_DropTrigger, i
4ca0: 44 62 2c 20 30 2c 20 30 2c 20 70 54 72 69 67 67  Db, 0, 0, pTrigg
4cb0: 65 72 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  er->zName, 0);. 
4cc0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
4cd0: 4d 65 6d 3c 33 20 29 7b 0a 20 20 20 20 20 20 70  Mem<3 ){.      p
4ce0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b  Parse->nMem = 3;
4cf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4d00: 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 20 74 72 69  .** Remove a tri
4d10: 67 67 65 72 20 66 72 6f 6d 20 74 68 65 20 68 61  gger from the ha
4d20: 73 68 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  sh tables of the
4d30: 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72   sqlite* pointer
4d40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4d50: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
4d60: 54 72 69 67 67 65 72 28 73 71 6c 69 74 65 33 20  Trigger(sqlite3 
4d70: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
4d80: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
4d90: 7b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 20  {.  Hash *pHash 
4da0: 3d 20 26 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  = &(db->aDb[iDb]
4db0: 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61  .pSchema->trigHa
4dc0: 73 68 29 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  sh);.  Trigger *
4dd0: 70 54 72 69 67 67 65 72 3b 0a 20 20 70 54 72 69  pTrigger;.  pTri
4de0: 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 48 61  gger = sqlite3Ha
4df0: 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20  shInsert(pHash, 
4e00: 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74  zName, sqlite3St
4e10: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30  rlen30(zName), 0
4e20: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
4e30: 70 54 72 69 67 67 65 72 29 20 29 7b 0a 20 20 20  pTrigger) ){.   
4e40: 20 69 66 28 20 70 54 72 69 67 67 65 72 2d 3e 70   if( pTrigger->p
4e50: 53 63 68 65 6d 61 3d 3d 70 54 72 69 67 67 65 72  Schema==pTrigger
4e60: 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 29 7b 0a  ->pTabSchema ){.
4e70: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
4e80: 62 20 3d 20 74 61 62 6c 65 4f 66 54 72 69 67 67  b = tableOfTrigg
4e90: 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20  er(pTrigger);.  
4ea0: 20 20 20 20 54 72 69 67 67 65 72 20 2a 2a 70 70      Trigger **pp
4eb0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26  ;.      for(pp=&
4ec0: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 20  pTab->pTrigger; 
4ed0: 2a 70 70 21 3d 70 54 72 69 67 67 65 72 3b 20 70  *pp!=pTrigger; p
4ee0: 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
4ef0: 29 29 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20  ));.      *pp = 
4f00: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 3b 0a 20 20  (*pp)->pNext;.  
4f10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
4f20: 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62 2c  eleteTrigger(db,
4f30: 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
4f40: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
4f50: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
4f60: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
4f70: 70 45 4c 69 73 74 20 69 73 20 74 68 65 20 53 45  pEList is the SE
4f80: 54 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55  T clause of an U
4f90: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
4fa0: 20 20 45 61 63 68 20 65 6e 74 72 79 0a 2a 2a 20    Each entry.** 
4fb0: 69 6e 20 70 45 4c 69 73 74 20 69 73 20 6f 66 20  in pEList is of 
4fc0: 74 68 65 20 66 6f 72 6d 61 74 20 3c 69 64 3e 3d  the format <id>=
4fd0: 3c 65 78 70 72 3e 2e 20 20 49 66 20 61 6e 79 20  <expr>.  If any 
4fe0: 6f 66 20 74 68 65 20 65 6e 74 72 69 65 73 0a 2a  of the entries.*
4ff0: 2a 20 69 6e 20 70 45 4c 69 73 74 20 68 61 76 65  * in pEList have
5000: 20 61 6e 20 3c 69 64 3e 20 77 68 69 63 68 20 6d   an <id> which m
5010: 61 74 63 68 65 73 20 61 6e 20 69 64 65 6e 74 69  atches an identi
5020: 66 69 65 72 20 69 6e 20 70 49 64 4c 69 73 74 2c  fier in pIdList,
5030: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
5040: 54 52 55 45 2e 20 20 49 66 20 70 49 64 4c 69 73  TRUE.  If pIdLis
5050: 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  t==NULL, then it
5060: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
5070: 0a 2a 2a 20 77 69 6c 64 63 61 72 64 20 74 68 61  .** wildcard tha
5080: 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68 69  t matches anythi
5090: 6e 67 2e 20 20 4c 69 6b 65 77 69 73 65 20 69 66  ng.  Likewise if
50a0: 20 70 45 4c 69 73 74 3d 3d 4e 55 4c 4c 20 74 68   pEList==NULL th
50b0: 65 6e 0a 2a 2a 20 69 74 20 6d 61 74 63 68 65 73  en.** it matches
50c0: 20 61 6e 79 74 68 69 6e 67 20 73 6f 20 61 6c 77   anything so alw
50d0: 61 79 73 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ays return true.
50e0: 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 6f    Return false o
50f0: 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  nly.** if there 
5100: 69 73 20 6e 6f 20 6d 61 74 63 68 2e 0a 2a 2f 0a  is no match..*/.
5110: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
5120: 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70 28 49 64  ColumnOverlap(Id
5130: 4c 69 73 74 20 2a 70 49 64 4c 69 73 74 2c 20 45  List *pIdList, E
5140: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
5150: 7b 0a 20 20 69 6e 74 20 65 3b 0a 20 20 69 66 28  {.  int e;.  if(
5160: 20 70 49 64 4c 69 73 74 3d 3d 30 20 7c 7c 20 4e   pIdList==0 || N
5170: 45 56 45 52 28 70 45 4c 69 73 74 3d 3d 30 29 20  EVER(pEList==0) 
5180: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f  ) return 1;.  fo
5190: 72 28 65 3d 30 3b 20 65 3c 70 45 4c 69 73 74 2d  r(e=0; e<pEList-
51a0: 3e 6e 45 78 70 72 3b 20 65 2b 2b 29 7b 0a 20 20  >nExpr; e++){.  
51b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
51c0: 69 73 74 49 6e 64 65 78 28 70 49 64 4c 69 73 74  istIndex(pIdList
51d0: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 65 5d 2e 7a  , pEList->a[e].z
51e0: 4e 61 6d 65 29 3e 3d 30 20 29 20 72 65 74 75 72  Name)>=0 ) retur
51f0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
5200: 6e 20 30 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n 0; .}../*.** R
5210: 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
5220: 61 6c 6c 20 74 72 69 67 67 65 72 73 20 6f 6e 20  all triggers on 
5230: 74 61 62 6c 65 20 70 54 61 62 20 69 66 20 74 68  table pTab if th
5240: 65 72 65 20 65 78 69 73 74 73 20 61 74 20 6c 65  ere exists at le
5250: 61 73 74 0a 2a 2a 20 6f 6e 65 20 74 72 69 67 67  ast.** one trigg
5260: 65 72 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  er that must be 
5270: 66 69 72 65 64 20 77 68 65 6e 20 61 6e 20 6f 70  fired when an op
5280: 65 72 61 74 69 6f 6e 20 6f 66 20 74 79 70 65 20  eration of type 
5290: 27 6f 70 27 20 69 73 20 0a 2a 2a 20 70 65 72 66  'op' is .** perf
52a0: 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 74 61 62  ormed on the tab
52b0: 6c 65 2c 20 61 6e 64 2c 20 69 66 20 74 68 61 74  le, and, if that
52c0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
52d0: 20 55 50 44 41 54 45 2c 20 69 66 20 61 74 0a 2a   UPDATE, if at.*
52e0: 2a 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  * least one of t
52f0: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 43  he columns in pC
5300: 68 61 6e 67 65 73 20 69 73 20 62 65 69 6e 67 20  hanges is being 
5310: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 54 72 69  modified..*/.Tri
5320: 67 67 65 72 20 2a 73 71 6c 69 74 65 33 54 72 69  gger *sqlite3Tri
5330: 67 67 65 72 73 45 78 69 73 74 28 0a 20 20 50 61  ggersExist(.  Pa
5340: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5350: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
5360: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
5370: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
5380: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
5390: 20 74 68 65 20 63 6f 6e 74 61 69 6e 73 20 74 68   the contains th
53a0: 65 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20  e triggers */.  
53b0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
53c0: 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 65 20 6f          /* one o
53d0: 66 20 54 4b 5f 44 45 4c 45 54 45 2c 20 54 4b 5f  f TK_DELETE, TK_
53e0: 49 4e 53 45 52 54 2c 20 54 4b 5f 55 50 44 41 54  INSERT, TK_UPDAT
53f0: 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  E */.  ExprList 
5400: 2a 70 43 68 61 6e 67 65 73 2c 20 20 20 20 20 2f  *pChanges,     /
5410: 2a 20 43 6f 6c 75 6d 6e 73 20 74 68 61 74 20 63  * Columns that c
5420: 68 61 6e 67 65 20 69 6e 20 61 6e 20 55 50 44 41  hange in an UPDA
5430: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
5440: 20 20 69 6e 74 20 2a 70 4d 61 73 6b 20 20 20 20    int *pMask    
5450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
5460: 3a 20 4d 61 73 6b 20 6f 66 20 54 52 49 47 47 45  : Mask of TRIGGE
5470: 52 5f 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52  R_BEFORE|TRIGGER
5480: 5f 41 46 54 45 52 20 2a 2f 0a 29 7b 0a 20 20 69  _AFTER */.){.  i
5490: 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 54  nt mask = 0;.  T
54a0: 72 69 67 67 65 72 20 2a 70 4c 69 73 74 20 3d 20  rigger *pList = 
54b0: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69  sqlite3TriggerLi
54c0: 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  st(pParse, pTab)
54d0: 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 3b 0a  ;.  Trigger *p;.
54e0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 3d    assert( pList=
54f0: 3d 30 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  =0 || IsVirtual(
5500: 70 54 61 62 29 3d 3d 30 20 29 3b 0a 20 20 66 6f  pTab)==0 );.  fo
5510: 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
5520: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
5530: 66 28 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20  f( p->op==op && 
5540: 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c  checkColumnOverl
5550: 61 70 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20  ap(p->pColumns, 
5560: 70 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20  pChanges) ){.   
5570: 20 20 20 6d 61 73 6b 20 7c 3d 20 70 2d 3e 74 72     mask |= p->tr
5580: 5f 74 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _tm;.    }.  }. 
5590: 20 69 66 28 20 70 4d 61 73 6b 20 29 7b 0a 20 20   if( pMask ){.  
55a0: 20 20 2a 70 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b    *pMask = mask;
55b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 6d  .  }.  return (m
55c0: 61 73 6b 20 3f 20 70 4c 69 73 74 20 3a 20 30 29  ask ? pList : 0)
55d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
55e0: 72 74 20 74 68 65 20 70 53 74 65 70 2d 3e 74 61  rt the pStep->ta
55f0: 72 67 65 74 20 74 6f 6b 65 6e 20 69 6e 74 6f 20  rget token into 
5600: 61 20 53 72 63 4c 69 73 74 20 61 6e 64 20 72 65  a SrcList and re
5610: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
5620: 2a 20 74 6f 20 74 68 61 74 20 53 72 63 4c 69 73  * to that SrcLis
5630: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
5640: 75 74 69 6e 65 20 61 64 64 73 20 61 20 73 70 65  utine adds a spe
5650: 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20 6e  cific database n
5660: 61 6d 65 2c 20 69 66 20 6e 65 65 64 65 64 2c 20  ame, if needed, 
5670: 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 77 68  to the target wh
5680: 65 6e 0a 2a 2a 20 66 6f 72 6d 69 6e 67 20 74 68  en.** forming th
5690: 65 20 53 72 63 4c 69 73 74 2e 20 20 54 68 69 73  e SrcList.  This
56a0: 20 70 72 65 76 65 6e 74 73 20 61 20 74 72 69 67   prevents a trig
56b0: 67 65 72 20 69 6e 20 6f 6e 65 20 64 61 74 61 62  ger in one datab
56c0: 61 73 65 20 66 72 6f 6d 0a 2a 2a 20 72 65 66 65  ase from.** refe
56d0: 72 72 69 6e 67 20 74 6f 20 61 20 74 61 72 67 65  rring to a targe
56e0: 74 20 69 6e 20 61 6e 6f 74 68 65 72 20 64 61 74  t in another dat
56f0: 61 62 61 73 65 2e 20 20 41 6e 20 65 78 63 65 70  abase.  An excep
5700: 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 74 68 65  tion is when the
5710: 0a 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20 69  .** trigger is i
5720: 6e 20 54 45 4d 50 20 69 6e 20 77 68 69 63 68 20  n TEMP in which 
5730: 63 61 73 65 20 69 74 20 63 61 6e 20 72 65 66 65  case it can refe
5740: 72 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 64  r to any other d
5750: 61 74 61 62 61 73 65 20 69 74 0a 2a 2a 20 77 61  atabase it.** wa
5760: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  nts..*/.static S
5770: 72 63 4c 69 73 74 20 2a 74 61 72 67 65 74 53 72  rcList *targetSr
5780: 63 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  cList(.  Parse *
5790: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
57a0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
57b0: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
57c0: 72 53 74 65 70 20 2a 70 53 74 65 70 20 20 20 2f  rStep *pStep   /
57d0: 2a 20 54 68 65 20 74 72 69 67 67 65 72 20 63 6f  * The trigger co
57e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 72  ntaining the tar
57f0: 67 65 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  get token */.){.
5800: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
5810: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
5820: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
5830: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 53 72 63 4c  to use */.  SrcL
5840: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
5850: 20 2f 2a 20 53 72 63 4c 69 73 74 20 74 6f 20 62   /* SrcList to b
5860: 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 0a 20  e returned */.. 
5870: 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
5880: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  rcListAppend(pPa
5890: 72 73 65 2d 3e 64 62 2c 20 30 2c 20 26 70 53 74  rse->db, 0, &pSt
58a0: 65 70 2d 3e 74 61 72 67 65 74 2c 20 30 29 3b 0a  ep->target, 0);.
58b0: 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20    if( pSrc ){.  
58c0: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
58d0: 6e 53 72 63 3e 30 20 29 3b 0a 20 20 20 20 61 73  nSrc>0 );.    as
58e0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 21 3d 30  sert( pSrc->a!=0
58f0: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
5900: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
5910: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
5920: 53 74 65 70 2d 3e 70 54 72 69 67 2d 3e 70 53 63  Step->pTrig->pSc
5930: 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 69  hema);.    if( i
5940: 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 3d 32 20  Db==0 || iDb>=2 
5950: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5960: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5970: 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  b;.      assert(
5980: 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d   iDb<pParse->db-
5990: 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 70 53  >nDb );.      pS
59a0: 72 63 2d 3e 61 5b 70 53 72 63 2d 3e 6e 53 72 63  rc->a[pSrc->nSrc
59b0: 2d 31 5d 2e 7a 44 61 74 61 62 61 73 65 20 3d 20  -1].zDatabase = 
59c0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
59d0: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  db, db->aDb[iDb]
59e0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
59f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63   }.  return pSrc
5a00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
5a10: 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f  ate VDBE code fo
5a20: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73  r the statements
5a30: 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79   inside the body
5a40: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 0a 2a 2a   of a single .**
5a50: 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 73 74 61   trigger..*/.sta
5a60: 74 69 63 20 69 6e 74 20 63 6f 64 65 54 72 69 67  tic int codeTrig
5a70: 67 65 72 50 72 6f 67 72 61 6d 28 0a 20 20 50 61  gerProgram(.  Pa
5a80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5a90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5aa0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5ab0: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
5ac0: 70 53 74 65 70 4c 69 73 74 2c 20 20 20 2f 2a 20  pStepList,   /* 
5ad0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 6d 65 6e  List of statemen
5ae0: 74 73 20 69 6e 73 69 64 65 20 74 68 65 20 74 72  ts inside the tr
5af0: 69 67 67 65 72 20 62 6f 64 79 20 2a 2f 0a 20 20  igger body */.  
5b00: 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20 20 20 20  int orconf      
5b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
5b20: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 2e  flict algorithm.
5b30: 20 28 4f 45 5f 41 62 6f 72 74 2c 20 65 74 63 29   (OE_Abort, etc)
5b40: 20 2a 2f 20 20 0a 29 7b 0a 20 20 54 72 69 67 67   */  .){.  Trigg
5b50: 65 72 53 74 65 70 20 2a 70 53 74 65 70 3b 0a 20  erStep *pStep;. 
5b60: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
5b70: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69  e->pVdbe;.  sqli
5b80: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5b90: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
5ba0: 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65   pParse->pTrigge
5bb0: 72 54 61 62 20 26 26 20 70 50 61 72 73 65 2d 3e  rTab && pParse->
5bc0: 70 54 6f 70 6c 65 76 65 6c 20 29 3b 0a 20 20 61  pToplevel );.  a
5bd0: 73 73 65 72 74 28 20 70 53 74 65 70 4c 69 73 74  ssert( pStepList
5be0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21   );.  assert( v!
5bf0: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 53 74 65  =0 );.  for(pSte
5c00: 70 3d 70 53 74 65 70 4c 69 73 74 3b 20 70 53 74  p=pStepList; pSt
5c10: 65 70 3b 20 70 53 74 65 70 3d 70 53 74 65 70 2d  ep; pStep=pStep-
5c20: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20  >pNext){.    /* 
5c30: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 4f  Figure out the O
5c40: 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63  N CONFLICT polic
5c50: 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
5c60: 73 65 64 20 66 6f 72 20 74 68 69 73 20 73 74 65  sed for this ste
5c70: 70 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  p.    ** of the 
5c80: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e  trigger program.
5c90: 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
5ca0: 74 20 74 68 61 74 20 63 61 75 73 65 64 20 74 68  t that caused th
5cb0: 69 73 20 74 72 69 67 67 65 72 0a 20 20 20 20 2a  is trigger.    *
5cc0: 2a 20 74 6f 20 66 69 72 65 20 68 61 64 20 61 6e  * to fire had an
5cd0: 20 65 78 70 6c 69 63 69 74 20 4f 4e 20 43 4f 4e   explicit ON CON
5ce0: 46 4c 49 43 54 2c 20 74 68 65 6e 20 75 73 65 20  FLICT, then use 
5cf0: 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  it. Otherwise, u
5d00: 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 4e  se.    ** the ON
5d10: 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79   CONFLICT policy
5d20: 20 74 68 61 74 20 77 61 73 20 73 70 65 63 69 66   that was specif
5d30: 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  ied as part of t
5d40: 68 65 20 74 72 69 67 67 65 72 0a 20 20 20 20 2a  he trigger.    *
5d50: 2a 20 73 74 65 70 20 73 74 61 74 65 6d 65 6e 74  * step statement
5d60: 2e 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  . Example:.    *
5d70: 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
5d80: 45 20 54 52 49 47 47 45 52 20 41 46 54 45 52 20  E TRIGGER AFTER 
5d90: 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47  INSERT ON t1 BEG
5da0: 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 49  IN;.    **     I
5db0: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
5dc0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
5dd0: 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20  new.a, new.b);. 
5de0: 20 20 20 2a 2a 20 20 20 45 4e 44 3b 0a 20 20 20     **   END;.   
5df0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 49 4e 53   **.    **   INS
5e00: 45 52 54 20 49 4e 54 4f 20 74 31 20 2e 2e 2e 20  ERT INTO t1 ... 
5e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20  ;            -- 
5e20: 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 32 20 75  insert into t2 u
5e30: 73 65 73 20 52 45 50 4c 41 43 45 20 70 6f 6c 69  ses REPLACE poli
5e40: 63 79 0a 20 20 20 20 2a 2a 20 20 20 49 4e 53 45  cy.    **   INSE
5e50: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
5e60: 4f 20 74 31 20 2e 2e 2e 20 3b 20 20 2d 2d 20 69  O t1 ... ;  -- i
5e70: 6e 73 65 72 74 20 69 6e 74 6f 20 74 32 20 75 73  nsert into t2 us
5e80: 65 73 20 49 47 4e 4f 52 45 20 70 6f 6c 69 63 79  es IGNORE policy
5e90: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
5ea0: 73 65 2d 3e 65 4f 72 63 6f 6e 66 20 3d 20 28 6f  se->eOrconf = (o
5eb0: 72 63 6f 6e 66 3d 3d 4f 45 5f 44 65 66 61 75 6c  rconf==OE_Defaul
5ec0: 74 29 3f 70 53 74 65 70 2d 3e 6f 72 63 6f 6e 66  t)?pStep->orconf
5ed0: 3a 28 75 38 29 6f 72 63 6f 6e 66 3b 0a 0a 20 20  :(u8)orconf;..  
5ee0: 20 20 73 77 69 74 63 68 28 20 70 53 74 65 70 2d    switch( pStep-
5ef0: 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 63 61 73  >op ){.      cas
5f00: 65 20 54 4b 5f 55 50 44 41 54 45 3a 20 7b 0a 20  e TK_UPDATE: {. 
5f10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 55 70         sqlite3Up
5f20: 64 61 74 65 28 70 50 61 72 73 65 2c 20 0a 20 20  date(pParse, .  
5f30: 20 20 20 20 20 20 20 20 74 61 72 67 65 74 53 72          targetSr
5f40: 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  cList(pParse, pS
5f50: 74 65 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20  tep),.          
5f60: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
5f70: 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 45  up(db, pStep->pE
5f80: 78 70 72 4c 69 73 74 2c 20 30 29 2c 20 0a 20 20  xprList, 0), .  
5f90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5fa0: 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 65 70  xprDup(db, pStep
5fb0: 2d 3e 70 57 68 65 72 65 2c 20 30 29 2c 20 0a 20  ->pWhere, 0), . 
5fc0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
5fd0: 3e 65 4f 72 63 6f 6e 66 0a 20 20 20 20 20 20 20  >eOrconf.       
5fe0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
5ff0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
6000: 20 63 61 73 65 20 54 4b 5f 49 4e 53 45 52 54 3a   case TK_INSERT:
6010: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
6020: 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c  e3Insert(pParse,
6030: 20 0a 20 20 20 20 20 20 20 20 20 20 74 61 72 67   .          targ
6040: 65 74 53 72 63 4c 69 73 74 28 70 50 61 72 73 65  etSrcList(pParse
6050: 2c 20 70 53 74 65 70 29 2c 0a 20 20 20 20 20 20  , pStep),.      
6060: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
6070: 69 73 74 44 75 70 28 64 62 2c 20 70 53 74 65 70  istDup(db, pStep
6080: 2d 3e 70 45 78 70 72 4c 69 73 74 2c 20 30 29 2c  ->pExprList, 0),
6090: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
60a0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
60b0: 20 70 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 2c   pStep->pSelect,
60c0: 20 30 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20   0), .          
60d0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
60e0: 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 49 64 4c  (db, pStep->pIdL
60f0: 69 73 74 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ist), .         
6100: 20 70 50 61 72 73 65 2d 3e 65 4f 72 63 6f 6e 66   pParse->eOrconf
6110: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
6120: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6130: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b   }.      case TK
6140: 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20 20  _DELETE: {.     
6150: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
6160: 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 0a 20 20  From(pParse, .  
6170: 20 20 20 20 20 20 20 20 74 61 72 67 65 74 53 72          targetSr
6180: 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  cList(pParse, pS
6190: 74 65 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20  tep),.          
61a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
61b0: 62 2c 20 70 53 74 65 70 2d 3e 70 57 68 65 72 65  b, pStep->pWhere
61c0: 2c 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  , 0).        );.
61d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
61e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
61f0: 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 53  ault: assert( pS
6200: 74 65 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  tep->op==TK_SELE
6210: 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 20 20  CT ); {.        
6220: 53 65 6c 65 63 74 44 65 73 74 20 73 44 65 73 74  SelectDest sDest
6230: 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  ;.        Select
6240: 20 2a 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69   *pSelect = sqli
6250: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
6260: 20 70 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 2c   pStep->pSelect,
6270: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
6280: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
6290: 69 74 28 26 73 44 65 73 74 2c 20 53 52 54 5f 44  it(&sDest, SRT_D
62a0: 69 73 63 61 72 64 2c 20 30 29 3b 0a 20 20 20 20  iscard, 0);.    
62b0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
62c0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
62d0: 74 2c 20 26 73 44 65 73 74 29 3b 0a 20 20 20 20  t, &sDest);.    
62e0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
62f0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
6300: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ect);.        br
6310: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
6320: 20 7d 20 0a 20 20 20 20 69 66 28 20 70 53 74 65   } .    if( pSte
6330: 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54  p->op!=TK_SELECT
6340: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6350: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
6360: 50 5f 52 65 73 65 74 43 6f 75 6e 74 29 3b 0a 20  P_ResetCount);. 
6370: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
6380: 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn 0;.}..#ifdef 
6390: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
63a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
63b0: 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
63c0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 29 20 61 6e  VdbeComment() an
63d0: 6e 6f 74 61 74 69 6f 6e 73 20 74 6f 20 61 20 56  notations to a V
63e0: 44 42 45 0a 2a 2a 20 70 72 6f 67 72 61 6d 2e 20  DBE.** program. 
63f0: 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  It is not used i
6400: 6e 20 70 72 6f 64 75 63 74 69 6f 6e 20 63 6f 64  n production cod
6410: 65 2c 20 6f 6e 6c 79 20 66 6f 72 20 64 65 62 75  e, only for debu
6420: 67 67 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  gging..*/.static
6430: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 6e 45   const char *onE
6440: 72 72 6f 72 54 65 78 74 28 69 6e 74 20 6f 6e 45  rrorText(int onE
6450: 72 72 6f 72 29 7b 0a 20 20 73 77 69 74 63 68 28  rror){.  switch(
6460: 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20   onError ){.    
6470: 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20  case OE_Abort:  
6480: 20 20 72 65 74 75 72 6e 20 22 61 62 6f 72 74 22    return "abort"
6490: 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f  ;.    case OE_Ro
64a0: 6c 6c 62 61 63 6b 3a 20 72 65 74 75 72 6e 20 22  llback: return "
64b0: 72 6f 6c 6c 62 61 63 6b 22 3b 0a 20 20 20 20 63  rollback";.    c
64c0: 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20  ase OE_Fail:    
64d0: 20 72 65 74 75 72 6e 20 22 66 61 69 6c 22 3b 0a   return "fail";.
64e0: 20 20 20 20 63 61 73 65 20 4f 45 5f 52 65 70 6c      case OE_Repl
64f0: 61 63 65 3a 20 20 72 65 74 75 72 6e 20 22 72 65  ace:  return "re
6500: 70 6c 61 63 65 22 3b 0a 20 20 20 20 63 61 73 65  place";.    case
6510: 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 72 65   OE_Ignore:   re
6520: 74 75 72 6e 20 22 69 67 6e 6f 72 65 22 3b 0a 20  turn "ignore";. 
6530: 20 20 20 63 61 73 65 20 4f 45 5f 44 65 66 61 75     case OE_Defau
6540: 6c 74 3a 20 20 72 65 74 75 72 6e 20 22 64 65 66  lt:  return "def
6550: 61 75 6c 74 22 3b 0a 20 20 7d 0a 20 20 72 65 74  ault";.  }.  ret
6560: 75 72 6e 20 22 6e 2f 61 22 3b 0a 7d 0a 23 65 6e  urn "n/a";.}.#en
6570: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  dif../*.** Parse
6580: 20 63 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75   context structu
6590: 72 65 20 70 46 72 6f 6d 20 68 61 73 20 6a 75 73  re pFrom has jus
65a0: 74 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20 63  t been used to c
65b0: 72 65 61 74 65 20 61 20 73 75 62 2d 76 64 62 65  reate a sub-vdbe
65c0: 0a 2a 2a 20 28 74 72 69 67 67 65 72 20 70 72 6f  .** (trigger pro
65d0: 67 72 61 6d 29 2e 20 49 66 20 61 6e 20 65 72 72  gram). If an err
65e0: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
65f0: 20 74 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20   transfer error 
6600: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
6610: 72 6f 6d 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f  rom pFrom to pTo
6620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6630: 20 74 72 61 6e 73 66 65 72 50 61 72 73 65 45 72   transferParseEr
6640: 72 6f 72 28 50 61 72 73 65 20 2a 70 54 6f 2c 20  ror(Parse *pTo, 
6650: 50 61 72 73 65 20 2a 70 46 72 6f 6d 29 7b 0a 20  Parse *pFrom){. 
6660: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
6670: 7a 45 72 72 4d 73 67 3d 3d 30 20 7c 7c 20 70 46  zErrMsg==0 || pF
6680: 72 6f 6d 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 61  rom->nErr );.  a
6690: 73 73 65 72 74 28 20 70 54 6f 2d 3e 7a 45 72 72  ssert( pTo->zErr
66a0: 4d 73 67 3d 3d 30 20 7c 7c 20 70 54 6f 2d 3e 6e  Msg==0 || pTo->n
66b0: 45 72 72 20 29 3b 0a 20 20 69 66 28 20 70 54 6f  Err );.  if( pTo
66c0: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
66d0: 20 70 54 6f 2d 3e 7a 45 72 72 4d 73 67 20 3d 20   pTo->zErrMsg = 
66e0: 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73 67 3b 0a  pFrom->zErrMsg;.
66f0: 20 20 20 20 70 54 6f 2d 3e 6e 45 72 72 20 3d 20      pTo->nErr = 
6700: 70 46 72 6f 6d 2d 3e 6e 45 72 72 3b 0a 20 20 7d  pFrom->nErr;.  }
6710: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
6720: 33 44 62 46 72 65 65 28 70 46 72 6f 6d 2d 3e 64  3DbFree(pFrom->d
6730: 62 2c 20 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73  b, pFrom->zErrMs
6740: 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  g);.  }.}../*.**
6750: 20 43 72 65 61 74 65 20 61 6e 64 20 70 6f 70 75   Create and popu
6760: 6c 61 74 65 20 61 20 6e 65 77 20 54 72 69 67 67  late a new Trigg
6770: 65 72 50 72 67 20 6f 62 6a 65 63 74 20 77 69 74  erPrg object wit
6780: 68 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  h a sub-program 
6790: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  .** implementing
67a0: 20 74 72 69 67 67 65 72 20 70 54 72 69 67 67 65   trigger pTrigge
67b0: 72 20 77 69 74 68 20 4f 4e 20 43 4f 4e 46 4c 49  r with ON CONFLI
67c0: 43 54 20 70 6f 6c 69 63 79 20 6f 72 63 6f 6e 66  CT policy orconf
67d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 67  ..*/.static Trig
67e0: 67 65 72 50 72 67 20 2a 63 6f 64 65 52 6f 77 54  gerPrg *codeRowT
67f0: 72 69 67 67 65 72 28 0a 20 20 50 61 72 73 65 20  rigger(.  Parse 
6800: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
6810: 2a 20 43 75 72 72 65 6e 74 20 70 61 72 73 65 20  * Current parse 
6820: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69  context */.  Tri
6830: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c 20  gger *pTrigger, 
6840: 20 20 2f 2a 20 54 72 69 67 67 65 72 20 74 6f 20    /* Trigger to 
6850: 63 6f 64 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  code */.  Table 
6860: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  *pTab,         /
6870: 2a 20 54 68 65 20 74 61 62 6c 65 20 70 54 72 69  * The table pTri
6880: 67 67 65 72 20 69 73 20 61 74 74 61 63 68 65 64  gger is attached
6890: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63   to */.  int orc
68a0: 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a  onf           /*
68b0: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c   ON CONFLICT pol
68c0: 69 63 79 20 74 6f 20 63 6f 64 65 20 74 72 69 67  icy to code trig
68d0: 67 65 72 20 70 72 6f 67 72 61 6d 20 77 69 74 68  ger program with
68e0: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
68f0: 70 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 50 61  pTop = sqlite3Pa
6900: 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
6910: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se);.  sqlite3 *
6920: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6930: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
6940: 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 72 69 67 67  andle */.  Trigg
6950: 65 72 50 72 67 20 2a 70 50 72 67 3b 20 20 20 20  erPrg *pPrg;    
6960: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
6970: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 45  to return */.  E
6980: 78 70 72 20 2a 70 57 68 65 6e 20 3d 20 30 3b 20  xpr *pWhen = 0; 
6990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75             /* Du
69a0: 70 6c 69 63 61 74 65 20 6f 66 20 74 72 69 67 67  plicate of trigg
69b0: 65 72 20 57 48 45 4e 20 65 78 70 72 65 73 73 69  er WHEN expressi
69c0: 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  on */.  Vdbe *v;
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69e0: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
69f0: 20 56 4d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e   VM */.  NameCon
6a00: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
6a10: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
6a20: 74 65 78 74 20 66 6f 72 20 73 75 62 2d 76 64 62  text for sub-vdb
6a30: 65 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  e */.  SubProgra
6a40: 6d 20 2a 70 50 72 6f 67 72 61 6d 20 3d 20 30 3b  m *pProgram = 0;
6a50: 20 20 20 2f 2a 20 53 75 62 2d 76 64 62 65 20 66     /* Sub-vdbe f
6a60: 6f 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  or trigger progr
6a70: 61 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  am */.  Parse *p
6a80: 53 75 62 50 61 72 73 65 3b 20 20 20 20 20 20 20  SubParse;       
6a90: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
6aa0: 74 65 78 74 20 66 6f 72 20 73 75 62 2d 76 64 62  text for sub-vdb
6ab0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 54  e */.  int iEndT
6ac0: 72 69 67 67 65 72 20 3d 20 30 3b 20 20 20 20 20  rigger = 0;     
6ad0: 20 20 20 2f 2a 20 4c 61 62 65 6c 20 74 6f 20 6a     /* Label to j
6ae0: 75 6d 70 20 74 6f 20 69 66 20 57 48 45 4e 20 69  ump to if WHEN i
6af0: 73 20 66 61 6c 73 65 20 2a 2f 0a 0a 20 20 61 73  s false */..  as
6b00: 73 65 72 74 28 20 70 54 61 62 3d 3d 74 61 62 6c  sert( pTab==tabl
6b10: 65 4f 66 54 72 69 67 67 65 72 28 70 54 72 69 67  eOfTrigger(pTrig
6b20: 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  ger) );..  /* Al
6b30: 6c 6f 63 61 74 65 20 74 68 65 20 54 72 69 67 67  locate the Trigg
6b40: 65 72 50 72 67 20 61 6e 64 20 53 75 62 50 72 6f  erPrg and SubPro
6b50: 67 72 61 6d 20 6f 62 6a 65 63 74 73 2e 20 54 6f  gram objects. To
6b60: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
6b70: 79 0a 20 20 2a 2a 20 61 72 65 20 66 72 65 65 64  y.  ** are freed
6b80: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
6b90: 75 72 73 2c 20 6c 69 6e 6b 20 74 68 65 6d 20 69  urs, link them i
6ba0: 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70 54  nto the Parse.pT
6bb0: 72 69 67 67 65 72 50 72 67 20 0a 20 20 2a 2a 20  riggerPrg .  ** 
6bc0: 6c 69 73 74 20 6f 66 20 74 68 65 20 74 6f 70 2d  list of the top-
6bd0: 6c 65 76 65 6c 20 50 61 72 73 65 20 6f 62 6a 65  level Parse obje
6be0: 63 74 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  ct sooner rather
6bf0: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 20 2a 2f   than later.  */
6c00: 0a 20 20 70 50 72 67 20 3d 20 73 71 6c 69 74 65  .  pPrg = sqlite
6c10: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
6c20: 2c 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72  , sizeof(Trigger
6c30: 50 72 67 29 29 3b 0a 20 20 69 66 28 20 21 70 50  Prg));.  if( !pP
6c40: 72 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rg ) return 0;. 
6c50: 20 70 50 72 67 2d 3e 70 4e 65 78 74 20 3d 20 70   pPrg->pNext = p
6c60: 54 6f 70 2d 3e 70 54 72 69 67 67 65 72 50 72 67  Top->pTriggerPrg
6c70: 3b 0a 20 20 70 54 6f 70 2d 3e 70 54 72 69 67 67  ;.  pTop->pTrigg
6c80: 65 72 50 72 67 20 3d 20 70 50 72 67 3b 0a 20 20  erPrg = pPrg;.  
6c90: 70 50 72 67 2d 3e 70 50 72 6f 67 72 61 6d 20 3d  pPrg->pProgram =
6ca0: 20 70 50 72 6f 67 72 61 6d 20 3d 20 73 71 6c 69   pProgram = sqli
6cb0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
6cc0: 64 62 2c 20 73 69 7a 65 6f 66 28 53 75 62 50 72  db, sizeof(SubPr
6cd0: 6f 67 72 61 6d 29 29 3b 0a 20 20 69 66 28 20 21  ogram));.  if( !
6ce0: 70 50 72 6f 67 72 61 6d 20 29 20 72 65 74 75 72  pProgram ) retur
6cf0: 6e 20 30 3b 0a 20 20 70 50 72 6f 67 72 61 6d 2d  n 0;.  pProgram-
6d00: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 50 72  >nRef = 1;.  pPr
6d10: 67 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70 54  g->pTrigger = pT
6d20: 72 69 67 67 65 72 3b 0a 20 20 70 50 72 67 2d 3e  rigger;.  pPrg->
6d30: 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b  orconf = orconf;
6d40: 0a 20 20 70 50 72 67 2d 3e 6f 6c 64 6d 61 73 6b  .  pPrg->oldmask
6d50: 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 0a   = 0xffffffff;..
6d60: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
6d70: 64 20 70 6f 70 75 6c 61 74 65 20 61 20 6e 65 77  d populate a new
6d80: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 74   Parse context t
6d90: 6f 20 75 73 65 20 66 6f 72 20 63 6f 64 69 6e 67  o use for coding
6da0: 20 74 68 65 20 0a 20 20 2a 2a 20 74 72 69 67 67   the .  ** trigg
6db0: 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20  er sub-program. 
6dc0: 20 2a 2f 0a 20 20 70 53 75 62 50 61 72 73 65 20   */.  pSubParse 
6dd0: 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
6de0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
6df0: 6f 66 28 50 61 72 73 65 29 29 3b 0a 20 20 69 66  of(Parse));.  if
6e00: 28 20 21 70 53 75 62 50 61 72 73 65 20 29 20 72  ( !pSubParse ) r
6e10: 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73 65  eturn 0;.  memse
6e20: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
6e30: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
6e40: 50 61 72 73 65 20 3d 20 70 53 75 62 50 61 72 73  Parse = pSubPars
6e50: 65 3b 0a 20 20 70 53 75 62 50 61 72 73 65 2d 3e  e;.  pSubParse->
6e60: 64 62 20 3d 20 64 62 3b 0a 20 20 70 53 75 62 50  db = db;.  pSubP
6e70: 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
6e80: 62 20 3d 20 70 54 61 62 3b 0a 20 20 70 53 75 62  b = pTab;.  pSub
6e90: 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c  Parse->pToplevel
6ea0: 20 3d 20 70 54 6f 70 3b 0a 20 20 70 53 75 62 50   = pTop;.  pSubP
6eb0: 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
6ec0: 78 74 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 7a  xt = pTrigger->z
6ed0: 4e 61 6d 65 3b 0a 20 20 70 53 75 62 50 61 72 73  Name;.  pSubPars
6ee0: 65 2d 3e 65 54 72 69 67 67 65 72 4f 70 20 3d 20  e->eTriggerOp = 
6ef0: 70 54 72 69 67 67 65 72 2d 3e 6f 70 3b 0a 0a 20  pTrigger->op;.. 
6f00: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
6f10: 64 62 65 28 70 53 75 62 50 61 72 73 65 29 3b 0a  dbe(pSubParse);.
6f20: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 56    if( v ){.    V
6f30: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
6f40: 53 74 61 72 74 3a 20 25 73 2e 25 73 20 28 25 73  Start: %s.%s (%s
6f50: 20 25 73 25 73 25 73 20 4f 4e 20 25 73 29 22 2c   %s%s%s ON %s)",
6f60: 20 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72   .      pTrigger
6f70: 2d 3e 7a 4e 61 6d 65 2c 20 6f 6e 45 72 72 6f 72  ->zName, onError
6f80: 54 65 78 74 28 6f 72 63 6f 6e 66 29 2c 0a 20 20  Text(orconf),.  
6f90: 20 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e 74      (pTrigger->t
6fa0: 72 5f 74 6d 3d 3d 54 52 49 47 47 45 52 5f 42 45  r_tm==TRIGGER_BE
6fb0: 46 4f 52 45 20 3f 20 22 42 45 46 4f 52 45 22 20  FORE ? "BEFORE" 
6fc0: 3a 20 22 41 46 54 45 52 22 29 2c 0a 20 20 20 20  : "AFTER"),.    
6fd0: 20 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e 6f      (pTrigger->o
6fe0: 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 3f 20 22  p==TK_UPDATE ? "
6ff0: 55 50 44 41 54 45 22 20 3a 20 22 22 29 2c 0a 20  UPDATE" : ""),. 
7000: 20 20 20 20 20 20 20 28 70 54 72 69 67 67 65 72         (pTrigger
7010: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54 20  ->op==TK_INSERT 
7020: 3f 20 22 49 4e 53 45 52 54 22 20 3a 20 22 22 29  ? "INSERT" : "")
7030: 2c 0a 20 20 20 20 20 20 20 20 28 70 54 72 69 67  ,.        (pTrig
7040: 67 65 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 45 4c 45  ger->op==TK_DELE
7050: 54 45 20 3f 20 22 44 45 4c 45 54 45 22 20 3a 20  TE ? "DELETE" : 
7060: 22 22 29 2c 0a 20 20 20 20 20 20 70 54 61 62 2d  ""),.      pTab-
7070: 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 23  >zName.    ));.#
7080: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7090: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 73 71 6c  IT_TRACE.    sql
70a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
70b0: 28 76 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 73  (v, -1, .      s
70c0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
70d0: 2c 20 22 2d 2d 20 54 52 49 47 47 45 52 20 25 73  , "-- TRIGGER %s
70e0: 22 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61  ", pTrigger->zNa
70f0: 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a  me), P4_DYNAMIC.
7100: 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20      );.#endif.. 
7110: 20 20 20 2f 2a 20 49 66 20 6f 6e 65 20 77 61 73     /* If one was
7120: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 64 65   specified, code
7130: 20 74 68 65 20 57 48 45 4e 20 63 6c 61 75 73 65   the WHEN clause
7140: 2e 20 49 66 20 69 74 20 65 76 61 6c 75 61 74 65  . If it evaluate
7150: 73 20 74 6f 20 66 61 6c 73 65 0a 20 20 20 20 2a  s to false.    *
7160: 2a 20 28 6f 72 20 4e 55 4c 4c 29 20 74 68 65 20  * (or NULL) the 
7170: 73 75 62 2d 76 64 62 65 20 69 73 20 69 6d 6d 65  sub-vdbe is imme
7180: 64 69 61 74 65 6c 79 20 68 61 6c 74 65 64 20 62  diately halted b
7190: 79 20 6a 75 6d 70 69 6e 67 20 74 6f 20 74 68 65  y jumping to the
71a0: 20 0a 20 20 20 20 2a 2a 20 4f 50 5f 48 61 6c 74   .    ** OP_Halt
71b0: 20 69 6e 73 65 72 74 65 64 20 61 74 20 74 68 65   inserted at the
71c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67   end of the prog
71d0: 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ram.  */.    if(
71e0: 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e   pTrigger->pWhen
71f0: 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 6e 20   ){.      pWhen 
7200: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7210: 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70  (db, pTrigger->p
7220: 57 68 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  When, 0);.      
7230: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73  if( SQLITE_OK==s
7240: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
7250: 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 57 68  rNames(&sNC, pWh
7260: 65 6e 29 20 0a 20 20 20 20 20 20 20 26 26 20 64  en) .       && d
7270: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
7280: 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =0 .      ){.   
7290: 20 20 20 20 20 69 45 6e 64 54 72 69 67 67 65 72       iEndTrigger
72a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
72b0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
72c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
72d0: 66 46 61 6c 73 65 28 70 53 75 62 50 61 72 73 65  fFalse(pSubParse
72e0: 2c 20 70 57 68 65 6e 2c 20 69 45 6e 64 54 72 69  , pWhen, iEndTri
72f0: 67 67 65 72 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  gger, SQLITE_JUM
7300: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
7310: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
7320: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57  xprDelete(db, pW
7330: 68 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  hen);.    }..   
7340: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 74 72 69   /* Code the tri
7350: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 69 6e 74  gger program int
7360: 6f 20 74 68 65 20 73 75 62 2d 76 64 62 65 2e 20  o the sub-vdbe. 
7370: 2a 2f 0a 20 20 20 20 63 6f 64 65 54 72 69 67 67  */.    codeTrigg
7380: 65 72 50 72 6f 67 72 61 6d 28 70 53 75 62 50 61  erProgram(pSubPa
7390: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 73  rse, pTrigger->s
73a0: 74 65 70 5f 6c 69 73 74 2c 20 6f 72 63 6f 6e 66  tep_list, orconf
73b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
73c0: 74 20 61 6e 20 4f 50 5f 48 61 6c 74 20 61 74 20  t an OP_Halt at 
73d0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
73e0: 75 62 2d 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20  ub-program. */. 
73f0: 20 20 20 69 66 28 20 69 45 6e 64 54 72 69 67 67     if( iEndTrigg
7400: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
7410: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
7420: 62 65 6c 28 76 2c 20 69 45 6e 64 54 72 69 67 67  bel(v, iEndTrigg
7430: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
7440: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
7450: 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 20 20  (v, OP_Halt);.  
7460: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
7470: 2c 20 22 45 6e 64 3a 20 25 73 2e 25 73 22 2c 20  , "End: %s.%s", 
7480: 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 2c  pTrigger->zName,
7490: 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f 72 63   onErrorText(orc
74a0: 6f 6e 66 29 29 29 3b 0a 0a 20 20 20 20 74 72 61  onf)));..    tra
74b0: 6e 73 66 65 72 50 61 72 73 65 45 72 72 6f 72 28  nsferParseError(
74c0: 70 50 61 72 73 65 2c 20 70 53 75 62 50 61 72 73  pParse, pSubPars
74d0: 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  e);.    if( db->
74e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
74f0: 29 7b 0a 20 20 20 20 20 20 70 50 72 6f 67 72 61  ){.      pProgra
7500: 6d 2d 3e 61 4f 70 20 3d 20 73 71 6c 69 74 65 33  m->aOp = sqlite3
7510: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
7520: 76 2c 20 26 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f  v, &pProgram->nO
7530: 70 2c 20 26 70 54 6f 70 2d 3e 6e 4d 61 78 41 72  p, &pTop->nMaxAr
7540: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  g);.    }.    pP
7550: 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 3d 20 70  rogram->nMem = p
7560: 53 75 62 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  SubParse->nMem;.
7570: 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43      pProgram->nC
7580: 73 72 20 3d 20 70 53 75 62 50 61 72 73 65 2d 3e  sr = pSubParse->
7590: 6e 54 61 62 3b 0a 20 20 20 20 70 50 72 6f 67 72  nTab;.    pProgr
75a0: 61 6d 2d 3e 74 6f 6b 65 6e 20 3d 20 28 76 6f 69  am->token = (voi
75b0: 64 20 2a 29 70 54 72 69 67 67 65 72 3b 0a 20 20  d *)pTrigger;.  
75c0: 20 20 70 50 72 67 2d 3e 6f 6c 64 6d 61 73 6b 20    pPrg->oldmask 
75d0: 3d 20 70 53 75 62 50 61 72 73 65 2d 3e 6f 6c 64  = pSubParse->old
75e0: 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  mask;.    sqlite
75f0: 33 56 64 62 65 44 65 6c 65 74 65 28 76 29 3b 0a  3VdbeDelete(v);.
7600: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21    }..  assert( !
7610: 70 53 75 62 50 61 72 73 65 2d 3e 70 41 69 6e 63  pSubParse->pAinc
7620: 20 20 20 20 20 20 20 26 26 20 21 70 53 75 62 50         && !pSubP
7630: 61 72 73 65 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  arse->pZombieTab
7640: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
7650: 53 75 62 50 61 72 73 65 2d 3e 70 54 72 69 67 67  SubParse->pTrigg
7660: 65 72 50 72 67 20 26 26 20 21 70 53 75 62 50 61  erPrg && !pSubPa
7670: 72 73 65 2d 3e 6e 4d 61 78 41 72 67 20 29 3b 0a  rse->nMaxArg );.
7680: 20 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72    sqlite3StackFr
7690: 65 65 28 64 62 2c 20 70 53 75 62 50 61 72 73 65  ee(db, pSubParse
76a0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 72  );..  return pPr
76b0: 67 3b 0a 7d 0a 20 20 20 20 0a 2f 2a 0a 2a 2a 20  g;.}.    ./*.** 
76c0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
76d0: 20 74 6f 20 61 20 54 72 69 67 67 65 72 50 72 67   to a TriggerPrg
76e0: 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69   object containi
76f0: 6e 67 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  ng the sub-progr
7700: 61 6d 20 66 6f 72 0a 2a 2a 20 74 72 69 67 67 65  am for.** trigge
7710: 72 20 70 54 72 69 67 67 65 72 20 77 69 74 68 20  r pTrigger with 
7720: 64 65 66 61 75 6c 74 20 4f 4e 20 43 4f 4e 46 4c  default ON CONFL
7730: 49 43 54 20 61 6c 67 6f 72 69 74 68 6d 20 6f 72  ICT algorithm or
7740: 63 6f 6e 66 2e 20 49 66 20 6e 6f 20 73 75 63 68  conf. If no such
7750: 0a 2a 2a 20 54 72 69 67 67 65 72 50 72 67 20 6f  .** TriggerPrg o
7760: 62 6a 65 63 74 20 65 78 69 73 74 73 2c 20 61 20  bject exists, a 
7770: 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  new object is al
7780: 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
7790: 6c 61 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  lated before.** 
77a0: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a  being returned..
77b0: 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 67 67 65  */.static Trigge
77c0: 72 50 72 67 20 2a 67 65 74 52 6f 77 54 72 69 67  rPrg *getRowTrig
77d0: 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ger(.  Parse *pP
77e0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 43  arse,       /* C
77f0: 75 72 72 65 6e 74 20 70 61 72 73 65 20 63 6f 6e  urrent parse con
7800: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
7810: 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20 20 2f  r *pTrigger,   /
7820: 2a 20 54 72 69 67 67 65 72 20 74 6f 20 63 6f 64  * Trigger to cod
7830: 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
7840: 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab,         /* T
7850: 68 65 20 74 61 62 6c 65 20 74 72 69 67 67 65 72  he table trigger
7860: 20 70 54 72 69 67 67 65 72 20 69 73 20 61 74 74   pTrigger is att
7870: 61 63 68 65 64 20 74 6f 20 2a 2f 0a 20 20 69 6e  ached to */.  in
7880: 74 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20  t orconf        
7890: 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     /* ON CONFLIC
78a0: 54 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a  T algorithm. */.
78b0: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 52 6f 6f  ){.  Parse *pRoo
78c0: 74 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  t = sqlite3Parse
78d0: 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
78e0: 3b 0a 20 20 54 72 69 67 67 65 72 50 72 67 20 2a  ;.  TriggerPrg *
78f0: 70 50 72 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  pPrg;..  assert(
7900: 20 70 54 61 62 3d 3d 74 61 62 6c 65 4f 66 54 72   pTab==tableOfTr
7910: 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29 20  igger(pTrigger) 
7920: 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 6d 61 79 20  );..  /* It may 
7930: 62 65 20 74 68 61 74 20 74 68 69 73 20 74 72 69  be that this tri
7940: 67 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  gger has already
7950: 20 62 65 65 6e 20 63 6f 64 65 64 20 28 6f 72 20   been coded (or 
7960: 69 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70  is in the.  ** p
7970: 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
7980: 63 6f 64 65 64 29 2e 20 49 66 20 74 68 69 73 20  coded). If this 
7990: 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
79a0: 6e 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 0a  n an entry with.
79b0: 20 20 2a 2a 20 61 20 6d 61 74 63 68 69 6e 67 20    ** a matching 
79c0: 54 72 69 67 67 65 72 50 72 67 2e 70 54 72 69 67  TriggerPrg.pTrig
79d0: 67 65 72 20 66 69 65 6c 64 20 77 69 6c 6c 20 62  ger field will b
79e0: 65 20 70 72 65 73 65 6e 74 20 73 6f 6d 65 77 68  e present somewh
79f0: 65 72 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ere.  ** in the 
7a00: 50 61 72 73 65 2e 70 54 72 69 67 67 65 72 50 72  Parse.pTriggerPr
7a10: 67 20 6c 69 73 74 2e 20 53 65 61 72 63 68 20 66  g list. Search f
7a20: 6f 72 20 73 75 63 68 20 61 6e 20 65 6e 74 72 79  or such an entry
7a30: 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 72 67  .  */.  for(pPrg
7a40: 3d 70 52 6f 6f 74 2d 3e 70 54 72 69 67 67 65 72  =pRoot->pTrigger
7a50: 50 72 67 3b 20 0a 20 20 20 20 20 20 70 50 72 67  Prg; .      pPrg
7a60: 20 26 26 20 28 70 50 72 67 2d 3e 70 54 72 69 67   && (pPrg->pTrig
7a70: 67 65 72 21 3d 70 54 72 69 67 67 65 72 20 7c 7c  ger!=pTrigger ||
7a80: 20 70 50 72 67 2d 3e 6f 72 63 6f 6e 66 21 3d 6f   pPrg->orconf!=o
7a90: 72 63 6f 6e 66 29 3b 20 0a 20 20 20 20 20 20 70  rconf); .      p
7aa0: 50 72 67 3d 70 50 72 67 2d 3e 70 4e 65 78 74 0a  Prg=pPrg->pNext.
7ab0: 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e    );..  /* If an
7ac0: 20 65 78 69 73 74 69 6e 67 20 54 72 69 67 67 65   existing Trigge
7ad0: 72 50 72 67 20 63 6f 75 6c 64 20 6e 6f 74 20 62  rPrg could not b
7ae0: 65 20 6c 6f 63 61 74 65 64 2c 20 63 72 65 61 74  e located, creat
7af0: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 20 2a 2f 0a  e a new one. */.
7b00: 20 20 69 66 28 20 21 70 50 72 67 20 29 7b 0a 20    if( !pPrg ){. 
7b10: 20 20 20 70 50 72 67 20 3d 20 63 6f 64 65 52 6f     pPrg = codeRo
7b20: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
7b30: 20 70 54 72 69 67 67 65 72 2c 20 70 54 61 62 2c   pTrigger, pTab,
7b40: 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 7d 0a 0a 20   orconf);.  }.. 
7b50: 20 72 65 74 75 72 6e 20 70 50 72 67 3b 0a 7d 0a   return pPrg;.}.
7b60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
7b70: 61 6c 6c 65 64 20 74 6f 20 63 6f 64 65 20 46 4f  alled to code FO
7b80: 52 20 45 41 43 48 20 52 4f 57 20 74 72 69 67 67  R EACH ROW trigg
7b90: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ers..**.** When 
7ba0: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 74 68  the code that th
7bb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65  is function gene
7bc0: 72 61 74 65 73 20 69 73 20 65 78 65 63 75 74 65  rates is execute
7bd0: 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  d, the following
7be0: 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 74 72 75   .** must be tru
7bf0: 65 3a 0a 2a 2a 0a 2a 2a 20 31 2e 20 4e 6f 20 63  e:.**.** 1. No c
7c00: 75 72 73 6f 72 73 20 6d 61 79 20 62 65 20 6f 70  ursors may be op
7c10: 65 6e 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  en in the main d
7c20: 61 74 61 62 61 73 65 2e 20 20 28 42 75 74 20 6e  atabase.  (But n
7c30: 65 77 49 64 78 20 61 6e 64 20 6f 6c 64 49 64 78  ewIdx and oldIdx
7c40: 0a 2a 2a 20 20 20 20 63 61 6e 20 62 65 20 69 6e  .**    can be in
7c50: 64 69 63 65 73 20 6f 66 20 63 75 72 73 6f 72 73  dices of cursors
7c60: 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
7c70: 62 6c 65 73 2e 20 20 53 65 65 20 62 65 6c 6f 77  bles.  See below
7c80: 2e 29 0a 2a 2a 0a 2a 2a 20 32 2e 20 49 66 20 74  .).**.** 2. If t
7c90: 68 65 20 74 72 69 67 67 65 72 73 20 62 65 69 6e  he triggers bein
7ca0: 67 20 63 6f 64 65 64 20 61 72 65 20 4f 4e 20 49  g coded are ON I
7cb0: 4e 53 45 52 54 20 6f 72 20 4f 4e 20 55 50 44 41  NSERT or ON UPDA
7cc0: 54 45 20 74 72 69 67 67 65 72 73 2c 20 74 68 65  TE triggers, the
7cd0: 6e 0a 2a 2a 20 20 20 20 61 20 74 65 6d 70 6f 72  n.**    a tempor
7ce0: 61 72 79 20 76 64 62 65 20 63 75 72 73 6f 72 20  ary vdbe cursor 
7cf0: 28 69 6e 64 65 78 20 6e 65 77 49 64 78 29 20 6d  (index newIdx) m
7d00: 75 73 74 20 62 65 20 6f 70 65 6e 20 61 6e 64 20  ust be open and 
7d10: 70 6f 69 6e 74 69 6e 67 20 61 74 0a 2a 2a 20 20  pointing at.**  
7d20: 20 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69    a row containi
7d30: 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  ng values to be 
7d40: 73 75 62 73 74 69 74 75 74 65 64 20 66 6f 72 20  substituted for 
7d50: 6e 65 77 2e 2a 20 65 78 70 72 65 73 73 69 6f 6e  new.* expression
7d60: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 74  s in the.**    t
7d70: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 28 73  rigger program(s
7d80: 29 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 49 66 20 74  )..**.** 3. If t
7d90: 68 65 20 74 72 69 67 67 65 72 73 20 62 65 69 6e  he triggers bein
7da0: 67 20 63 6f 64 65 64 20 61 72 65 20 4f 4e 20 44  g coded are ON D
7db0: 45 4c 45 54 45 20 6f 72 20 4f 4e 20 55 50 44 41  ELETE or ON UPDA
7dc0: 54 45 20 74 72 69 67 67 65 72 73 2c 20 74 68 65  TE triggers, the
7dd0: 6e 0a 2a 2a 20 20 20 20 61 20 74 65 6d 70 6f 72  n.**    a tempor
7de0: 61 72 79 20 76 64 62 65 20 63 75 72 73 6f 72 20  ary vdbe cursor 
7df0: 28 69 6e 64 65 78 20 6f 6c 64 49 64 78 29 20 6d  (index oldIdx) m
7e00: 75 73 74 20 62 65 20 6f 70 65 6e 20 61 6e 64 20  ust be open and 
7e10: 70 6f 69 6e 74 69 6e 67 20 61 74 0a 2a 2a 20 20  pointing at.**  
7e20: 20 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69    a row containi
7e30: 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  ng values to be 
7e40: 73 75 62 73 74 69 74 75 74 65 64 20 66 6f 72 20  substituted for 
7e50: 6f 6c 64 2e 2a 20 65 78 70 72 65 73 73 69 6f 6e  old.* expression
7e60: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 74  s in the.**    t
7e70: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 28 73  rigger program(s
7e80: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 79  )..**.** If they
7e90: 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74   are not NULL, t
7ea0: 68 65 20 70 69 4f 6c 64 43 6f 6c 4d 61 73 6b 20  he piOldColMask 
7eb0: 61 6e 64 20 70 69 4e 65 77 43 6f 6c 4d 61 73 6b  and piNewColMask
7ec0: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
7ed0: 73 0a 2a 2a 20 61 72 65 20 73 65 74 20 74 6f 20  s.** are set to 
7ee0: 76 61 6c 75 65 73 20 74 68 61 74 20 64 65 73 63  values that desc
7ef0: 72 69 62 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73  ribe the columns
7f00: 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 69   used by the tri
7f10: 67 67 65 72 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  gger program.** 
7f20: 69 6e 20 74 68 65 20 4f 4c 44 2e 2a 20 61 6e 64  in the OLD.* and
7f30: 20 4e 45 57 2e 2a 20 74 61 62 6c 65 73 20 72 65   NEW.* tables re
7f40: 73 70 65 63 74 69 76 65 6c 79 2e 20 49 66 20 63  spectively. If c
7f50: 6f 6c 75 6d 6e 20 4e 20 6f 66 20 74 68 65 20 0a  olumn N of the .
7f60: 2a 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  ** pseudo-table 
7f70: 69 73 20 72 65 61 64 20 61 74 20 6c 65 61 73 74  is read at least
7f80: 20 6f 6e 63 65 2c 20 74 68 65 20 63 6f 72 72 65   once, the corre
7f90: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 6f 66 20  sponding bit of 
7fa0: 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 6d 61  the output.** ma
7fb0: 73 6b 20 69 73 20 73 65 74 2e 20 49 66 20 61 20  sk is set. If a 
7fc0: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 6e 20 69  column with an i
7fd0: 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
7fe0: 6e 20 33 32 20 69 73 20 72 65 61 64 2c 20 74 68  n 32 is read, th
7ff0: 65 0a 2a 2a 20 6f 75 74 70 75 74 20 6d 61 73 6b  e.** output mask
8000: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
8010: 70 65 63 69 61 6c 20 76 61 6c 75 65 20 30 78 66  pecial value 0xf
8020: 66 66 66 66 66 66 66 2e 0a 2a 2a 0a 2a 2f 0a 76  fffffff..**.*/.v
8030: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 52  oid sqlite3CodeR
8040: 6f 77 54 72 69 67 67 65 72 28 0a 20 20 50 61 72  owTrigger(.  Par
8050: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8060: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
8070: 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20  xt */.  Trigger 
8080: 2a 70 54 72 69 67 67 65 72 2c 20 20 20 2f 2a 20  *pTrigger,   /* 
8090: 4c 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73  List of triggers
80a0: 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 20 2a   on table pTab *
80b0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
80c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
80d0: 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b  of TK_UPDATE, TK
80e0: 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 44 45 4c 45  _INSERT, TK_DELE
80f0: 54 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  TE */.  ExprList
8100: 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f 2a 20   *pChanges,  /* 
8110: 43 68 61 6e 67 65 73 20 6c 69 73 74 20 66 6f 72  Changes list for
8120: 20 61 6e 79 20 55 50 44 41 54 45 20 4f 46 20 74   any UPDATE OF t
8130: 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74  riggers */.  int
8140: 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20 20 20   tr_tm,         
8150: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 52 49 47    /* One of TRIG
8160: 47 45 52 5f 42 45 46 4f 52 45 2c 20 54 52 49 47  GER_BEFORE, TRIG
8170: 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 20 20 54  GER_AFTER */.  T
8180: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
8190: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
81a0: 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72   to code trigger
81b0: 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
81c0: 6e 65 77 49 64 78 2c 20 20 20 20 20 20 20 20 20  newIdx,         
81d0: 20 2f 2a 20 54 68 65 20 69 6e 64 69 63 65 20 6f   /* The indice o
81e0: 66 20 74 68 65 20 22 6e 65 77 22 20 72 6f 77 20  f the "new" row 
81f0: 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 69  to access */.  i
8200: 6e 74 20 6f 6c 64 49 64 78 2c 20 20 20 20 20 20  nt oldIdx,      
8210: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 69 63      /* The indic
8220: 65 20 6f 66 20 74 68 65 20 22 6f 6c 64 22 20 72  e of the "old" r
8230: 6f 77 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a  ow to access */.
8240: 20 20 69 6e 74 20 6f 72 63 6f 6e 66 2c 20 20 20    int orconf,   
8250: 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e         /* ON CON
8260: 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 2a 2f 0a  FLICT policy */.
8270: 20 20 69 6e 74 20 69 67 6e 6f 72 65 4a 75 6d 70    int ignoreJump
8280: 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75         /* Instru
8290: 63 74 69 6f 6e 20 74 6f 20 6a 75 6d 70 20 74 6f  ction to jump to
82a0: 20 66 6f 72 20 52 41 49 53 45 28 49 47 4e 4f 52   for RAISE(IGNOR
82b0: 45 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  E) */.){.  Trigg
82c0: 65 72 20 2a 70 3b 0a 0a 20 20 55 4e 55 53 45 44  er *p;..  UNUSED
82d0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 65 77 49 64  _PARAMETER(newId
82e0: 78 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 6f 70  x);..  assert(op
82f0: 20 3d 3d 20 54 4b 5f 55 50 44 41 54 45 20 7c 7c   == TK_UPDATE ||
8300: 20 6f 70 20 3d 3d 20 54 4b 5f 49 4e 53 45 52 54   op == TK_INSERT
8310: 20 7c 7c 20 6f 70 20 3d 3d 20 54 4b 5f 44 45 4c   || op == TK_DEL
8320: 45 54 45 29 3b 0a 20 20 61 73 73 65 72 74 28 74  ETE);.  assert(t
8330: 72 5f 74 6d 20 3d 3d 20 54 52 49 47 47 45 52 5f  r_tm == TRIGGER_
8340: 42 45 46 4f 52 45 20 7c 7c 20 74 72 5f 74 6d 20  BEFORE || tr_tm 
8350: 3d 3d 20 54 52 49 47 47 45 52 5f 41 46 54 45 52  == TRIGGER_AFTER
8360: 20 29 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 54 72   );..  for(p=pTr
8370: 69 67 67 65 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  igger; p; p=p->p
8380: 4e 65 78 74 29 7b 0a 0a 20 20 20 20 2f 2a 20 53  Next){..    /* S
8390: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 3a 20  anity checking: 
83a0: 20 54 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   The schema for 
83b0: 74 68 65 20 74 72 69 67 67 65 72 20 61 6e 64 20  the trigger and 
83c0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 72  for the table ar
83d0: 65 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  e.    ** always 
83e0: 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 74 72  defined.  The tr
83f0: 69 67 67 65 72 20 6d 75 73 74 20 62 65 20 69 6e  igger must be in
8400: 20 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61   the same schema
8410: 20 61 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20   as the table.  
8420: 20 20 2a 2a 20 6f 72 20 65 6c 73 65 20 69 74 20    ** or else it 
8430: 6d 75 73 74 20 62 65 20 61 20 54 45 4d 50 20 74  must be a TEMP t
8440: 72 69 67 67 65 72 2e 20 2a 2f 0a 20 20 20 20 61  rigger. */.    a
8450: 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d  ssert( p->pSchem
8460: 61 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  a!=0 );.    asse
8470: 72 74 28 20 70 2d 3e 70 54 61 62 53 63 68 65 6d  rt( p->pTabSchem
8480: 61 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  a!=0 );.    asse
8490: 72 74 28 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d  rt( p->pSchema==
84a0: 70 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 0a 20  p->pTabSchema . 
84b0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 70 53          || p->pS
84c0: 63 68 65 6d 61 3d 3d 70 50 61 72 73 65 2d 3e 64  chema==pParse->d
84d0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
84e0: 61 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 74  a );..    /* Det
84f0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 77  ermine whether w
8500: 65 20 73 68 6f 75 6c 64 20 63 6f 64 65 20 74 68  e should code th
8510: 69 73 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20  is trigger */.  
8520: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 6f 70 20    if( p->op==op 
8530: 0a 20 20 20 20 20 26 26 20 70 2d 3e 74 72 5f 74  .     && p->tr_t
8540: 6d 3d 3d 74 72 5f 74 6d 20 0a 20 20 20 20 20 26  m==tr_tm .     &
8550: 26 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65  & checkColumnOve
8560: 72 6c 61 70 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73  rlap(p->pColumns
8570: 2c 70 43 68 61 6e 67 65 73 29 0a 20 20 20 20 29  ,pChanges).    )
8580: 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 20  {.      Vdbe *v 
8590: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
85a0: 28 70 50 61 72 73 65 29 3b 20 2f 2a 20 4d 61 69  (pParse); /* Mai
85b0: 6e 20 56 4d 20 2a 2f 0a 20 20 20 20 20 20 54 72  n VM */.      Tr
85c0: 69 67 67 65 72 50 72 67 20 2a 70 50 72 67 3b 0a  iggerPrg *pPrg;.
85d0: 20 20 20 20 20 20 70 50 72 67 20 3d 20 67 65 74        pPrg = get
85e0: 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73  RowTrigger(pPars
85f0: 65 2c 20 70 2c 20 70 54 61 62 2c 20 6f 72 63 6f  e, p, pTab, orco
8600: 6e 66 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nf);.      asser
8610: 74 28 20 70 50 72 67 20 7c 7c 20 70 50 61 72 73  t( pPrg || pPars
8620: 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
8630: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
8640: 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  led );..      /*
8650: 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 50 72 6f   Code the OP_Pro
8660: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 74  gram opcode in t
8670: 68 65 20 70 61 72 65 6e 74 20 56 44 42 45 2e 20  he parent VDBE. 
8680: 50 34 20 6f 66 20 74 68 65 20 4f 50 5f 50 72 6f  P4 of the OP_Pro
8690: 67 72 61 6d 20 0a 20 20 20 20 20 20 2a 2a 20 69  gram .      ** i
86a0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
86b0: 68 65 20 73 75 62 2d 76 64 62 65 20 63 6f 6e 74  he sub-vdbe cont
86c0: 61 69 6e 69 6e 67 20 74 68 65 20 74 72 69 67 67  aining the trigg
86d0: 65 72 20 70 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a  er program.  */.
86e0: 20 20 20 20 20 20 69 66 28 20 70 50 72 67 20 29        if( pPrg )
86f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8700: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8710: 50 5f 50 72 6f 67 72 61 6d 2c 20 6f 6c 64 49 64  P_Program, oldId
8720: 78 2c 20 69 67 6e 6f 72 65 4a 75 6d 70 2c 20 2b  x, ignoreJump, +
8730: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a  +pParse->nMem);.
8740: 20 20 20 20 20 20 20 20 70 50 72 67 2d 3e 70 50          pPrg->pP
8750: 72 6f 67 72 61 6d 2d 3e 6e 52 65 66 2b 2b 3b 0a  rogram->nRef++;.
8760: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8770: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
8780: 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  1, (const char *
8790: 29 70 50 72 67 2d 3e 70 50 72 6f 67 72 61 6d 2c  )pPrg->pProgram,
87a0: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 29 3b   P4_SUBPROGRAM);
87b0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
87c0: 6d 65 6e 74 28 28 76 2c 20 22 43 61 6c 6c 3a 20  ment((v, "Call: 
87d0: 25 73 2e 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65  %s.%s", p->zName
87e0: 2c 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f 72  , onErrorText(or
87f0: 63 6f 6e 66 29 29 29 3b 0a 20 20 20 20 20 20 7d  conf)));.      }
8800: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
8810: 0a 2a 2a 20 54 72 69 67 67 65 72 73 20 66 69 72  .** Triggers fir
8820: 65 64 20 62 79 20 55 50 44 41 54 45 20 6f 72 20  ed by UPDATE or 
8830: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
8840: 73 20 6d 61 79 20 61 63 63 65 73 73 20 76 61 6c  s may access val
8850: 75 65 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ues stored.** in
8860: 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
8870: 6f 2d 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  o-table. This fu
8880: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
8890: 20 33 32 2d 62 69 74 20 62 69 74 6d 61 73 6b 0a   32-bit bitmask.
88a0: 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  ** indicating wh
88b0: 69 63 68 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ich columns of t
88c0: 68 65 20 6f 6c 64 2e 2a 20 74 61 62 6c 65 20 61  he old.* table a
88d0: 63 74 75 61 6c 6c 79 20 61 72 65 20 75 73 65 64  ctually are used
88e0: 20 62 79 0a 2a 2a 20 74 72 69 67 67 65 72 73 2e   by.** triggers.
88f0: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
8900: 6e 20 6d 61 79 20 62 65 20 75 73 65 64 20 62 79  n may be used by
8910: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61   the caller to a
8920: 76 6f 69 64 20 68 61 76 69 6e 67 0a 2a 2a 20 74  void having.** t
8930: 6f 20 6c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  o load the entir
8940: 65 20 6f 6c 64 2e 2a 20 72 65 63 6f 72 64 20 69  e old.* record i
8950: 6e 74 6f 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20  nto memory when 
8960: 65 78 65 63 75 74 69 6e 67 20 61 6e 20 55 50 44  executing an UPD
8970: 41 54 45 0a 2a 2a 20 6f 72 20 44 45 4c 45 54 45  ATE.** or DELETE
8980: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
8990: 42 69 74 20 30 20 6f 66 20 74 68 65 20 72 65 74  Bit 0 of the ret
89a0: 75 72 6e 65 64 20 6d 61 73 6b 20 69 73 20 73 65  urned mask is se
89b0: 74 20 69 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f  t if the left-mo
89c0: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
89d0: 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 62 65  .** table may be
89e0: 20 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20   accessed using 
89f0: 61 6e 20 6f 6c 64 2e 3c 63 6f 6c 3e 20 72 65 66  an old.<col> ref
8a00: 65 72 65 6e 63 65 2e 20 42 69 74 20 31 20 69 73  erence. Bit 1 is
8a10: 20 73 65 74 20 69 66 0a 2a 2a 20 74 68 65 20 73   set if.** the s
8a20: 65 63 6f 6e 64 20 6c 65 66 74 6d 6f 73 74 20 63  econd leftmost c
8a30: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 72  olumn value is r
8a40: 65 71 75 69 72 65 64 2c 20 61 6e 64 20 73 6f 20  equired, and so 
8a50: 6f 6e 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  on. If there.** 
8a60: 61 72 65 20 6d 6f 72 65 20 74 68 61 6e 20 33 32  are more than 32
8a70: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
8a80: 74 61 62 6c 65 2c 20 61 6e 64 20 61 74 20 6c 65  table, and at le
8a90: 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 63  ast one of the c
8aa0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 77 69 74 68 20 61  olumns.** with a
8ab0: 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
8ac0: 74 68 61 6e 20 33 32 20 6d 61 79 20 62 65 20 61  than 32 may be a
8ad0: 63 63 65 73 73 65 64 2c 20 30 78 66 66 66 66 66  ccessed, 0xfffff
8ae0: 66 66 66 20 69 73 20 72 65 74 75 72 6e 65 64 2e  fff is returned.
8af0: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74  .**.** It is not
8b00: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74   possible to det
8b10: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6f 6c  ermine if the ol
8b20: 64 2e 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69  d.rowid column i
8b30: 73 20 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79  s accessed.** by
8b40: 20 74 72 69 67 67 65 72 73 2e 20 54 68 65 20 63   triggers. The c
8b50: 61 6c 6c 65 72 20 6d 75 73 74 20 61 6c 77 61 79  aller must alway
8b60: 73 20 61 73 73 75 6d 65 20 74 68 61 74 20 69 74  s assume that it
8b70: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65   is..**.** There
8b80: 20 69 73 20 6e 6f 20 65 71 75 69 76 61 6c 65 6e   is no equivalen
8b90: 74 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 6e  t function for n
8ba0: 65 77 2e 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  ew.* references.
8bb0: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 54  .*/.u32 sqlite3T
8bc0: 72 69 67 67 65 72 4f 6c 64 6d 61 73 6b 28 0a 20  riggerOldmask(. 
8bd0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8be0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
8bf0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67  ontext */.  Trig
8c00: 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20  ger *pTrigger,  
8c10: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 72 69 67   /* List of trig
8c20: 67 65 72 73 20 6f 6e 20 74 61 62 6c 65 20 70 54  gers on table pT
8c30: 61 62 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  ab */.  int op, 
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8c50: 45 69 74 68 65 72 20 54 4b 5f 55 50 44 41 54 45  Either TK_UPDATE
8c60: 20 6f 72 20 54 4b 5f 44 45 4c 45 54 45 20 2a 2f   or TK_DELETE */
8c70: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68  .  ExprList *pCh
8c80: 61 6e 67 65 73 2c 20 20 2f 2a 20 43 68 61 6e 67  anges,  /* Chang
8c90: 65 73 20 6c 69 73 74 20 66 6f 72 20 61 6e 79 20  es list for any 
8ca0: 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67 65  UPDATE OF trigge
8cb0: 72 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  rs */.  Table *p
8cc0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab,         /* 
8cd0: 54 68 65 20 74 61 62 6c 65 20 74 6f 20 63 6f 64  The table to cod
8ce0: 65 20 74 72 69 67 67 65 72 73 20 66 72 6f 6d 20  e triggers from 
8cf0: 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20  */.  int orconf 
8d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66            /* Def
8d10: 61 75 6c 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ault ON CONFLICT
8d20: 20 70 6f 6c 69 63 79 20 66 6f 72 20 74 72 69 67   policy for trig
8d30: 67 65 72 20 73 74 65 70 73 20 2a 2f 0a 29 7b 0a  ger steps */.){.
8d40: 20 20 75 33 32 20 6d 61 73 6b 20 3d 20 30 3b 0a    u32 mask = 0;.
8d50: 20 20 54 72 69 67 67 65 72 20 2a 70 3b 0a 0a 20    Trigger *p;.. 
8d60: 20 61 73 73 65 72 74 28 6f 70 3d 3d 54 4b 5f 55   assert(op==TK_U
8d70: 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  PDATE || op==TK_
8d80: 44 45 4c 45 54 45 29 3b 0a 20 20 66 6f 72 28 70  DELETE);.  for(p
8d90: 3d 70 54 72 69 67 67 65 72 3b 20 70 3b 20 70 3d  =pTrigger; p; p=
8da0: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
8db0: 66 28 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20  f( p->op==op && 
8dc0: 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c  checkColumnOverl
8dd0: 61 70 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 70  ap(p->pColumns,p
8de0: 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20 20  Changes) ){.    
8df0: 20 20 54 72 69 67 67 65 72 50 72 67 20 2a 70 50    TriggerPrg *pP
8e00: 72 67 3b 0a 20 20 20 20 20 20 70 50 72 67 20 3d  rg;.      pPrg =
8e10: 20 67 65 74 52 6f 77 54 72 69 67 67 65 72 28 70   getRowTrigger(p
8e20: 50 61 72 73 65 2c 20 70 2c 20 70 54 61 62 2c 20  Parse, p, pTab, 
8e30: 6f 72 63 6f 6e 66 29 3b 0a 20 20 20 20 20 20 69  orconf);.      i
8e40: 66 28 20 70 50 72 67 20 29 7b 0a 20 20 20 20 20  f( pPrg ){.     
8e50: 20 20 20 6d 61 73 6b 20 7c 3d 20 70 50 72 67 2d     mask |= pPrg-
8e60: 3e 6f 6c 64 6d 61 73 6b 3b 0a 20 20 20 20 20 20  >oldmask;.      
8e70: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
8e80: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 23  eturn mask;.}..#
8e90: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
8ea0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
8eb0: 49 47 47 45 52 29 20 2a 2f 0a                    IGGER) */.