/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 545f3b8354001577a82c44fc6c4beac598b45b86:


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 6e  p;.  pTrigger->n
1fc0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7a  ame = zName;.  z
1fd0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 72 69  Name = 0;.  pTri
1fe0: 67 67 65 72 2d 3e 74 61 62 6c 65 20 3d 20 73 71  gger->table = sq
1ff0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
2000: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 61 5b  , pTableName->a[
2010: 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 70 54 72  0].zName);.  pTr
2020: 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 20 3d  igger->pSchema =
2030: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
2040: 63 68 65 6d 61 3b 0a 20 20 70 54 72 69 67 67 65  chema;.  pTrigge
2050: 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 3d 20  r->pTabSchema = 
2060: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  pTab->pSchema;. 
2070: 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 20 3d 20   pTrigger->op = 
2080: 28 75 38 29 6f 70 3b 0a 20 20 70 54 72 69 67 67  (u8)op;.  pTrigg
2090: 65 72 2d 3e 74 72 5f 74 6d 20 3d 20 74 72 5f 74  er->tr_tm = tr_t
20a0: 6d 3d 3d 54 4b 5f 42 45 46 4f 52 45 20 3f 20 54  m==TK_BEFORE ? T
20b0: 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 3a 20  RIGGER_BEFORE : 
20c0: 54 52 49 47 47 45 52 5f 41 46 54 45 52 3b 0a 20  TRIGGER_AFTER;. 
20d0: 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e   pTrigger->pWhen
20e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
20f0: 70 28 64 62 2c 20 70 57 68 65 6e 2c 20 45 58 50  p(db, pWhen, EXP
2100: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
2110: 70 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d  pTrigger->pColum
2120: 6e 73 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ns = sqlite3IdLi
2130: 73 74 44 75 70 28 64 62 2c 20 70 43 6f 6c 75 6d  stDup(db, pColum
2140: 6e 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ns);.  assert( p
2150: 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67  Parse->pNewTrigg
2160: 65 72 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73  er==0 );.  pPars
2170: 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20 3d  e->pNewTrigger =
2180: 20 70 54 72 69 67 67 65 72 3b 0a 0a 74 72 69 67   pTrigger;..trig
2190: 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  ger_cleanup:.  s
21a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74   zName);.  sqlit
21c0: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
21d0: 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b  db, pTableName);
21e0: 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
21f0: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75  Delete(db, pColu
2200: 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  mns);.  sqlite3E
2210: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57  xprDelete(db, pW
2220: 68 65 6e 29 3b 0a 20 20 69 66 28 20 21 70 50 61  hen);.  if( !pPa
2230: 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72  rse->pNewTrigger
2240: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2250: 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62 2c  eleteTrigger(db,
2260: 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 7d 65   pTrigger);.  }e
2270: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2280: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69   pParse->pNewTri
2290: 67 67 65 72 3d 3d 70 54 72 69 67 67 65 72 20 29  gger==pTrigger )
22a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
22b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
22c0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c 20  alled after all 
22d0: 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20 61  of the trigger a
22e0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
22f0: 20 70 61 72 73 65 64 0a 2a 2a 20 69 6e 20 6f 72   parsed.** in or
2300: 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
2310: 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62  the process of b
2320: 75 69 6c 64 69 6e 67 20 74 68 65 20 74 72 69 67  uilding the trig
2330: 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ger..*/.void sql
2340: 69 74 65 33 46 69 6e 69 73 68 54 72 69 67 67 65  ite3FinishTrigge
2350: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
2360: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
2370: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
2380: 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20  /.  TriggerStep 
2390: 2a 70 53 74 65 70 4c 69 73 74 2c 20 2f 2a 20 54  *pStepList, /* T
23a0: 68 65 20 74 72 69 67 67 65 72 65 64 20 70 72 6f  he triggered pro
23b0: 67 72 61 6d 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  gram */.  Token 
23c0: 2a 70 41 6c 6c 20 20 20 20 20 20 20 20 20 20 20  *pAll           
23d0: 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 68 61 74 20    /* Token that 
23e0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63 6f  describes the co
23f0: 6d 70 6c 65 74 65 20 43 52 45 41 54 45 20 54 52  mplete CREATE TR
2400: 49 47 47 45 52 20 2a 2f 0a 29 7b 0a 20 20 54 72  IGGER */.){.  Tr
2410: 69 67 67 65 72 20 2a 70 54 72 69 67 20 3d 20 70  igger *pTrig = p
2420: 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67  Parse->pNewTrigg
2430: 65 72 3b 20 20 20 20 2f 2a 20 54 72 69 67 67 65  er;    /* Trigge
2440: 72 20 62 65 69 6e 67 20 66 69 6e 69 73 68 65 64  r being finished
2450: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
2460: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2480: 2a 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65  * Name of trigge
2490: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
24a0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
24d0: 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  */.  DbFixer sFi
24e0: 78 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  x;.  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 2f 2a                /*
2510: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   Database contai
2520: 6e 69 6e 67 20 74 68 65 20 74 72 69 67 67 65 72  ning the trigger
2530: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 6e 61 6d 65   */.  Token name
2540: 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20 20  Token;          
2550: 20 2f 2a 20 54 72 69 67 67 65 72 20 6e 61 6d 65   /* Trigger name
2560: 20 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72   for error repor
2570: 74 69 6e 67 20 2a 2f 0a 0a 20 20 70 54 72 69 67  ting */..  pTrig
2580: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
2590: 72 69 67 67 65 72 3b 0a 20 20 70 50 61 72 73 65  rigger;.  pParse
25a0: 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20 3d 20  ->pNewTrigger = 
25b0: 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  0;.  if( NEVER(p
25c0: 50 61 72 73 65 2d 3e 6e 45 72 72 29 20 7c 7c 20  Parse->nErr) || 
25d0: 21 70 54 72 69 67 20 29 20 67 6f 74 6f 20 74 72  !pTrig ) goto tr
25e0: 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61  iggerfinish_clea
25f0: 6e 75 70 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70  nup;.  zName = p
2600: 54 72 69 67 2d 3e 6e 61 6d 65 3b 0a 20 20 69 44  Trig->name;.  iD
2610: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
2620: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
2630: 3e 64 62 2c 20 70 54 72 69 67 2d 3e 70 53 63 68  >db, pTrig->pSch
2640: 65 6d 61 29 3b 0a 20 20 70 54 72 69 67 2d 3e 73  ema);.  pTrig->s
2650: 74 65 70 5f 6c 69 73 74 20 3d 20 70 53 74 65 70  tep_list = pStep
2660: 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  List;.  while( p
2670: 53 74 65 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  StepList ){.    
2680: 70 53 74 65 70 4c 69 73 74 2d 3e 70 54 72 69 67  pStepList->pTrig
2690: 20 3d 20 70 54 72 69 67 3b 0a 20 20 20 20 70 53   = pTrig;.    pS
26a0: 74 65 70 4c 69 73 74 20 3d 20 70 53 74 65 70 4c  tepList = pStepL
26b0: 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ist->pNext;.  }.
26c0: 20 20 6e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 3d 20    nameToken.z = 
26d0: 70 54 72 69 67 2d 3e 6e 61 6d 65 3b 0a 20 20 6e  pTrig->name;.  n
26e0: 61 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20 73 71 6c  ameToken.n = sql
26f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 6e 61 6d  ite3Strlen30(nam
2700: 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 69 66 28  eToken.z);.  if(
2710: 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
2720: 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
2730: 44 62 2c 20 22 74 72 69 67 67 65 72 22 2c 20 26  Db, "trigger", &
2740: 6e 61 6d 65 54 6f 6b 65 6e 29 20 0a 20 20 20 20  nameToken) .    
2750: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
2760: 46 69 78 54 72 69 67 67 65 72 53 74 65 70 28 26  FixTriggerStep(&
2770: 73 46 69 78 2c 20 70 54 72 69 67 2d 3e 73 74 65  sFix, pTrig->ste
2780: 70 5f 6c 69 73 74 29 20 29 7b 0a 20 20 20 20 67  p_list) ){.    g
2790: 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e 69 73  oto triggerfinis
27a0: 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  h_cleanup;.  }..
27b0: 20 20 2f 2a 20 69 66 20 77 65 20 61 72 65 20 6e    /* if we are n
27c0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
27d0: 20 61 6e 64 20 74 68 69 73 20 74 72 69 67 67 65   and this trigge
27e0: 72 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 54 45  r is not on a TE
27f0: 4d 50 20 74 61 62 6c 65 2c 20 0a 20 20 2a 2a 20  MP table, .  ** 
2800: 62 75 69 6c 64 20 74 68 65 20 73 71 6c 69 74 65  build the sqlite
2810: 5f 6d 61 73 74 65 72 20 65 6e 74 72 79 0a 20 20  _master entry.  
2820: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
2830: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 56  it.busy ){.    V
2840: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
2850: 20 2a 7a 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b   *z;..    /* Mak
2860: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
2870: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2880: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 76 20 3d  table */.    v =
2890: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
28a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
28b0: 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 74 72 69   v==0 ) goto tri
28c0: 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e  ggerfinish_clean
28d0: 75 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  up;.    sqlite3B
28e0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
28f0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
2900: 62 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  b);.    z = sqli
2910: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
2920: 20 28 63 68 61 72 2a 29 70 41 6c 6c 2d 3e 7a 2c   (char*)pAll->z,
2930: 20 70 41 6c 6c 2d 3e 6e 29 3b 0a 20 20 20 20 73   pAll->n);.    s
2940: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
2950: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
2960: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
2970: 2e 25 73 20 56 41 4c 55 45 53 28 27 74 72 69 67  .%s VALUES('trig
2980: 67 65 72 27 2c 25 51 2c 25 51 2c 30 2c 27 43 52  ger',%Q,%Q,0,'CR
2990: 45 41 54 45 20 54 52 49 47 47 45 52 20 25 71 27  EATE TRIGGER %q'
29a0: 29 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  )",.       db->a
29b0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
29c0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
29d0: 2c 20 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  , zName,.       
29e0: 70 54 72 69 67 2d 3e 74 61 62 6c 65 2c 20 7a 29  pTrig->table, z)
29f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
2a00: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
2a10: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
2a20: 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
2a30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2a40: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61  eAddOp4(v, OP_Pa
2a50: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
2a60: 30 2c 20 30 2c 20 73 71 6c 69 74 65 33 4d 50 72  0, 0, sqlite3MPr
2a70: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 64 62  intf(.        db
2a80: 2c 20 22 74 79 70 65 3d 27 74 72 69 67 67 65 72  , "type='trigger
2a90: 27 20 41 4e 44 20 6e 61 6d 65 3d 27 25 71 27 22  ' AND name='%q'"
2aa0: 2c 20 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e  , zName), P4_DYN
2ab0: 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  AMIC.    );.  }.
2ac0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
2ad0: 62 75 73 79 20 29 7b 0a 20 20 20 20 54 72 69 67  busy ){.    Trig
2ae0: 67 65 72 20 2a 70 4c 69 6e 6b 20 3d 20 70 54 72  ger *pLink = pTr
2af0: 69 67 3b 0a 20 20 20 20 48 61 73 68 20 2a 70 48  ig;.    Hash *pH
2b00: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
2b10: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69  Db].pSchema->tri
2b20: 67 48 61 73 68 3b 0a 20 20 20 20 70 54 72 69 67  gHash;.    pTrig
2b30: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
2b40: 73 65 72 74 28 70 48 61 73 68 2c 20 7a 4e 61 6d  sert(pHash, zNam
2b50: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
2b60: 33 30 28 7a 4e 61 6d 65 29 2c 20 70 54 72 69 67  30(zName), pTrig
2b70: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 72 69 67  );.    if( pTrig
2b80: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   ){.      db->ma
2b90: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
2ba0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
2bb0: 69 6e 6b 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 4c  ink->pSchema==pL
2bc0: 69 6e 6b 2d 3e 70 54 61 62 53 63 68 65 6d 61 20  ink->pTabSchema 
2bd0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
2be0: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20  pTab;.      int 
2bf0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
2c00: 6e 33 30 28 70 4c 69 6e 6b 2d 3e 74 61 62 6c 65  n30(pLink->table
2c10: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
2c20: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2c30: 26 70 4c 69 6e 6b 2d 3e 70 54 61 62 53 63 68 65  &pLink->pTabSche
2c40: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 4c 69  ma->tblHash, pLi
2c50: 6e 6b 2d 3e 74 61 62 6c 65 2c 20 6e 29 3b 0a 20  nk->table, n);. 
2c60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
2c70: 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c  b!=0 );.      pL
2c80: 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  ink->pNext = pTa
2c90: 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  b->pTrigger;.   
2ca0: 20 20 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65     pTab->pTrigge
2cb0: 72 20 3d 20 70 4c 69 6e 6b 3b 0a 20 20 20 20 7d  r = pLink;.    }
2cc0: 0a 20 20 7d 0a 0a 74 72 69 67 67 65 72 66 69 6e  .  }..triggerfin
2cd0: 69 73 68 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  ish_cleanup:.  s
2ce0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
2cf0: 67 65 72 28 64 62 2c 20 70 54 72 69 67 29 3b 0a  ger(db, pTrig);.
2d00: 20 20 61 73 73 65 72 74 28 20 21 70 50 61 72 73    assert( !pPars
2d10: 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20 29  e->pNewTrigger )
2d20: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  ;.  sqlite3Delet
2d30: 65 54 72 69 67 67 65 72 53 74 65 70 28 64 62 2c  eTriggerStep(db,
2d40: 20 70 53 74 65 70 4c 69 73 74 29 3b 0a 7d 0a 0a   pStepList);.}..
2d50: 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 53 45 4c  /*.** Turn a SEL
2d60: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 28 74  ECT statement (t
2d70: 68 61 74 20 74 68 65 20 70 53 65 6c 65 63 74 20  hat the pSelect 
2d80: 70 61 72 61 6d 65 74 65 72 20 70 6f 69 6e 74 73  parameter points
2d90: 20 74 6f 29 20 69 6e 74 6f 0a 2a 2a 20 61 20 74   to) into.** a t
2da0: 72 69 67 67 65 72 20 73 74 65 70 2e 20 20 52 65  rigger step.  Re
2db0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
2dc0: 6f 20 61 20 54 72 69 67 67 65 72 53 74 65 70 20  o a TriggerStep 
2dd0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
2de0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
2df0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
2e00: 68 65 6e 20 69 74 20 66 69 6e 64 73 20 61 20 53  hen it finds a S
2e10: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2e20: 69 6e 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20  in.** body of a 
2e30: 54 52 49 47 47 45 52 2e 20 20 0a 2a 2f 0a 54 72  TRIGGER.  .*/.Tr
2e40: 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74  iggerStep *sqlit
2e50: 65 33 54 72 69 67 67 65 72 53 65 6c 65 63 74 53  e3TriggerSelectS
2e60: 74 65 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  tep(sqlite3 *db,
2e70: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2e80: 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  ){.  TriggerStep
2e90: 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 20 3d   *pTriggerStep =
2ea0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2eb0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
2ec0: 54 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a 20  TriggerStep));. 
2ed0: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65   if( pTriggerSte
2ee0: 70 3d 3d 30 20 29 20 7b 0a 20 20 20 20 73 71 6c  p==0 ) {.    sql
2ef0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
2f00: 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
2f10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2f20: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
2f30: 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
2f40: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
2f50: 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65  >pSelect = pSele
2f60: 63 74 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74  ct;.  pTriggerSt
2f70: 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f  ep->orconf = OE_
2f80: 44 65 66 61 75 6c 74 3b 0a 20 20 72 65 74 75 72  Default;.  retur
2f90: 6e 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a  n pTriggerStep;.
2fa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2fb0: 65 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  e space to hold 
2fc0: 61 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 74  a new trigger st
2fd0: 65 70 2e 20 20 54 68 65 20 61 6c 6c 6f 63 61 74  ep.  The allocat
2fe0: 65 64 20 73 70 61 63 65 0a 2a 2a 20 68 6f 6c 64  ed space.** hold
2ff0: 73 20 62 6f 74 68 20 74 68 65 20 54 72 69 67 67  s both the Trigg
3000: 65 72 53 74 65 70 20 6f 62 6a 65 63 74 20 61 6e  erStep object an
3010: 64 20 74 68 65 20 54 72 69 67 67 65 72 53 74 65  d the TriggerSte
3020: 70 2e 74 61 72 67 65 74 2e 7a 20 73 74 72 69 6e  p.target.z strin
3030: 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  g..**.** If an O
3040: 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
3050: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
3060: 64 20 61 6e 64 20 64 62 2d 3e 6d 61 6c 6c 6f 63  d and db->malloc
3070: 46 61 69 6c 65 64 20 69 73 20 73 65 74 2e 0a 2a  Failed is set..*
3080: 2f 0a 73 74 61 74 69 63 20 54 72 69 67 67 65 72  /.static Trigger
3090: 53 74 65 70 20 2a 74 72 69 67 67 65 72 53 74 65  Step *triggerSte
30a0: 70 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c  pAllocate(.  sql
30b0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
30c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
30d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
30e0: 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20  */.  u8 op,     
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 2f 2a 20 54 72 69 67 67 65 72 20 6f 70 63 6f   /* Trigger opco
3110: 64 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  de */.  Token *p
3120: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
3130: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 72 67 65      /* The targe
3140: 74 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 54  t name */.){.  T
3150: 72 69 67 67 65 72 53 74 65 70 20 2a 70 54 72 69  riggerStep *pTri
3160: 67 67 65 72 53 74 65 70 3b 0a 0a 20 20 70 54 72  ggerStep;..  pTr
3170: 69 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c 69  iggerStep = sqli
3180: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
3190: 64 62 2c 20 73 69 7a 65 6f 66 28 54 72 69 67 67  db, sizeof(Trigg
31a0: 65 72 53 74 65 70 29 20 2b 20 70 4e 61 6d 65 2d  erStep) + pName-
31b0: 3e 6e 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67  >n);.  if( pTrig
31c0: 67 65 72 53 74 65 70 20 29 7b 0a 20 20 20 20 63  gerStep ){.    c
31d0: 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29  har *z = (char*)
31e0: 26 70 54 72 69 67 67 65 72 53 74 65 70 5b 31 5d  &pTriggerStep[1]
31f0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20  ;.    memcpy(z, 
3200: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
3210: 3e 6e 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65  >n);.    pTrigge
3220: 72 53 74 65 70 2d 3e 74 61 72 67 65 74 2e 7a 20  rStep->target.z 
3230: 3d 20 7a 3b 0a 20 20 20 20 70 54 72 69 67 67 65  = z;.    pTrigge
3240: 72 53 74 65 70 2d 3e 74 61 72 67 65 74 2e 6e 20  rStep->target.n 
3250: 3d 20 70 4e 61 6d 65 2d 3e 6e 3b 0a 20 20 20 20  = pName->n;.    
3260: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70  pTriggerStep->op
3270: 20 3d 20 6f 70 3b 0a 20 20 7d 0a 20 20 72 65 74   = op;.  }.  ret
3280: 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70  urn pTriggerStep
3290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 69 6c 64  ;.}../*.** Build
32a0: 20 61 20 74 72 69 67 67 65 72 20 73 74 65 70 20   a trigger step 
32b0: 6f 75 74 20 6f 66 20 61 6e 20 49 4e 53 45 52 54  out of an INSERT
32c0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74   statement.  Ret
32d0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
32e0: 20 74 6f 20 74 68 65 20 6e 65 77 20 74 72 69 67   to the new trig
32f0: 67 65 72 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20  ger step..**.** 
3300: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
3310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
3320: 65 6e 20 69 74 20 73 65 65 73 20 61 6e 20 49 4e  en it sees an IN
3330: 53 45 52 54 20 69 6e 73 69 64 65 20 74 68 65 0a  SERT inside the.
3340: 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20 74 72 69  ** body of a tri
3350: 67 67 65 72 2e 0a 2a 2f 0a 54 72 69 67 67 65 72  gger..*/.Trigger
3360: 53 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72 69  Step *sqlite3Tri
3370: 67 67 65 72 49 6e 73 65 72 74 53 74 65 70 28 0a  ggerInsertStep(.
3380: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
3390: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
33a0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
33b0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
33c0: 62 6c 65 4e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  bleName,  /* Nam
33d0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  e of the table i
33e0: 6e 74 6f 20 77 68 69 63 68 20 77 65 20 69 6e 73  nto which we ins
33f0: 65 72 74 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  ert */.  IdList 
3400: 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20 20 2f 2a 20  *pColumn,    /* 
3410: 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
3420: 69 6e 20 70 54 61 62 6c 65 4e 61 6d 65 20 74 6f  in pTableName to
3430: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 2a 2f 0a   insert into */.
3440: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
3450: 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 56 41 4c  st,   /* The VAL
3460: 55 45 20 63 6c 61 75 73 65 3a 20 61 20 6c 69 73  UE clause: a lis
3470: 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 62  t of values to b
3480: 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  e inserted */.  
3490: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
34a0: 20 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20      /* A SELECT 
34b0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 73  statement that s
34c0: 75 70 70 6c 69 65 73 20 76 61 6c 75 65 73 20 2a  upplies values *
34d0: 2f 0a 20 20 75 38 20 6f 72 63 6f 6e 66 20 20 20  /.  u8 orconf   
34e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
34f0: 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68  onflict algorith
3500: 6d 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  m (OE_Abort, OE_
3510: 52 65 70 6c 61 63 65 2c 20 65 74 63 2e 29 20 2a  Replace, etc.) *
3520: 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74  /.){.  TriggerSt
3530: 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65 70  ep *pTriggerStep
3540: 3b 0a 0a 20 20 61 73 73 65 72 74 28 70 45 4c 69  ;..  assert(pELi
3550: 73 74 20 3d 3d 20 30 20 7c 7c 20 70 53 65 6c 65  st == 0 || pSele
3560: 63 74 20 3d 3d 20 30 29 3b 0a 20 20 61 73 73 65  ct == 0);.  asse
3570: 72 74 28 70 45 4c 69 73 74 20 21 3d 20 30 20 7c  rt(pEList != 0 |
3580: 7c 20 70 53 65 6c 65 63 74 20 21 3d 20 30 20 7c  | pSelect != 0 |
3590: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
35a0: 65 64 29 3b 0a 0a 20 20 70 54 72 69 67 67 65 72  ed);..  pTrigger
35b0: 53 74 65 70 20 3d 20 74 72 69 67 67 65 72 53 74  Step = triggerSt
35c0: 65 70 41 6c 6c 6f 63 61 74 65 28 64 62 2c 20 54  epAllocate(db, T
35d0: 4b 5f 49 4e 53 45 52 54 2c 20 70 54 61 62 6c 65  K_INSERT, pTable
35e0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 72  Name);.  if( pTr
35f0: 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20 20  iggerStep ){.   
3600: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
3610: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
3620: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53  SelectDup(db, pS
3630: 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52  elect, EXPRDUP_R
3640: 45 44 55 43 45 29 3b 0a 20 20 20 20 70 54 72 69  EDUCE);.    pTri
3650: 67 67 65 72 53 74 65 70 2d 3e 70 49 64 4c 69 73  ggerStep->pIdLis
3660: 74 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20  t = pColumn;.   
3670: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
3680: 45 78 70 72 4c 69 73 74 20 3d 20 73 71 6c 69 74  ExprList = sqlit
3690: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
36a0: 2c 20 70 45 4c 69 73 74 2c 20 45 58 50 52 44 55  , pEList, EXPRDU
36b0: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 70  P_REDUCE);.    p
36c0: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63  TriggerStep->orc
36d0: 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20  onf = orconf;.  
36e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
36f0: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
3700: 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d  b, pColumn);.  }
3710: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
3720: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
3730: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
3740: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
3750: 70 53 65 6c 65 63 74 29 3b 0a 0a 20 20 72 65 74  pSelect);..  ret
3760: 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65 70  urn pTriggerStep
3770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  ;.}../*.** Const
3780: 72 75 63 74 20 61 20 74 72 69 67 67 65 72 20 73  ruct a trigger s
3790: 74 65 70 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  tep that impleme
37a0: 6e 74 73 20 61 6e 20 55 50 44 41 54 45 20 73 74  nts an UPDATE st
37b0: 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74 75  atement and retu
37c0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
37d0: 74 6f 20 74 68 61 74 20 74 72 69 67 67 65 72 20  to that trigger 
37e0: 73 74 65 70 2e 20 20 54 68 65 20 70 61 72 73 65  step.  The parse
37f0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
3800: 74 69 6e 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  tine when it.** 
3810: 73 65 65 73 20 61 6e 20 55 50 44 41 54 45 20 73  sees an UPDATE s
3820: 74 61 74 65 6d 65 6e 74 20 69 6e 73 69 64 65 20  tatement inside 
3830: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 43 52  the body of a CR
3840: 45 41 54 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f  EATE TRIGGER..*/
3850: 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 71  .TriggerStep *sq
3860: 6c 69 74 65 33 54 72 69 67 67 65 72 55 70 64 61  lite3TriggerUpda
3870: 74 65 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65  teStep(.  sqlite
3880: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
3890: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
38a0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
38b0: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65  oken *pTableName
38c0: 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
38d0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 75  he table to be u
38e0: 70 64 61 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  pdated */.  Expr
38f0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
3900: 20 2f 2a 20 54 68 65 20 53 45 54 20 63 6c 61 75   /* The SET clau
3910: 73 65 3a 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  se: list of colu
3920: 6d 6e 20 61 6e 64 20 6e 65 77 20 76 61 6c 75 65  mn and new value
3930: 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  s */.  Expr *pWh
3940: 65 72 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ere,        /* T
3950: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3960: 2a 2f 0a 20 20 75 38 20 6f 72 63 6f 6e 66 20 20  */.  u8 orconf  
3970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3980: 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69   conflict algori
3990: 74 68 6d 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20  thm. (OE_Abort, 
39a0: 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29 20  OE_Ignore, etc) 
39b0: 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53  */.){.  TriggerS
39c0: 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65  tep *pTriggerSte
39d0: 70 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74  p;..  pTriggerSt
39e0: 65 70 20 3d 20 74 72 69 67 67 65 72 53 74 65 70  ep = triggerStep
39f0: 41 6c 6c 6f 63 61 74 65 28 64 62 2c 20 54 4b 5f  Allocate(db, TK_
3a00: 55 50 44 41 54 45 2c 20 70 54 61 62 6c 65 4e 61  UPDATE, pTableNa
3a10: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67  me);.  if( pTrig
3a20: 67 65 72 53 74 65 70 20 29 7b 0a 20 20 20 20 70  gerStep ){.    p
3a30: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 45 78  TriggerStep->pEx
3a40: 70 72 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  prList = sqlite3
3a50: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
3a60: 70 45 4c 69 73 74 2c 20 45 58 50 52 44 55 50 5f  pEList, EXPRDUP_
3a70: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 70 54 72  REDUCE);.    pTr
3a80: 69 67 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72  iggerStep->pWher
3a90: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
3aa0: 75 70 28 64 62 2c 20 70 57 68 65 72 65 2c 20 45  up(db, pWhere, E
3ab0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
3ac0: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
3ad0: 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e  ->orconf = orcon
3ae0: 66 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  f;.  }.  sqlite3
3af0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
3b00: 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 71  b, pEList);.  sq
3b10: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3b20: 64 62 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 72  db, pWhere);.  r
3b30: 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53 74  eturn pTriggerSt
3b40: 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  ep;.}../*.** Con
3b50: 73 74 72 75 63 74 20 61 20 74 72 69 67 67 65 72  struct a trigger
3b60: 20 73 74 65 70 20 74 68 61 74 20 69 6d 70 6c 65   step that imple
3b70: 6d 65 6e 74 73 20 61 20 44 45 4c 45 54 45 20 73  ments a DELETE s
3b80: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74  tatement and ret
3b90: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
3ba0: 20 74 6f 20 74 68 61 74 20 74 72 69 67 67 65 72   to that trigger
3bb0: 20 73 74 65 70 2e 20 20 54 68 65 20 70 61 72 73   step.  The pars
3bc0: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
3bd0: 75 74 69 6e 65 20 77 68 65 6e 20 69 74 0a 2a 2a  utine when it.**
3be0: 20 73 65 65 73 20 61 20 44 45 4c 45 54 45 20 73   sees a DELETE s
3bf0: 74 61 74 65 6d 65 6e 74 20 69 6e 73 69 64 65 20  tatement inside 
3c00: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 43 52  the body of a CR
3c10: 45 41 54 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f  EATE TRIGGER..*/
3c20: 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 71  .TriggerStep *sq
3c30: 6c 69 74 65 33 54 72 69 67 67 65 72 44 65 6c 65  lite3TriggerDele
3c40: 74 65 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65  teStep(.  sqlite
3c50: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
3c60: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
3c70: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
3c80: 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c  ken *pTableName,
3c90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
3ca0: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 72 6f  le from which ro
3cb0: 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 20 2a  ws are deleted *
3cc0: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3ce0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3cf0: 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53  */.){.  TriggerS
3d00: 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65  tep *pTriggerSte
3d10: 70 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74  p;..  pTriggerSt
3d20: 65 70 20 3d 20 74 72 69 67 67 65 72 53 74 65 70  ep = triggerStep
3d30: 41 6c 6c 6f 63 61 74 65 28 64 62 2c 20 54 4b 5f  Allocate(db, TK_
3d40: 44 45 4c 45 54 45 2c 20 70 54 61 62 6c 65 4e 61  DELETE, pTableNa
3d50: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67  me);.  if( pTrig
3d60: 67 65 72 53 74 65 70 20 29 7b 0a 20 20 20 20 70  gerStep ){.    p
3d70: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57 68  TriggerStep->pWh
3d80: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
3d90: 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 65 2c  rDup(db, pWhere,
3da0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
3db0: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74  ;.    pTriggerSt
3dc0: 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f  ep->orconf = OE_
3dd0: 44 65 66 61 75 6c 74 3b 0a 20 20 7d 0a 20 20 73  Default;.  }.  s
3de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3df0: 28 64 62 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  (db, pWhere);.  
3e00: 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53  return pTriggerS
3e10: 74 65 70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52  tep;.}../* .** R
3e20: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
3e30: 65 20 61 20 54 72 69 67 67 65 72 20 73 74 72 75  e a Trigger stru
3e40: 63 74 75 72 65 0a 2a 2f 0a 76 6f 69 64 20 73 71  cture.*/.void sq
3e50: 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67  lite3DeleteTrigg
3e60: 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  er(sqlite3 *db, 
3e70: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
3e80: 72 29 7b 0a 20 20 69 66 28 20 70 54 72 69 67 67  r){.  if( pTrigg
3e90: 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  er==0 ) return;.
3ea0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
3eb0: 72 69 67 67 65 72 53 74 65 70 28 64 62 2c 20 70  riggerStep(db, p
3ec0: 54 72 69 67 67 65 72 2d 3e 73 74 65 70 5f 6c 69  Trigger->step_li
3ed0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  st);.  sqlite3Db
3ee0: 46 72 65 65 28 64 62 2c 20 70 54 72 69 67 67 65  Free(db, pTrigge
3ef0: 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  r->name);.  sqli
3f00: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
3f10: 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a  rigger->table);.
3f20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3f30: 65 74 65 28 64 62 2c 20 70 54 72 69 67 67 65 72  ete(db, pTrigger
3f40: 2d 3e 70 57 68 65 6e 29 3b 0a 20 20 73 71 6c 69  ->pWhen);.  sqli
3f50: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
3f60: 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 43  db, pTrigger->pC
3f70: 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74  olumns);.  sqlit
3f80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 72  e3DbFree(db, pTr
3f90: 69 67 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  igger);.}../*.**
3fa0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3fb0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 72 6f 70  s called to drop
3fc0: 20 61 20 74 72 69 67 67 65 72 20 66 72 6f 6d 20   a trigger from 
3fd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
3fe0: 65 6d 61 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ema. .**.** This
3ff0: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 64   may be called d
4000: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
4010: 20 70 61 72 73 65 72 20 61 6e 64 20 74 68 65 72   parser and ther
4020: 65 66 6f 72 65 20 69 64 65 6e 74 69 66 69 65 73  efore identifies
4030: 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20  .** the trigger 
4040: 62 79 20 6e 61 6d 65 2e 20 20 54 68 65 20 73 71  by name.  The sq
4050: 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
4060: 50 74 72 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  Ptr() routine do
4070: 65 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 6a  es the.** same j
4080: 6f 62 20 61 73 20 74 68 69 73 20 72 6f 75 74 69  ob as this routi
4090: 6e 65 20 65 78 63 65 70 74 20 69 74 20 74 61 6b  ne except it tak
40a0: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
40b0: 74 68 65 20 74 72 69 67 67 65 72 0a 2a 2a 20 69  the trigger.** i
40c0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 74 72  nstead of the tr
40d0: 69 67 67 65 72 20 6e 61 6d 65 2e 0a 2a 2a 2f 0a  igger name..**/.
40e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
40f0: 54 72 69 67 67 65 72 28 50 61 72 73 65 20 2a 70  Trigger(Parse *p
4100: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
4110: 70 4e 61 6d 65 2c 20 69 6e 74 20 6e 6f 45 72 72  pName, int noErr
4120: 29 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54  ){.  Trigger *pT
4130: 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e  rigger = 0;.  in
4140: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
4150: 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73 74 20  r *zDb;.  const 
4160: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
4170: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 73 71 6c 69  nt nName;.  sqli
4180: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
4190: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d  ->db;..  if( db-
41a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
41b0: 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 67 65  goto drop_trigge
41c0: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 66 28  r_cleanup;.  if(
41d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
41e0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
41f0: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
4200: 6f 20 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63  o drop_trigger_c
4210: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 61  leanup;.  }..  a
4220: 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
4230: 72 63 3d 3d 31 20 29 3b 0a 20 20 7a 44 62 20 3d  rc==1 );.  zDb =
4240: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
4250: 74 61 62 61 73 65 3b 0a 20 20 7a 4e 61 6d 65 20  tabase;.  zName 
4260: 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  = pName->a[0].zN
4270: 61 6d 65 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  ame;.  nName = s
4280: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
4290: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 4f  Name);.  for(i=O
42a0: 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62  MIT_TEMPDB; i<db
42b0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
42c0: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
42d0: 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65   i^1 : i;  /* Se
42e0: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
42f0: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
4300: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53   zDb && sqlite3S
4310: 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 6a  trICmp(db->aDb[j
4320: 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 20  ].zName, zDb) ) 
4330: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 54  continue;.    pT
4340: 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33  rigger = sqlite3
4350: 48 61 73 68 46 69 6e 64 28 26 28 64 62 2d 3e 61  HashFind(&(db->a
4360: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  Db[j].pSchema->t
4370: 72 69 67 48 61 73 68 29 2c 20 7a 4e 61 6d 65 2c  rigHash), zName,
4380: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   nName);.    if(
4390: 20 70 54 72 69 67 67 65 72 20 29 20 62 72 65 61   pTrigger ) brea
43a0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 54  k;.  }.  if( !pT
43b0: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 69 66  rigger ){.    if
43c0: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
43d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
43e0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
43f0: 63 68 20 74 72 69 67 67 65 72 3a 20 25 53 22 2c  ch trigger: %S",
4400: 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
4410: 7d 0a 20 20 20 20 67 6f 74 6f 20 64 72 6f 70 5f  }.    goto drop_
4420: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
4430: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 72  .  }.  sqlite3Dr
4440: 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
4450: 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  rse, pTrigger);.
4460: 0a 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c  .drop_trigger_cl
4470: 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
4480: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
4490: 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
44a0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
44b0: 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ter to the Table
44c0: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
44d0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 61 20  he table that a 
44e0: 74 72 69 67 67 65 72 0a 2a 2a 20 69 73 20 73 65  trigger.** is se
44f0: 74 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  t on..*/.static 
4500: 54 61 62 6c 65 20 2a 74 61 62 6c 65 4f 66 54 72  Table *tableOfTr
4510: 69 67 67 65 72 28 54 72 69 67 67 65 72 20 2a 70  igger(Trigger *p
4520: 54 72 69 67 67 65 72 29 7b 0a 20 20 69 6e 74 20  Trigger){.  int 
4530: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
4540: 6e 33 30 28 70 54 72 69 67 67 65 72 2d 3e 74 61  n30(pTrigger->ta
4550: 62 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  ble);.  return s
4560: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
4570: 70 54 72 69 67 67 65 72 2d 3e 70 54 61 62 53 63  pTrigger->pTabSc
4580: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70  hema->tblHash, p
4590: 54 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 2c 20  Trigger->table, 
45a0: 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 72  n);.}.../*.** Dr
45b0: 6f 70 20 61 20 74 72 69 67 67 65 72 20 67 69 76  op a trigger giv
45c0: 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
45d0: 74 68 61 74 20 74 72 69 67 67 65 72 2e 20 0a 2a  that trigger. .*
45e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
45f0: 6f 70 54 72 69 67 67 65 72 50 74 72 28 50 61 72  opTriggerPtr(Par
4600: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 72 69 67  se *pParse, Trig
4610: 67 65 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a  ger *pTrigger){.
4620: 20 20 54 61 62 6c 65 20 20 20 2a 70 54 61 62 6c    Table   *pTabl
4630: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
4640: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
4650: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
4660: 69 44 62 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71  iDb;..  iDb = sq
4670: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
4680: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
4690: 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
46a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
46b0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
46c0: 44 62 20 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d  Db );.  pTable =
46d0: 20 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72 28   tableOfTrigger(
46e0: 70 54 72 69 67 67 65 72 29 3b 0a 20 20 61 73 73  pTrigger);.  ass
46f0: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 20  ert( pTable );. 
4700: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
4710: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 72 69 67 67  >pSchema==pTrigg
4720: 65 72 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 69  er->pSchema || i
4730: 44 62 3d 3d 31 20 29 3b 0a 23 69 66 6e 64 65 66  Db==1 );.#ifndef
4740: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
4750: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
4760: 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
4770: 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45  LITE_DROP_TRIGGE
4780: 52 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  R;.    const cha
4790: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
47a0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
47b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
47c0: 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
47d0: 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69  (iDb);.    if( i
47e0: 44 62 3d 3d 31 20 29 20 63 6f 64 65 20 3d 20 53  Db==1 ) code = S
47f0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
4800: 54 52 49 47 47 45 52 3b 0a 20 20 20 20 69 66 28  TRIGGER;.    if(
4810: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
4820: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
4830: 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 2c 20  pTrigger->name, 
4840: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 7a  pTable->zName, z
4850: 44 62 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c  Db) ||.      sql
4860: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
4870: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
4880: 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
4890: 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  b) ){.      retu
48a0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rn;.    }.  }.#e
48b0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
48c0: 61 74 65 20 63 6f 64 65 20 74 6f 20 64 65 73 74  ate code to dest
48d0: 72 6f 79 20 74 68 65 20 64 61 74 61 62 61 73 65  roy the database
48e0: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 74   record of the t
48f0: 72 69 67 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 61  rigger..  */.  a
4900: 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30  ssert( pTable!=0
4910: 20 29 3b 0a 20 20 69 66 28 20 28 76 20 3d 20 73   );.  if( (v = s
4920: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
4930: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
4940: 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 20 20 73   int base;.    s
4950: 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65  tatic const Vdbe
4960: 4f 70 4c 69 73 74 20 64 72 6f 70 54 72 69 67 67  OpList dropTrigg
4970: 65 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  er[] = {.      {
4980: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
4990: 30 2c 20 41 44 44 52 28 39 29 2c 20 20 30 7d 2c  0, ADDR(9),  0},
49a0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
49b0: 6e 67 38 2c 20 20 20 20 30 2c 20 31 2c 20 20 20  ng8,    0, 1,   
49c0: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f       0}, /* 1 */
49d0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
49e0: 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20  mn,     0, 1,   
49f0: 20 20 20 20 20 32 7d 2c 0a 20 20 20 20 20 20 7b       2},.      {
4a00: 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20   OP_Ne,         
4a10: 32 2c 20 41 44 44 52 28 38 29 2c 20 20 31 7d 2c  2, ADDR(8),  1},
4a20: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
4a30: 6e 67 38 2c 20 20 20 20 30 2c 20 31 2c 20 20 20  ng8,    0, 1,   
4a40: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 34 3a 20 22       0}, /* 4: "
4a50: 74 72 69 67 67 65 72 22 20 2a 2f 0a 20 20 20 20  trigger" */.    
4a60: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
4a70: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
4a80: 32 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  2},.      { OP_N
4a90: 65 2c 20 20 20 20 20 20 20 20 20 32 2c 20 41 44  e,         2, AD
4aa0: 44 52 28 38 29 2c 20 20 31 7d 2c 0a 20 20 20 20  DR(8),  1},.    
4ab0: 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20    { OP_Delete,  
4ac0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
4ad0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
4ae0: 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44  ext,       0, AD
4af0: 44 52 28 31 29 2c 20 20 30 7d 2c 20 2f 2a 20 38  DR(1),  0}, /* 8
4b00: 20 2a 2f 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20   */.    };..    
4b10: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
4b20: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
4b30: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
4b40: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
4b50: 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  rTable(pParse, i
4b60: 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20  Db);.    base = 
4b70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4b80: 4c 69 73 74 28 76 2c 20 20 41 72 72 61 79 53 69  List(v,  ArraySi
4b90: 7a 65 28 64 72 6f 70 54 72 69 67 67 65 72 29 2c  ze(dropTrigger),
4ba0: 20 64 72 6f 70 54 72 69 67 67 65 72 29 3b 0a 20   dropTrigger);. 
4bb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
4bc0: 61 6e 67 65 50 34 28 76 2c 20 62 61 73 65 2b 31  angeP4(v, base+1
4bd0: 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65  , pTrigger->name
4be0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4bf0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
4c00: 20 62 61 73 65 2b 34 2c 20 22 74 72 69 67 67 65   base+4, "trigge
4c10: 72 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  r", P4_STATIC);.
4c20: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
4c30: 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
4c40: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
4c50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4c60: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
4c70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4c80: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
4c90: 54 72 69 67 67 65 72 2c 20 69 44 62 2c 20 30 2c  Trigger, iDb, 0,
4ca0: 20 30 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e 61   0, pTrigger->na
4cb0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  me, 0);.    if( 
4cc0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c 33 20 29  pParse->nMem<3 )
4cd0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
4ce0: 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 7d 0a  nMem = 3;.    }.
4cf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
4d00: 6f 76 65 20 61 20 74 72 69 67 67 65 72 20 66 72  ove a trigger fr
4d10: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
4d20: 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  es of the sqlite
4d30: 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 76 6f  * pointer..*/.vo
4d40: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
4d50: 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67 65 72  AndDeleteTrigger
4d60: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
4d70: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
4d80: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 48 61 73  r *zName){.  Has
4d90: 68 20 2a 70 48 61 73 68 20 3d 20 26 28 64 62 2d  h *pHash = &(db-
4da0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
4db0: 61 2d 3e 74 72 69 67 48 61 73 68 29 3b 0a 20 20  a->trigHash);.  
4dc0: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
4dd0: 72 3b 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  r;.  pTrigger = 
4de0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4df0: 74 28 70 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  t(pHash, zName, 
4e00: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
4e10: 7a 4e 61 6d 65 29 2c 20 30 29 3b 0a 20 20 69 66  zName), 0);.  if
4e20: 28 20 41 4c 57 41 59 53 28 70 54 72 69 67 67 65  ( ALWAYS(pTrigge
4e30: 72 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  r) ){.    if( pT
4e40: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
4e50: 3d 70 54 72 69 67 67 65 72 2d 3e 70 54 61 62 53  =pTrigger->pTabS
4e60: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 54  chema ){.      T
4e70: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 74 61 62  able *pTab = tab
4e80: 6c 65 4f 66 54 72 69 67 67 65 72 28 70 54 72 69  leOfTrigger(pTri
4e90: 67 67 65 72 29 3b 0a 20 20 20 20 20 20 54 72 69  gger);.      Tri
4ea0: 67 67 65 72 20 2a 2a 70 70 3b 0a 20 20 20 20 20  gger **pp;.     
4eb0: 20 66 6f 72 28 70 70 3d 26 70 54 61 62 2d 3e 70   for(pp=&pTab->p
4ec0: 54 72 69 67 67 65 72 3b 20 2a 70 70 21 3d 70 54  Trigger; *pp!=pT
4ed0: 72 69 67 67 65 72 3b 20 70 70 3d 26 28 28 2a 70  rigger; pp=&((*p
4ee0: 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20  p)->pNext));.   
4ef0: 20 20 20 2a 70 70 20 3d 20 28 2a 70 70 29 2d 3e     *pp = (*pp)->
4f00: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
4f10: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72   sqlite3DeleteTr
4f20: 69 67 67 65 72 28 64 62 2c 20 70 54 72 69 67 67  igger(db, pTrigg
4f30: 65 72 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  er);.    db->fla
4f40: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
4f50: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
4f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74 20  }../*.** pEList 
4f70: 69 73 20 74 68 65 20 53 45 54 20 63 6c 61 75 73  is the SET claus
4f80: 65 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73  e of an UPDATE s
4f90: 74 61 74 65 6d 65 6e 74 2e 20 20 45 61 63 68 20  tatement.  Each 
4fa0: 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 45 4c 69  entry.** in pELi
4fb0: 73 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  st is of the for
4fc0: 6d 61 74 20 3c 69 64 3e 3d 3c 65 78 70 72 3e 2e  mat <id>=<expr>.
4fd0: 20 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20    If any of the 
4fe0: 65 6e 74 72 69 65 73 0a 2a 2a 20 69 6e 20 70 45  entries.** in pE
4ff0: 4c 69 73 74 20 68 61 76 65 20 61 6e 20 3c 69 64  List have an <id
5000: 3e 20 77 68 69 63 68 20 6d 61 74 63 68 65 73 20  > which matches 
5010: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 69 6e  an identifier in
5020: 20 70 49 64 4c 69 73 74 2c 0a 2a 2a 20 74 68 65   pIdList,.** the
5030: 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  n return TRUE.  
5040: 49 66 20 70 49 64 4c 69 73 74 3d 3d 4e 55 4c 4c  If pIdList==NULL
5050: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 6e  , then it is con
5060: 73 69 64 65 72 65 64 20 61 0a 2a 2a 20 77 69 6c  sidered a.** wil
5070: 64 63 61 72 64 20 74 68 61 74 20 6d 61 74 63 68  dcard that match
5080: 65 73 20 61 6e 79 74 68 69 6e 67 2e 20 20 4c 69  es anything.  Li
5090: 6b 65 77 69 73 65 20 69 66 20 70 45 4c 69 73 74  kewise if pEList
50a0: 3d 3d 4e 55 4c 4c 20 74 68 65 6e 0a 2a 2a 20 69  ==NULL then.** i
50b0: 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68 69  t matches anythi
50c0: 6e 67 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74  ng so always ret
50d0: 75 72 6e 20 74 72 75 65 2e 20 20 52 65 74 75 72  urn true.  Retur
50e0: 6e 20 66 61 6c 73 65 20 6f 6e 6c 79 0a 2a 2a 20  n false only.** 
50f0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  if there is no m
5100: 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  atch..*/.static 
5110: 69 6e 74 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f  int checkColumnO
5120: 76 65 72 6c 61 70 28 49 64 4c 69 73 74 20 2a 70  verlap(IdList *p
5130: 49 64 4c 69 73 74 2c 20 45 78 70 72 4c 69 73 74  IdList, ExprList
5140: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74   *pEList){.  int
5150: 20 65 3b 0a 20 20 69 66 28 20 70 49 64 4c 69 73   e;.  if( pIdLis
5160: 74 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 45  t==0 || NEVER(pE
5170: 4c 69 73 74 3d 3d 30 29 20 29 20 72 65 74 75 72  List==0) ) retur
5180: 6e 20 31 3b 0a 20 20 66 6f 72 28 65 3d 30 3b 20  n 1;.  for(e=0; 
5190: 65 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  e<pEList->nExpr;
51a0: 20 65 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   e++){.    if( s
51b0: 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
51c0: 78 28 70 49 64 4c 69 73 74 2c 20 70 45 4c 69 73  x(pIdList, pELis
51d0: 74 2d 3e 61 5b 65 5d 2e 7a 4e 61 6d 65 29 3e 3d  t->a[e].zName)>=
51e0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
51f0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 20 0a 7d  }.  return 0; .}
5200: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
5210: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 72 69   list of all tri
5220: 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65 20 70  ggers on table p
5230: 54 61 62 20 69 66 20 74 68 65 72 65 20 65 78 69  Tab if there exi
5240: 73 74 73 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  sts at least.** 
5250: 6f 6e 65 20 74 72 69 67 67 65 72 20 74 68 61 74  one trigger that
5260: 20 6d 75 73 74 20 62 65 20 66 69 72 65 64 20 77   must be fired w
5270: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
5280: 20 6f 66 20 74 79 70 65 20 27 6f 70 27 20 69 73   of type 'op' is
5290: 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 6f   .** performed o
52a0: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64  n the table, and
52b0: 2c 20 69 66 20 74 68 61 74 20 6f 70 65 72 61 74  , if that operat
52c0: 69 6f 6e 20 69 73 20 61 6e 20 55 50 44 41 54 45  ion is an UPDATE
52d0: 2c 20 69 66 20 61 74 0a 2a 2a 20 6c 65 61 73 74  , if at.** least
52e0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f 6c 75   one of the colu
52f0: 6d 6e 73 20 69 6e 20 70 43 68 61 6e 67 65 73 20  mns in pChanges 
5300: 69 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  is being modifie
5310: 64 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 20 2a 73  d..*/.Trigger *s
5320: 71 6c 69 74 65 33 54 72 69 67 67 65 72 73 45 78  qlite3TriggersEx
5330: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
5340: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
5350: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
5360: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
5370: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
5380: 54 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  The table the co
5390: 6e 74 61 69 6e 73 20 74 68 65 20 74 72 69 67 67  ntains the trigg
53a0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ers */.  int op,
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53c0: 20 2f 2a 20 6f 6e 65 20 6f 66 20 54 4b 5f 44 45   /* one of TK_DE
53d0: 4c 45 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c  LETE, TK_INSERT,
53e0: 20 54 4b 5f 55 50 44 41 54 45 20 2a 2f 0a 20 20   TK_UPDATE */.  
53f0: 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67  ExprList *pChang
5400: 65 73 2c 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  es,     /* Colum
5410: 6e 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 69  ns that change i
5420: 6e 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  n an UPDATE stat
5430: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  ement */.  int *
5440: 70 4d 61 73 6b 20 20 20 20 20 20 20 20 20 20 20  pMask           
5450: 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20     /* OUT: Mask 
5460: 6f 66 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52  of TRIGGER_BEFOR
5470: 45 7c 54 52 49 47 47 45 52 5f 41 46 54 45 52 20  E|TRIGGER_AFTER 
5480: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b  */.){.  int mask
5490: 20 3d 20 30 3b 0a 20 20 54 72 69 67 67 65 72 20   = 0;.  Trigger 
54a0: 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  *pList = sqlite3
54b0: 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72  TriggerList(pPar
54c0: 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 54 72 69  se, pTab);.  Tri
54d0: 67 67 65 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  gger *p;.  asser
54e0: 74 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 49  t( pList==0 || I
54f0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 3d 3d  sVirtual(pTab)==
5500: 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69  0 );.  for(p=pLi
5510: 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  st; p; p=p->pNex
5520: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  t){.    if( p->o
5530: 70 3d 3d 6f 70 20 26 26 20 63 68 65 63 6b 43 6f  p==op && checkCo
5540: 6c 75 6d 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70  lumnOverlap(p->p
5550: 43 6f 6c 75 6d 6e 73 2c 20 70 43 68 61 6e 67 65  Columns, pChange
5560: 73 29 20 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b  s) ){.      mask
5570: 20 7c 3d 20 70 2d 3e 74 72 5f 74 6d 3b 0a 20 20   |= p->tr_tm;.  
5580: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d    }.  }.  if( pM
5590: 61 73 6b 20 29 7b 0a 20 20 20 20 2a 70 4d 61 73  ask ){.    *pMas
55a0: 6b 20 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  k = mask;.  }.  
55b0: 72 65 74 75 72 6e 20 28 6d 61 73 6b 20 3f 20 70  return (mask ? p
55c0: 4c 69 73 74 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a  List : 0);.}../*
55d0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20  .** Convert the 
55e0: 70 53 74 65 70 2d 3e 74 61 72 67 65 74 20 74 6f  pStep->target to
55f0: 6b 65 6e 20 69 6e 74 6f 20 61 20 53 72 63 4c 69  ken into a SrcLi
5600: 73 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  st and return a 
5610: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
5620: 61 74 20 53 72 63 4c 69 73 74 2e 0a 2a 2a 0a 2a  at SrcList..**.*
5630: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
5640: 64 64 73 20 61 20 73 70 65 63 69 66 69 63 20 64  dds a specific d
5650: 61 74 61 62 61 73 65 20 6e 61 6d 65 2c 20 69 66  atabase name, if
5660: 20 6e 65 65 64 65 64 2c 20 74 6f 20 74 68 65 20   needed, to the 
5670: 74 61 72 67 65 74 20 77 68 65 6e 0a 2a 2a 20 66  target when.** f
5680: 6f 72 6d 69 6e 67 20 74 68 65 20 53 72 63 4c 69  orming the SrcLi
5690: 73 74 2e 20 20 54 68 69 73 20 70 72 65 76 65 6e  st.  This preven
56a0: 74 73 20 61 20 74 72 69 67 67 65 72 20 69 6e 20  ts a trigger in 
56b0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 72 6f  one database fro
56c0: 6d 0a 2a 2a 20 72 65 66 65 72 72 69 6e 67 20 74  m.** referring t
56d0: 6f 20 61 20 74 61 72 67 65 74 20 69 6e 20 61 6e  o a target in an
56e0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 2e 20  other database. 
56f0: 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 73   An exception is
5700: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 74 72 69   when the.** tri
5710: 67 67 65 72 20 69 73 20 69 6e 20 54 45 4d 50 20  gger is in TEMP 
5720: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 69 74  in which case it
5730: 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 61 6e   can refer to an
5740: 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  y other database
5750: 20 69 74 0a 2a 2a 20 77 61 6e 74 73 2e 0a 2a 2f   it.** wants..*/
5760: 0a 73 74 61 74 69 63 20 53 72 63 4c 69 73 74 20  .static SrcList 
5770: 2a 74 61 72 67 65 74 53 72 63 4c 69 73 74 28 0a  *targetSrcList(.
5780: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5790: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
57a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
57b0: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
57c0: 70 53 74 65 70 20 20 20 2f 2a 20 54 68 65 20 74  pStep   /* The t
57d0: 72 69 67 67 65 72 20 63 6f 6e 74 61 69 6e 69 6e  rigger containin
57e0: 67 20 74 68 65 20 74 61 72 67 65 74 20 74 6f 6b  g the target tok
57f0: 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  en */.){.  int i
5800: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
5810: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
5820: 64 61 74 61 62 61 73 65 20 74 6f 20 75 73 65 20  database to use 
5830: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
5840: 72 63 3b 20 20 20 20 20 20 20 2f 2a 20 53 72 63  rc;       /* Src
5850: 4c 69 73 74 20 74 6f 20 62 65 20 72 65 74 75 72  List to be retur
5860: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
5870: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
5880: 70 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  ppend(pParse->db
5890: 2c 20 30 2c 20 26 70 53 74 65 70 2d 3e 74 61 72  , 0, &pStep->tar
58a0: 67 65 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  get, 0);.  if( p
58b0: 53 72 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Src ){.    asser
58c0: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 30 20  t( pSrc->nSrc>0 
58d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
58e0: 53 72 63 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 20  Src->a!=0 );.   
58f0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
5900: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
5910: 73 65 2d 3e 64 62 2c 20 70 53 74 65 70 2d 3e 70  se->db, pStep->p
5920: 54 72 69 67 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  Trig->pSchema);.
5930: 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c      if( iDb==0 |
5940: 7c 20 69 44 62 3e 3d 32 20 29 7b 0a 20 20 20 20  | iDb>=2 ){.    
5950: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5960: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
5970: 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 70 50    assert( iDb<pP
5980: 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b  arse->db->nDb );
5990: 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 70  .      pSrc->a[p
59a0: 53 72 63 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 44 61  Src->nSrc-1].zDa
59b0: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
59c0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 64 62 2d  DbStrDup(db, db-
59d0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29  >aDb[iDb].zName)
59e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
59f0: 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 2f 2a  turn pSrc;.}../*
5a00: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
5a10: 45 20 63 6f 64 65 20 66 6f 72 20 7a 65 72 6f 20  E code for zero 
5a20: 6f 72 20 6d 6f 72 65 20 73 74 61 74 65 6d 65 6e  or more statemen
5a30: 74 73 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f  ts inside the bo
5a40: 64 79 20 6f 66 20 61 0a 2a 2a 20 74 72 69 67 67  dy of a.** trigg
5a50: 65 72 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  er.  .*/.static 
5a60: 69 6e 74 20 63 6f 64 65 54 72 69 67 67 65 72 50  int codeTriggerP
5a70: 72 6f 67 72 61 6d 28 0a 20 20 50 61 72 73 65 20  rogram(.  Parse 
5a80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
5a90: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
5aa0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
5ab0: 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74 65  riggerStep *pSte
5ac0: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74  pList,   /* List
5ad0: 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 69   of statements i
5ae0: 6e 73 69 64 65 20 74 68 65 20 74 72 69 67 67 65  nside the trigge
5af0: 72 20 62 6f 64 79 20 2a 2f 0a 20 20 69 6e 74 20  r body */.  int 
5b00: 6f 72 63 6f 6e 66 69 6e 20 20 20 20 20 20 20 20  orconfin        
5b10: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
5b20: 74 20 61 6c 67 6f 72 69 74 68 6d 2e 20 28 4f 45  t algorithm. (OE
5b30: 5f 41 62 6f 72 74 2c 20 65 74 63 29 20 2a 2f 20  _Abort, etc) */ 
5b40: 20 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74   .){.  TriggerSt
5b50: 65 70 20 2a 20 70 54 72 69 67 67 65 72 53 74 65  ep * pTriggerSte
5b60: 70 20 3d 20 70 53 74 65 70 4c 69 73 74 3b 0a 20  p = pStepList;. 
5b70: 20 69 6e 74 20 6f 72 63 6f 6e 66 3b 0a 20 20 56   int orconf;.  V
5b80: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
5b90: 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74 65  >pVdbe;.  sqlite
5ba0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5bb0: 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  db;..  assert( p
5bc0: 54 72 69 67 67 65 72 53 74 65 70 21 3d 30 20 29  TriggerStep!=0 )
5bd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
5be0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
5bf0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
5c00: 6e 74 65 78 74 50 75 73 68 2c 20 30 2c 20 30 29  ntextPush, 0, 0)
5c10: 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
5c20: 28 76 2c 20 22 62 65 67 69 6e 20 74 72 69 67 67  (v, "begin trigg
5c30: 65 72 20 25 73 22 2c 20 70 53 74 65 70 4c 69 73  er %s", pStepLis
5c40: 74 2d 3e 70 54 72 69 67 2d 3e 6e 61 6d 65 29 29  t->pTrig->name))
5c50: 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67  ;.  while( pTrig
5c60: 67 65 72 53 74 65 70 20 29 7b 0a 20 20 20 20 73  gerStep ){.    s
5c70: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
5c80: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
5c90: 20 20 6f 72 63 6f 6e 66 20 3d 20 28 6f 72 63 6f    orconf = (orco
5ca0: 6e 66 69 6e 20 3d 3d 20 4f 45 5f 44 65 66 61 75  nfin == OE_Defau
5cb0: 6c 74 29 3f 70 54 72 69 67 67 65 72 53 74 65 70  lt)?pTriggerStep
5cc0: 2d 3e 6f 72 63 6f 6e 66 3a 6f 72 63 6f 6e 66 69  ->orconf:orconfi
5cd0: 6e 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 74  n;.    pParse->t
5ce0: 72 69 67 53 74 61 63 6b 2d 3e 6f 72 63 6f 6e 66  rigStack->orconf
5cf0: 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 20 20 73   = orconf;.    s
5d00: 77 69 74 63 68 28 20 70 54 72 69 67 67 65 72 53  witch( pTriggerS
5d10: 74 65 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  tep->op ){.     
5d20: 20 63 61 73 65 20 54 4b 5f 55 50 44 41 54 45 3a   case TK_UPDATE:
5d30: 20 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69   {.        SrcLi
5d40: 73 74 20 2a 70 53 72 63 3b 0a 20 20 20 20 20 20  st *pSrc;.      
5d50: 20 20 70 53 72 63 20 3d 20 74 61 72 67 65 74 53    pSrc = targetS
5d60: 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  rcList(pParse, p
5d70: 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a 20 20  TriggerStep);.  
5d80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5d90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
5da0: 73 65 74 43 6f 75 6e 74 2c 20 30 2c 20 30 29 3b  setCount, 0, 0);
5db0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5dc0: 55 70 64 61 74 65 28 70 50 61 72 73 65 2c 20 70  Update(pParse, p
5dd0: 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Src,.           
5de0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5df0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 54 72 69  ListDup(db, pTri
5e00: 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70 72 4c  ggerStep->pExprL
5e10: 69 73 74 2c 20 30 29 2c 20 0a 20 20 20 20 20 20  ist, 0), .      
5e20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5e30: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 54 72  3ExprDup(db, pTr
5e40: 69 67 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72  iggerStep->pWher
5e50: 65 2c 20 30 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a  e, 0), orconf);.
5e60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5e70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5e80: 52 65 73 65 74 43 6f 75 6e 74 2c 20 31 2c 20 30  ResetCount, 1, 0
5e90: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5ea0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5eb0: 63 61 73 65 20 54 4b 5f 49 4e 53 45 52 54 3a 20  case TK_INSERT: 
5ec0: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
5ed0: 74 20 2a 70 53 72 63 3b 0a 20 20 20 20 20 20 20  t *pSrc;.       
5ee0: 20 70 53 72 63 20 3d 20 74 61 72 67 65 74 53 72   pSrc = targetSr
5ef0: 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54  cList(pParse, pT
5f00: 72 69 67 67 65 72 53 74 65 70 29 3b 0a 20 20 20  riggerStep);.   
5f10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5f20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
5f30: 65 74 43 6f 75 6e 74 2c 20 30 2c 20 30 29 3b 0a  etCount, 0, 0);.
5f40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
5f50: 6e 73 65 72 74 28 70 50 61 72 73 65 2c 20 70 53  nsert(pParse, pS
5f60: 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc,.          sq
5f70: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
5f80: 28 64 62 2c 20 70 54 72 69 67 67 65 72 53 74 65  (db, pTriggerSte
5f90: 70 2d 3e 70 45 78 70 72 4c 69 73 74 2c 20 30 29  p->pExprList, 0)
5fa0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
5fb0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
5fc0: 2c 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  , pTriggerStep->
5fd0: 70 53 65 6c 65 63 74 2c 20 30 29 2c 20 0a 20 20  pSelect, 0), .  
5fe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
5ff0: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 54 72  dListDup(db, pTr
6000: 69 67 67 65 72 53 74 65 70 2d 3e 70 49 64 4c 69  iggerStep->pIdLi
6010: 73 74 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20  st), orconf);.  
6020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6030: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
6040: 73 65 74 43 6f 75 6e 74 2c 20 31 2c 20 30 29 3b  setCount, 1, 0);
6050: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6060: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
6070: 73 65 20 54 4b 5f 44 45 4c 45 54 45 3a 20 7b 0a  se TK_DELETE: {.
6080: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
6090: 2a 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 73  *pSrc;.        s
60a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
60b0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e  (v, OP_ResetCoun
60c0: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
60d0: 20 20 70 53 72 63 20 3d 20 74 61 72 67 65 74 53    pSrc = targetS
60e0: 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  rcList(pParse, p
60f0: 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a 20 20  TriggerStep);.  
6100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
6110: 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 20  eteFrom(pParse, 
6120: 70 53 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20  pSrc, .         
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
6150: 64 62 2c 20 70 54 72 69 67 67 65 72 53 74 65 70  db, pTriggerStep
6160: 2d 3e 70 57 68 65 72 65 2c 20 30 29 29 3b 0a 20  ->pWhere, 0));. 
6170: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6180: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
6190: 65 73 65 74 43 6f 75 6e 74 2c 20 31 2c 20 30 29  esetCount, 1, 0)
61a0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
61b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
61c0: 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
61d0: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70  pTriggerStep->op
61e0: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 7b  ==TK_SELECT ); {
61f0: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
6200: 2a 73 73 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  *ss = sqlite3Sel
6210: 65 63 74 44 75 70 28 64 62 2c 20 70 54 72 69 67  ectDup(db, pTrig
6220: 67 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74  gerStep->pSelect
6230: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
6240: 28 20 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ( ss ){.        
6250: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
6260: 74 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71  t;..          sq
6270: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
6280: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 44  nit(&dest, SRT_D
6290: 69 73 63 61 72 64 2c 20 30 29 3b 0a 20 20 20 20  iscard, 0);.    
62a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
62b0: 65 63 74 28 70 50 61 72 73 65 2c 20 73 73 2c 20  ect(pParse, ss, 
62c0: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  &dest);.        
62d0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
62e0: 65 6c 65 74 65 28 64 62 2c 20 73 73 29 3b 0a 20  elete(db, ss);. 
62f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6300: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6310: 20 20 20 20 7d 20 0a 20 20 20 20 70 54 72 69 67      } .    pTrig
6320: 67 65 72 53 74 65 70 20 3d 20 70 54 72 69 67 67  gerStep = pTrigg
6330: 65 72 53 74 65 70 2d 3e 70 4e 65 78 74 3b 0a 20  erStep->pNext;. 
6340: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
6350: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6e  AddOp2(v, OP_Con
6360: 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a  textPop, 0, 0);.
6370: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
6380: 2c 20 22 65 6e 64 20 74 72 69 67 67 65 72 20 25  , "end trigger %
6390: 73 22 2c 20 70 53 74 65 70 4c 69 73 74 2d 3e 70  s", pStepList->p
63a0: 54 72 69 67 2d 3e 6e 61 6d 65 29 29 3b 0a 0a 20  Trig->name));.. 
63b0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
63c0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
63d0: 65 64 20 74 6f 20 63 6f 64 65 20 46 4f 52 20 45  ed to code FOR E
63e0: 41 43 48 20 52 4f 57 20 74 72 69 67 67 65 72 73  ACH ROW triggers
63f0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
6400: 20 63 6f 64 65 20 74 68 61 74 20 74 68 69 73 20   code that this 
6410: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
6420: 65 73 20 69 73 20 65 78 65 63 75 74 65 64 2c 20  es is executed, 
6430: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  the following .*
6440: 2a 20 6d 75 73 74 20 62 65 20 74 72 75 65 3a 0a  * must be true:.
6450: 2a 2a 0a 2a 2a 20 31 2e 20 4e 6f 20 63 75 72 73  **.** 1. No curs
6460: 6f 72 73 20 6d 61 79 20 62 65 20 6f 70 65 6e 20  ors may be open 
6470: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
6480: 62 61 73 65 2e 20 20 28 42 75 74 20 6e 65 77 49  base.  (But newI
6490: 64 78 20 61 6e 64 20 6f 6c 64 49 64 78 0a 2a 2a  dx and oldIdx.**
64a0: 20 20 20 20 63 61 6e 20 62 65 20 69 6e 64 69 63      can be indic
64b0: 65 73 20 6f 66 20 63 75 72 73 6f 72 73 20 69 6e  es of cursors in
64c0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
64d0: 73 2e 20 20 53 65 65 20 62 65 6c 6f 77 2e 29 0a  s.  See below.).
64e0: 2a 2a 0a 2a 2a 20 32 2e 20 49 66 20 74 68 65 20  **.** 2. If the 
64f0: 74 72 69 67 67 65 72 73 20 62 65 69 6e 67 20 63  triggers being c
6500: 6f 64 65 64 20 61 72 65 20 4f 4e 20 49 4e 53 45  oded are ON INSE
6510: 52 54 20 6f 72 20 4f 4e 20 55 50 44 41 54 45 20  RT or ON UPDATE 
6520: 74 72 69 67 67 65 72 73 2c 20 74 68 65 6e 0a 2a  triggers, then.*
6530: 2a 20 20 20 20 61 20 74 65 6d 70 6f 72 61 72 79  *    a temporary
6540: 20 76 64 62 65 20 63 75 72 73 6f 72 20 28 69 6e   vdbe cursor (in
6550: 64 65 78 20 6e 65 77 49 64 78 29 20 6d 75 73 74  dex newIdx) must
6560: 20 62 65 20 6f 70 65 6e 20 61 6e 64 20 70 6f 69   be open and poi
6570: 6e 74 69 6e 67 20 61 74 0a 2a 2a 20 20 20 20 61  nting at.**    a
6580: 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
6590: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62  values to be sub
65a0: 73 74 69 74 75 74 65 64 20 66 6f 72 20 6e 65 77  stituted for new
65b0: 2e 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  .* expressions i
65c0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 74 72 69 67  n the.**    trig
65d0: 67 65 72 20 70 72 6f 67 72 61 6d 28 73 29 2e 0a  ger program(s)..
65e0: 2a 2a 0a 2a 2a 20 33 2e 20 49 66 20 74 68 65 20  **.** 3. If the 
65f0: 74 72 69 67 67 65 72 73 20 62 65 69 6e 67 20 63  triggers being c
6600: 6f 64 65 64 20 61 72 65 20 4f 4e 20 44 45 4c 45  oded are ON DELE
6610: 54 45 20 6f 72 20 4f 4e 20 55 50 44 41 54 45 20  TE or ON UPDATE 
6620: 74 72 69 67 67 65 72 73 2c 20 74 68 65 6e 0a 2a  triggers, then.*
6630: 2a 20 20 20 20 61 20 74 65 6d 70 6f 72 61 72 79  *    a temporary
6640: 20 76 64 62 65 20 63 75 72 73 6f 72 20 28 69 6e   vdbe cursor (in
6650: 64 65 78 20 6f 6c 64 49 64 78 29 20 6d 75 73 74  dex oldIdx) must
6660: 20 62 65 20 6f 70 65 6e 20 61 6e 64 20 70 6f 69   be open and poi
6670: 6e 74 69 6e 67 20 61 74 0a 2a 2a 20 20 20 20 61  nting at.**    a
6680: 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
6690: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62  values to be sub
66a0: 73 74 69 74 75 74 65 64 20 66 6f 72 20 6f 6c 64  stituted for old
66b0: 2e 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  .* expressions i
66c0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 74 72 69 67  n the.**    trig
66d0: 67 65 72 20 70 72 6f 67 72 61 6d 28 73 29 2e 0a  ger program(s)..
66e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 79 20 61 72  **.** If they ar
66f0: 65 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  e not NULL, the 
6700: 70 69 4f 6c 64 43 6f 6c 4d 61 73 6b 20 61 6e 64  piOldColMask and
6710: 20 70 69 4e 65 77 43 6f 6c 4d 61 73 6b 20 6f 75   piNewColMask ou
6720: 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 0a 2a  tput variables.*
6730: 2a 20 61 72 65 20 73 65 74 20 74 6f 20 76 61 6c  * are set to val
6740: 75 65 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ues that describ
6750: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 75 73  e the columns us
6760: 65 64 20 62 79 20 74 68 65 20 74 72 69 67 67 65  ed by the trigge
6770: 72 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 69 6e 20  r program.** in 
6780: 74 68 65 20 4f 4c 44 2e 2a 20 61 6e 64 20 4e 45  the OLD.* and NE
6790: 57 2e 2a 20 74 61 62 6c 65 73 20 72 65 73 70 65  W.* tables respe
67a0: 63 74 69 76 65 6c 79 2e 20 49 66 20 63 6f 6c 75  ctively. If colu
67b0: 6d 6e 20 4e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mn N of the .** 
67c0: 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 69 73 20  pseudo-table is 
67d0: 72 65 61 64 20 61 74 20 6c 65 61 73 74 20 6f 6e  read at least on
67e0: 63 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ce, the correspo
67f0: 6e 64 69 6e 67 20 62 69 74 20 6f 66 20 74 68 65  nding bit of the
6800: 20 6f 75 74 70 75 74 0a 2a 2a 20 6d 61 73 6b 20   output.** mask 
6810: 69 73 20 73 65 74 2e 20 49 66 20 61 20 63 6f 6c  is set. If a col
6820: 75 6d 6e 20 77 69 74 68 20 61 6e 20 69 6e 64 65  umn with an inde
6830: 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 33  x greater than 3
6840: 32 20 69 73 20 72 65 61 64 2c 20 74 68 65 0a 2a  2 is read, the.*
6850: 2a 20 6f 75 74 70 75 74 20 6d 61 73 6b 20 69 73  * output mask is
6860: 20 73 65 74 20 74 6f 20 74 68 65 20 73 70 65 63   set to the spec
6870: 69 61 6c 20 76 61 6c 75 65 20 30 78 66 66 66 66  ial value 0xffff
6880: 66 66 66 66 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  ffff..**.*/.int 
6890: 73 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72  sqlite3CodeRowTr
68a0: 69 67 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a  igger(.  Parse *
68b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
68c0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
68d0: 2f 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  /.  Trigger *pTr
68e0: 69 67 67 65 72 2c 20 20 20 2f 2a 20 4c 69 73 74  igger,   /* List
68f0: 20 6f 66 20 74 72 69 67 67 65 72 73 20 6f 6e 20   of triggers on 
6900: 74 61 62 6c 65 20 70 54 61 62 20 2a 2f 0a 20 20  table pTab */.  
6910: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
6920: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
6930: 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f 49 4e 53  K_UPDATE, TK_INS
6940: 45 52 54 2c 20 54 4b 5f 44 45 4c 45 54 45 20 2a  ERT, TK_DELETE *
6950: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43  /.  ExprList *pC
6960: 68 61 6e 67 65 73 2c 20 20 2f 2a 20 43 68 61 6e  hanges,  /* Chan
6970: 67 65 73 20 6c 69 73 74 20 66 6f 72 20 61 6e 79  ges list for any
6980: 20 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67   UPDATE OF trigg
6990: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f  ers */.  int tr_
69a0: 74 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tm,           /*
69b0: 20 4f 6e 65 20 6f 66 20 54 52 49 47 47 45 52 5f   One of TRIGGER_
69c0: 42 45 46 4f 52 45 2c 20 54 52 49 47 47 45 52 5f  BEFORE, TRIGGER_
69d0: 41 46 54 45 52 20 2a 2f 0a 20 20 54 61 62 6c 65  AFTER */.  Table
69e0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
69f0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20  /* The table to 
6a00: 63 6f 64 65 20 74 72 69 67 67 65 72 73 20 66 72  code triggers fr
6a10: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 49  om */.  int newI
6a20: 64 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx,          /* 
6a30: 54 68 65 20 69 6e 64 69 63 65 20 6f 66 20 74 68  The indice of th
6a40: 65 20 22 6e 65 77 22 20 72 6f 77 20 74 6f 20 61  e "new" row to a
6a50: 63 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6f  ccess */.  int o
6a60: 6c 64 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  ldIdx,          
6a70: 2f 2a 20 54 68 65 20 69 6e 64 69 63 65 20 6f 66  /* The indice of
6a80: 20 74 68 65 20 22 6f 6c 64 22 20 72 6f 77 20 74   the "old" row t
6a90: 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 69 6e  o access */.  in
6aa0: 74 20 6f 72 63 6f 6e 66 2c 20 20 20 20 20 20 20  t orconf,       
6ab0: 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     /* ON CONFLIC
6ac0: 54 20 70 6f 6c 69 63 79 20 2a 2f 0a 20 20 69 6e  T policy */.  in
6ad0: 74 20 69 67 6e 6f 72 65 4a 75 6d 70 2c 20 20 20  t ignoreJump,   
6ae0: 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f     /* Instructio
6af0: 6e 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72  n to jump to for
6b00: 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29 20 2a   RAISE(IGNORE) *
6b10: 2f 0a 20 20 75 33 32 20 2a 70 69 4f 6c 64 43 6f  /.  u32 *piOldCo
6b20: 6c 4d 61 73 6b 2c 20 20 20 2f 2a 20 4f 55 54 3a  lMask,   /* OUT:
6b30: 20 4d 61 73 6b 20 6f 66 20 63 6f 6c 75 6d 6e 73   Mask of columns
6b40: 20 75 73 65 64 20 66 72 6f 6d 20 74 68 65 20 4f   used from the O
6b50: 4c 44 2e 2a 20 74 61 62 6c 65 20 2a 2f 0a 20 20  LD.* table */.  
6b60: 75 33 32 20 2a 70 69 4e 65 77 43 6f 6c 4d 61 73  u32 *piNewColMas
6b70: 6b 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73  k    /* OUT: Mas
6b80: 6b 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65  k of columns use
6b90: 64 20 66 72 6f 6d 20 74 68 65 20 4e 45 57 2e 2a  d from the NEW.*
6ba0: 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 54   table */.){.  T
6bb0: 72 69 67 67 65 72 20 2a 70 3b 0a 20 20 73 71 6c  rigger *p;.  sql
6bc0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6bd0: 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72  e->db;.  Trigger
6be0: 53 74 61 63 6b 20 74 72 69 67 53 74 61 63 6b 45  Stack trigStackE
6bf0: 6e 74 72 79 3b 0a 0a 20 20 74 72 69 67 53 74 61  ntry;..  trigSta
6c00: 63 6b 45 6e 74 72 79 2e 6f 6c 64 43 6f 6c 4d 61  ckEntry.oldColMa
6c10: 73 6b 20 3d 20 30 3b 0a 20 20 74 72 69 67 53 74  sk = 0;.  trigSt
6c20: 61 63 6b 45 6e 74 72 79 2e 6e 65 77 43 6f 6c 4d  ackEntry.newColM
6c30: 61 73 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ask = 0;..  asse
6c40: 72 74 28 6f 70 20 3d 3d 20 54 4b 5f 55 50 44 41  rt(op == TK_UPDA
6c50: 54 45 20 7c 7c 20 6f 70 20 3d 3d 20 54 4b 5f 49  TE || op == TK_I
6c60: 4e 53 45 52 54 20 7c 7c 20 6f 70 20 3d 3d 20 54  NSERT || op == T
6c70: 4b 5f 44 45 4c 45 54 45 29 3b 0a 20 20 61 73 73  K_DELETE);.  ass
6c80: 65 72 74 28 74 72 5f 74 6d 20 3d 3d 20 54 52 49  ert(tr_tm == TRI
6c90: 47 47 45 52 5f 42 45 46 4f 52 45 20 7c 7c 20 74  GGER_BEFORE || t
6ca0: 72 5f 74 6d 20 3d 3d 20 54 52 49 47 47 45 52 5f  r_tm == TRIGGER_
6cb0: 41 46 54 45 52 20 29 3b 0a 0a 20 20 61 73 73 65  AFTER );..  asse
6cc0: 72 74 28 6e 65 77 49 64 78 20 21 3d 20 2d 31 20  rt(newIdx != -1 
6cd0: 7c 7c 20 6f 6c 64 49 64 78 20 21 3d 20 2d 31 29  || oldIdx != -1)
6ce0: 3b 0a 0a 20 20 66 6f 72 28 70 3d 70 54 72 69 67  ;..  for(p=pTrig
6cf0: 67 65 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  ger; p; p=p->pNe
6d00: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 66 69 72  xt){.    int fir
6d10: 65 5f 74 68 69 73 20 3d 20 30 3b 0a 0a 20 20 20  e_this = 0;..   
6d20: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
6d30: 69 6e 67 3a 20 20 54 68 65 20 73 63 68 65 6d 61  ing:  The schema
6d40: 20 66 6f 72 20 74 68 65 20 74 72 69 67 67 65 72   for the trigger
6d50: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 61 62   and for the tab
6d60: 6c 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c  le are.    ** al
6d70: 77 61 79 73 20 64 65 66 69 6e 65 64 2e 20 20 54  ways defined.  T
6d80: 68 65 20 74 72 69 67 67 65 72 20 6d 75 73 74 20  he trigger must 
6d90: 62 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 73  be in the same s
6da0: 63 68 65 6d 61 20 61 73 20 74 68 65 20 74 61 62  chema as the tab
6db0: 6c 65 0a 20 20 20 20 2a 2a 20 6f 72 20 65 6c 73  le.    ** or els
6dc0: 65 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 54  e it must be a T
6dd0: 45 4d 50 20 74 72 69 67 67 65 72 2e 20 2a 2f 0a  EMP trigger. */.
6de0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
6df0: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
6e00: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62   assert( p->pTab
6e10: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
6e20: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68   assert( p->pSch
6e30: 65 6d 61 3d 3d 70 2d 3e 70 54 61 62 53 63 68 65  ema==p->pTabSche
6e40: 6d 61 20 7c 7c 20 70 2d 3e 70 53 63 68 65 6d 61  ma || p->pSchema
6e50: 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
6e60: 68 65 6d 61 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  hema );..    /* 
6e70: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
6e80: 72 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 64 65  r we should code
6e90: 20 74 68 69 73 20 74 72 69 67 67 65 72 20 2a 2f   this trigger */
6ea0: 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20  .    if( .      
6eb0: 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 0a 20 20  p->op==op && .  
6ec0: 20 20 20 20 70 2d 3e 74 72 5f 74 6d 3d 3d 74 72      p->tr_tm==tr
6ed0: 5f 74 6d 20 26 26 20 0a 20 20 20 20 20 20 63 68  _tm && .      ch
6ee0: 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70  eckColumnOverlap
6ef0: 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 70 43 68  (p->pColumns,pCh
6f00: 61 6e 67 65 73 29 0a 20 20 20 20 29 7b 0a 20 20  anges).    ){.  
6f10: 20 20 20 20 54 72 69 67 67 65 72 53 74 61 63 6b      TriggerStack
6f20: 20 2a 70 53 3b 20 20 20 20 20 20 2f 2a 20 50 6f   *pS;      /* Po
6f30: 69 6e 74 65 72 20 74 6f 20 74 72 69 67 67 65 72  inter to trigger
6f40: 2d 73 74 61 63 6b 20 65 6e 74 72 79 20 2a 2f 0a  -stack entry */.
6f50: 20 20 20 20 20 20 66 6f 72 28 70 53 3d 70 50 61        for(pS=pPa
6f60: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 20  rse->trigStack; 
6f70: 70 53 20 26 26 20 70 21 3d 70 53 2d 3e 70 54 72  pS && p!=pS->pTr
6f80: 69 67 67 65 72 3b 20 70 53 3d 70 53 2d 3e 70 4e  igger; pS=pS->pN
6f90: 65 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28  ext){}.      if(
6fa0: 20 21 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20   !pS ){.        
6fb0: 66 69 72 65 5f 74 68 69 73 20 3d 20 31 3b 0a 20  fire_this = 1;. 
6fc0: 20 20 20 20 20 7d 0a 23 69 66 20 30 20 20 20 20       }.#if 0    
6fd0: 2f 2a 20 47 69 76 65 20 6e 6f 20 77 61 72 6e 69  /* Give no warni
6fe0: 6e 67 20 66 6f 72 20 72 65 63 75 72 73 69 76 65  ng for recursive
6ff0: 20 74 72 69 67 67 65 72 73 2e 20 20 4a 75 73 74   triggers.  Just
7000: 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 6d 20   do not do them 
7010: 2a 2f 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a 20  */.      else{. 
7020: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7030: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7040: 72 65 63 75 72 73 69 76 65 20 74 72 69 67 67 65  recursive trigge
7050: 72 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  rs not supported
7060: 20 28 25 73 29 22 2c 0a 20 20 20 20 20 20 20 20   (%s)",.        
7070: 20 20 20 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20      p->name);.  
7080: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7090: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
70a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
70b0: 20 0a 20 20 20 20 69 66 28 20 66 69 72 65 5f 74   .    if( fire_t
70c0: 68 69 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  his ){.      int
70d0: 20 65 6e 64 54 72 69 67 67 65 72 3b 0a 20 20 20   endTrigger;.   
70e0: 20 20 20 45 78 70 72 20 2a 20 77 68 65 6e 45 78     Expr * whenEx
70f0: 70 72 3b 0a 20 20 20 20 20 20 41 75 74 68 43 6f  pr;.      AuthCo
7100: 6e 74 65 78 74 20 73 43 6f 6e 74 65 78 74 3b 0a  ntext sContext;.
7110: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
7120: 74 20 73 4e 43 3b 0a 0a 23 69 66 6e 64 65 66 20  t sNC;..#ifndef 
7130: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
7140: 45 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  E.      sqlite3V
7150: 64 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65  dbeAddOp4(pParse
7160: 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 54 72 61 63  ->pVdbe, OP_Trac
7170: 65 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  e, 0, 0, 0,.    
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
71a0: 74 66 28 64 62 2c 20 22 2d 2d 20 54 52 49 47 47  tf(db, "-- TRIGG
71b0: 45 52 20 25 73 22 2c 20 70 2d 3e 6e 61 6d 65 29  ER %s", p->name)
71c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
71d0: 20 20 20 20 20 20 20 20 20 20 50 34 5f 44 59 4e            P4_DYN
71e0: 41 4d 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  AMIC);.#endif.  
71f0: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
7200: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
7210: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72  ;.      sNC.pPar
7220: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 0a 20 20  se = pParse;..  
7230: 20 20 20 20 2f 2a 20 50 75 73 68 20 61 6e 20 65      /* Push an e
7240: 6e 74 72 79 20 6f 6e 20 74 6f 20 74 68 65 20 74  ntry on to the t
7250: 72 69 67 67 65 72 20 73 74 61 63 6b 20 2a 2f 0a  rigger stack */.
7260: 20 20 20 20 20 20 74 72 69 67 53 74 61 63 6b 45        trigStackE
7270: 6e 74 72 79 2e 70 54 72 69 67 67 65 72 20 3d 20  ntry.pTrigger = 
7280: 70 3b 0a 20 20 20 20 20 20 74 72 69 67 53 74 61  p;.      trigSta
7290: 63 6b 45 6e 74 72 79 2e 6e 65 77 49 64 78 20 3d  ckEntry.newIdx =
72a0: 20 6e 65 77 49 64 78 3b 0a 20 20 20 20 20 20 74   newIdx;.      t
72b0: 72 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 6f 6c  rigStackEntry.ol
72c0: 64 49 64 78 20 3d 20 6f 6c 64 49 64 78 3b 0a 20  dIdx = oldIdx;. 
72d0: 20 20 20 20 20 74 72 69 67 53 74 61 63 6b 45 6e       trigStackEn
72e0: 74 72 79 2e 70 54 61 62 20 3d 20 70 54 61 62 3b  try.pTab = pTab;
72f0: 0a 20 20 20 20 20 20 74 72 69 67 53 74 61 63 6b  .      trigStack
7300: 45 6e 74 72 79 2e 70 4e 65 78 74 20 3d 20 70 50  Entry.pNext = pP
7310: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b  arse->trigStack;
7320: 0a 20 20 20 20 20 20 74 72 69 67 53 74 61 63 6b  .      trigStack
7330: 45 6e 74 72 79 2e 69 67 6e 6f 72 65 4a 75 6d 70  Entry.ignoreJump
7340: 20 3d 20 69 67 6e 6f 72 65 4a 75 6d 70 3b 0a 20   = ignoreJump;. 
7350: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 74 72 69       pParse->tri
7360: 67 53 74 61 63 6b 20 3d 20 26 74 72 69 67 53 74  gStack = &trigSt
7370: 61 63 6b 45 6e 74 72 79 3b 0a 20 20 20 20 20 20  ackEntry;.      
7380: 73 71 6c 69 74 65 33 41 75 74 68 43 6f 6e 74 65  sqlite3AuthConte
7390: 78 74 50 75 73 68 28 70 50 61 72 73 65 2c 20 26  xtPush(pParse, &
73a0: 73 43 6f 6e 74 65 78 74 2c 20 70 2d 3e 6e 61 6d  sContext, p->nam
73b0: 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6f  e);..      /* co
73c0: 64 65 20 74 68 65 20 57 48 45 4e 20 63 6c 61 75  de the WHEN clau
73d0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 65 6e 64 54  se */.      endT
73e0: 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33  rigger = sqlite3
73f0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
7400: 61 72 73 65 2d 3e 70 56 64 62 65 29 3b 0a 20 20  arse->pVdbe);.  
7410: 20 20 20 20 77 68 65 6e 45 78 70 72 20 3d 20 73      whenExpr = s
7420: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7430: 2c 20 70 2d 3e 70 57 68 65 6e 2c 20 30 29 3b 0a  , p->pWhen, 0);.
7440: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
7450: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71  llocFailed || sq
7460: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
7470: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 77 68 65 6e  Names(&sNC, when
7480: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
7490: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
74a0: 63 6b 20 3d 20 74 72 69 67 53 74 61 63 6b 45 6e  ck = trigStackEn
74b0: 74 72 79 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20  try.pNext;.     
74c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
74d0: 6c 65 74 65 28 64 62 2c 20 77 68 65 6e 45 78 70  lete(db, whenExp
74e0: 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  r);.        retu
74f0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
7500: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
7510: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 77  fFalse(pParse, w
7520: 68 65 6e 45 78 70 72 2c 20 65 6e 64 54 72 69 67  henExpr, endTrig
7530: 67 65 72 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ger, SQLITE_JUMP
7540: 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
7550: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7560: 28 64 62 2c 20 77 68 65 6e 45 78 70 72 29 3b 0a  (db, whenExpr);.
7570: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
7580: 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
7590: 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 54  se);.      codeT
75a0: 72 69 67 67 65 72 50 72 6f 67 72 61 6d 28 70 50  riggerProgram(pP
75b0: 61 72 73 65 2c 20 70 2d 3e 73 74 65 70 5f 6c 69  arse, p->step_li
75c0: 73 74 2c 20 6f 72 63 6f 6e 66 29 3b 20 0a 20 20  st, orconf); .  
75d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
75e0: 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
75f0: 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 50 6f  1);..      /* Po
7600: 70 20 74 68 65 20 65 6e 74 72 79 20 6f 66 66 20  p the entry off 
7610: 74 68 65 20 74 72 69 67 67 65 72 20 73 74 61 63  the trigger stac
7620: 6b 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73  k */.      pPars
7630: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 74  e->trigStack = t
7640: 72 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 70 4e  rigStackEntry.pN
7650: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
7660: 65 33 41 75 74 68 43 6f 6e 74 65 78 74 50 6f 70  e3AuthContextPop
7670: 28 26 73 43 6f 6e 74 65 78 74 29 3b 0a 0a 20 20  (&sContext);..  
7680: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
7690: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 70 50 61 72  esolveLabel(pPar
76a0: 73 65 2d 3e 70 56 64 62 65 2c 20 65 6e 64 54 72  se->pVdbe, endTr
76b0: 69 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  igger);.    }.  
76c0: 7d 0a 20 20 69 66 28 20 70 69 4f 6c 64 43 6f 6c  }.  if( piOldCol
76d0: 4d 61 73 6b 20 29 20 2a 70 69 4f 6c 64 43 6f 6c  Mask ) *piOldCol
76e0: 4d 61 73 6b 20 7c 3d 20 74 72 69 67 53 74 61 63  Mask |= trigStac
76f0: 6b 45 6e 74 72 79 2e 6f 6c 64 43 6f 6c 4d 61 73  kEntry.oldColMas
7700: 6b 3b 0a 20 20 69 66 28 20 70 69 4e 65 77 43 6f  k;.  if( piNewCo
7710: 6c 4d 61 73 6b 20 29 20 2a 70 69 4e 65 77 43 6f  lMask ) *piNewCo
7720: 6c 4d 61 73 6b 20 7c 3d 20 74 72 69 67 53 74 61  lMask |= trigSta
7730: 63 6b 45 6e 74 72 79 2e 6e 65 77 43 6f 6c 4d 61  ckEntry.newColMa
7740: 73 6b 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  sk;.  return 0;.
7750: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
7760: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7770: 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a           _TRIGGER) */.