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

Artifact 5dcdcf5c719bfd1a58f98265d7c024b8c12e2dc1:


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 33  trigger.c,v 1.13
0180: 38 20 32 30 30 39 2f 30 35 2f 30 36 20 31 38 3a  8 2009/05/06 18:
0190: 34 32 3a 32 31 20 64 72 68 20 45 78 70 20 24 0a  42:21 drh Exp $.
01a0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
01b0: 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e 64  iteInt.h"..#ifnd
01c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
01d0: 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 44 65 6c  RIGGER./*.** Del
01e0: 65 74 65 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73  ete a linked lis
01f0: 74 20 6f 66 20 54 72 69 67 67 65 72 53 74 65 70  t of TriggerStep
0200: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
0210: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
0220: 74 65 54 72 69 67 67 65 72 53 74 65 70 28 73 71  teTriggerStep(sq
0230: 6c 69 74 65 33 20 2a 64 62 2c 20 54 72 69 67 67  lite3 *db, Trigg
0240: 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72  erStep *pTrigger
0250: 53 74 65 70 29 7b 0a 20 20 77 68 69 6c 65 28 20  Step){.  while( 
0260: 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a  pTriggerStep ){.
0270: 20 20 20 20 54 72 69 67 67 65 72 53 74 65 70 20      TriggerStep 
0280: 2a 20 70 54 6d 70 20 3d 20 70 54 72 69 67 67 65  * pTmp = pTrigge
0290: 72 53 74 65 70 3b 0a 20 20 20 20 70 54 72 69 67  rStep;.    pTrig
02a0: 67 65 72 53 74 65 70 20 3d 20 70 54 72 69 67 67  gerStep = pTrigg
02b0: 65 72 53 74 65 70 2d 3e 70 4e 65 78 74 3b 0a 0a  erStep->pNext;..
02c0: 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 74 61      if( pTmp->ta
02d0: 72 67 65 74 2e 64 79 6e 20 29 20 73 71 6c 69 74  rget.dyn ) sqlit
02e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 28 63 68  e3DbFree(db, (ch
02f0: 61 72 2a 29 70 54 6d 70 2d 3e 74 61 72 67 65 74  ar*)pTmp->target
0300: 2e 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  .z);.    sqlite3
0310: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0320: 54 6d 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Tmp->pWhere);.  
0330: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0340: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6d 70  tDelete(db, pTmp
0350: 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b 0a 20 20  ->pExprList);.  
0360: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 54 6d 70 2d 3e  elete(db, pTmp->
0380: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
0390: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
03a0: 65 28 64 62 2c 20 70 54 6d 70 2d 3e 70 49 64 4c  e(db, pTmp->pIdL
03b0: 69 73 74 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  ist);..    sqlit
03c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d  e3DbFree(db, pTm
03d0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
03e0: 20 47 69 76 65 6e 20 74 61 62 6c 65 20 70 54 61   Given table pTa
03f0: 62 2c 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74  b, return a list
0400: 20 6f 66 20 61 6c 6c 20 74 68 65 20 74 72 69 67   of all the trig
0410: 67 65 72 73 20 61 74 74 61 63 68 65 64 20 74 6f  gers attached to
0420: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 20   .** the table. 
0430: 54 68 65 20 6c 69 73 74 20 69 73 20 63 6f 6e 6e  The list is conn
0440: 65 63 74 65 64 20 62 79 20 54 72 69 67 67 65 72  ected by Trigger
0450: 2e 70 4e 65 78 74 20 70 6f 69 6e 74 65 72 73 2e  .pNext pointers.
0460: 0a 2a 2f 0a 54 72 69 67 67 65 72 20 2a 73 71 6c  .*/.Trigger *sql
0470: 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
0480: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
0490: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 53  able *pTab){.  S
04a0: 63 68 65 6d 61 20 2a 20 63 6f 6e 73 74 20 70 54  chema * const pT
04b0: 6d 70 53 63 68 65 6d 61 20 3d 20 70 50 61 72 73  mpSchema = pPars
04c0: 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  e->db->aDb[1].pS
04d0: 63 68 65 6d 61 3b 0a 20 20 54 72 69 67 67 65 72  chema;.  Trigger
04e0: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 20   *pList = 0;    
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0500: 20 4c 69 73 74 20 6f 66 20 74 72 69 67 67 65 72   List of trigger
0510: 73 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  s to return */..
0520: 20 20 69 66 28 20 70 54 6d 70 53 63 68 65 6d 61    if( pTmpSchema
0530: 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  !=pTab->pSchema 
0540: 29 7b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20  ){.    HashElem 
0550: 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71  *p;.    for(p=sq
0560: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
0570: 54 6d 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48  TmpSchema->trigH
0580: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
0590: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
05a0: 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54       Trigger *pT
05b0: 72 69 67 20 3d 20 28 54 72 69 67 67 65 72 20 2a  rig = (Trigger *
05c0: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
05d0: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  p);.      if( pT
05e0: 72 69 67 2d 3e 70 54 61 62 53 63 68 65 6d 61 3d  rig->pTabSchema=
05f0: 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 0a 20  =pTab->pSchema. 
0600: 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
0610: 74 65 33 53 74 72 49 43 6d 70 28 70 54 72 69 67  te3StrICmp(pTrig
0620: 2d 3e 74 61 62 6c 65 2c 20 70 54 61 62 2d 3e 7a  ->table, pTab->z
0630: 4e 61 6d 65 29 20 0a 20 20 20 20 20 20 29 7b 0a  Name) .      ){.
0640: 20 20 20 20 20 20 20 20 70 54 72 69 67 2d 3e 70          pTrig->p
0650: 4e 65 78 74 20 3d 20 28 70 4c 69 73 74 20 3f 20  Next = (pList ? 
0660: 70 4c 69 73 74 20 3a 20 70 54 61 62 2d 3e 70 54  pList : pTab->pT
0670: 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 20  rigger);.       
0680: 20 70 4c 69 73 74 20 3d 20 70 54 72 69 67 3b 0a   pList = pTrig;.
0690: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
06a0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69  }..  return (pLi
06b0: 73 74 20 3f 20 70 4c 69 73 74 20 3a 20 70 54 61  st ? pList : pTa
06c0: 62 2d 3e 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a  b->pTrigger);.}.
06d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
06e0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
06f0: 73 65 72 20 77 68 65 6e 20 69 74 20 73 65 65 73  ser when it sees
0700: 20 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45   a CREATE TRIGGE
0710: 52 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 75  R statement.** u
0720: 70 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 20 6f  p to the point o
0730: 66 20 74 68 65 20 42 45 47 49 4e 20 62 65 66 6f  f the BEGIN befo
0740: 72 65 20 74 68 65 20 74 72 69 67 67 65 72 20 61  re the trigger a
0750: 63 74 69 6f 6e 73 2e 20 20 41 20 54 72 69 67 67  ctions.  A Trigg
0760: 65 72 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  er.** structure 
0770: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 61 73  is generated bas
0780: 65 64 20 6f 6e 20 74 68 65 20 69 6e 66 6f 72 6d  ed on the inform
0790: 61 74 69 6f 6e 20 61 76 61 69 6c 61 62 6c 65 20  ation available 
07a0: 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  and stored.** in
07b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69   pParse->pNewTri
07c0: 67 67 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  gger.  After the
07d0: 20 74 72 69 67 67 65 72 20 61 63 74 69 6f 6e 73   trigger actions
07e0: 20 68 61 76 65 20 62 65 65 6e 20 70 61 72 73 65   have been parse
07f0: 64 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  d, the.** sqlite
0800: 33 46 69 6e 69 73 68 54 72 69 67 67 65 72 28 29  3FinishTrigger()
0810: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
0820: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
0830: 74 68 65 20 74 72 69 67 67 65 72 0a 2a 2a 20 63  the trigger.** c
0840: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 70 72 6f 63  onstruction proc
0850: 65 73 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ess..*/.void sql
0860: 69 74 65 33 42 65 67 69 6e 54 72 69 67 67 65 72  ite3BeginTrigger
0870: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0880: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  e,      /* The p
0890: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 6f 66 20  arse context of 
08a0: 74 68 65 20 43 52 45 41 54 45 20 54 52 49 47 47  the CREATE TRIGG
08b0: 45 52 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ER statement */.
08c0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
08d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d        /* The nam
08e0: 65 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72  e of the trigger
08f0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
0900: 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me2,      /* The
0910: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 72 69   name of the tri
0920: 67 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 72  gger */.  int tr
0930: 5f 74 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  _tm,          /*
0940: 20 4f 6e 65 20 6f 66 20 54 4b 5f 42 45 46 4f 52   One of TK_BEFOR
0950: 45 2c 20 54 4b 5f 41 46 54 45 52 2c 20 54 4b 5f  E, TK_AFTER, TK_
0960: 49 4e 53 54 45 41 44 20 2a 2f 0a 20 20 69 6e 74  INSTEAD */.  int
0970: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
0980: 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 49 4e   /* One of TK_IN
0990: 53 45 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 2c  SERT, TK_UPDATE,
09a0: 20 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20   TK_DELETE */.  
09b0: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73  IdList *pColumns
09c0: 2c 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6c 69  ,   /* column li
09d0: 73 74 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  st if this is an
09e0: 20 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67   UPDATE OF trigg
09f0: 65 72 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  er */.  SrcList 
0a00: 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 2f 2a 20 54  *pTableName,/* T
0a10: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
0a20: 61 62 6c 65 2f 76 69 65 77 20 74 68 65 20 74 72  able/view the tr
0a30: 69 67 67 65 72 20 61 70 70 6c 69 65 73 20 74 6f  igger applies to
0a40: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0a50: 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45  n,        /* WHE
0a60: 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  N clause */.  in
0a70: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20  t isTemp,       
0a80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
0a90: 20 54 45 4d 50 4f 52 41 52 59 20 6b 65 79 77 6f   TEMPORARY keywo
0aa0: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
0ab0: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
0ac0: 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65         /* Suppre
0ad0: 73 73 20 65 72 72 6f 72 73 20 69 66 20 74 68 65  ss errors if the
0ae0: 20 74 72 69 67 67 65 72 20 61 6c 72 65 61 64 79   trigger already
0af0: 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
0b00: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
0b10: 72 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a  r = 0;.  Table *
0b20: 70 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  pTab;.  char *zN
0b30: 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ame = 0;        
0b40: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0b50: 72 69 67 67 65 72 20 2a 2f 0a 20 20 73 71 6c 69  rigger */.  sqli
0b60: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0b70: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
0ba0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 72 69  to store the tri
0bb0: 67 67 65 72 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  gger in */.  Tok
0bc0: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 20 20  en *pName;      
0bd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 71 75       /* The unqu
0be0: 61 6c 69 66 69 65 64 20 64 62 20 6e 61 6d 65 20  alified db name 
0bf0: 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  */.  DbFixer sFi
0c00: 78 3b 0a 20 20 69 6e 74 20 69 54 61 62 44 62 3b  x;.  int iTabDb;
0c10: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ..  assert( pNam
0c20: 65 31 21 3d 30 20 29 3b 20 20 20 2f 2a 20 70 4e  e1!=0 );   /* pN
0c30: 61 6d 65 31 2d 3e 7a 20 6d 69 67 68 74 20 62 65  ame1->z might be
0c40: 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 6f 74 20 70   NULL, but not p
0c50: 4e 61 6d 65 31 20 69 74 73 65 6c 66 20 2a 2f 0a  Name1 itself */.
0c60: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 32    assert( pName2
0c70: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
0c80: 20 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 7c   op==TK_INSERT |
0c90: 7c 20 6f 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20  | op==TK_UPDATE 
0ca0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45  || op==TK_DELETE
0cb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
0cc0: 3e 30 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b  >0 && op<0xff );
0cd0: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b  .  if( isTemp ){
0ce0: 0a 20 20 20 20 2f 2a 20 49 66 20 54 45 4d 50 20  .    /* If TEMP 
0cf0: 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20 74  was specified, t
0d00: 68 65 6e 20 74 68 65 20 74 72 69 67 67 65 72 20  hen the trigger 
0d10: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
0d20: 71 75 61 6c 69 66 69 65 64 2e 20 2a 2f 0a 20 20  qualified. */.  
0d30: 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e    if( pName2->n>
0d40: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
0d50: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
0d60: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 72  e, "temporary tr
0d70: 69 67 67 65 72 20 6d 61 79 20 6e 6f 74 20 68 61  igger may not ha
0d80: 76 65 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d  ve qualified nam
0d90: 65 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  e");.      goto 
0da0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
0db0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 44 62 20 3d  .    }.    iDb =
0dc0: 20 31 3b 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20   1;.    pName = 
0dd0: 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b  pName1;.  }else{
0de0: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
0df0: 75 74 20 74 68 65 20 64 62 20 74 68 61 74 20 74  ut the db that t
0e00: 68 65 20 74 68 65 20 74 72 69 67 67 65 72 20 77  he the trigger w
0e10: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 69  ill be created i
0e20: 6e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  n */.    iDb = s
0e30: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
0e40: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
0e50: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
0e60: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
0e70: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74   ){.      goto t
0e80: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
0ea0: 49 66 20 74 68 65 20 74 72 69 67 67 65 72 20 6e  If the trigger n
0eb0: 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
0ec0: 69 65 64 2c 20 61 6e 64 20 74 68 65 20 74 61 62  ied, and the tab
0ed0: 6c 65 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  le is a temp tab
0ee0: 6c 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65  le,.  ** then se
0ef0: 74 20 69 44 62 20 74 6f 20 31 20 74 6f 20 63 72  t iDb to 1 to cr
0f00: 65 61 74 65 20 74 68 65 20 74 72 69 67 67 65 72  eate the trigger
0f10: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
0f20: 79 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  y database..  **
0f30: 20 49 66 20 73 71 6c 69 74 65 33 53 72 63 4c 69   If sqlite3SrcLi
0f40: 73 74 4c 6f 6f 6b 75 70 28 29 20 72 65 74 75 72  stLookup() retur
0f50: 6e 73 20 30 2c 20 69 6e 64 69 63 61 74 69 6e 67  ns 0, indicating
0f60: 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
0f70: 6e 6f 74 0a 20 20 2a 2a 20 65 78 69 73 74 2c 20  not.  ** exist, 
0f80: 74 68 65 20 65 72 72 6f 72 20 69 73 20 63 61 75  the error is cau
0f90: 67 68 74 20 62 79 20 74 68 65 20 62 6c 6f 63 6b  ght by the block
0fa0: 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69   below..  */.  i
0fb0: 66 28 20 21 70 54 61 62 6c 65 4e 61 6d 65 20 7c  f( !pTableName |
0fc0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
0fd0: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  ed ){.    goto t
0fe0: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
0ff0: 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c    }.  pTab = sql
1000: 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
1010: 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  p(pParse, pTable
1020: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 61  Name);.  if( pNa
1030: 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
1040: 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
1050: 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
1060: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 44  Schema ){.    iD
1070: 62 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b = 1;.  }..  /*
1080: 20 45 6e 73 75 72 65 20 74 68 65 20 74 61 62 6c   Ensure the tabl
1090: 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 20 64  e name matches d
10a0: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 61 6e 64  atabase name and
10b0: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
10c0: 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20  exists */.  if( 
10d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10e0: 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f   ) goto trigger_
10f0: 63 6c 65 61 6e 75 70 3b 0a 20 20 61 73 73 65 72  cleanup;.  asser
1100: 74 28 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e  t( pTableName->n
1110: 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
1120: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
1130: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
1140: 62 2c 20 22 74 72 69 67 67 65 72 22 2c 20 70 4e  b, "trigger", pN
1150: 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 73  ame) && .      s
1160: 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
1170: 28 26 73 46 69 78 2c 20 70 54 61 62 6c 65 4e 61  (&sFix, pTableNa
1180: 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  me) ){.    goto 
1190: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
11a0: 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71  .  }.  pTab = sq
11b0: 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
11c0: 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  up(pParse, pTabl
11d0: 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70  eName);.  if( !p
11e0: 54 61 62 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Tab ){.    /* Th
11f0: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
1200: 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 67   exist. */.    g
1210: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
1220: 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49  nup;.  }.  if( I
1230: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1240: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1250: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
1260: 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74 72 69  annot create tri
1270: 67 67 65 72 73 20 6f 6e 20 76 69 72 74 75 61 6c  ggers on virtual
1280: 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 67   tables");.    g
1290: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
12a0: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  nup;.  }..  /* C
12b0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 74 72  heck that the tr
12c0: 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 6e 6f  igger name is no
12d0: 74 20 72 65 73 65 72 76 65 64 20 61 6e 64 20 74  t reserved and t
12e0: 68 61 74 20 6e 6f 20 74 72 69 67 67 65 72 20 6f  hat no trigger o
12f0: 66 20 74 68 65 0a 20 20 2a 2a 20 73 70 65 63 69  f the.  ** speci
1300: 66 69 65 64 20 6e 61 6d 65 20 65 78 69 73 74 73  fied name exists
1310: 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71   */.  zName = sq
1320: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1330: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
1340: 20 69 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 53   if( !zName || S
1350: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1360: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
1370: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
1380: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67  ){.    goto trig
1390: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ger_cleanup;.  }
13a0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 48 61  .  if( sqlite3Ha
13b0: 73 68 46 69 6e 64 28 26 28 64 62 2d 3e 61 44 62  shFind(&(db->aDb
13c0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [iDb].pSchema->t
13d0: 72 69 67 48 61 73 68 29 2c 0a 20 20 20 20 20 20  rigHash),.      
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74  zName, sqlite3St
1400: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 29 20 29  rlen30(zName)) )
1410: 7b 0a 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72  {.    if( !noErr
1420: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1430: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1440: 2c 20 22 74 72 69 67 67 65 72 20 25 54 20 61 6c  , "trigger %T al
1450: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70  ready exists", p
1460: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
1470: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
1480: 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eanup;.  }..  /*
1490: 20 44 6f 20 6e 6f 74 20 63 72 65 61 74 65 20 61   Do not create a
14a0: 20 74 72 69 67 67 65 72 20 6f 6e 20 61 20 73 79   trigger on a sy
14b0: 73 74 65 6d 20 74 61 62 6c 65 20 2a 2f 0a 20 20  stem table */.  
14c0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
14d0: 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
14e0: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
14f0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1500: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1510: 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "cannot create 
1520: 74 72 69 67 67 65 72 20 6f 6e 20 73 79 73 74 65  trigger on syste
1530: 6d 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 70  m table");.    p
1540: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
1550: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
1560: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20  cleanup;.  }..  
1570: 2f 2a 20 49 4e 53 54 45 41 44 20 6f 66 20 74 72  /* INSTEAD of tr
1580: 69 67 67 65 72 73 20 61 72 65 20 6f 6e 6c 79 20  iggers are only 
1590: 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 76 69  for views and vi
15a0: 65 77 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  ews only support
15b0: 20 49 4e 53 54 45 41 44 0a 20 20 2a 2a 20 6f 66   INSTEAD.  ** of
15c0: 20 74 72 69 67 67 65 72 73 2e 0a 20 20 2a 2f 0a   triggers..  */.
15d0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
15e0: 65 63 74 20 26 26 20 74 72 5f 74 6d 21 3d 54 4b  ect && tr_tm!=TK
15f0: 5f 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20  _INSTEAD ){.    
1600: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1610: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
1620: 63 72 65 61 74 65 20 25 73 20 74 72 69 67 67 65  create %s trigge
1630: 72 20 6f 6e 20 76 69 65 77 3a 20 25 53 22 2c 20  r on view: %S", 
1640: 0a 20 20 20 20 20 20 20 20 28 74 72 5f 74 6d 20  .        (tr_tm 
1650: 3d 3d 20 54 4b 5f 42 45 46 4f 52 45 29 3f 22 42  == TK_BEFORE)?"B
1660: 45 46 4f 52 45 22 3a 22 41 46 54 45 52 22 2c 20  EFORE":"AFTER", 
1670: 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a  pTableName, 0);.
1680: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
1690: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
16a0: 69 66 28 20 21 70 54 61 62 2d 3e 70 53 65 6c 65  if( !pTab->pSele
16b0: 63 74 20 26 26 20 74 72 5f 74 6d 3d 3d 54 4b 5f  ct && tr_tm==TK_
16c0: 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73  INSTEAD ){.    s
16d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16e0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63  Parse, "cannot c
16f0: 72 65 61 74 65 20 49 4e 53 54 45 41 44 20 4f 46  reate INSTEAD OF
1700: 22 0a 20 20 20 20 20 20 20 20 22 20 74 72 69 67  ".        " trig
1710: 67 65 72 20 6f 6e 20 74 61 62 6c 65 3a 20 25 53  ger on table: %S
1720: 22 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30  ", pTableName, 0
1730: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67  );.    goto trig
1740: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ger_cleanup;.  }
1750: 0a 20 20 69 54 61 62 44 62 20 3d 20 73 71 6c 69  .  iTabDb = sqli
1760: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1770: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
1780: 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
1790: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
17a0: 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
17b0: 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
17c0: 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52  E_CREATE_TRIGGER
17d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
17e0: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
17f0: 69 54 61 62 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  iTabDb].zName;. 
1800: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1810: 44 62 54 72 69 67 20 3d 20 69 73 54 65 6d 70 20  DbTrig = isTemp 
1820: 3f 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61  ? db->aDb[1].zNa
1830: 6d 65 20 3a 20 7a 44 62 3b 0a 20 20 20 20 69 66  me : zDb;.    if
1840: 28 20 69 54 61 62 44 62 3d 3d 31 20 7c 7c 20 69  ( iTabDb==1 || i
1850: 73 54 65 6d 70 20 29 20 63 6f 64 65 20 3d 20 53  sTemp ) code = S
1860: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
1870: 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 69  P_TRIGGER;.    i
1880: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1890: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
18a0: 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
18b0: 4e 61 6d 65 2c 20 7a 44 62 54 72 69 67 29 20 29  Name, zDbTrig) )
18c0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69  {.      goto tri
18d0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
18e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
18f0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1900: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
1910: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
1920: 28 69 54 61 62 44 62 29 2c 30 2c 7a 44 62 29 29  (iTabDb),0,zDb))
1930: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69  {.      goto tri
1940: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
1950: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1960: 20 20 2f 2a 20 49 4e 53 54 45 41 44 20 4f 46 20    /* INSTEAD OF 
1970: 74 72 69 67 67 65 72 73 20 63 61 6e 20 6f 6e 6c  triggers can onl
1980: 79 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65 77  y appear on view
1990: 73 20 61 6e 64 20 42 45 46 4f 52 45 20 74 72 69  s and BEFORE tri
19a0: 67 67 65 72 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f  ggers.  ** canno
19b0: 74 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65 77  t appear on view
19c0: 73 2e 20 20 53 6f 20 77 65 20 6d 69 67 68 74 20  s.  So we might 
19d0: 61 73 20 77 65 6c 6c 20 74 72 61 6e 73 6c 61 74  as well translat
19e0: 65 20 65 76 65 72 79 0a 20 20 2a 2a 20 49 4e 53  e every.  ** INS
19f0: 54 45 41 44 20 4f 46 20 74 72 69 67 67 65 72 20  TEAD OF trigger 
1a00: 69 6e 74 6f 20 61 20 42 45 46 4f 52 45 20 74 72  into a BEFORE tr
1a10: 69 67 67 65 72 2e 20 20 49 74 20 73 69 6d 70 6c  igger.  It simpl
1a20: 69 66 69 65 73 20 63 6f 64 65 0a 20 20 2a 2a 20  ifies code.  ** 
1a30: 65 6c 73 65 77 68 65 72 65 2e 0a 20 20 2a 2f 0a  elsewhere..  */.
1a40: 20 20 69 66 20 28 74 72 5f 74 6d 20 3d 3d 20 54    if (tr_tm == T
1a50: 4b 5f 49 4e 53 54 45 41 44 29 7b 0a 20 20 20 20  K_INSTEAD){.    
1a60: 74 72 5f 74 6d 20 3d 20 54 4b 5f 42 45 46 4f 52  tr_tm = TK_BEFOR
1a70: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69  E;.  }..  /* Bui
1a80: 6c 64 20 74 68 65 20 54 72 69 67 67 65 72 20 6f  ld the Trigger o
1a90: 62 6a 65 63 74 20 2a 2f 0a 20 20 70 54 72 69 67  bject */.  pTrig
1aa0: 67 65 72 20 3d 20 28 54 72 69 67 67 65 72 2a 29  ger = (Trigger*)
1ab0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1ac0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
1ad0: 72 69 67 67 65 72 29 29 3b 0a 20 20 69 66 28 20  rigger));.  if( 
1ae0: 70 54 72 69 67 67 65 72 3d 3d 30 20 29 20 67 6f  pTrigger==0 ) go
1af0: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
1b00: 75 70 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e  up;.  pTrigger->
1b10: 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
1b20: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 72  zName = 0;.  pTr
1b30: 69 67 67 65 72 2d 3e 74 61 62 6c 65 20 3d 20 73  igger->table = s
1b40: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
1b50: 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 61  b, pTableName->a
1b60: 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 70 54  [0].zName);.  pT
1b70: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 20  rigger->pSchema 
1b80: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
1b90: 53 63 68 65 6d 61 3b 0a 20 20 70 54 72 69 67 67  Schema;.  pTrigg
1ba0: 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 3d  er->pTabSchema =
1bb0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a   pTab->pSchema;.
1bc0: 20 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 20 3d    pTrigger->op =
1bd0: 20 28 75 38 29 6f 70 3b 0a 20 20 70 54 72 69 67   (u8)op;.  pTrig
1be0: 67 65 72 2d 3e 74 72 5f 74 6d 20 3d 20 74 72 5f  ger->tr_tm = tr_
1bf0: 74 6d 3d 3d 54 4b 5f 42 45 46 4f 52 45 20 3f 20  tm==TK_BEFORE ? 
1c00: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 3a  TRIGGER_BEFORE :
1c10: 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 3b 0a   TRIGGER_AFTER;.
1c20: 20 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65    pTrigger->pWhe
1c30: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
1c40: 75 70 28 64 62 2c 20 70 57 68 65 6e 2c 20 45 58  up(db, pWhen, EX
1c50: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
1c60: 20 70 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75   pTrigger->pColu
1c70: 6d 6e 73 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  mns = sqlite3IdL
1c80: 69 73 74 44 75 70 28 64 62 2c 20 70 43 6f 6c 75  istDup(db, pColu
1c90: 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 54  mns);.  sqlite3T
1ca0: 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 54  okenCopy(db, &pT
1cb0: 72 69 67 67 65 72 2d 3e 6e 61 6d 65 54 6f 6b 65  rigger->nameToke
1cc0: 6e 2c 70 4e 61 6d 65 29 3b 0a 20 20 61 73 73 65  n,pName);.  asse
1cd0: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
1ce0: 54 72 69 67 67 65 72 3d 3d 30 20 29 3b 0a 20 20  Trigger==0 );.  
1cf0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
1d00: 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 3b 0a  ger = pTrigger;.
1d10: 0a 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70  .trigger_cleanup
1d20: 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
1d30: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
1d40: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1d50: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 4e  lete(db, pTableN
1d60: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  ame);.  sqlite3I
1d70: 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1d80: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73 71 6c  pColumns);.  sql
1d90: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1da0: 62 2c 20 70 57 68 65 6e 29 3b 0a 20 20 69 66 28  b, pWhen);.  if(
1db0: 20 21 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72   !pParse->pNewTr
1dc0: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  igger ){.    sql
1dd0: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
1de0: 72 28 64 62 2c 20 70 54 72 69 67 67 65 72 29 3b  r(db, pTrigger);
1df0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1e00: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
1e10: 65 77 54 72 69 67 67 65 72 3d 3d 70 54 72 69 67  ewTrigger==pTrig
1e20: 67 65 72 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ger );.  }.}../*
1e30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e40: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
1e50: 20 61 6c 6c 20 6f 66 20 74 68 65 20 74 72 69 67   all of the trig
1e60: 67 65 72 20 61 63 74 69 6f 6e 73 20 68 61 76 65  ger actions have
1e70: 20 62 65 65 6e 20 70 61 72 73 65 64 0a 2a 2a 20   been parsed.** 
1e80: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
1e90: 6c 65 74 65 20 74 68 65 20 70 72 6f 63 65 73 73  lete the process
1ea0: 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 74 68 65   of building the
1eb0: 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 76 6f 69   trigger..*/.voi
1ec0: 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 54  d sqlite3FinishT
1ed0: 72 69 67 67 65 72 28 0a 20 20 50 61 72 73 65 20  rigger(.  Parse 
1ee0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1ef0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
1f00: 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72  ext */.  Trigger
1f10: 53 74 65 70 20 2a 70 53 74 65 70 4c 69 73 74 2c  Step *pStepList,
1f20: 20 2f 2a 20 54 68 65 20 74 72 69 67 67 65 72 65   /* The triggere
1f30: 64 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 54  d program */.  T
1f40: 6f 6b 65 6e 20 2a 70 41 6c 6c 20 20 20 20 20 20  oken *pAll      
1f50: 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20         /* Token 
1f60: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
1f70: 68 65 20 63 6f 6d 70 6c 65 74 65 20 43 52 45 41  he complete CREA
1f80: 54 45 20 54 52 49 47 47 45 52 20 2a 2f 0a 29 7b  TE TRIGGER */.){
1f90: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
1fa0: 67 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  g = pParse->pNew
1fb0: 54 72 69 67 67 65 72 3b 20 20 20 20 2f 2a 20 54  Trigger;    /* T
1fc0: 72 69 67 67 65 72 20 62 65 69 6e 67 20 66 69 6e  rigger being fin
1fd0: 69 73 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  ished */.  char 
1fe0: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2010: 72 69 67 67 65 72 20 2a 2f 0a 20 20 73 71 6c 69  rigger */.  sqli
2020: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
2030: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
2040: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
2050: 62 61 73 65 20 2a 2f 0a 20 20 44 62 46 69 78 65  base */.  DbFixe
2060: 72 20 73 46 69 78 3b 0a 20 20 69 6e 74 20 69 44  r sFix;.  int iD
2070: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
20a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 72  ontaining the tr
20b0: 69 67 67 65 72 20 2a 2f 0a 0a 20 20 70 54 72 69  igger */..  pTri
20c0: 67 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  g = pParse->pNew
20d0: 54 72 69 67 67 65 72 3b 0a 20 20 70 50 61 72 73  Trigger;.  pPars
20e0: 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20 3d  e->pNewTrigger =
20f0: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   0;.  if( pParse
2100: 2d 3e 6e 45 72 72 20 7c 7c 20 21 70 54 72 69 67  ->nErr || !pTrig
2110: 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72 66   ) goto triggerf
2120: 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20  inish_cleanup;. 
2130: 20 7a 4e 61 6d 65 20 3d 20 70 54 72 69 67 2d 3e   zName = pTrig->
2140: 6e 61 6d 65 3b 0a 20 20 69 44 62 20 3d 20 73 71  name;.  iDb = sq
2150: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
2160: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
2170: 54 72 69 67 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  Trig->pSchema);.
2180: 20 20 70 54 72 69 67 2d 3e 73 74 65 70 5f 6c 69    pTrig->step_li
2190: 73 74 20 3d 20 70 53 74 65 70 4c 69 73 74 3b 0a  st = pStepList;.
21a0: 20 20 77 68 69 6c 65 28 20 70 53 74 65 70 4c 69    while( pStepLi
21b0: 73 74 20 29 7b 0a 20 20 20 20 70 53 74 65 70 4c  st ){.    pStepL
21c0: 69 73 74 2d 3e 70 54 72 69 67 20 3d 20 70 54 72  ist->pTrig = pTr
21d0: 69 67 3b 0a 20 20 20 20 70 53 74 65 70 4c 69 73  ig;.    pStepLis
21e0: 74 20 3d 20 70 53 74 65 70 4c 69 73 74 2d 3e 70  t = pStepList->p
21f0: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
2200: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
2210: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
2220: 62 2c 20 22 74 72 69 67 67 65 72 22 2c 20 26 70  b, "trigger", &p
2230: 54 72 69 67 2d 3e 6e 61 6d 65 54 6f 6b 65 6e 29  Trig->nameToken)
2240: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73   .          && s
2250: 71 6c 69 74 65 33 46 69 78 54 72 69 67 67 65 72  qlite3FixTrigger
2260: 53 74 65 70 28 26 73 46 69 78 2c 20 70 54 72 69  Step(&sFix, pTri
2270: 67 2d 3e 73 74 65 70 5f 6c 69 73 74 29 20 29 7b  g->step_list) ){
2280: 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65  .    goto trigge
2290: 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b  rfinish_cleanup;
22a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 69 66 20 77 65  .  }..  /* if we
22b0: 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c   are not initial
22c0: 69 7a 69 6e 67 2c 20 61 6e 64 20 74 68 69 73 20  izing, and this 
22d0: 74 72 69 67 67 65 72 20 69 73 20 6e 6f 74 20 6f  trigger is not o
22e0: 6e 20 61 20 54 45 4d 50 20 74 61 62 6c 65 2c 20  n a TEMP table, 
22f0: 0a 20 20 2a 2a 20 62 75 69 6c 64 20 74 68 65 20  .  ** build the 
2300: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 65 6e  sqlite_master en
2310: 74 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  try.  */.  if( !
2320: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
2330: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
2340: 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20    char *z;..    
2350: 2f 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  /* Make an entry
2360: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
2370: 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
2380: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
2390: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
23a0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
23b0: 74 6f 20 74 72 69 67 67 65 72 66 69 6e 69 73 68  to triggerfinish
23c0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 73 71  _cleanup;.    sq
23d0: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
23e0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
23f0: 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 7a 20   0, iDb);.    z 
2400: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
2410: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 41  up(db, (char*)pA
2420: 6c 6c 2d 3e 7a 2c 20 70 41 6c 6c 2d 3e 6e 29 3b  ll->z, pAll->n);
2430: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
2440: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
2450: 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
2460: 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
2470: 28 27 74 72 69 67 67 65 72 27 2c 25 51 2c 25 51  ('trigger',%Q,%Q
2480: 2c 30 2c 27 43 52 45 41 54 45 20 54 52 49 47 47  ,0,'CREATE TRIGG
2490: 45 52 20 25 71 27 29 22 2c 0a 20 20 20 20 20 20  ER %q')",.      
24a0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
24b0: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
24c0: 45 28 69 44 62 29 2c 20 7a 4e 61 6d 65 2c 0a 20  E(iDb), zName,. 
24d0: 20 20 20 20 20 20 70 54 72 69 67 2d 3e 74 61 62        pTrig->tab
24e0: 6c 65 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  le, z);.    sqli
24f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
2500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
2510: 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
2520: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
2530: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2540: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
2550: 20 69 44 62 2c 20 30 2c 20 30 2c 20 73 71 6c 69   iDb, 0, 0, sqli
2560: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
2570: 20 20 20 20 64 62 2c 20 22 74 79 70 65 3d 27 74      db, "type='t
2580: 72 69 67 67 65 72 27 20 41 4e 44 20 6e 61 6d 65  rigger' AND name
2590: 3d 27 25 71 27 22 2c 20 7a 4e 61 6d 65 29 2c 20  ='%q'", zName), 
25a0: 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29  P4_DYNAMIC.    )
25b0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d  ;.  }..  if( db-
25c0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
25d0: 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 6e 6b    Trigger *pLink
25e0: 20 3d 20 70 54 72 69 67 3b 0a 20 20 20 20 48 61   = pTrig;.    Ha
25f0: 73 68 20 2a 70 48 61 73 68 20 3d 20 26 64 62 2d  sh *pHash = &db-
2600: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
2610: 61 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20  a->trigHash;.   
2620: 20 70 54 72 69 67 20 3d 20 73 71 6c 69 74 65 33   pTrig = sqlite3
2630: 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68  HashInsert(pHash
2640: 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  , zName, sqlite3
2650: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c  Strlen30(zName),
2660: 20 70 54 72 69 67 29 3b 0a 20 20 20 20 69 66 28   pTrig);.    if(
2670: 20 70 54 72 69 67 20 29 7b 0a 20 20 20 20 20 20   pTrig ){.      
2680: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2690: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
26a0: 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 53 63 68 65  if( pLink->pSche
26b0: 6d 61 3d 3d 70 4c 69 6e 6b 2d 3e 70 54 61 62 53  ma==pLink->pTabS
26c0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 54  chema ){.      T
26d0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
26e0: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
26f0: 33 53 74 72 6c 65 6e 33 30 28 70 4c 69 6e 6b 2d  3Strlen30(pLink-
2700: 3e 74 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 70  >table);.      p
2710: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Tab = sqlite3Has
2720: 68 46 69 6e 64 28 26 70 4c 69 6e 6b 2d 3e 70 54  hFind(&pLink->pT
2730: 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  abSchema->tblHas
2740: 68 2c 20 70 4c 69 6e 6b 2d 3e 74 61 62 6c 65 2c  h, pLink->table,
2750: 20 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   n);.      asser
2760: 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
2770: 20 20 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74      pLink->pNext
2780: 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65   = pTab->pTrigge
2790: 72 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  r;.      pTab->p
27a0: 54 72 69 67 67 65 72 20 3d 20 70 4c 69 6e 6b 3b  Trigger = pLink;
27b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 74 72 69 67  .    }.  }..trig
27c0: 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75  gerfinish_cleanu
27d0: 70 3a 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  p:.  sqlite3Dele
27e0: 74 65 54 72 69 67 67 65 72 28 64 62 2c 20 70 54  teTrigger(db, pT
27f0: 72 69 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rig);.  assert( 
2800: 21 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69  !pParse->pNewTri
2810: 67 67 65 72 20 29 3b 0a 20 20 73 71 6c 69 74 65  gger );.  sqlite
2820: 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74  3DeleteTriggerSt
2830: 65 70 28 64 62 2c 20 70 53 74 65 70 4c 69 73 74  ep(db, pStepList
2840: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
2850: 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 63   a copy of all c
2860: 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 74 68 65  omponents of the
2870: 20 67 69 76 65 6e 20 74 72 69 67 67 65 72 20 73   given trigger s
2880: 74 65 70 2e 20 20 54 68 69 73 20 68 61 73 0a 2a  tep.  This has.*
2890: 2a 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  * the effect of 
28a0: 63 6f 70 79 69 6e 67 20 61 6c 6c 20 45 78 70 72  copying all Expr
28b0: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
28c0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
28d0: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
28e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20  ite3_malloc().  
28f0: 41 73 20 69 6e 69 74 69 61 6c 6c 79 20 63 72 65  As initially cre
2900: 61 74 65 64 2c 20 74 68 65 20 45 78 70 72 2e 74  ated, the Expr.t
2910: 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 0a 2a 2a  oken.z values.**
2920: 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68   all point to th
2930: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 74  e input string t
2940: 68 61 74 20 77 61 73 20 66 65 64 20 74 6f 20 74  hat was fed to t
2950: 68 65 20 70 61 72 73 65 72 2e 20 20 42 75 74 20  he parser.  But 
2960: 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69  that.** string i
2970: 73 20 65 70 68 65 6d 65 72 61 6c 20 2d 20 69 74  s ephemeral - it
2980: 20 77 69 6c 6c 20 67 6f 20 61 77 61 79 20 61 73   will go away as
2990: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 73 71 6c   soon as the sql
29a0: 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 63  ite3_exec().** c
29b0: 61 6c 6c 20 74 68 61 74 20 73 74 61 72 74 65 64  all that started
29c0: 20 74 68 65 20 70 61 72 73 65 72 20 65 78 69 74   the parser exit
29d0: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
29e0: 20 6d 61 6b 65 73 20 61 20 70 65 72 73 69 73 74   makes a persist
29f0: 65 6e 74 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 61  ent.** copy of a
2a00: 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
2a10: 6e 2e 7a 20 73 74 72 69 6e 67 73 20 73 6f 20 74  n.z strings so t
2a20: 68 61 74 20 74 68 65 20 54 72 69 67 67 65 72 53  hat the TriggerS
2a30: 74 65 70 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  tep structure.**
2a40: 20 77 69 6c 6c 20 62 65 20 76 61 6c 69 64 20 65   will be valid e
2a50: 76 65 6e 20 61 66 74 65 72 20 74 68 65 20 73 71  ven after the sq
2a60: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
2a70: 6c 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74  l returns..*/.st
2a80: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
2a90: 50 65 72 73 69 73 74 54 72 69 67 67 65 72 53 74  PersistTriggerSt
2aa0: 65 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ep(sqlite3 *db, 
2ab0: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 29 7b  TriggerStep *p){
2ac0: 0a 20 20 69 66 28 20 70 2d 3e 74 61 72 67 65 74  .  if( p->target
2ad0: 2e 7a 20 29 7b 0a 20 20 20 20 70 2d 3e 74 61 72  .z ){.    p->tar
2ae0: 67 65 74 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c  get.z = (u8*)sql
2af0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
2b00: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 74 61 72 67  , (char*)p->targ
2b10: 65 74 2e 7a 2c 20 70 2d 3e 74 61 72 67 65 74 2e  et.z, p->target.
2b20: 6e 29 3b 0a 20 20 20 20 70 2d 3e 74 61 72 67 65  n);.    p->targe
2b30: 74 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20  t.dyn = 1;.  }. 
2b40: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 20   if( p->pSelect 
2b50: 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
2b60: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  New = sqlite3Sel
2b70: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  ectDup(db, p->pS
2b80: 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 73  elect, 1);.    s
2b90: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
2ba0: 74 65 28 64 62 2c 20 70 2d 3e 70 53 65 6c 65 63  te(db, p->pSelec
2bb0: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65  t);.    p->pSele
2bc0: 63 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  ct = pNew;.  }. 
2bd0: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29   if( p->pWhere )
2be0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
2bf0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
2c00: 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  p(db, p->pWhere,
2c10: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
2c20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2c30: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
2c40: 57 68 65 72 65 29 3b 0a 20 20 20 20 70 2d 3e 70  Where);.    p->p
2c50: 57 68 65 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Where = pNew;.  
2c60: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 78 70 72  }.  if( p->pExpr
2c70: 4c 69 73 74 20 29 7b 0a 20 20 20 20 45 78 70 72  List ){.    Expr
2c80: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c  List *pNew = sql
2c90: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2ca0: 64 62 2c 20 70 2d 3e 70 45 78 70 72 4c 69 73 74  db, p->pExprList
2cb0: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
2cc0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2cd0: 64 62 2c 20 70 2d 3e 70 45 78 70 72 4c 69 73 74  db, p->pExprList
2ce0: 29 3b 0a 20 20 20 20 70 2d 3e 70 45 78 70 72 4c  );.    p->pExprL
2cf0: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
2d00: 20 20 69 66 28 20 70 2d 3e 70 49 64 4c 69 73 74    if( p->pIdList
2d10: 20 29 7b 0a 20 20 20 20 49 64 4c 69 73 74 20 2a   ){.    IdList *
2d20: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 49 64  pNew = sqlite3Id
2d30: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
2d40: 49 64 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  IdList);.    sql
2d50: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
2d60: 28 64 62 2c 20 70 2d 3e 70 49 64 4c 69 73 74 29  (db, p->pIdList)
2d70: 3b 0a 20 20 20 20 70 2d 3e 70 49 64 4c 69 73 74  ;.    p->pIdList
2d80: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a   = pNew;.  }.}..
2d90: 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 53 45 4c  /*.** Turn a SEL
2da0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 28 74  ECT statement (t
2db0: 68 61 74 20 74 68 65 20 70 53 65 6c 65 63 74 20  hat the pSelect 
2dc0: 70 61 72 61 6d 65 74 65 72 20 70 6f 69 6e 74 73  parameter points
2dd0: 20 74 6f 29 20 69 6e 74 6f 0a 2a 2a 20 61 20 74   to) into.** a t
2de0: 72 69 67 67 65 72 20 73 74 65 70 2e 20 20 52 65  rigger step.  Re
2df0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
2e00: 6f 20 61 20 54 72 69 67 67 65 72 53 74 65 70 20  o a TriggerStep 
2e10: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
2e20: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
2e30: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
2e40: 68 65 6e 20 69 74 20 66 69 6e 64 73 20 61 20 53  hen it finds a S
2e50: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2e60: 69 6e 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20  in.** body of a 
2e70: 54 52 49 47 47 45 52 2e 20 20 0a 2a 2f 0a 54 72  TRIGGER.  .*/.Tr
2e80: 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74  iggerStep *sqlit
2e90: 65 33 54 72 69 67 67 65 72 53 65 6c 65 63 74 53  e3TriggerSelectS
2ea0: 74 65 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  tep(sqlite3 *db,
2eb0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2ec0: 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  ){.  TriggerStep
2ed0: 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 20 3d   *pTriggerStep =
2ee0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2ef0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
2f00: 54 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a 20  TriggerStep));. 
2f10: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65   if( pTriggerSte
2f20: 70 3d 3d 30 20 29 20 7b 0a 20 20 20 20 73 71 6c  p==0 ) {.    sql
2f30: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
2f40: 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
2f50: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2f60: 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ..  pTriggerStep
2f70: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
2f80: 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70  ;.  pTriggerStep
2f90: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ->pSelect = pSel
2fa0: 65 63 74 3b 0a 20 20 70 54 72 69 67 67 65 72 53  ect;.  pTriggerS
2fb0: 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45  tep->orconf = OE
2fc0: 5f 44 65 66 61 75 6c 74 3b 0a 20 20 73 71 6c 69  _Default;.  sqli
2fd0: 74 65 50 65 72 73 69 73 74 54 72 69 67 67 65 72  tePersistTrigger
2fe0: 53 74 65 70 28 64 62 2c 20 70 54 72 69 67 67 65  Step(db, pTrigge
2ff0: 72 53 74 65 70 29 3b 0a 0a 20 20 72 65 74 75 72  rStep);..  retur
3000: 6e 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a  n pTriggerStep;.
3010: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 69 6c 64 20 61  }../*.** Build a
3020: 20 74 72 69 67 67 65 72 20 73 74 65 70 20 6f 75   trigger step ou
3030: 74 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 73  t of an INSERT s
3040: 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  tatement.  Retur
3050: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
3060: 6f 20 74 68 65 20 6e 65 77 20 74 72 69 67 67 65  o the new trigge
3070: 72 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  r step..**.** Th
3080: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
3090: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
30a0: 20 69 74 20 73 65 65 73 20 61 6e 20 49 4e 53 45   it sees an INSE
30b0: 52 54 20 69 6e 73 69 64 65 20 74 68 65 0a 2a 2a  RT inside the.**
30c0: 20 62 6f 64 79 20 6f 66 20 61 20 74 72 69 67 67   body of a trigg
30d0: 65 72 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74  er..*/.TriggerSt
30e0: 65 70 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67  ep *sqlite3Trigg
30f0: 65 72 49 6e 73 65 72 74 53 74 65 70 28 0a 20 20  erInsertStep(.  
3100: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
3110: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
3120: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
3130: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
3140: 65 4e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  eName,  /* Name 
3150: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  of the table int
3160: 6f 20 77 68 69 63 68 20 77 65 20 69 6e 73 65 72  o which we inser
3170: 74 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  t */.  IdList *p
3180: 43 6f 6c 75 6d 6e 2c 20 20 20 20 2f 2a 20 4c 69  Column,    /* Li
3190: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
31a0: 20 70 54 61 62 6c 65 4e 61 6d 65 20 74 6f 20 69   pTableName to i
31b0: 6e 73 65 72 74 20 69 6e 74 6f 20 2a 2f 0a 20 20  nsert into */.  
31c0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
31d0: 2c 20 20 20 2f 2a 20 54 68 65 20 56 41 4c 55 45  ,   /* The VALUE
31e0: 20 63 6c 61 75 73 65 3a 20 61 20 6c 69 73 74 20   clause: a list 
31f0: 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  of values to be 
3200: 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 53 65  inserted */.  Se
3210: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
3220: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
3230: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 73 75 70  atement that sup
3240: 70 6c 69 65 73 20 76 61 6c 75 65 73 20 2a 2f 0a  plies values */.
3250: 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20 20    int orconf    
3260: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
3270: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20  flict algorithm 
3280: 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 52 65  (OE_Abort, OE_Re
3290: 70 6c 61 63 65 2c 20 65 74 63 2e 29 20 2a 2f 0a  place, etc.) */.
32a0: 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  ){.  TriggerStep
32b0: 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a   *pTriggerStep;.
32c0: 0a 20 20 61 73 73 65 72 74 28 70 45 4c 69 73 74  .  assert(pEList
32d0: 20 3d 3d 20 30 20 7c 7c 20 70 53 65 6c 65 63 74   == 0 || pSelect
32e0: 20 3d 3d 20 30 29 3b 0a 20 20 61 73 73 65 72 74   == 0);.  assert
32f0: 28 70 45 4c 69 73 74 20 21 3d 20 30 20 7c 7c 20  (pEList != 0 || 
3300: 70 53 65 6c 65 63 74 20 21 3d 20 30 20 7c 7c 20  pSelect != 0 || 
3310: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3320: 29 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74  );..  pTriggerSt
3330: 65 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ep = sqlite3DbMa
3340: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
3350: 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29  eof(TriggerStep)
3360: 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65  );.  if( pTrigge
3370: 72 53 74 65 70 20 29 7b 0a 20 20 20 20 70 54 72  rStep ){.    pTr
3380: 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20  iggerStep->op = 
3390: 54 4b 5f 49 4e 53 45 52 54 3b 0a 20 20 20 20 70  TK_INSERT;.    p
33a0: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 53 65  TriggerStep->pSe
33b0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a  lect = pSelect;.
33c0: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
33d0: 2d 3e 74 61 72 67 65 74 20 20 3d 20 2a 70 54 61  ->target  = *pTa
33e0: 62 6c 65 4e 61 6d 65 3b 0a 20 20 20 20 70 54 72  bleName;.    pTr
33f0: 69 67 67 65 72 53 74 65 70 2d 3e 70 49 64 4c 69  iggerStep->pIdLi
3400: 73 74 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20  st = pColumn;.  
3410: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3420: 70 45 78 70 72 4c 69 73 74 20 3d 20 70 45 4c 69  pExprList = pELi
3430: 73 74 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  st;.    pTrigger
3440: 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f  Step->orconf = o
3450: 72 63 6f 6e 66 3b 0a 20 20 20 20 73 71 6c 69 74  rconf;.    sqlit
3460: 65 50 65 72 73 69 73 74 54 72 69 67 67 65 72 53  ePersistTriggerS
3470: 74 65 70 28 64 62 2c 20 70 54 72 69 67 67 65 72  tep(db, pTrigger
3480: 53 74 65 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Step);.  }else{.
3490: 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
34a0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  tDelete(db, pCol
34b0: 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  umn);.    sqlite
34c0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
34d0: 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
34e0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
34f0: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
3500: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
3510: 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d   pTriggerStep;.}
3520: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
3530: 74 20 61 20 74 72 69 67 67 65 72 20 73 74 65 70  t a trigger step
3540: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
3550: 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65   an UPDATE state
3560: 6d 65 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 0a  ment and return.
3570: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
3580: 74 68 61 74 20 74 72 69 67 67 65 72 20 73 74 65  that trigger ste
3590: 70 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 63  p.  The parser c
35a0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
35b0: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 73 65 65  e when it.** see
35c0: 73 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  s an UPDATE stat
35d0: 65 6d 65 6e 74 20 69 6e 73 69 64 65 20 74 68 65  ement inside the
35e0: 20 62 6f 64 79 20 6f 66 20 61 20 43 52 45 41 54   body of a CREAT
35f0: 45 20 54 52 49 47 47 45 52 2e 0a 2a 2f 0a 54 72  E TRIGGER..*/.Tr
3600: 69 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74  iggerStep *sqlit
3610: 65 33 54 72 69 67 67 65 72 55 70 64 61 74 65 53  e3TriggerUpdateS
3620: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  tep(.  sqlite3 *
3630: 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  db,         /* T
3640: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
3650: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
3660: 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20  n *pTableName,  
3670: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3680: 74 61 62 6c 65 20 74 6f 20 62 65 20 75 70 64 61  table to be upda
3690: 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
36a0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f 2a  t *pEList,    /*
36b0: 20 54 68 65 20 53 45 54 20 63 6c 61 75 73 65 3a   The SET clause:
36c0: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20   list of column 
36d0: 61 6e 64 20 6e 65 77 20 76 61 6c 75 65 73 20 2a  and new values *
36e0: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
36f0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
3700: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
3710: 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20 20    int orconf    
3720: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
3730: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
3740: 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  . (OE_Abort, OE_
3750: 49 67 6e 6f 72 65 2c 20 65 74 63 29 20 2a 2f 0a  Ignore, etc) */.
3760: 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  ){.  TriggerStep
3770: 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 20 3d   *pTriggerStep =
3780: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3790: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
37a0: 54 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a 20  TriggerStep));. 
37b0: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65   if( pTriggerSte
37c0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 73 71 6c  p==0 ){.     sql
37d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
37e0: 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a  te(db, pEList);.
37f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3800: 44 65 6c 65 74 65 28 64 62 2c 20 70 57 68 65 72  Delete(db, pWher
3810: 65 29 3b 0a 20 20 20 20 20 72 65 74 75 72 6e 20  e);.     return 
3820: 30 3b 0a 20 20 7d 0a 0a 20 20 70 54 72 69 67 67  0;.  }..  pTrigg
3830: 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f  erStep->op = TK_
3840: 55 50 44 41 54 45 3b 0a 20 20 70 54 72 69 67 67  UPDATE;.  pTrigg
3850: 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74 20 20  erStep->target  
3860: 3d 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 20  = *pTableName;. 
3870: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
3880: 45 78 70 72 4c 69 73 74 20 3d 20 70 45 4c 69 73  ExprList = pELis
3890: 74 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  t;.  pTriggerSte
38a0: 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  p->pWhere = pWhe
38b0: 72 65 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74  re;.  pTriggerSt
38c0: 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63  ep->orconf = orc
38d0: 6f 6e 66 3b 0a 20 20 73 71 6c 69 74 65 50 65 72  onf;.  sqlitePer
38e0: 73 69 73 74 54 72 69 67 67 65 72 53 74 65 70 28  sistTriggerStep(
38f0: 64 62 2c 20 70 54 72 69 67 67 65 72 53 74 65 70  db, pTriggerStep
3900: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 72  );..  return pTr
3910: 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a  iggerStep;.}../*
3920: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
3930: 74 72 69 67 67 65 72 20 73 74 65 70 20 74 68 61  trigger step tha
3940: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 44  t implements a D
3950: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
3960: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  and return.** a 
3970: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20  pointer to that 
3980: 74 72 69 67 67 65 72 20 73 74 65 70 2e 20 20 54  trigger step.  T
3990: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
39a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
39b0: 6e 20 69 74 0a 2a 2a 20 73 65 65 73 20 61 20 44  n it.** sees a D
39c0: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
39d0: 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79 20  inside the body 
39e0: 6f 66 20 61 20 43 52 45 41 54 45 20 54 52 49 47  of a CREATE TRIG
39f0: 47 45 52 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53  GER..*/.TriggerS
3a00: 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72 69 67  tep *sqlite3Trig
3a10: 67 65 72 44 65 6c 65 74 65 53 74 65 70 28 0a 20  gerDeleteStep(. 
3a20: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
3a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
3a40: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
3a50: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
3a60: 6c 65 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20  leName,      /* 
3a70: 54 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  The table from w
3a80: 68 69 63 68 20 72 6f 77 73 20 61 72 65 20 64 65  hich rows are de
3a90: 6c 65 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  leted */.  Expr 
3aa0: 2a 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  *pWhere         
3ab0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
3ac0: 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 54  clause */.){.  T
3ad0: 72 69 67 67 65 72 53 74 65 70 20 2a 70 54 72 69  riggerStep *pTri
3ae0: 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c 69 74  ggerStep = sqlit
3af0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
3b00: 62 2c 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65  b, sizeof(Trigge
3b10: 72 53 74 65 70 29 29 3b 0a 20 20 69 66 28 20 70  rStep));.  if( p
3b20: 54 72 69 67 67 65 72 53 74 65 70 3d 3d 30 20 29  TriggerStep==0 )
3b30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
3b40: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 68 65  rDelete(db, pWhe
3b50: 72 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  re);.    return 
3b60: 30 3b 0a 20 20 7d 0a 0a 20 20 70 54 72 69 67 67  0;.  }..  pTrigg
3b70: 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f  erStep->op = TK_
3b80: 44 45 4c 45 54 45 3b 0a 20 20 70 54 72 69 67 67  DELETE;.  pTrigg
3b90: 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74 20 20  erStep->target  
3ba0: 3d 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 20  = *pTableName;. 
3bb0: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
3bc0: 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
3bd0: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3be0: 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f 44 65 66 61  orconf = OE_Defa
3bf0: 75 6c 74 3b 0a 20 20 73 71 6c 69 74 65 50 65 72  ult;.  sqlitePer
3c00: 73 69 73 74 54 72 69 67 67 65 72 53 74 65 70 28  sistTriggerStep(
3c10: 64 62 2c 20 70 54 72 69 67 67 65 72 53 74 65 70  db, pTriggerStep
3c20: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 72  );..  return pTr
3c30: 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a  iggerStep;.}../*
3c40: 20 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79   .** Recursively
3c50: 20 64 65 6c 65 74 65 20 61 20 54 72 69 67 67 65   delete a Trigge
3c60: 72 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 76  r structure.*/.v
3c70: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74  oid sqlite3Delet
3c80: 65 54 72 69 67 67 65 72 28 73 71 6c 69 74 65 33  eTrigger(sqlite3
3c90: 20 2a 64 62 2c 20 54 72 69 67 67 65 72 20 2a 70   *db, Trigger *p
3ca0: 54 72 69 67 67 65 72 29 7b 0a 20 20 69 66 28 20  Trigger){.  if( 
3cb0: 70 54 72 69 67 67 65 72 3d 3d 30 20 29 20 72 65  pTrigger==0 ) re
3cc0: 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 44  turn;.  sqlite3D
3cd0: 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70  eleteTriggerStep
3ce0: 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 73  (db, pTrigger->s
3cf0: 74 65 70 5f 6c 69 73 74 29 3b 0a 20 20 73 71 6c  tep_list);.  sql
3d00: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3d10: 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 29 3b 0a  Trigger->name);.
3d20: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3d30: 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61  db, pTrigger->ta
3d40: 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ble);.  sqlite3E
3d50: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 54  xprDelete(db, pT
3d60: 72 69 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b 0a  rigger->pWhen);.
3d70: 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
3d80: 65 6c 65 74 65 28 64 62 2c 20 70 54 72 69 67 67  elete(db, pTrigg
3d90: 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20  er->pColumns);. 
3da0: 20 69 66 28 20 70 54 72 69 67 67 65 72 2d 3e 6e   if( pTrigger->n
3db0: 61 6d 65 54 6f 6b 65 6e 2e 64 79 6e 20 29 20 73  ameToken.dyn ) s
3dc0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3dd0: 20 28 63 68 61 72 2a 29 70 54 72 69 67 67 65 72   (char*)pTrigger
3de0: 2d 3e 6e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a  ->nameToken.z);.
3df0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3e00: 64 62 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 7d  db, pTrigger);.}
3e10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3e20: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
3e30: 74 6f 20 64 72 6f 70 20 61 20 74 72 69 67 67 65  to drop a trigge
3e40: 72 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  r from the datab
3e50: 61 73 65 20 73 63 68 65 6d 61 2e 20 0a 2a 2a 0a  ase schema. .**.
3e60: 2a 2a 20 54 68 69 73 20 6d 61 79 20 62 65 20 63  ** This may be c
3e70: 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20 66  alled directly f
3e80: 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 20 61  rom the parser a
3e90: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 69 64 65  nd therefore ide
3ea0: 6e 74 69 66 69 65 73 0a 2a 2a 20 74 68 65 20 74  ntifies.** the t
3eb0: 72 69 67 67 65 72 20 62 79 20 6e 61 6d 65 2e 20  rigger by name. 
3ec0: 20 54 68 65 20 73 71 6c 69 74 65 33 44 72 6f 70   The sqlite3Drop
3ed0: 54 72 69 67 67 65 72 50 74 72 28 29 20 72 6f 75  TriggerPtr() rou
3ee0: 74 69 6e 65 20 64 6f 65 73 20 74 68 65 0a 2a 2a  tine does the.**
3ef0: 20 73 61 6d 65 20 6a 6f 62 20 61 73 20 74 68 69   same job as thi
3f00: 73 20 72 6f 75 74 69 6e 65 20 65 78 63 65 70 74  s routine except
3f10: 20 69 74 20 74 61 6b 65 73 20 61 20 70 6f 69 6e   it takes a poin
3f20: 74 65 72 20 74 6f 20 74 68 65 20 74 72 69 67 67  ter to the trigg
3f30: 65 72 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  er.** instead of
3f40: 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d   the trigger nam
3f50: 65 2e 0a 2a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  e..**/.void sqli
3f60: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 28 50  te3DropTrigger(P
3f70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
3f80: 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
3f90: 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 72 69 67  t noErr){.  Trig
3fa0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
3fb0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  0;.  int i;.  co
3fc0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
3fd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
3fe0: 6d 65 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  me;.  int nName;
3ff0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4000: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
4010: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
4020: 69 6c 65 64 20 29 20 67 6f 74 6f 20 64 72 6f 70  iled ) goto drop
4030: 5f 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70  _trigger_cleanup
4040: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
4050: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
4060: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
4070: 20 20 20 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72      goto drop_tr
4080: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
4090: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e   }..  assert( pN
40a0: 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
40b0: 20 20 7a 44 62 20 3d 20 70 4e 61 6d 65 2d 3e 61    zDb = pName->a
40c0: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20  [0].zDatabase;. 
40d0: 20 7a 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 2d 3e   zName = pName->
40e0: 61 5b 30 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 6e 4e  a[0].zName;.  nN
40f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
4100: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
4110: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
4120: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
4130: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
4140: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
4150: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
4160: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
4170: 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73      if( zDb && s
4180: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62  qlite3StrICmp(db
4190: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  ->aDb[j].zName, 
41a0: 7a 44 62 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  zDb) ) continue;
41b0: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
41c0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
41d0: 26 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63  &(db->aDb[j].pSc
41e0: 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 29 2c  hema->trigHash),
41f0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
4200: 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72      if( pTrigger
4210: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
4220: 69 66 28 20 21 70 54 72 69 67 67 65 72 20 29 7b  if( !pTrigger ){
4230: 0a 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20  .    if( !noErr 
4240: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4250: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4260: 20 22 6e 6f 20 73 75 63 68 20 74 72 69 67 67 65   "no such trigge
4270: 72 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  r: %S", pName, 0
4280: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  );.    }.    got
4290: 6f 20 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63  o drop_trigger_c
42a0: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 71  leanup;.  }.  sq
42b0: 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
42c0: 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
42d0: 67 67 65 72 29 3b 0a 0a 64 72 6f 70 5f 74 72 69  gger);..drop_tri
42e0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  gger_cleanup:.  
42f0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
4300: 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
4310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4320: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4330: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
4340: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
4350: 74 68 61 74 20 61 20 74 72 69 67 67 65 72 0a 2a  that a trigger.*
4360: 2a 20 69 73 20 73 65 74 20 6f 6e 2e 0a 2a 2f 0a  * is set on..*/.
4370: 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 74 61  static Table *ta
4380: 62 6c 65 4f 66 54 72 69 67 67 65 72 28 54 72 69  bleOfTrigger(Tri
4390: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 29 7b  gger *pTrigger){
43a0: 0a 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74  .  int n = sqlit
43b0: 65 33 53 74 72 6c 65 6e 33 30 28 70 54 72 69 67  e3Strlen30(pTrig
43c0: 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 72  ger->table);.  r
43d0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 48 61 73  eturn sqlite3Has
43e0: 68 46 69 6e 64 28 26 70 54 72 69 67 67 65 72 2d  hFind(&pTrigger-
43f0: 3e 70 54 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c  >pTabSchema->tbl
4400: 48 61 73 68 2c 20 70 54 72 69 67 67 65 72 2d 3e  Hash, pTrigger->
4410: 74 61 62 6c 65 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f  table, n);.}.../
4420: 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 74 72 69 67  *.** Drop a trig
4430: 67 65 72 20 67 69 76 65 6e 20 61 20 70 6f 69 6e  ger given a poin
4440: 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67  ter to that trig
4450: 67 65 72 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ger. .*/.void sq
4460: 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
4470: 50 74 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  Ptr(Parse *pPars
4480: 65 2c 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  e, Trigger *pTri
4490: 67 67 65 72 29 7b 0a 20 20 54 61 62 6c 65 20 20  gger){.  Table  
44a0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65   *pTable;.  Vdbe
44b0: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
44c0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
44d0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
44e0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
44f0: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
4500: 2d 3e 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e  ->db, pTrigger->
4510: 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
4520: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
4530: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 70  b<db->nDb );.  p
4540: 54 61 62 6c 65 20 3d 20 74 61 62 6c 65 4f 66 54  Table = tableOfT
4550: 72 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29  rigger(pTrigger)
4560: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
4570: 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
4580: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 3d  pTable->pSchema=
4590: 3d 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65  =pTrigger->pSche
45a0: 6d 61 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a  ma || iDb==1 );.
45b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
45c0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
45d0: 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
45e0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
45f0: 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 63 6f  _TRIGGER;.    co
4600: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
4610: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
4620: 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
4630: 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
4640: 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
4650: 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 20 63    if( iDb==1 ) c
4660: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
4670: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a  P_TEMP_TRIGGER;.
4680: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
4690: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
46a0: 20 63 6f 64 65 2c 20 70 54 72 69 67 67 65 72 2d   code, pTrigger-
46b0: 3e 6e 61 6d 65 2c 20 70 54 61 62 6c 65 2d 3e 7a  >name, pTable->z
46c0: 4e 61 6d 65 2c 20 7a 44 62 29 20 7c 7c 0a 20 20  Name, zDb) ||.  
46d0: 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43      sqlite3AuthC
46e0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
46f0: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
4700: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
4710: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
4720: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
4730: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
4740: 74 6f 20 64 65 73 74 72 6f 79 20 74 68 65 20 64  to destroy the d
4750: 61 74 61 62 61 73 65 20 72 65 63 6f 72 64 20 6f  atabase record o
4760: 66 20 74 68 65 20 74 72 69 67 67 65 72 2e 0a 20  f the trigger.. 
4770: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
4780: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  able!=0 );.  if(
4790: 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   (v = sqlite3Get
47a0: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
47b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 61 73 65   ){.    int base
47c0: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
47d0: 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72  st VdbeOpList dr
47e0: 6f 70 54 72 69 67 67 65 72 5b 5d 20 3d 20 7b 0a  opTrigger[] = {.
47f0: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e        { OP_Rewin
4800: 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 39  d,     0, ADDR(9
4810: 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ),  0},.      { 
4820: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30  OP_String8,    0
4830: 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 1,        0}, 
4840: 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
4850: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
4860: 2c 20 31 2c 20 20 20 20 20 20 20 20 32 7d 2c 0a  , 1,        2},.
4870: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20        { OP_Ne,  
4880: 20 20 20 20 20 20 20 32 2c 20 41 44 44 52 28 38         2, ADDR(8
4890: 29 2c 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20  ),  1},.      { 
48a0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30  OP_String8,    0
48b0: 2c 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 1,        0}, 
48c0: 2f 2a 20 34 3a 20 22 74 72 69 67 67 65 72 22 20  /* 4: "trigger" 
48d0: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
48e0: 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 30 2c 20  lumn,     0, 0, 
48f0: 20 20 20 20 20 20 20 32 7d 2c 0a 20 20 20 20 20         2},.     
4900: 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20   { OP_Ne,       
4910: 20 20 32 2c 20 41 44 44 52 28 38 29 2c 20 20 31    2, ADDR(8),  1
4920: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65  },.      { OP_De
4930: 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20  lete,     0, 0, 
4940: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
4950: 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20   { OP_Next,     
4960: 20 20 30 2c 20 41 44 44 52 28 31 29 2c 20 20 30    0, ADDR(1),  0
4970: 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d  }, /* 8 */.    }
4980: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ;..    sqlite3Be
4990: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
49a0: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
49b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70  );.    sqlite3Op
49c0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
49d0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
49e0: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  base = sqlite3Vd
49f0: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 20  beAddOpList(v,  
4a00: 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 72  ArraySize(dropTr
4a10: 69 67 67 65 72 29 2c 20 64 72 6f 70 54 72 69 67  igger), dropTrig
4a20: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
4a30: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
4a40: 20 62 61 73 65 2b 31 2c 20 70 54 72 69 67 67 65   base+1, pTrigge
4a50: 72 2d 3e 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  r->name, 0);.   
4a60: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4a70: 67 65 50 34 28 76 2c 20 62 61 73 65 2b 34 2c 20  geP4(v, base+4, 
4a80: 22 74 72 69 67 67 65 72 22 2c 20 50 34 5f 53 54  "trigger", P4_ST
4a90: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
4aa0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
4ab0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
4ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4ad0: 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
4ae0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
4af0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
4b00: 4f 50 5f 44 72 6f 70 54 72 69 67 67 65 72 2c 20  OP_DropTrigger, 
4b10: 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 72 69 67  iDb, 0, 0, pTrig
4b20: 67 65 72 2d 3e 6e 61 6d 65 2c 20 30 29 3b 0a 20  ger->name, 0);. 
4b30: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
4b40: 4d 65 6d 3c 33 20 29 7b 0a 20 20 20 20 20 20 70  Mem<3 ){.      p
4b50: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b  Parse->nMem = 3;
4b60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4b70: 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 20 74 72 69  .** Remove a tri
4b80: 67 67 65 72 20 66 72 6f 6d 20 74 68 65 20 68 61  gger from the ha
4b90: 73 68 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  sh tables of the
4ba0: 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72   sqlite* pointer
4bb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4bc0: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
4bd0: 54 72 69 67 67 65 72 28 73 71 6c 69 74 65 33 20  Trigger(sqlite3 
4be0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
4bf0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
4c00: 7b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 20  {.  Hash *pHash 
4c10: 3d 20 26 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  = &(db->aDb[iDb]
4c20: 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61  .pSchema->trigHa
4c30: 73 68 29 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  sh);.  Trigger *
4c40: 70 54 72 69 67 67 65 72 3b 0a 20 20 70 54 72 69  pTrigger;.  pTri
4c50: 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 48 61  gger = sqlite3Ha
4c60: 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20  shInsert(pHash, 
4c70: 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74  zName, sqlite3St
4c80: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30  rlen30(zName), 0
4c90: 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65  );.  if( pTrigge
4ca0: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 72  r ){.    if( pTr
4cb0: 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
4cc0: 70 54 72 69 67 67 65 72 2d 3e 70 54 61 62 53 63  pTrigger->pTabSc
4cd0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 54 61  hema ){.      Ta
4ce0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 74 61 62 6c  ble *pTab = tabl
4cf0: 65 4f 66 54 72 69 67 67 65 72 28 70 54 72 69 67  eOfTrigger(pTrig
4d00: 67 65 72 29 3b 0a 20 20 20 20 20 20 54 72 69 67  ger);.      Trig
4d10: 67 65 72 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  ger **pp;.      
4d20: 66 6f 72 28 70 70 3d 26 70 54 61 62 2d 3e 70 54  for(pp=&pTab->pT
4d30: 72 69 67 67 65 72 3b 20 2a 70 70 21 3d 70 54 72  rigger; *pp!=pTr
4d40: 69 67 67 65 72 3b 20 70 70 3d 26 28 28 2a 70 70  igger; pp=&((*pp
4d50: 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20  )->pNext));.    
4d60: 20 20 2a 70 70 20 3d 20 28 2a 70 70 29 2d 3e 70    *pp = (*pp)->p
4d70: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
4d80: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69  sqlite3DeleteTri
4d90: 67 67 65 72 28 64 62 2c 20 70 54 72 69 67 67 65  gger(db, pTrigge
4da0: 72 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  r);.    db->flag
4db0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
4dc0: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d  rnChanges;.  }.}
4dd0: 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69  ../*.** pEList i
4de0: 73 20 74 68 65 20 53 45 54 20 63 6c 61 75 73 65  s the SET clause
4df0: 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73 74   of an UPDATE st
4e00: 61 74 65 6d 65 6e 74 2e 20 20 45 61 63 68 20 65  atement.  Each e
4e10: 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 45 4c 69 73  ntry.** in pELis
4e20: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
4e30: 61 74 20 3c 69 64 3e 3d 3c 65 78 70 72 3e 2e 20  at <id>=<expr>. 
4e40: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
4e50: 6e 74 72 69 65 73 0a 2a 2a 20 69 6e 20 70 45 4c  ntries.** in pEL
4e60: 69 73 74 20 68 61 76 65 20 61 6e 20 3c 69 64 3e  ist have an <id>
4e70: 20 77 68 69 63 68 20 6d 61 74 63 68 65 73 20 61   which matches a
4e80: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 69 6e 20  n identifier in 
4e90: 70 49 64 4c 69 73 74 2c 0a 2a 2a 20 74 68 65 6e  pIdList,.** then
4ea0: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49   return TRUE.  I
4eb0: 66 20 70 49 64 4c 69 73 74 3d 3d 4e 55 4c 4c 2c  f pIdList==NULL,
4ec0: 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 6e 73   then it is cons
4ed0: 69 64 65 72 65 64 20 61 0a 2a 2a 20 77 69 6c 64  idered a.** wild
4ee0: 63 61 72 64 20 74 68 61 74 20 6d 61 74 63 68 65  card that matche
4ef0: 73 20 61 6e 79 74 68 69 6e 67 2e 20 20 4c 69 6b  s anything.  Lik
4f00: 65 77 69 73 65 20 69 66 20 70 45 4c 69 73 74 3d  ewise if pEList=
4f10: 3d 4e 55 4c 4c 20 74 68 65 6e 0a 2a 2a 20 69 74  =NULL then.** it
4f20: 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68 69 6e   matches anythin
4f30: 67 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75  g so always retu
4f40: 72 6e 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e  rn true.  Return
4f50: 20 66 61 6c 73 65 20 6f 6e 6c 79 0a 2a 2a 20 69   false only.** i
4f60: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
4f70: 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tch..*/.static i
4f80: 6e 74 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76  nt checkColumnOv
4f90: 65 72 4c 61 70 28 49 64 4c 69 73 74 20 2a 70 49  erLap(IdList *pI
4fa0: 64 4c 69 73 74 2c 20 45 78 70 72 4c 69 73 74 20  dList, ExprList 
4fb0: 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20  *pEList){.  int 
4fc0: 65 3b 0a 20 20 69 66 28 20 21 70 49 64 4c 69 73  e;.  if( !pIdLis
4fd0: 74 20 7c 7c 20 21 70 45 4c 69 73 74 20 29 20 72  t || !pEList ) r
4fe0: 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 65  eturn 1;.  for(e
4ff0: 3d 30 3b 20 65 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; e<pEList->nE
5000: 78 70 72 3b 20 65 2b 2b 29 7b 0a 20 20 20 20 69  xpr; e++){.    i
5010: 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  f( sqlite3IdList
5020: 49 6e 64 65 78 28 70 49 64 4c 69 73 74 2c 20 70  Index(pIdList, p
5030: 45 4c 69 73 74 2d 3e 61 5b 65 5d 2e 7a 4e 61 6d  EList->a[e].zNam
5040: 65 29 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 31  e)>=0 ) return 1
5050: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
5060: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ; .}../*.** Retu
5070: 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c  rn a list of all
5080: 20 74 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62   triggers on tab
5090: 6c 65 20 70 54 61 62 20 69 66 20 74 68 65 72 65  le pTab if there
50a0: 20 65 78 69 73 74 73 20 61 74 20 6c 65 61 73 74   exists at least
50b0: 0a 2a 2a 20 6f 6e 65 20 74 72 69 67 67 65 72 20  .** one trigger 
50c0: 74 68 61 74 20 6d 75 73 74 20 62 65 20 66 69 72  that must be fir
50d0: 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61  ed when an opera
50e0: 74 69 6f 6e 20 6f 66 20 74 79 70 65 20 27 6f 70  tion of type 'op
50f0: 27 20 69 73 20 0a 2a 2a 20 70 65 72 66 6f 72 6d  ' is .** perform
5100: 65 64 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c  ed on the table,
5110: 20 61 6e 64 2c 20 69 66 20 74 68 61 74 20 6f 70   and, if that op
5120: 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 55 50  eration is an UP
5130: 44 41 54 45 2c 20 69 66 20 61 74 0a 2a 2a 20 6c  DATE, if at.** l
5140: 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
5150: 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 43 68 61 6e  columns in pChan
5160: 67 65 73 20 69 73 20 62 65 69 6e 67 20 6d 6f 64  ges is being mod
5170: 69 66 69 65 64 2e 0a 2a 2f 0a 54 72 69 67 67 65  ified..*/.Trigge
5180: 72 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65  r *sqlite3Trigge
5190: 72 73 45 78 69 73 74 28 0a 20 20 50 61 72 73 65  rsExist(.  Parse
51a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
51b0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
51c0: 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
51d0: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
51e0: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
51f0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  e contains the t
5200: 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74  riggers */.  int
5210: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
5220: 20 20 20 20 20 2f 2a 20 6f 6e 65 20 6f 66 20 54       /* one of T
5230: 4b 5f 44 45 4c 45 54 45 2c 20 54 4b 5f 49 4e 53  K_DELETE, TK_INS
5240: 45 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 20 2a  ERT, TK_UPDATE *
5250: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43  /.  ExprList *pC
5260: 68 61 6e 67 65 73 2c 20 20 20 20 20 2f 2a 20 43  hanges,     /* C
5270: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 63 68 61 6e  olumns that chan
5280: 67 65 20 69 6e 20 61 6e 20 55 50 44 41 54 45 20  ge in an UPDATE 
5290: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
52a0: 6e 74 20 2a 70 4d 61 73 6b 20 20 20 20 20 20 20  nt *pMask       
52b0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
52c0: 61 73 6b 20 6f 66 20 54 52 49 47 47 45 52 5f 42  ask of TRIGGER_B
52d0: 45 46 4f 52 45 7c 54 52 49 47 47 45 52 5f 41 46  EFORE|TRIGGER_AF
52e0: 54 45 52 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  TER */.){.  int 
52f0: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 54 72 69 67  mask = 0;.  Trig
5300: 67 65 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c  ger *pList = sql
5310: 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
5320: 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
5330: 20 54 72 69 67 67 65 72 20 2a 70 3b 0a 20 20 61   Trigger *p;.  a
5340: 73 73 65 72 74 28 20 70 4c 69 73 74 3d 3d 30 20  ssert( pList==0 
5350: 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
5360: 62 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70  b)==0 );.  for(p
5370: 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
5380: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
5390: 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 63 68 65  p->op==op && che
53a0: 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 4c 61 70 28  ckColumnOverLap(
53b0: 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70 43 68  p->pColumns, pCh
53c0: 61 6e 67 65 73 29 20 29 7b 0a 20 20 20 20 20 20  anges) ){.      
53d0: 6d 61 73 6b 20 7c 3d 20 70 2d 3e 74 72 5f 74 6d  mask |= p->tr_tm
53e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
53f0: 28 20 70 4d 61 73 6b 20 29 7b 0a 20 20 20 20 2a  ( pMask ){.    *
5400: 70 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 20 20  pMask = mask;.  
5410: 7d 0a 20 20 72 65 74 75 72 6e 20 28 6d 61 73 6b  }.  return (mask
5420: 20 3f 20 70 4c 69 73 74 20 3a 20 30 29 3b 0a 7d   ? pList : 0);.}
5430: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
5440: 74 68 65 20 70 53 74 65 70 2d 3e 74 61 72 67 65  the pStep->targe
5450: 74 20 74 6f 6b 65 6e 20 69 6e 74 6f 20 61 20 53  t token into a S
5460: 72 63 4c 69 73 74 20 61 6e 64 20 72 65 74 75 72  rcList and retur
5470: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
5480: 6f 20 74 68 61 74 20 53 72 63 4c 69 73 74 2e 0a  o that SrcList..
5490: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
54a0: 6e 65 20 61 64 64 73 20 61 20 73 70 65 63 69 66  ne adds a specif
54b0: 69 63 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ic database name
54c0: 2c 20 69 66 20 6e 65 65 64 65 64 2c 20 74 6f 20  , if needed, to 
54d0: 74 68 65 20 74 61 72 67 65 74 20 77 68 65 6e 0a  the target when.
54e0: 2a 2a 20 66 6f 72 6d 69 6e 67 20 74 68 65 20 53  ** forming the S
54f0: 72 63 4c 69 73 74 2e 20 20 54 68 69 73 20 70 72  rcList.  This pr
5500: 65 76 65 6e 74 73 20 61 20 74 72 69 67 67 65 72  events a trigger
5510: 20 69 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65   in one database
5520: 20 66 72 6f 6d 0a 2a 2a 20 72 65 66 65 72 72 69   from.** referri
5530: 6e 67 20 74 6f 20 61 20 74 61 72 67 65 74 20 69  ng to a target i
5540: 6e 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  n another databa
5550: 73 65 2e 20 20 41 6e 20 65 78 63 65 70 74 69 6f  se.  An exceptio
5560: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 0a 2a 2a  n is when the.**
5570: 20 74 72 69 67 67 65 72 20 69 73 20 69 6e 20 54   trigger is in T
5580: 45 4d 50 20 69 6e 20 77 68 69 63 68 20 63 61 73  EMP in which cas
5590: 65 20 69 74 20 63 61 6e 20 72 65 66 65 72 20 74  e it can refer t
55a0: 6f 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  o any other data
55b0: 62 61 73 65 20 69 74 0a 2a 2a 20 77 61 6e 74 73  base it.** wants
55c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 72 63 4c  ..*/.static SrcL
55d0: 69 73 74 20 2a 74 61 72 67 65 74 53 72 63 4c 69  ist *targetSrcLi
55e0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
55f0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
5600: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
5610: 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74  t */.  TriggerSt
5620: 65 70 20 2a 70 53 74 65 70 20 20 20 2f 2a 20 54  ep *pStep   /* T
5630: 68 65 20 74 72 69 67 67 65 72 20 63 6f 6e 74 61  he trigger conta
5640: 69 6e 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  ining the target
5650: 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 54   token */.){.  T
5660: 6f 6b 65 6e 20 73 44 62 3b 20 20 20 20 20 20 20  oken sDb;       
5670: 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 64 61 74      /* Dummy dat
5680: 61 62 61 73 65 20 6e 61 6d 65 20 74 6f 6b 65 6e  abase name token
5690: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
56a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
56b0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
56c0: 61 73 65 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  ase to use */.  
56d0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
56e0: 20 20 20 20 20 2f 2a 20 53 72 63 4c 69 73 74 20       /* SrcList 
56f0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a  to be returned *
5700: 2f 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  /..  iDb = sqlit
5710: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
5720: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 74 65  pParse->db, pSte
5730: 70 2d 3e 70 54 72 69 67 2d 3e 70 53 63 68 65 6d  p->pTrig->pSchem
5740: 61 29 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d 30  a);.  if( iDb==0
5750: 20 7c 7c 20 69 44 62 3e 3d 32 20 29 7b 0a 20 20   || iDb>=2 ){.  
5760: 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 70 50    assert( iDb<pP
5770: 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b  arse->db->nDb );
5780: 0a 20 20 20 20 73 44 62 2e 7a 20 3d 20 28 75 38  .    sDb.z = (u8
5790: 2a 29 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  *)pParse->db->aD
57a0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
57b0: 20 20 73 44 62 2e 6e 20 3d 20 73 71 6c 69 74 65    sDb.n = sqlite
57c0: 33 53 74 72 6c 65 6e 33 30 28 28 63 68 61 72 2a  3Strlen30((char*
57d0: 29 73 44 62 2e 7a 29 3b 0a 20 20 20 20 73 44 62  )sDb.z);.    sDb
57e0: 2e 71 75 6f 74 65 64 20 3d 20 30 3b 0a 20 20 20  .quoted = 0;.   
57f0: 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
5800: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  rcListAppend(pPa
5810: 72 73 65 2d 3e 64 62 2c 20 30 2c 20 26 73 44 62  rse->db, 0, &sDb
5820: 2c 20 26 70 53 74 65 70 2d 3e 74 61 72 67 65 74  , &pStep->target
5830: 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  );.  } else {.  
5840: 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33    pSrc = sqlite3
5850: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50  SrcListAppend(pP
5860: 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 26 70 53  arse->db, 0, &pS
5870: 74 65 70 2d 3e 74 61 72 67 65 74 2c 20 30 29 3b  tep->target, 0);
5880: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 53  .  }.  return pS
5890: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  rc;.}../*.** Gen
58a0: 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
58b0: 66 6f 72 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  for zero or more
58c0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
58d0: 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  de the body of a
58e0: 0a 2a 2a 20 74 72 69 67 67 65 72 2e 20 20 0a 2a  .** trigger.  .*
58f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
5900: 65 54 72 69 67 67 65 72 50 72 6f 67 72 61 6d 28  eTriggerProgram(
5910: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
5930: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
5940: 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 53  xt */.  TriggerS
5950: 74 65 70 20 2a 70 53 74 65 70 4c 69 73 74 2c 20  tep *pStepList, 
5960: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 73 74 61    /* List of sta
5970: 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 20 74  tements inside t
5980: 68 65 20 74 72 69 67 67 65 72 20 62 6f 64 79 20  he trigger body 
5990: 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 69  */.  int orconfi
59a0: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n              /
59b0: 2a 20 43 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  * Conflict algor
59c0: 69 74 68 6d 2e 20 28 4f 45 5f 41 62 6f 72 74 2c  ithm. (OE_Abort,
59d0: 20 65 74 63 29 20 2a 2f 20 20 0a 29 7b 0a 20 20   etc) */  .){.  
59e0: 54 72 69 67 67 65 72 53 74 65 70 20 2a 20 70 54  TriggerStep * pT
59f0: 72 69 67 67 65 72 53 74 65 70 20 3d 20 70 53 74  riggerStep = pSt
5a00: 65 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 6f 72  epList;.  int or
5a10: 63 6f 6e 66 3b 0a 20 20 56 64 62 65 20 2a 76 20  conf;.  Vdbe *v 
5a20: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5a30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5a40: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
5a50: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
5a60: 53 74 65 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Step!=0 );.  ass
5a70: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
5a80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5a90: 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 75  (v, OP_ContextPu
5aa0: 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 56 64 62  sh, 0, 0);.  Vdb
5ab0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  eComment((v, "be
5ac0: 67 69 6e 20 74 72 69 67 67 65 72 20 25 73 22 2c  gin trigger %s",
5ad0: 20 70 53 74 65 70 4c 69 73 74 2d 3e 70 54 72 69   pStepList->pTri
5ae0: 67 2d 3e 6e 61 6d 65 29 29 3b 0a 20 20 77 68 69  g->name));.  whi
5af0: 6c 65 28 20 70 54 72 69 67 67 65 72 53 74 65 70  le( pTriggerStep
5b00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5b10: 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
5b20: 61 72 73 65 29 3b 0a 20 20 20 20 6f 72 63 6f 6e  arse);.    orcon
5b30: 66 20 3d 20 28 6f 72 63 6f 6e 66 69 6e 20 3d 3d  f = (orconfin ==
5b40: 20 4f 45 5f 44 65 66 61 75 6c 74 29 3f 70 54 72   OE_Default)?pTr
5b50: 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e  iggerStep->orcon
5b60: 66 3a 6f 72 63 6f 6e 66 69 6e 3b 0a 20 20 20 20  f:orconfin;.    
5b70: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
5b80: 6b 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f  k->orconf = orco
5b90: 6e 66 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  nf;.    switch( 
5ba0: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70  pTriggerStep->op
5bb0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54   ){.      case T
5bc0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
5bd0: 20 20 20 20 53 65 6c 65 63 74 20 2a 73 73 20 3d      Select *ss =
5be0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
5bf0: 70 28 64 62 2c 20 70 54 72 69 67 67 65 72 53 74  p(db, pTriggerSt
5c00: 65 70 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ep->pSelect, 0);
5c10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 73 20  .        if( ss 
5c20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  ){.          Sel
5c30: 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 0a 20  ectDest dest;.. 
5c40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5c50: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
5c60: 64 65 73 74 2c 20 53 52 54 5f 44 69 73 63 61 72  dest, SRT_Discar
5c70: 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  d, 0);.         
5c80: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
5c90: 50 61 72 73 65 2c 20 73 73 2c 20 26 64 65 73 74  Parse, ss, &dest
5ca0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
5cb0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
5cc0: 28 64 62 2c 20 73 73 29 3b 0a 20 20 20 20 20 20  (db, ss);.      
5cd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
5ce0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5cf0: 20 63 61 73 65 20 54 4b 5f 55 50 44 41 54 45 3a   case TK_UPDATE:
5d00: 20 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69   {.        SrcLi
5d10: 73 74 20 2a 70 53 72 63 3b 0a 20 20 20 20 20 20  st *pSrc;.      
5d20: 20 20 70 53 72 63 20 3d 20 74 61 72 67 65 74 53    pSrc = targetS
5d30: 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  rcList(pParse, p
5d40: 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a 20 20  TriggerStep);.  
5d50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5d60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
5d70: 73 65 74 43 6f 75 6e 74 2c 20 30 2c 20 30 29 3b  setCount, 0, 0);
5d80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5d90: 55 70 64 61 74 65 28 70 50 61 72 73 65 2c 20 70  Update(pParse, p
5da0: 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Src,.           
5db0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5dc0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 54 72 69  ListDup(db, pTri
5dd0: 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70 72 4c  ggerStep->pExprL
5de0: 69 73 74 2c 20 30 29 2c 20 0a 20 20 20 20 20 20  ist, 0), .      
5df0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5e00: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 54 72  3ExprDup(db, pTr
5e10: 69 67 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72  iggerStep->pWher
5e20: 65 2c 20 30 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a  e, 0), orconf);.
5e30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5e40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5e50: 52 65 73 65 74 43 6f 75 6e 74 2c 20 31 2c 20 30  ResetCount, 1, 0
5e60: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5e70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5e80: 63 61 73 65 20 54 4b 5f 49 4e 53 45 52 54 3a 20  case TK_INSERT: 
5e90: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
5ea0: 74 20 2a 70 53 72 63 3b 0a 20 20 20 20 20 20 20  t *pSrc;.       
5eb0: 20 70 53 72 63 20 3d 20 74 61 72 67 65 74 53 72   pSrc = targetSr
5ec0: 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54  cList(pParse, pT
5ed0: 72 69 67 67 65 72 53 74 65 70 29 3b 0a 20 20 20  riggerStep);.   
5ee0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5ef0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
5f00: 65 74 43 6f 75 6e 74 2c 20 30 2c 20 30 29 3b 0a  etCount, 0, 0);.
5f10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
5f20: 6e 73 65 72 74 28 70 50 61 72 73 65 2c 20 70 53  nsert(pParse, pS
5f30: 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc,.          sq
5f40: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
5f50: 28 64 62 2c 20 70 54 72 69 67 67 65 72 53 74 65  (db, pTriggerSte
5f60: 70 2d 3e 70 45 78 70 72 4c 69 73 74 2c 20 30 29  p->pExprList, 0)
5f70: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
5f80: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
5f90: 2c 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  , pTriggerStep->
5fa0: 70 53 65 6c 65 63 74 2c 20 30 29 2c 20 0a 20 20  pSelect, 0), .  
5fb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
5fc0: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 54 72  dListDup(db, pTr
5fd0: 69 67 67 65 72 53 74 65 70 2d 3e 70 49 64 4c 69  iggerStep->pIdLi
5fe0: 73 74 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20  st), orconf);.  
5ff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6000: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
6010: 73 65 74 43 6f 75 6e 74 2c 20 31 2c 20 30 29 3b  setCount, 1, 0);
6020: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6030: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
6040: 73 65 20 54 4b 5f 44 45 4c 45 54 45 3a 20 7b 0a  se TK_DELETE: {.
6050: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
6060: 2a 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 73  *pSrc;.        s
6070: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6080: 28 76 2c 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e  (v, OP_ResetCoun
6090: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
60a0: 20 20 70 53 72 63 20 3d 20 74 61 72 67 65 74 53    pSrc = targetS
60b0: 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  rcList(pParse, p
60c0: 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a 20 20  TriggerStep);.  
60d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
60e0: 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 20  eteFrom(pParse, 
60f0: 70 53 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20  pSrc, .         
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6110: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
6120: 64 62 2c 20 70 54 72 69 67 67 65 72 53 74 65 70  db, pTriggerStep
6130: 2d 3e 70 57 68 65 72 65 2c 20 30 29 29 3b 0a 20  ->pWhere, 0));. 
6140: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6150: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
6160: 65 73 65 74 43 6f 75 6e 74 2c 20 31 2c 20 30 29  esetCount, 1, 0)
6170: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6180: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
6190: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
61a0: 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d  assert(0);.    }
61b0: 20 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74   .    pTriggerSt
61c0: 65 70 20 3d 20 70 54 72 69 67 67 65 72 53 74 65  ep = pTriggerSte
61d0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
61e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
61f0: 32 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50  2(v, OP_ContextP
6200: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 56 64 62  op, 0, 0);.  Vdb
6210: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
6220: 64 20 74 72 69 67 67 65 72 20 25 73 22 2c 20 70  d trigger %s", p
6230: 53 74 65 70 4c 69 73 74 2d 3e 70 54 72 69 67 2d  StepList->pTrig-
6240: 3e 6e 61 6d 65 29 29 3b 0a 0a 20 20 72 65 74 75  >name));..  retu
6250: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
6260: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  his is called to
6270: 20 63 6f 64 65 20 46 4f 52 20 45 41 43 48 20 52   code FOR EACH R
6280: 4f 57 20 74 72 69 67 67 65 72 73 2e 0a 2a 2a 0a  OW triggers..**.
6290: 2a 2a 20 57 68 65 6e 20 74 68 65 20 63 6f 64 65  ** When the code
62a0: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
62b0: 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 69 73  ion generates is
62c0: 20 65 78 65 63 75 74 65 64 2c 20 74 68 65 20 66   executed, the f
62d0: 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 6d 75 73  ollowing .** mus
62e0: 74 20 62 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a  t be true:.**.**
62f0: 20 31 2e 20 4e 6f 20 63 75 72 73 6f 72 73 20 6d   1. No cursors m
6300: 61 79 20 62 65 20 6f 70 65 6e 20 69 6e 20 74 68  ay be open in th
6310: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e  e main database.
6320: 20 20 28 42 75 74 20 6e 65 77 49 64 78 20 61 6e    (But newIdx an
6330: 64 20 6f 6c 64 49 64 78 0a 2a 2a 20 20 20 20 63  d oldIdx.**    c
6340: 61 6e 20 62 65 20 69 6e 64 69 63 65 73 20 6f 66  an be indices of
6350: 20 63 75 72 73 6f 72 73 20 69 6e 20 74 65 6d 70   cursors in temp
6360: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 53  orary tables.  S
6370: 65 65 20 62 65 6c 6f 77 2e 29 0a 2a 2a 0a 2a 2a  ee below.).**.**
6380: 20 32 2e 20 49 66 20 74 68 65 20 74 72 69 67 67   2. If the trigg
6390: 65 72 73 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ers being coded 
63a0: 61 72 65 20 4f 4e 20 49 4e 53 45 52 54 20 6f 72  are ON INSERT or
63b0: 20 4f 4e 20 55 50 44 41 54 45 20 74 72 69 67 67   ON UPDATE trigg
63c0: 65 72 73 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20  ers, then.**    
63d0: 61 20 74 65 6d 70 6f 72 61 72 79 20 76 64 62 65  a temporary vdbe
63e0: 20 63 75 72 73 6f 72 20 28 69 6e 64 65 78 20 6e   cursor (index n
63f0: 65 77 49 64 78 29 20 6d 75 73 74 20 62 65 20 6f  ewIdx) must be o
6400: 70 65 6e 20 61 6e 64 20 70 6f 69 6e 74 69 6e 67  pen and pointing
6410: 20 61 74 0a 2a 2a 20 20 20 20 61 20 72 6f 77 20   at.**    a row 
6420: 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 6c 75 65  containing value
6430: 73 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  s to be substitu
6440: 74 65 64 20 66 6f 72 20 6e 65 77 2e 2a 20 65 78  ted for new.* ex
6450: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
6460: 0a 2a 2a 20 20 20 20 74 72 69 67 67 65 72 20 70  .**    trigger p
6470: 72 6f 67 72 61 6d 28 73 29 2e 0a 2a 2a 0a 2a 2a  rogram(s)..**.**
6480: 20 33 2e 20 49 66 20 74 68 65 20 74 72 69 67 67   3. If the trigg
6490: 65 72 73 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ers being coded 
64a0: 61 72 65 20 4f 4e 20 44 45 4c 45 54 45 20 6f 72  are ON DELETE or
64b0: 20 4f 4e 20 55 50 44 41 54 45 20 74 72 69 67 67   ON UPDATE trigg
64c0: 65 72 73 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20  ers, then.**    
64d0: 61 20 74 65 6d 70 6f 72 61 72 79 20 76 64 62 65  a temporary vdbe
64e0: 20 63 75 72 73 6f 72 20 28 69 6e 64 65 78 20 6f   cursor (index o
64f0: 6c 64 49 64 78 29 20 6d 75 73 74 20 62 65 20 6f  ldIdx) must be o
6500: 70 65 6e 20 61 6e 64 20 70 6f 69 6e 74 69 6e 67  pen and pointing
6510: 20 61 74 0a 2a 2a 20 20 20 20 61 20 72 6f 77 20   at.**    a row 
6520: 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 6c 75 65  containing value
6530: 73 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  s to be substitu
6540: 74 65 64 20 66 6f 72 20 6f 6c 64 2e 2a 20 65 78  ted for old.* ex
6550: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
6560: 0a 2a 2a 20 20 20 20 74 72 69 67 67 65 72 20 70  .**    trigger p
6570: 72 6f 67 72 61 6d 28 73 29 2e 0a 2a 2a 0a 2a 2a  rogram(s)..**.**
6580: 20 49 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   If they are not
6590: 20 4e 55 4c 4c 2c 20 74 68 65 20 70 69 4f 6c 64   NULL, the piOld
65a0: 43 6f 6c 4d 61 73 6b 20 61 6e 64 20 70 69 4e 65  ColMask and piNe
65b0: 77 43 6f 6c 4d 61 73 6b 20 6f 75 74 70 75 74 20  wColMask output 
65c0: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 61 72 65  variables.** are
65d0: 20 73 65 74 20 74 6f 20 76 61 6c 75 65 73 20 74   set to values t
65e0: 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65  hat describe the
65f0: 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 62 79   columns used by
6600: 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f   the trigger pro
6610: 67 72 61 6d 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  gram.** in the O
6620: 4c 44 2e 2a 20 61 6e 64 20 4e 45 57 2e 2a 20 74  LD.* and NEW.* t
6630: 61 62 6c 65 73 20 72 65 73 70 65 63 74 69 76 65  ables respective
6640: 6c 79 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 4e 20  ly. If column N 
6650: 6f 66 20 74 68 65 20 0a 2a 2a 20 70 73 65 75 64  of the .** pseud
6660: 6f 2d 74 61 62 6c 65 20 69 73 20 72 65 61 64 20  o-table is read 
6670: 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2c 20 74  at least once, t
6680: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
6690: 20 62 69 74 20 6f 66 20 74 68 65 20 6f 75 74 70   bit of the outp
66a0: 75 74 0a 2a 2a 20 6d 61 73 6b 20 69 73 20 73 65  ut.** mask is se
66b0: 74 2e 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 77  t. If a column w
66c0: 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65  ith an index gre
66d0: 61 74 65 72 20 74 68 61 6e 20 33 32 20 69 73 20  ater than 32 is 
66e0: 72 65 61 64 2c 20 74 68 65 0a 2a 2a 20 6f 75 74  read, the.** out
66f0: 70 75 74 20 6d 61 73 6b 20 69 73 20 73 65 74 20  put mask is set 
6700: 74 6f 20 74 68 65 20 73 70 65 63 69 61 6c 20 76  to the special v
6710: 61 6c 75 65 20 30 78 66 66 66 66 66 66 66 66 2e  alue 0xffffffff.
6720: 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
6730: 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72  e3CodeRowTrigger
6740: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6750: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
6760: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
6770: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
6780: 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  ,   /* List of t
6790: 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65  riggers on table
67a0: 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 6f   pTab */.  int o
67b0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
67c0: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 50 44  /* One of TK_UPD
67d0: 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20  ATE, TK_INSERT, 
67e0: 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 45  TK_DELETE */.  E
67f0: 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65  xprList *pChange
6800: 73 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 6c  s,  /* Changes l
6810: 69 73 74 20 66 6f 72 20 61 6e 79 20 55 50 44 41  ist for any UPDA
6820: 54 45 20 4f 46 20 74 72 69 67 67 65 72 73 20 2a  TE OF triggers *
6830: 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20  /.  int tr_tm,  
6840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
6850: 6f 66 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52  of TRIGGER_BEFOR
6860: 45 2c 20 54 52 49 47 47 45 52 5f 41 46 54 45 52  E, TRIGGER_AFTER
6870: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
6880: 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  b,         /* Th
6890: 65 20 74 61 62 6c 65 20 74 6f 20 63 6f 64 65 20  e table to code 
68a0: 74 72 69 67 67 65 72 73 20 66 72 6f 6d 20 2a 2f  triggers from */
68b0: 0a 20 20 69 6e 74 20 6e 65 77 49 64 78 2c 20 20  .  int newIdx,  
68c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
68d0: 6e 64 69 63 65 20 6f 66 20 74 68 65 20 22 6e 65  ndice of the "ne
68e0: 77 22 20 72 6f 77 20 74 6f 20 61 63 63 65 73 73  w" row to access
68f0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6c 64 49 64 78   */.  int oldIdx
6900: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
6910: 65 20 69 6e 64 69 63 65 20 6f 66 20 74 68 65 20  e indice of the 
6920: 22 6f 6c 64 22 20 72 6f 77 20 74 6f 20 61 63 63  "old" row to acc
6930: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63  ess */.  int orc
6940: 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  onf,          /*
6950: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c   ON CONFLICT pol
6960: 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 67 6e  icy */.  int ign
6970: 6f 72 65 4a 75 6d 70 2c 20 20 20 20 20 20 2f 2a  oreJump,      /*
6980: 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   Instruction to 
6990: 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52 41 49 53  jump to for RAIS
69a0: 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a 20 20 75  E(IGNORE) */.  u
69b0: 33 32 20 2a 70 69 4f 6c 64 43 6f 6c 4d 61 73 6b  32 *piOldColMask
69c0: 2c 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b  ,   /* OUT: Mask
69d0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64   of columns used
69e0: 20 66 72 6f 6d 20 74 68 65 20 4f 4c 44 2e 2a 20   from the OLD.* 
69f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 75 33 32 20 2a  table */.  u32 *
6a00: 70 69 4e 65 77 43 6f 6c 4d 61 73 6b 20 20 20 20  piNewColMask    
6a10: 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
6a20: 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 72 6f  columns used fro
6a30: 6d 20 74 68 65 20 4e 45 57 2e 2a 20 74 61 62 6c  m the NEW.* tabl
6a40: 65 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65  e */.){.  Trigge
6a50: 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  r *p;.  sqlite3 
6a60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6a70: 3b 0a 20 20 54 72 69 67 67 65 72 53 74 61 63 6b  ;.  TriggerStack
6a80: 20 74 72 69 67 53 74 61 63 6b 45 6e 74 72 79 3b   trigStackEntry;
6a90: 0a 0a 20 20 74 72 69 67 53 74 61 63 6b 45 6e 74  ..  trigStackEnt
6aa0: 72 79 2e 6f 6c 64 43 6f 6c 4d 61 73 6b 20 3d 20  ry.oldColMask = 
6ab0: 30 3b 0a 20 20 74 72 69 67 53 74 61 63 6b 45 6e  0;.  trigStackEn
6ac0: 74 72 79 2e 6e 65 77 43 6f 6c 4d 61 73 6b 20 3d  try.newColMask =
6ad0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 6f 70   0;..  assert(op
6ae0: 20 3d 3d 20 54 4b 5f 55 50 44 41 54 45 20 7c 7c   == TK_UPDATE ||
6af0: 20 6f 70 20 3d 3d 20 54 4b 5f 49 4e 53 45 52 54   op == TK_INSERT
6b00: 20 7c 7c 20 6f 70 20 3d 3d 20 54 4b 5f 44 45 4c   || op == TK_DEL
6b10: 45 54 45 29 3b 0a 20 20 61 73 73 65 72 74 28 74  ETE);.  assert(t
6b20: 72 5f 74 6d 20 3d 3d 20 54 52 49 47 47 45 52 5f  r_tm == TRIGGER_
6b30: 42 45 46 4f 52 45 20 7c 7c 20 74 72 5f 74 6d 20  BEFORE || tr_tm 
6b40: 3d 3d 20 54 52 49 47 47 45 52 5f 41 46 54 45 52  == TRIGGER_AFTER
6b50: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 6e 65   );..  assert(ne
6b60: 77 49 64 78 20 21 3d 20 2d 31 20 7c 7c 20 6f 6c  wIdx != -1 || ol
6b70: 64 49 64 78 20 21 3d 20 2d 31 29 3b 0a 0a 20 20  dIdx != -1);..  
6b80: 66 6f 72 28 70 3d 70 54 72 69 67 67 65 72 3b 20  for(p=pTrigger; 
6b90: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
6ba0: 20 20 20 20 69 6e 74 20 66 69 72 65 5f 74 68 69      int fire_thi
6bb0: 73 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 44  s = 0;..    /* D
6bc0: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
6bd0: 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 64 65 20   we should code 
6be0: 74 68 69 73 20 74 72 69 67 67 65 72 20 2a 2f 0a  this trigger */.
6bf0: 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 70      if( .      p
6c00: 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 0a 20 20 20  ->op==op && .   
6c10: 20 20 20 70 2d 3e 74 72 5f 74 6d 3d 3d 74 72 5f     p->tr_tm==tr_
6c20: 74 6d 20 26 26 20 0a 20 20 20 20 20 20 28 70 2d  tm && .      (p-
6c30: 3e 70 53 63 68 65 6d 61 3d 3d 70 2d 3e 70 54 61  >pSchema==p->pTa
6c40: 62 53 63 68 65 6d 61 20 7c 7c 20 70 2d 3e 70 53  bSchema || p->pS
6c50: 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
6c60: 5d 2e 70 53 63 68 65 6d 61 29 20 26 26 0a 20 20  ].pSchema) &&.  
6c70: 20 20 20 20 28 6f 70 21 3d 54 4b 5f 55 50 44 41      (op!=TK_UPDA
6c80: 54 45 7c 7c 21 70 2d 3e 70 43 6f 6c 75 6d 6e 73  TE||!p->pColumns
6c90: 7c 7c 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65  ||checkColumnOve
6ca0: 72 4c 61 70 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73  rLap(p->pColumns
6cb0: 2c 70 43 68 61 6e 67 65 73 29 29 0a 20 20 20 20  ,pChanges)).    
6cc0: 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72  ){.      Trigger
6cd0: 53 74 61 63 6b 20 2a 70 53 3b 20 20 20 20 20 20  Stack *pS;      
6ce0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 72  /* Pointer to tr
6cf0: 69 67 67 65 72 2d 73 74 61 63 6b 20 65 6e 74 72  igger-stack entr
6d00: 79 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 70  y */.      for(p
6d10: 53 3d 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  S=pParse->trigSt
6d20: 61 63 6b 3b 20 70 53 20 26 26 20 70 21 3d 70 53  ack; pS && p!=pS
6d30: 2d 3e 70 54 72 69 67 67 65 72 3b 20 70 53 3d 70  ->pTrigger; pS=p
6d40: 53 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20  S->pNext){}.    
6d50: 20 20 69 66 28 20 21 70 53 20 29 7b 0a 20 20 20    if( !pS ){.   
6d60: 20 20 20 20 20 66 69 72 65 5f 74 68 69 73 20 3d       fire_this =
6d70: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20   1;.      }.#if 
6d80: 30 20 20 20 20 2f 2a 20 47 69 76 65 20 6e 6f 20  0    /* Give no 
6d90: 77 61 72 6e 69 6e 67 20 66 6f 72 20 72 65 63 75  warning for recu
6da0: 72 73 69 76 65 20 74 72 69 67 67 65 72 73 2e 20  rsive triggers. 
6db0: 20 4a 75 73 74 20 64 6f 20 6e 6f 74 20 64 6f 20   Just do not do 
6dc0: 74 68 65 6d 20 2a 2f 0a 20 20 20 20 20 20 65 6c  them */.      el
6dd0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
6de0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6df0: 73 65 2c 20 22 72 65 63 75 72 73 69 76 65 20 74  se, "recursive t
6e00: 72 69 67 67 65 72 73 20 6e 6f 74 20 73 75 70 70  riggers not supp
6e10: 6f 72 74 65 64 20 28 25 73 29 22 2c 0a 20 20 20  orted (%s)",.   
6e20: 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65           p->name
6e30: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
6e40: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
6e50: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
6e60: 20 20 20 7d 0a 20 0a 20 20 20 20 69 66 28 20 66     }. .    if( f
6e70: 69 72 65 5f 74 68 69 73 20 29 7b 0a 20 20 20 20  ire_this ){.    
6e80: 20 20 69 6e 74 20 65 6e 64 54 72 69 67 67 65 72    int endTrigger
6e90: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 20 77  ;.      Expr * w
6ea0: 68 65 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 41  henExpr;.      A
6eb0: 75 74 68 43 6f 6e 74 65 78 74 20 73 43 6f 6e 74  uthContext sCont
6ec0: 65 78 74 3b 0a 20 20 20 20 20 20 4e 61 6d 65 43  ext;.      NameC
6ed0: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 0a 23 69 66  ontext sNC;..#if
6ee0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6ef0: 5f 54 52 41 43 45 0a 20 20 20 20 20 20 73 71 6c  _TRACE.      sql
6f00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
6f10: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
6f20: 5f 54 72 61 63 65 2c 20 30 2c 20 30 2c 20 30 2c  _Trace, 0, 0, 0,
6f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6f40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6f50: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 2d 2d 20  MPrintf(db, "-- 
6f60: 54 52 49 47 47 45 52 20 25 73 22 2c 20 70 2d 3e  TRIGGER %s", p->
6f70: 6e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  name),.         
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
6f90: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 23 65 6e 64  4_DYNAMIC);.#end
6fa0: 69 66 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  if.      memset(
6fb0: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
6fc0: 73 4e 43 29 29 3b 0a 20 20 20 20 20 20 73 4e 43  sNC));.      sNC
6fd0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
6fe0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 50 75 73 68  ;..      /* Push
6ff0: 20 61 6e 20 65 6e 74 72 79 20 6f 6e 20 74 6f 20   an entry on to 
7000: 74 68 65 20 74 72 69 67 67 65 72 20 73 74 61 63  the trigger stac
7010: 6b 20 2a 2f 0a 20 20 20 20 20 20 74 72 69 67 53  k */.      trigS
7020: 74 61 63 6b 45 6e 74 72 79 2e 70 54 72 69 67 67  tackEntry.pTrigg
7030: 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 74 72  er = p;.      tr
7040: 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 6e 65 77  igStackEntry.new
7050: 49 64 78 20 3d 20 6e 65 77 49 64 78 3b 0a 20 20  Idx = newIdx;.  
7060: 20 20 20 20 74 72 69 67 53 74 61 63 6b 45 6e 74      trigStackEnt
7070: 72 79 2e 6f 6c 64 49 64 78 20 3d 20 6f 6c 64 49  ry.oldIdx = oldI
7080: 64 78 3b 0a 20 20 20 20 20 20 74 72 69 67 53 74  dx;.      trigSt
7090: 61 63 6b 45 6e 74 72 79 2e 70 54 61 62 20 3d 20  ackEntry.pTab = 
70a0: 70 54 61 62 3b 0a 20 20 20 20 20 20 74 72 69 67  pTab;.      trig
70b0: 53 74 61 63 6b 45 6e 74 72 79 2e 70 4e 65 78 74  StackEntry.pNext
70c0: 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53   = pParse->trigS
70d0: 74 61 63 6b 3b 0a 20 20 20 20 20 20 74 72 69 67  tack;.      trig
70e0: 53 74 61 63 6b 45 6e 74 72 79 2e 69 67 6e 6f 72  StackEntry.ignor
70f0: 65 4a 75 6d 70 20 3d 20 69 67 6e 6f 72 65 4a 75  eJump = ignoreJu
7100: 6d 70 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  mp;.      pParse
7110: 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 26 74  ->trigStack = &t
7120: 72 69 67 53 74 61 63 6b 45 6e 74 72 79 3b 0a 20  rigStackEntry;. 
7130: 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68       sqlite3Auth
7140: 43 6f 6e 74 65 78 74 50 75 73 68 28 70 50 61 72  ContextPush(pPar
7150: 73 65 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20 70  se, &sContext, p
7160: 2d 3e 6e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20  ->name);..      
7170: 2f 2a 20 63 6f 64 65 20 74 68 65 20 57 48 45 4e  /* code the WHEN
7180: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
7190: 20 65 6e 64 54 72 69 67 67 65 72 20 3d 20 73 71   endTrigger = sq
71a0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
71b0: 65 6c 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  el(pParse->pVdbe
71c0: 29 3b 0a 20 20 20 20 20 20 77 68 65 6e 45 78 70  );.      whenExp
71d0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
71e0: 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 6e 2c  up(db, p->pWhen,
71f0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64   0);.      if( d
7200: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7210: 7c 7c 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  || sqlite3Resolv
7220: 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c  eExprNames(&sNC,
7230: 20 77 68 65 6e 45 78 70 72 29 20 29 7b 0a 20 20   whenExpr) ){.  
7240: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 74 72        pParse->tr
7250: 69 67 53 74 61 63 6b 20 3d 20 74 72 69 67 53 74  igStack = trigSt
7260: 61 63 6b 45 6e 74 72 79 2e 70 4e 65 78 74 3b 0a  ackEntry.pNext;.
7270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7280: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 77 68  xprDelete(db, wh
7290: 65 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  enExpr);.       
72a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
72b0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
72c0: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
72d0: 73 65 2c 20 77 68 65 6e 45 78 70 72 2c 20 65 6e  se, whenExpr, en
72e0: 64 54 72 69 67 67 65 72 2c 20 53 51 4c 49 54 45  dTrigger, SQLITE
72f0: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
7300: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7310: 65 6c 65 74 65 28 64 62 2c 20 77 68 65 6e 45 78  elete(db, whenEx
7320: 70 72 29 3b 0a 0a 20 20 20 20 20 20 63 6f 64 65  pr);..      code
7330: 54 72 69 67 67 65 72 50 72 6f 67 72 61 6d 28 70  TriggerProgram(p
7340: 50 61 72 73 65 2c 20 70 2d 3e 73 74 65 70 5f 6c  Parse, p->step_l
7350: 69 73 74 2c 20 6f 72 63 6f 6e 66 29 3b 20 0a 0a  ist, orconf); ..
7360: 20 20 20 20 20 20 2f 2a 20 50 6f 70 20 74 68 65        /* Pop the
7370: 20 65 6e 74 72 79 20 6f 66 66 20 74 68 65 20 74   entry off the t
7380: 72 69 67 67 65 72 20 73 74 61 63 6b 20 2a 2f 0a  rigger stack */.
7390: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 74 72        pParse->tr
73a0: 69 67 53 74 61 63 6b 20 3d 20 74 72 69 67 53 74  igStack = trigSt
73b0: 61 63 6b 45 6e 74 72 79 2e 70 4e 65 78 74 3b 0a  ackEntry.pNext;.
73c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
73d0: 68 43 6f 6e 74 65 78 74 50 6f 70 28 26 73 43 6f  hContextPop(&sCo
73e0: 6e 74 65 78 74 29 3b 0a 0a 20 20 20 20 20 20 73  ntext);..      s
73f0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
7400: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 2d 3e 70  eLabel(pParse->p
7410: 56 64 62 65 2c 20 65 6e 64 54 72 69 67 67 65 72  Vdbe, endTrigger
7420: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
7430: 66 28 20 70 69 4f 6c 64 43 6f 6c 4d 61 73 6b 20  f( piOldColMask 
7440: 29 20 2a 70 69 4f 6c 64 43 6f 6c 4d 61 73 6b 20  ) *piOldColMask 
7450: 7c 3d 20 74 72 69 67 53 74 61 63 6b 45 6e 74 72  |= trigStackEntr
7460: 79 2e 6f 6c 64 43 6f 6c 4d 61 73 6b 3b 0a 20 20  y.oldColMask;.  
7470: 69 66 28 20 70 69 4e 65 77 43 6f 6c 4d 61 73 6b  if( piNewColMask
7480: 20 29 20 2a 70 69 4e 65 77 43 6f 6c 4d 61 73 6b   ) *piNewColMask
7490: 20 7c 3d 20 74 72 69 67 53 74 61 63 6b 45 6e 74   |= trigStackEnt
74a0: 72 79 2e 6e 65 77 43 6f 6c 4d 61 73 6b 3b 0a 20  ry.newColMask;. 
74b0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
74c0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
74d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
74e0: 47 45 52 29 20 2a 2f 0a                          GER) */.