/ Hex Artifact Content
Login

Artifact c029d5262768faa43962080a170bb707afa0b9d7:


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: 36 20 32 30 30 39 2f 30 34 2f 32 33 20 31 33 3a  6 2009/04/23 13:
0190: 32 32 3a 34 34 20 64 72 68 20 45 78 70 20 24 0a  22:44 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 20 2b 20 31 3b 0a 20 20 20  >table) + 1;.   
2710: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
2720: 33 48 61 73 68 46 69 6e 64 28 26 70 4c 69 6e 6b  3HashFind(&pLink
2730: 2d 3e 70 54 61 62 53 63 68 65 6d 61 2d 3e 74 62  ->pTabSchema->tb
2740: 6c 48 61 73 68 2c 20 70 4c 69 6e 6b 2d 3e 74 61  lHash, pLink->ta
2750: 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 61  ble, n);.      a
2760: 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
2770: 3b 0a 20 20 20 20 20 20 70 4c 69 6e 6b 2d 3e 70  ;.      pLink->p
2780: 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 54 72  Next = pTab->pTr
2790: 69 67 67 65 72 3b 0a 20 20 20 20 20 20 70 54 61  igger;.      pTa
27a0: 62 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70 4c  b->pTrigger = pL
27b0: 69 6e 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ink;.    }.  }..
27c0: 74 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c  triggerfinish_cl
27d0: 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
27e0: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62  DeleteTrigger(db
27f0: 2c 20 70 54 72 69 67 29 3b 0a 20 20 61 73 73 65  , pTrig);.  asse
2800: 72 74 28 20 21 70 50 61 72 73 65 2d 3e 70 4e 65  rt( !pParse->pNe
2810: 77 54 72 69 67 67 65 72 20 29 3b 0a 20 20 73 71  wTrigger );.  sq
2820: 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67  lite3DeleteTrigg
2830: 65 72 53 74 65 70 28 64 62 2c 20 70 53 74 65 70  erStep(db, pStep
2840: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
2850: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 61  Make a copy of a
2860: 6c 6c 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66  ll components of
2870: 20 74 68 65 20 67 69 76 65 6e 20 74 72 69 67 67   the given trigg
2880: 65 72 20 73 74 65 70 2e 20 20 54 68 69 73 20 68  er step.  This h
2890: 61 73 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74  as.** the effect
28a0: 20 6f 66 20 63 6f 70 79 69 6e 67 20 61 6c 6c 20   of copying all 
28b0: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
28c0: 75 65 73 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ues into memory 
28d0: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
28e0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
28f0: 29 2e 20 20 41 73 20 69 6e 69 74 69 61 6c 6c 79  ).  As initially
2900: 20 63 72 65 61 74 65 64 2c 20 74 68 65 20 45 78   created, the Ex
2910: 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65  pr.token.z value
2920: 73 0a 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 20 74  s.** all point t
2930: 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
2940: 6e 67 20 74 68 61 74 20 77 61 73 20 66 65 64 20  ng that was fed 
2950: 74 6f 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  to the parser.  
2960: 42 75 74 20 74 68 61 74 0a 2a 2a 20 73 74 72 69  But that.** stri
2970: 6e 67 20 69 73 20 65 70 68 65 6d 65 72 61 6c 20  ng is ephemeral 
2980: 2d 20 69 74 20 77 69 6c 6c 20 67 6f 20 61 77 61  - it will go awa
2990: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  y as soon as the
29a0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a   sqlite3_exec().
29b0: 2a 2a 20 63 61 6c 6c 20 74 68 61 74 20 73 74 61  ** call that sta
29c0: 72 74 65 64 20 74 68 65 20 70 61 72 73 65 72 20  rted the parser 
29d0: 65 78 69 74 73 2e 20 20 54 68 69 73 20 72 6f 75  exits.  This rou
29e0: 74 69 6e 65 20 6d 61 6b 65 73 20 61 20 70 65 72  tine makes a per
29f0: 73 69 73 74 65 6e 74 0a 2a 2a 20 63 6f 70 79 20  sistent.** copy 
2a00: 6f 66 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  of all the Expr.
2a10: 74 6f 6b 65 6e 2e 7a 20 73 74 72 69 6e 67 73 20  token.z strings 
2a20: 73 6f 20 74 68 61 74 20 74 68 65 20 54 72 69 67  so that the Trig
2a30: 67 65 72 53 74 65 70 20 73 74 72 75 63 74 75 72  gerStep structur
2a40: 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 76 61 6c  e.** will be val
2a50: 69 64 20 65 76 65 6e 20 61 66 74 65 72 20 74 68  id even after th
2a60: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  e sqlite3_exec()
2a70: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 2a   call returns..*
2a80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2a90: 6c 69 74 65 50 65 72 73 69 73 74 54 72 69 67 67  litePersistTrigg
2aa0: 65 72 53 74 65 70 28 73 71 6c 69 74 65 33 20 2a  erStep(sqlite3 *
2ab0: 64 62 2c 20 54 72 69 67 67 65 72 53 74 65 70 20  db, TriggerStep 
2ac0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 61  *p){.  if( p->ta
2ad0: 72 67 65 74 2e 7a 20 29 7b 0a 20 20 20 20 70 2d  rget.z ){.    p-
2ae0: 3e 74 61 72 67 65 74 2e 7a 20 3d 20 28 75 38 2a  >target.z = (u8*
2af0: 29 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75  )sqlite3DbStrNDu
2b00: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e  p(db, (char*)p->
2b10: 74 61 72 67 65 74 2e 7a 2c 20 70 2d 3e 74 61 72  target.z, p->tar
2b20: 67 65 74 2e 6e 29 3b 0a 20 20 20 20 70 2d 3e 74  get.n);.    p->t
2b30: 61 72 67 65 74 2e 64 79 6e 20 3d 20 31 3b 0a 20  arget.dyn = 1;. 
2b40: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 53 65 6c   }.  if( p->pSel
2b50: 65 63 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  ect ){.    Selec
2b60: 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  t *pNew = sqlite
2b70: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
2b80: 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  ->pSelect, 1);. 
2b90: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2ba0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
2bb0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70  elect);.    p->p
2bc0: 53 65 6c 65 63 74 20 3d 20 70 4e 65 77 3b 0a 20  Select = pNew;. 
2bd0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65   }.  if( p->pWhe
2be0: 72 65 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  re ){.    Expr *
2bf0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
2c00: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68  prDup(db, p->pWh
2c10: 65 72 65 2c 20 45 58 50 52 44 55 50 5f 52 45 44  ere, EXPRDUP_RED
2c20: 55 43 45 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  UCE);.    sqlite
2c30: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
2c40: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
2c50: 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e 65 77  p->pWhere = pNew
2c60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2c70: 45 78 70 72 4c 69 73 74 20 29 7b 0a 20 20 20 20  ExprList ){.    
2c80: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d  ExprList *pNew =
2c90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2ca0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 78 70 72  Dup(db, p->pExpr
2cb0: 4c 69 73 74 2c 20 31 29 3b 0a 20 20 20 20 73 71  List, 1);.    sq
2cc0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2cd0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 78 70 72  ete(db, p->pExpr
2ce0: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
2cf0: 78 70 72 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  xprList = pNew;.
2d00: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 49 64    }.  if( p->pId
2d10: 4c 69 73 74 20 29 7b 0a 20 20 20 20 49 64 4c 69  List ){.    IdLi
2d20: 73 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  st *pNew = sqlit
2d30: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
2d40: 70 2d 3e 70 49 64 4c 69 73 74 29 3b 0a 20 20 20  p->pIdList);.   
2d50: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
2d60: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 49 64 4c  lete(db, p->pIdL
2d70: 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 49 64  ist);.    p->pId
2d80: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
2d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  .}../*.** Turn a
2da0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2db0: 74 20 28 74 68 61 74 20 74 68 65 20 70 53 65 6c  t (that the pSel
2dc0: 65 63 74 20 70 61 72 61 6d 65 74 65 72 20 70 6f  ect parameter po
2dd0: 69 6e 74 73 20 74 6f 29 20 69 6e 74 6f 0a 2a 2a  ints to) into.**
2de0: 20 61 20 74 72 69 67 67 65 72 20 73 74 65 70 2e   a trigger step.
2df0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
2e00: 65 72 20 74 6f 20 61 20 54 72 69 67 67 65 72 53  er to a TriggerS
2e10: 74 65 70 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  tep structure..*
2e20: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
2e30: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
2e40: 6e 65 20 77 68 65 6e 20 69 74 20 66 69 6e 64 73  ne when it finds
2e50: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2e60: 65 6e 74 20 69 6e 0a 2a 2a 20 62 6f 64 79 20 6f  ent in.** body o
2e70: 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 0a 2a  f a TRIGGER.  .*
2e80: 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a 73  /.TriggerStep *s
2e90: 71 6c 69 74 65 33 54 72 69 67 67 65 72 53 65 6c  qlite3TriggerSel
2ea0: 65 63 74 53 74 65 70 28 73 71 6c 69 74 65 33 20  ectStep(sqlite3 
2eb0: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  *db, Select *pSe
2ec0: 6c 65 63 74 29 7b 0a 20 20 54 72 69 67 67 65 72  lect){.  Trigger
2ed0: 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74  Step *pTriggerSt
2ee0: 65 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ep = sqlite3DbMa
2ef0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
2f00: 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29  eof(TriggerStep)
2f10: 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65  );.  if( pTrigge
2f20: 72 53 74 65 70 3d 3d 30 20 29 20 7b 0a 20 20 20  rStep==0 ) {.   
2f30: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2f40: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
2f50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
2f60: 0a 20 20 7d 0a 0a 20 20 70 54 72 69 67 67 65 72  .  }..  pTrigger
2f70: 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  Step->op = TK_SE
2f80: 4c 45 43 54 3b 0a 20 20 70 54 72 69 67 67 65 72  LECT;.  pTrigger
2f90: 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Step->pSelect = 
2fa0: 70 53 65 6c 65 63 74 3b 0a 20 20 70 54 72 69 67  pSelect;.  pTrig
2fb0: 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20  gerStep->orconf 
2fc0: 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20  = OE_Default;.  
2fd0: 73 71 6c 69 74 65 50 65 72 73 69 73 74 54 72 69  sqlitePersistTri
2fe0: 67 67 65 72 53 74 65 70 28 64 62 2c 20 70 54 72  ggerStep(db, pTr
2ff0: 69 67 67 65 72 53 74 65 70 29 3b 0a 0a 20 20 72  iggerStep);..  r
3000: 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53 74  eturn pTriggerSt
3010: 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 69  ep;.}../*.** Bui
3020: 6c 64 20 61 20 74 72 69 67 67 65 72 20 73 74 65  ld a trigger ste
3030: 70 20 6f 75 74 20 6f 66 20 61 6e 20 49 4e 53 45  p out of an INSE
3040: 52 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52  RT statement.  R
3050: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
3060: 2a 2a 20 74 6f 20 74 68 65 20 6e 65 77 20 74 72  ** to the new tr
3070: 69 67 67 65 72 20 73 74 65 70 2e 0a 2a 2a 0a 2a  igger step..**.*
3080: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
3090: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
30a0: 77 68 65 6e 20 69 74 20 73 65 65 73 20 61 6e 20  when it sees an 
30b0: 49 4e 53 45 52 54 20 69 6e 73 69 64 65 20 74 68  INSERT inside th
30c0: 65 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20 74  e.** body of a t
30d0: 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72 69 67 67  rigger..*/.Trigg
30e0: 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33 54  erStep *sqlite3T
30f0: 72 69 67 67 65 72 49 6e 73 65 72 74 53 74 65 70  riggerInsertStep
3100: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3110: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
3120: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3130: 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
3140: 54 61 62 6c 65 4e 61 6d 65 2c 20 20 2f 2a 20 4e  TableName,  /* N
3150: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
3160: 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 69   into which we i
3170: 6e 73 65 72 74 20 2a 2f 0a 20 20 49 64 4c 69 73  nsert */.  IdLis
3180: 74 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20 20 2f  t *pColumn,    /
3190: 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
31a0: 73 20 69 6e 20 70 54 61 62 6c 65 4e 61 6d 65 20  s in pTableName 
31b0: 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 2a  to insert into *
31c0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
31d0: 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 56  List,   /* The V
31e0: 41 4c 55 45 20 63 6c 61 75 73 65 3a 20 61 20 6c  ALUE clause: a l
31f0: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  ist of values to
3200: 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   be inserted */.
3210: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
3220: 74 2c 20 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  t,    /* A SELEC
3230: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
3240: 20 73 75 70 70 6c 69 65 73 20 76 61 6c 75 65 73   supplies values
3250: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66   */.  int orconf
3260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3270: 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69   conflict algori
3280: 74 68 6d 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f  thm (OE_Abort, O
3290: 45 5f 52 65 70 6c 61 63 65 2c 20 65 74 63 2e 29  E_Replace, etc.)
32a0: 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72   */.){.  Trigger
32b0: 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74  Step *pTriggerSt
32c0: 65 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 70 45  ep;..  assert(pE
32d0: 4c 69 73 74 20 3d 3d 20 30 20 7c 7c 20 70 53 65  List == 0 || pSe
32e0: 6c 65 63 74 20 3d 3d 20 30 29 3b 0a 20 20 61 73  lect == 0);.  as
32f0: 73 65 72 74 28 70 45 4c 69 73 74 20 21 3d 20 30  sert(pEList != 0
3300: 20 7c 7c 20 70 53 65 6c 65 63 74 20 21 3d 20 30   || pSelect != 0
3310: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
3320: 69 6c 65 64 29 3b 0a 0a 20 20 70 54 72 69 67 67  iled);..  pTrigg
3330: 65 72 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33  erStep = sqlite3
3340: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
3350: 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53   sizeof(TriggerS
3360: 74 65 70 29 29 3b 0a 20 20 69 66 28 20 70 54 72  tep));.  if( pTr
3370: 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20 20  iggerStep ){.   
3380: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f   pTriggerStep->o
3390: 70 20 3d 20 54 4b 5f 49 4e 53 45 52 54 3b 0a 20  p = TK_INSERT;. 
33a0: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
33b0: 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65  >pSelect = pSele
33c0: 63 74 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  ct;.    pTrigger
33d0: 53 74 65 70 2d 3e 74 61 72 67 65 74 20 20 3d 20  Step->target  = 
33e0: 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 20  *pTableName;.   
33f0: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
3400: 49 64 4c 69 73 74 20 3d 20 70 43 6f 6c 75 6d 6e  IdList = pColumn
3410: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74  ;.    pTriggerSt
3420: 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20  ep->pExprList = 
3430: 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 54 72 69  pEList;.    pTri
3440: 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66  ggerStep->orconf
3450: 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 20 20 73   = orconf;.    s
3460: 71 6c 69 74 65 50 65 72 73 69 73 74 54 72 69 67  qlitePersistTrig
3470: 67 65 72 53 74 65 70 28 64 62 2c 20 70 54 72 69  gerStep(db, pTri
3480: 67 67 65 72 53 74 65 70 29 3b 0a 20 20 7d 65 6c  ggerStep);.  }el
3490: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  se{.    sqlite3I
34a0: 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
34b0: 70 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71  pColumn);.    sq
34c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
34d0: 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
34e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
34f0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
3500: 6c 65 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  lect);.  }..  re
3510: 74 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65  turn pTriggerSte
3520: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  p;.}../*.** Cons
3530: 74 72 75 63 74 20 61 20 74 72 69 67 67 65 72 20  truct a trigger 
3540: 73 74 65 70 20 74 68 61 74 20 69 6d 70 6c 65 6d  step that implem
3550: 65 6e 74 73 20 61 6e 20 55 50 44 41 54 45 20 73  ents an UPDATE s
3560: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 74  tatement and ret
3570: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
3580: 20 74 6f 20 74 68 61 74 20 74 72 69 67 67 65 72   to that trigger
3590: 20 73 74 65 70 2e 20 20 54 68 65 20 70 61 72 73   step.  The pars
35a0: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
35b0: 75 74 69 6e 65 20 77 68 65 6e 20 69 74 0a 2a 2a  utine when it.**
35c0: 20 73 65 65 73 20 61 6e 20 55 50 44 41 54 45 20   sees an UPDATE 
35d0: 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 69 64 65  statement inside
35e0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 43   the body of a C
35f0: 52 45 41 54 45 20 54 52 49 47 47 45 52 2e 0a 2a  REATE TRIGGER..*
3600: 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a 73  /.TriggerStep *s
3610: 71 6c 69 74 65 33 54 72 69 67 67 65 72 55 70 64  qlite3TriggerUpd
3620: 61 74 65 53 74 65 70 28 0a 20 20 73 71 6c 69 74  ateStep(.  sqlit
3630: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
3640: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
3650: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
3660: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d  Token *pTableNam
3670: 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
3680: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
3690: 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 45 78 70  updated */.  Exp
36a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
36b0: 20 20 2f 2a 20 54 68 65 20 53 45 54 20 63 6c 61    /* The SET cla
36c0: 75 73 65 3a 20 6c 69 73 74 20 6f 66 20 63 6f 6c  use: list of col
36d0: 75 6d 6e 20 61 6e 64 20 6e 65 77 20 76 61 6c 75  umn and new valu
36e0: 65 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  es */.  Expr *pW
36f0: 68 65 72 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  here,        /* 
3700: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
3710: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66   */.  int orconf
3720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
3730: 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
3740: 69 74 68 6d 2e 20 28 4f 45 5f 41 62 6f 72 74 2c  ithm. (OE_Abort,
3750: 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29   OE_Ignore, etc)
3760: 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72   */.){.  Trigger
3770: 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74  Step *pTriggerSt
3780: 65 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ep = sqlite3DbMa
3790: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
37a0: 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29  eof(TriggerStep)
37b0: 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65  );.  if( pTrigge
37c0: 72 53 74 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20  rStep==0 ){.    
37d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
37e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73  Delete(db, pELis
37f0: 74 29 3b 0a 20 20 20 20 20 73 71 6c 69 74 65 33  t);.     sqlite3
3800: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3810: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 72 65 74  Where);.     ret
3820: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 54  urn 0;.  }..  pT
3830: 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d  riggerStep->op =
3840: 20 54 4b 5f 55 50 44 41 54 45 3b 0a 20 20 70 54   TK_UPDATE;.  pT
3850: 72 69 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67  riggerStep->targ
3860: 65 74 20 20 3d 20 2a 70 54 61 62 6c 65 4e 61 6d  et  = *pTableNam
3870: 65 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  e;.  pTriggerSte
3880: 70 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 70  p->pExprList = p
3890: 45 4c 69 73 74 3b 0a 20 20 70 54 72 69 67 67 65  EList;.  pTrigge
38a0: 72 53 74 65 70 2d 3e 70 57 68 65 72 65 20 3d 20  rStep->pWhere = 
38b0: 70 57 68 65 72 65 3b 0a 20 20 70 54 72 69 67 67  pWhere;.  pTrigg
38c0: 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d  erStep->orconf =
38d0: 20 6f 72 63 6f 6e 66 3b 0a 20 20 73 71 6c 69 74   orconf;.  sqlit
38e0: 65 50 65 72 73 69 73 74 54 72 69 67 67 65 72 53  ePersistTriggerS
38f0: 74 65 70 28 64 62 2c 20 70 54 72 69 67 67 65 72  tep(db, pTrigger
3900: 53 74 65 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Step);..  return
3910: 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d   pTriggerStep;.}
3920: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
3930: 74 20 61 20 74 72 69 67 67 65 72 20 73 74 65 70  t a trigger step
3940: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
3950: 20 61 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d   a DELETE statem
3960: 65 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ent and return.*
3970: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
3980: 68 61 74 20 74 72 69 67 67 65 72 20 73 74 65 70  hat trigger step
3990: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 63 61  .  The parser ca
39a0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
39b0: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 73 65 65 73   when it.** sees
39c0: 20 61 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d   a DELETE statem
39d0: 65 6e 74 20 69 6e 73 69 64 65 20 74 68 65 20 62  ent inside the b
39e0: 6f 64 79 20 6f 66 20 61 20 43 52 45 41 54 45 20  ody of a CREATE 
39f0: 54 52 49 47 47 45 52 2e 0a 2a 2f 0a 54 72 69 67  TRIGGER..*/.Trig
3a00: 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33  gerStep *sqlite3
3a10: 54 72 69 67 67 65 72 44 65 6c 65 74 65 53 74 65  TriggerDeleteSte
3a20: 70 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p(.  sqlite3 *db
3a30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3a40: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
3a50: 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
3a60: 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20  pTableName,     
3a70: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 66 72   /* The table fr
3a80: 6f 6d 20 77 68 69 63 68 20 72 6f 77 73 20 61 72  om which rows ar
3a90: 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 45  e deleted */.  E
3aa0: 78 70 72 20 2a 70 57 68 65 72 65 20 20 20 20 20  xpr *pWhere     
3ab0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
3ac0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b  ERE clause */.){
3ad0: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
3ae0: 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 73  pTriggerStep = s
3af0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
3b00: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72  ro(db, sizeof(Tr
3b10: 69 67 67 65 72 53 74 65 70 29 29 3b 0a 20 20 69  iggerStep));.  i
3b20: 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70 3d  f( pTriggerStep=
3b30: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3b40: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
3b50: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 72 65 74  pWhere);.    ret
3b60: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 54  urn 0;.  }..  pT
3b70: 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d  riggerStep->op =
3b80: 20 54 4b 5f 44 45 4c 45 54 45 3b 0a 20 20 70 54   TK_DELETE;.  pT
3b90: 72 69 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67  riggerStep->targ
3ba0: 65 74 20 20 3d 20 2a 70 54 61 62 6c 65 4e 61 6d  et  = *pTableNam
3bb0: 65 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  e;.  pTriggerSte
3bc0: 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  p->pWhere = pWhe
3bd0: 72 65 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74  re;.  pTriggerSt
3be0: 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f  ep->orconf = OE_
3bf0: 44 65 66 61 75 6c 74 3b 0a 20 20 73 71 6c 69 74  Default;.  sqlit
3c00: 65 50 65 72 73 69 73 74 54 72 69 67 67 65 72 53  ePersistTriggerS
3c10: 74 65 70 28 64 62 2c 20 70 54 72 69 67 67 65 72  tep(db, pTrigger
3c20: 53 74 65 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Step);..  return
3c30: 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d   pTriggerStep;.}
3c40: 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 63 75 72 73 69  ../* .** Recursi
3c50: 76 65 6c 79 20 64 65 6c 65 74 65 20 61 20 54 72  vely delete a Tr
3c60: 69 67 67 65 72 20 73 74 72 75 63 74 75 72 65 0a  igger structure.
3c70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3c80: 65 6c 65 74 65 54 72 69 67 67 65 72 28 73 71 6c  eleteTrigger(sql
3c90: 69 74 65 33 20 2a 64 62 2c 20 54 72 69 67 67 65  ite3 *db, Trigge
3ca0: 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20 20  r *pTrigger){.  
3cb0: 69 66 28 20 70 54 72 69 67 67 65 72 3d 3d 30 20  if( pTrigger==0 
3cc0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
3cd0: 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72  te3DeleteTrigger
3ce0: 53 74 65 70 28 64 62 2c 20 70 54 72 69 67 67 65  Step(db, pTrigge
3cf0: 72 2d 3e 73 74 65 70 5f 6c 69 73 74 29 3b 0a 20  r->step_list);. 
3d00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3d10: 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  b, pTrigger->nam
3d20: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
3d30: 72 65 65 28 64 62 2c 20 70 54 72 69 67 67 65 72  ree(db, pTrigger
3d40: 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69  ->table);.  sqli
3d50: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3d60: 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65  , pTrigger->pWhe
3d70: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  n);.  sqlite3IdL
3d80: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
3d90: 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73  rigger->pColumns
3da0: 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65  );.  if( pTrigge
3db0: 72 2d 3e 6e 61 6d 65 54 6f 6b 65 6e 2e 64 79 6e  r->nameToken.dyn
3dc0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
3dd0: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 54 72 69  (db, (char*)pTri
3de0: 67 67 65 72 2d 3e 6e 61 6d 65 54 6f 6b 65 6e 2e  gger->nameToken.
3df0: 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  z);.  sqlite3DbF
3e00: 72 65 65 28 64 62 2c 20 70 54 72 69 67 67 65 72  ree(db, pTrigger
3e10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
3e20: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
3e30: 6c 65 64 20 74 6f 20 64 72 6f 70 20 61 20 74 72  led to drop a tr
3e40: 69 67 67 65 72 20 66 72 6f 6d 20 74 68 65 20 64  igger from the d
3e50: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
3e60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 79 20  .**.** This may 
3e70: 62 65 20 63 61 6c 6c 65 64 20 64 69 72 65 63 74  be called direct
3e80: 6c 79 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73  ly from the pars
3e90: 65 72 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  er and therefore
3ea0: 20 69 64 65 6e 74 69 66 69 65 73 0a 2a 2a 20 74   identifies.** t
3eb0: 68 65 20 74 72 69 67 67 65 72 20 62 79 20 6e 61  he trigger by na
3ec0: 6d 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  me.  The sqlite3
3ed0: 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 29  DropTriggerPtr()
3ee0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
3ef0: 65 0a 2a 2a 20 73 61 6d 65 20 6a 6f 62 20 61 73  e.** same job as
3f00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78   this routine ex
3f10: 63 65 70 74 20 69 74 20 74 61 6b 65 73 20 61 20  cept it takes a 
3f20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
3f30: 72 69 67 67 65 72 0a 2a 2a 20 69 6e 73 74 65 61  rigger.** instea
3f40: 64 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72  d of the trigger
3f50: 20 6e 61 6d 65 2e 0a 2a 2a 2f 0a 76 6f 69 64 20   name..**/.void 
3f60: 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
3f70: 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
3f80: 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
3f90: 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
3fa0: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
3fb0: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  r = 0;.  int i;.
3fc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
3fd0: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
3fe0: 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 4e  *zName;.  int nN
3ff0: 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ame;.  sqlite3 *
4000: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
4010: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
4020: 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
4030: 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65  drop_trigger_cle
4040: 61 6e 75 70 3b 0a 20 20 69 66 28 20 53 51 4c 49  anup;.  if( SQLI
4050: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
4060: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
4070: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 72 6f   ){.    goto dro
4080: 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  p_trigger_cleanu
4090: 70 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  p;.  }..  assert
40a0: 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
40b0: 20 29 3b 0a 20 20 7a 44 62 20 3d 20 70 4e 61 6d   );.  zDb = pNam
40c0: 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
40d0: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 4e 61  e;.  zName = pNa
40e0: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 3b 0a  me->a[0].zName;.
40f0: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
4100: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
4110: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
4120: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
4130: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
4140: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
4150: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
4160: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
4170: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20   */.    if( zDb 
4180: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
4190: 70 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  p(db->aDb[j].zNa
41a0: 6d 65 2c 20 7a 44 62 29 20 29 20 63 6f 6e 74 69  me, zDb) ) conti
41b0: 6e 75 65 3b 0a 20 20 20 20 70 54 72 69 67 67 65  nue;.    pTrigge
41c0: 72 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  r = sqlite3HashF
41d0: 69 6e 64 28 26 28 64 62 2d 3e 61 44 62 5b 6a 5d  ind(&(db->aDb[j]
41e0: 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61  .pSchema->trigHa
41f0: 73 68 29 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  sh), zName, nNam
4200: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 72 69  e);.    if( pTri
4210: 67 67 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  gger ) break;.  
4220: 7d 0a 20 20 69 66 28 20 21 70 54 72 69 67 67 65  }.  if( !pTrigge
4230: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6e 6f  r ){.    if( !no
4240: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
4250: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4260: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 72  rse, "no such tr
4270: 69 67 67 65 72 3a 20 25 53 22 2c 20 70 4e 61 6d  igger: %S", pNam
4280: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
4290: 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 67   goto drop_trigg
42a0: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
42b0: 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
42c0: 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
42d0: 70 54 72 69 67 67 65 72 29 3b 0a 0a 64 72 6f 70  pTrigger);..drop
42e0: 5f 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70  _trigger_cleanup
42f0: 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
4300: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
4310: 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  me);.}../*.** Re
4320: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
4330: 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
4340: 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 74 61  cture for the ta
4350: 62 6c 65 20 74 68 61 74 20 61 20 74 72 69 67 67  ble that a trigg
4360: 65 72 0a 2a 2a 20 69 73 20 73 65 74 20 6f 6e 2e  er.** is set on.
4370: 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
4380: 20 2a 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72   *tableOfTrigger
4390: 28 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67  (Trigger *pTrigg
43a0: 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 73  er){.  int n = s
43b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
43c0: 54 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 29 20  Trigger->table) 
43d0: 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  + 1;.  return sq
43e0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
43f0: 54 72 69 67 67 65 72 2d 3e 70 54 61 62 53 63 68  Trigger->pTabSch
4400: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 54  ema->tblHash, pT
4410: 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 2c 20 6e  rigger->table, n
4420: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f  );.}.../*.** Dro
4430: 70 20 61 20 74 72 69 67 67 65 72 20 67 69 76 65  p a trigger give
4440: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
4450: 68 61 74 20 74 72 69 67 67 65 72 2e 20 0a 2a 2f  hat trigger. .*/
4460: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
4470: 70 54 72 69 67 67 65 72 50 74 72 28 50 61 72 73  pTriggerPtr(Pars
4480: 65 20 2a 70 50 61 72 73 65 2c 20 54 72 69 67 67  e *pParse, Trigg
4490: 65 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20  er *pTrigger){. 
44a0: 20 54 61 62 6c 65 20 20 20 2a 70 54 61 62 6c 65   Table   *pTable
44b0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
44c0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
44d0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
44e0: 44 62 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c  Db;..  iDb = sql
44f0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
4500: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
4510: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 29  rigger->pSchema)
4520: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
4530: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
4540: 62 20 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  b );.  pTable = 
4550: 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72 28 70  tableOfTrigger(p
4560: 54 72 69 67 67 65 72 29 3b 0a 20 20 61 73 73 65  Trigger);.  asse
4570: 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 20 20  rt( pTable );.  
4580: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
4590: 70 53 63 68 65 6d 61 3d 3d 70 54 72 69 67 67 65  pSchema==pTrigge
45a0: 72 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 69 44  r->pSchema || iD
45b0: 62 3d 3d 31 20 29 3b 0a 23 69 66 6e 64 65 66 20  b==1 );.#ifndef 
45c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
45d0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
45e0: 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c    int code = SQL
45f0: 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52  ITE_DROP_TRIGGER
4600: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
4610: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
4620: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
4630: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
4640: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
4650: 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44  iDb);.    if( iD
4660: 62 3d 3d 31 20 29 20 63 6f 64 65 20 3d 20 53 51  b==1 ) code = SQ
4670: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
4680: 52 49 47 47 45 52 3b 0a 20 20 20 20 69 66 28 20  RIGGER;.    if( 
4690: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
46a0: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
46b0: 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 2c 20 70  Trigger->name, p
46c0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 7a 44  Table->zName, zD
46d0: 62 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69  b) ||.      sqli
46e0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
46f0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
4700: 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
4710: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
4720: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  n;.    }.  }.#en
4730: 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
4740: 74 65 20 63 6f 64 65 20 74 6f 20 64 65 73 74 72  te code to destr
4750: 6f 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  oy the database 
4760: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 74 72  record of the tr
4770: 69 67 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 61 73  igger..  */.  as
4780: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
4790: 29 3b 0a 20 20 69 66 28 20 28 76 20 3d 20 73 71  );.  if( (v = sq
47a0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
47b0: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
47c0: 69 6e 74 20 62 61 73 65 3b 0a 20 20 20 20 73 74  int base;.    st
47d0: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
47e0: 70 4c 69 73 74 20 64 72 6f 70 54 72 69 67 67 65  pList dropTrigge
47f0: 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  r[] = {.      { 
4800: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
4810: 2c 20 41 44 44 52 28 39 29 2c 20 20 30 7d 2c 0a  , ADDR(9),  0},.
4820: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
4830: 67 38 2c 20 20 20 20 30 2c 20 31 2c 20 20 20 20  g8,    0, 1,    
4840: 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a      0}, /* 1 */.
4850: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
4860: 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20  n,     0, 1,    
4870: 20 20 20 20 32 7d 2c 0a 20 20 20 20 20 20 7b 20      2},.      { 
4880: 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 32  OP_Ne,         2
4890: 2c 20 41 44 44 52 28 38 29 2c 20 20 31 7d 2c 0a  , ADDR(8),  1},.
48a0: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
48b0: 67 38 2c 20 20 20 20 30 2c 20 31 2c 20 20 20 20  g8,    0, 1,    
48c0: 20 20 20 20 30 7d 2c 20 2f 2a 20 34 3a 20 22 74      0}, /* 4: "t
48d0: 72 69 67 67 65 72 22 20 2a 2f 0a 20 20 20 20 20  rigger" */.     
48e0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
48f0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 32    0, 0,        2
4900: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
4910: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 41 44 44  ,         2, ADD
4920: 52 28 38 29 2c 20 20 31 7d 2c 0a 20 20 20 20 20  R(8),  1},.     
4930: 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20   { OP_Delete,   
4940: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
4950: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
4960: 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  xt,       0, ADD
4970: 52 28 31 29 2c 20 20 30 7d 2c 20 2f 2a 20 38 20  R(1),  0}, /* 8 
4980: 2a 2f 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 73  */.    };..    s
4990: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
49a0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
49b0: 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 0, iDb);.    s
49c0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
49d0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
49e0: 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73  b);.    base = s
49f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
4a00: 69 73 74 28 76 2c 20 20 41 72 72 61 79 53 69 7a  ist(v,  ArraySiz
4a10: 65 28 64 72 6f 70 54 72 69 67 67 65 72 29 2c 20  e(dropTrigger), 
4a20: 64 72 6f 70 54 72 69 67 67 65 72 29 3b 0a 20 20  dropTrigger);.  
4a30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
4a40: 6e 67 65 50 34 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP4(v, base+1,
4a50: 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 2c   pTrigger->name,
4a60: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4a70: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4a80: 62 61 73 65 2b 34 2c 20 22 74 72 69 67 67 65 72  base+4, "trigger
4a90: 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ", P4_STATIC);. 
4aa0: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
4ab0: 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
4ac0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
4ad0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4ae0: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
4af0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4b00: 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54  dOp4(v, OP_DropT
4b10: 72 69 67 67 65 72 2c 20 69 44 62 2c 20 30 2c 20  rigger, iDb, 0, 
4b20: 30 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  0, pTrigger->nam
4b30: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  e, 0);.    if( p
4b40: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c 33 20 29 7b  Parse->nMem<3 ){
4b50: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
4b60: 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 7d 0a 20  Mem = 3;.    }. 
4b70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f   }.}../*.** Remo
4b80: 76 65 20 61 20 74 72 69 67 67 65 72 20 66 72 6f  ve a trigger fro
4b90: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
4ba0: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 2a  s of the sqlite*
4bb0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 76 6f 69   pointer..*/.voi
4bc0: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
4bd0: 6e 64 44 65 6c 65 74 65 54 72 69 67 67 65 72 28  ndDeleteTrigger(
4be0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
4bf0: 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   iDb, const char
4c00: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 48 61 73 68   *zName){.  Hash
4c10: 20 2a 70 48 61 73 68 20 3d 20 26 28 64 62 2d 3e   *pHash = &(db->
4c20: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
4c30: 2d 3e 74 72 69 67 48 61 73 68 29 3b 0a 20 20 54  ->trigHash);.  T
4c40: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
4c50: 3b 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 73  ;.  pTrigger = s
4c60: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
4c70: 28 70 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73  (pHash, zName, s
4c80: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
4c90: 4e 61 6d 65 29 2c 20 30 29 3b 0a 20 20 69 66 28  Name), 0);.  if(
4ca0: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
4cb0: 20 69 66 28 20 70 54 72 69 67 67 65 72 2d 3e 70   if( pTrigger->p
4cc0: 53 63 68 65 6d 61 3d 3d 70 54 72 69 67 67 65 72  Schema==pTrigger
4cd0: 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 29 7b 0a  ->pTabSchema ){.
4ce0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
4cf0: 62 20 3d 20 74 61 62 6c 65 4f 66 54 72 69 67 67  b = tableOfTrigg
4d00: 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20  er(pTrigger);.  
4d10: 20 20 20 20 54 72 69 67 67 65 72 20 2a 2a 70 70      Trigger **pp
4d20: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26  ;.      for(pp=&
4d30: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 20  pTab->pTrigger; 
4d40: 2a 70 70 21 3d 70 54 72 69 67 67 65 72 3b 20 70  *pp!=pTrigger; p
4d50: 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
4d60: 29 29 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20  ));.      *pp = 
4d70: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 3b 0a 20 20  (*pp)->pNext;.  
4d80: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
4d90: 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62 2c  eleteTrigger(db,
4da0: 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
4db0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
4dc0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
4dd0: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
4de0: 70 45 4c 69 73 74 20 69 73 20 74 68 65 20 53 45  pEList is the SE
4df0: 54 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55  T clause of an U
4e00: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
4e10: 20 20 45 61 63 68 20 65 6e 74 72 79 0a 2a 2a 20    Each entry.** 
4e20: 69 6e 20 70 45 4c 69 73 74 20 69 73 20 6f 66 20  in pEList is of 
4e30: 74 68 65 20 66 6f 72 6d 61 74 20 3c 69 64 3e 3d  the format <id>=
4e40: 3c 65 78 70 72 3e 2e 20 20 49 66 20 61 6e 79 20  <expr>.  If any 
4e50: 6f 66 20 74 68 65 20 65 6e 74 72 69 65 73 0a 2a  of the entries.*
4e60: 2a 20 69 6e 20 70 45 4c 69 73 74 20 68 61 76 65  * in pEList have
4e70: 20 61 6e 20 3c 69 64 3e 20 77 68 69 63 68 20 6d   an <id> which m
4e80: 61 74 63 68 65 73 20 61 6e 20 69 64 65 6e 74 69  atches an identi
4e90: 66 69 65 72 20 69 6e 20 70 49 64 4c 69 73 74 2c  fier in pIdList,
4ea0: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
4eb0: 54 52 55 45 2e 20 20 49 66 20 70 49 64 4c 69 73  TRUE.  If pIdLis
4ec0: 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  t==NULL, then it
4ed0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
4ee0: 0a 2a 2a 20 77 69 6c 64 63 61 72 64 20 74 68 61  .** wildcard tha
4ef0: 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68 69  t matches anythi
4f00: 6e 67 2e 20 20 4c 69 6b 65 77 69 73 65 20 69 66  ng.  Likewise if
4f10: 20 70 45 4c 69 73 74 3d 3d 4e 55 4c 4c 20 74 68   pEList==NULL th
4f20: 65 6e 0a 2a 2a 20 69 74 20 6d 61 74 63 68 65 73  en.** it matches
4f30: 20 61 6e 79 74 68 69 6e 67 20 73 6f 20 61 6c 77   anything so alw
4f40: 61 79 73 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ays return true.
4f50: 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 6f    Return false o
4f60: 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  nly.** if there 
4f70: 69 73 20 6e 6f 20 6d 61 74 63 68 2e 0a 2a 2f 0a  is no match..*/.
4f80: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
4f90: 43 6f 6c 75 6d 6e 4f 76 65 72 4c 61 70 28 49 64  ColumnOverLap(Id
4fa0: 4c 69 73 74 20 2a 70 49 64 4c 69 73 74 2c 20 45  List *pIdList, E
4fb0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
4fc0: 7b 0a 20 20 69 6e 74 20 65 3b 0a 20 20 69 66 28  {.  int e;.  if(
4fd0: 20 21 70 49 64 4c 69 73 74 20 7c 7c 20 21 70 45   !pIdList || !pE
4fe0: 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20 31 3b  List ) return 1;
4ff0: 0a 20 20 66 6f 72 28 65 3d 30 3b 20 65 3c 70 45  .  for(e=0; e<pE
5000: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 65 2b 2b  List->nExpr; e++
5010: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
5020: 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 49  e3IdListIndex(pI
5030: 64 4c 69 73 74 2c 20 70 45 4c 69 73 74 2d 3e 61  dList, pEList->a
5040: 5b 65 5d 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29 20  [e].zName)>=0 ) 
5050: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
5060: 72 65 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f 2a  return 0; .}../*
5070: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73  .** Return a lis
5080: 74 20 6f 66 20 61 6c 6c 20 74 72 69 67 67 65 72  t of all trigger
5090: 73 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 20  s on table pTab 
50a0: 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
50b0: 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20  at least.** one 
50c0: 74 72 69 67 67 65 72 20 74 68 61 74 20 6d 75 73  trigger that mus
50d0: 74 20 62 65 20 66 69 72 65 64 20 77 68 65 6e 20  t be fired when 
50e0: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  an operation of 
50f0: 74 79 70 65 20 27 6f 70 27 20 69 73 20 0a 2a 2a  type 'op' is .**
5100: 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
5110: 65 20 74 61 62 6c 65 2c 20 61 6e 64 2c 20 69 66  e table, and, if
5120: 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20   that operation 
5130: 69 73 20 61 6e 20 55 50 44 41 54 45 2c 20 69 66  is an UPDATE, if
5140: 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 6f 6e 65   at.** least one
5150: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
5160: 69 6e 20 70 43 68 61 6e 67 65 73 20 69 73 20 62  in pChanges is b
5170: 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  eing modified..*
5180: 2f 0a 54 72 69 67 67 65 72 20 2a 73 71 6c 69 74  /.Trigger *sqlit
5190: 65 33 54 72 69 67 67 65 72 73 45 78 69 73 74 28  e3TriggersExist(
51a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
51b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
51c0: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
51d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
51e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
51f0: 74 61 62 6c 65 20 74 68 65 20 63 6f 6e 74 61 69  table the contai
5200: 6e 73 20 74 68 65 20 74 72 69 67 67 65 72 73 20  ns the triggers 
5210: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5230: 6f 6e 65 20 6f 66 20 54 4b 5f 44 45 4c 45 54 45  one of TK_DELETE
5240: 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f  , TK_INSERT, TK_
5250: 55 50 44 41 54 45 20 2a 2f 0a 20 20 45 78 70 72  UPDATE */.  Expr
5260: 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20  List *pChanges, 
5270: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 74      /* Columns t
5280: 68 61 74 20 63 68 61 6e 67 65 20 69 6e 20 61 6e  hat change in an
5290: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
52a0: 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4d 61 73  t */.  int *pMas
52b0: 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
52c0: 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 54  * OUT: Mask of T
52d0: 52 49 47 47 45 52 5f 42 45 46 4f 52 45 7c 54 52  RIGGER_BEFORE|TR
52e0: 49 47 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 29  IGGER_AFTER */.)
52f0: 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30  {.  int mask = 0
5300: 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69  ;.  Trigger *pLi
5310: 73 74 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  st = sqlite3Trig
5320: 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  gerList(pParse, 
5330: 70 54 61 62 29 3b 0a 20 20 54 72 69 67 67 65 72  pTab);.  Trigger
5340: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70   *p;.  assert( p
5350: 4c 69 73 74 3d 3d 30 20 7c 7c 20 49 73 56 69 72  List==0 || IsVir
5360: 74 75 61 6c 28 70 54 61 62 29 3d 3d 30 20 29 3b  tual(pTab)==0 );
5370: 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
5380: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
5390: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 6f      if( p->op==o
53a0: 70 20 26 26 20 63 68 65 63 6b 43 6f 6c 75 6d 6e  p && checkColumn
53b0: 4f 76 65 72 4c 61 70 28 70 2d 3e 70 43 6f 6c 75  OverLap(p->pColu
53c0: 6d 6e 73 2c 20 70 43 68 61 6e 67 65 73 29 20 29  mns, pChanges) )
53d0: 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20  {.      mask |= 
53e0: 70 2d 3e 74 72 5f 74 6d 3b 0a 20 20 20 20 7d 0a  p->tr_tm;.    }.
53f0: 20 20 7d 0a 20 20 69 66 28 20 70 4d 61 73 6b 20    }.  if( pMask 
5400: 29 7b 0a 20 20 20 20 2a 70 4d 61 73 6b 20 3d 20  ){.    *pMask = 
5410: 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  mask;.  }.  retu
5420: 72 6e 20 28 6d 61 73 6b 20 3f 20 70 4c 69 73 74  rn (mask ? pList
5430: 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   : 0);.}../*.** 
5440: 43 6f 6e 76 65 72 74 20 74 68 65 20 70 53 74 65  Convert the pSte
5450: 70 2d 3e 74 61 72 67 65 74 20 74 6f 6b 65 6e 20  p->target token 
5460: 69 6e 74 6f 20 61 20 53 72 63 4c 69 73 74 20 61  into a SrcList a
5470: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
5480: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20 53  ter.** to that S
5490: 72 63 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  rcList..**.** Th
54a0: 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
54b0: 61 20 73 70 65 63 69 66 69 63 20 64 61 74 61 62  a specific datab
54c0: 61 73 65 20 6e 61 6d 65 2c 20 69 66 20 6e 65 65  ase name, if nee
54d0: 64 65 64 2c 20 74 6f 20 74 68 65 20 74 61 72 67  ded, to the targ
54e0: 65 74 20 77 68 65 6e 0a 2a 2a 20 66 6f 72 6d 69  et when.** formi
54f0: 6e 67 20 74 68 65 20 53 72 63 4c 69 73 74 2e 20  ng the SrcList. 
5500: 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 61   This prevents a
5510: 20 74 72 69 67 67 65 72 20 69 6e 20 6f 6e 65 20   trigger in one 
5520: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 0a 2a 2a  database from.**
5530: 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 61 20   referring to a 
5540: 74 61 72 67 65 74 20 69 6e 20 61 6e 6f 74 68 65  target in anothe
5550: 72 20 64 61 74 61 62 61 73 65 2e 20 20 41 6e 20  r database.  An 
5560: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65  exception is whe
5570: 6e 20 74 68 65 0a 2a 2a 20 74 72 69 67 67 65 72  n the.** trigger
5580: 20 69 73 20 69 6e 20 54 45 4d 50 20 69 6e 20 77   is in TEMP in w
5590: 68 69 63 68 20 63 61 73 65 20 69 74 20 63 61 6e  hich case it can
55a0: 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6f 74   refer to any ot
55b0: 68 65 72 20 64 61 74 61 62 61 73 65 20 69 74 0a  her database it.
55c0: 2a 2a 20 77 61 6e 74 73 2e 0a 2a 2f 0a 73 74 61  ** wants..*/.sta
55d0: 74 69 63 20 53 72 63 4c 69 73 74 20 2a 74 61 72  tic SrcList *tar
55e0: 67 65 74 53 72 63 4c 69 73 74 28 0a 20 20 50 61  getSrcList(.  Pa
55f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5600: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
5610: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
5620: 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74 65  riggerStep *pSte
5630: 70 20 20 20 2f 2a 20 54 68 65 20 74 72 69 67 67  p   /* The trigg
5640: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
5650: 65 20 74 61 72 67 65 74 20 74 6f 6b 65 6e 20 2a  e target token *
5660: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 44 62  /.){.  Token sDb
5670: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
5680: 75 6d 6d 79 20 64 61 74 61 62 61 73 65 20 6e 61  ummy database na
5690: 6d 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e  me token */.  in
56a0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
56b0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
56c0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 75  he database to u
56d0: 73 65 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  se */.  SrcList 
56e0: 2a 70 53 72 63 3b 20 20 20 20 20 20 20 2f 2a 20  *pSrc;       /* 
56f0: 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 72 65  SrcList to be re
5700: 74 75 72 6e 65 64 20 2a 2f 0a 0a 20 20 69 44 62  turned */..  iDb
5710: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
5720: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
5730: 64 62 2c 20 70 53 74 65 70 2d 3e 70 54 72 69 67  db, pStep->pTrig
5740: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66  ->pSchema);.  if
5750: 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e  ( iDb==0 || iDb>
5760: 3d 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =2 ){.    assert
5770: 28 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62  ( iDb<pParse->db
5780: 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 73 44 62  ->nDb );.    sDb
5790: 2e 7a 20 3d 20 28 75 38 2a 29 70 50 61 72 73 65  .z = (u8*)pParse
57a0: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
57b0: 4e 61 6d 65 3b 0a 20 20 20 20 73 44 62 2e 6e 20  Name;.    sDb.n 
57c0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
57d0: 30 28 28 63 68 61 72 2a 29 73 44 62 2e 7a 29 3b  0((char*)sDb.z);
57e0: 0a 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69  .    pSrc = sqli
57f0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
5800: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20  (pParse->db, 0, 
5810: 26 73 44 62 2c 20 26 70 53 74 65 70 2d 3e 74 61  &sDb, &pStep->ta
5820: 72 67 65 74 29 3b 0a 20 20 7d 20 65 6c 73 65 20  rget);.  } else 
5830: 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c  {.    pSrc = sql
5840: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
5850: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c  d(pParse->db, 0,
5860: 20 26 70 53 74 65 70 2d 3e 74 61 72 67 65 74 2c   &pStep->target,
5870: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
5880: 6e 20 70 53 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pSrc;.}../*.**
5890: 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
58a0: 6f 64 65 20 66 6f 72 20 7a 65 72 6f 20 6f 72 20  ode for zero or 
58b0: 6d 6f 72 65 20 73 74 61 74 65 6d 65 6e 74 73 20  more statements 
58c0: 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79 20  inside the body 
58d0: 6f 66 20 61 0a 2a 2a 20 74 72 69 67 67 65 72 2e  of a.** trigger.
58e0: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
58f0: 20 63 6f 64 65 54 72 69 67 67 65 72 50 72 6f 67   codeTriggerProg
5900: 72 61 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ram(.  Parse *pP
5910: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
5920: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
5930: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67  ontext */.  Trig
5940: 67 65 72 53 74 65 70 20 2a 70 53 74 65 70 4c 69  gerStep *pStepLi
5950: 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  st,   /* List of
5960: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
5970: 64 65 20 74 68 65 20 74 72 69 67 67 65 72 20 62  de the trigger b
5980: 6f 64 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63  ody */.  int orc
5990: 6f 6e 66 69 6e 20 20 20 20 20 20 20 20 20 20 20  onfin           
59a0: 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 61     /* Conflict a
59b0: 6c 67 6f 72 69 74 68 6d 2e 20 28 4f 45 5f 41 62  lgorithm. (OE_Ab
59c0: 6f 72 74 2c 20 65 74 63 29 20 2a 2f 20 20 0a 29  ort, etc) */  .)
59d0: 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20  {.  TriggerStep 
59e0: 2a 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d  * pTriggerStep =
59f0: 20 70 53 74 65 70 4c 69 73 74 3b 0a 20 20 69 6e   pStepList;.  in
5a00: 74 20 6f 72 63 6f 6e 66 3b 0a 20 20 56 64 62 65  t orconf;.  Vdbe
5a10: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5a20: 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  dbe;.  sqlite3 *
5a30: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5a40: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 72 69  ..  assert( pTri
5a50: 67 67 65 72 53 74 65 70 21 3d 30 20 29 3b 0a 20  ggerStep!=0 );. 
5a60: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
5a70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5a80: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6e 74 65  dOp2(v, OP_Conte
5a90: 78 74 50 75 73 68 2c 20 30 2c 20 30 29 3b 0a 20  xtPush, 0, 0);. 
5aa0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
5ab0: 20 22 62 65 67 69 6e 20 74 72 69 67 67 65 72 20   "begin trigger 
5ac0: 25 73 22 2c 20 70 53 74 65 70 4c 69 73 74 2d 3e  %s", pStepList->
5ad0: 70 54 72 69 67 2d 3e 6e 61 6d 65 29 29 3b 0a 20  pTrig->name));. 
5ae0: 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
5af0: 53 74 65 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  Step ){.    sqli
5b00: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
5b10: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 6f  r(pParse);.    o
5b20: 72 63 6f 6e 66 20 3d 20 28 6f 72 63 6f 6e 66 69  rconf = (orconfi
5b30: 6e 20 3d 3d 20 4f 45 5f 44 65 66 61 75 6c 74 29  n == OE_Default)
5b40: 3f 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f  ?pTriggerStep->o
5b50: 72 63 6f 6e 66 3a 6f 72 63 6f 6e 66 69 6e 3b 0a  rconf:orconfin;.
5b60: 20 20 20 20 70 50 61 72 73 65 2d 3e 74 72 69 67      pParse->trig
5b70: 53 74 61 63 6b 2d 3e 6f 72 63 6f 6e 66 20 3d 20  Stack->orconf = 
5b80: 6f 72 63 6f 6e 66 3b 0a 20 20 20 20 73 77 69 74  orconf;.    swit
5b90: 63 68 28 20 70 54 72 69 67 67 65 72 53 74 65 70  ch( pTriggerStep
5ba0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 63 61  ->op ){.      ca
5bb0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
5bc0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
5bd0: 73 73 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ss = sqlite3Sele
5be0: 63 74 44 75 70 28 64 62 2c 20 70 54 72 69 67 67  ctDup(db, pTrigg
5bf0: 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 2c  erStep->pSelect,
5c00: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
5c10: 20 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20   ss ){.         
5c20: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
5c30: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ;..          sql
5c40: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
5c50: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 44 69  it(&dest, SRT_Di
5c60: 73 63 61 72 64 2c 20 30 29 3b 0a 20 20 20 20 20  scard, 0);.     
5c70: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
5c80: 63 74 28 70 50 61 72 73 65 2c 20 73 73 2c 20 26  ct(pParse, ss, &
5c90: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  dest);.         
5ca0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
5cb0: 6c 65 74 65 28 64 62 2c 20 73 73 29 3b 0a 20 20  lete(db, ss);.  
5cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5cd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5ce0: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 44       case TK_UPD
5cf0: 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 53  ATE: {.        S
5d00: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
5d10: 20 20 20 20 20 20 70 53 72 63 20 3d 20 74 61 72        pSrc = tar
5d20: 67 65 74 53 72 63 4c 69 73 74 28 70 50 61 72 73  getSrcList(pPars
5d30: 65 2c 20 70 54 72 69 67 67 65 72 53 74 65 70 29  e, pTriggerStep)
5d40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5d50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5d60: 50 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20 30 2c  P_ResetCount, 0,
5d70: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
5d80: 69 74 65 33 55 70 64 61 74 65 28 70 50 61 72 73  ite3Update(pPars
5d90: 65 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20  e, pSrc,.       
5da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5db0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
5dc0: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 45  pTriggerStep->pE
5dd0: 78 70 72 4c 69 73 74 2c 20 30 29 2c 20 0a 20 20  xprList, 0), .  
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
5df0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
5e00: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
5e10: 57 68 65 72 65 2c 20 30 29 2c 20 6f 72 63 6f 6e  Where, 0), orcon
5e20: 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  f);.        sqli
5e30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5e40: 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20   OP_ResetCount, 
5e50: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  1, 0);.        b
5e60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5e70: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 53 45      case TK_INSE
5e80: 52 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 53 72  RT: {.        Sr
5e90: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 20  cList *pSrc;.   
5ea0: 20 20 20 20 20 70 53 72 63 20 3d 20 74 61 72 67       pSrc = targ
5eb0: 65 74 53 72 63 4c 69 73 74 28 70 50 61 72 73 65  etSrcList(pParse
5ec0: 2c 20 70 54 72 69 67 67 65 72 53 74 65 70 29 3b  , pTriggerStep);
5ed0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5ee0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5ef0: 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20 30 2c 20  _ResetCount, 0, 
5f00: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
5f10: 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65  te3Insert(pParse
5f20: 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20  , pSrc,.        
5f30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
5f40: 74 44 75 70 28 64 62 2c 20 70 54 72 69 67 67 65  tDup(db, pTrigge
5f50: 72 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74  rStep->pExprList
5f60: 2c 20 30 29 2c 20 0a 20 20 20 20 20 20 20 20 20  , 0), .         
5f70: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
5f80: 70 28 64 62 2c 20 70 54 72 69 67 67 65 72 53 74  p(db, pTriggerSt
5f90: 65 70 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 2c  ep->pSelect, 0),
5fa0: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
5fb0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c  te3IdListDup(db,
5fc0: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
5fd0: 49 64 4c 69 73 74 29 2c 20 6f 72 63 6f 6e 66 29  IdList), orconf)
5fe0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5ff0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6000: 50 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20 31 2c  P_ResetCount, 1,
6010: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
6020: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6030: 20 20 63 61 73 65 20 54 4b 5f 44 45 4c 45 54 45    case TK_DELETE
6040: 3a 20 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c  : {.        SrcL
6050: 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 20 20 20  ist *pSrc;.     
6060: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6070: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp2(v, OP_Reset
6080: 43 6f 75 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  Count, 0, 0);.  
6090: 20 20 20 20 20 20 70 53 72 63 20 3d 20 74 61 72        pSrc = tar
60a0: 67 65 74 53 72 63 4c 69 73 74 28 70 50 61 72 73  getSrcList(pPars
60b0: 65 2c 20 70 54 72 69 67 67 65 72 53 74 65 70 29  e, pTriggerStep)
60c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
60d0: 33 44 65 6c 65 74 65 46 72 6f 6d 28 70 50 61 72  3DeleteFrom(pPar
60e0: 73 65 2c 20 70 53 72 63 2c 20 0a 20 20 20 20 20  se, pSrc, .     
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6110: 44 75 70 28 64 62 2c 20 70 54 72 69 67 67 65 72  Dup(db, pTrigger
6120: 53 74 65 70 2d 3e 70 57 68 65 72 65 2c 20 30 29  Step->pWhere, 0)
6130: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6140: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6150: 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20 31  OP_ResetCount, 1
6160: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 0);.        br
6170: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
6180: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
6190: 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
61a0: 20 20 20 7d 20 0a 20 20 20 20 70 54 72 69 67 67     } .    pTrigg
61b0: 65 72 53 74 65 70 20 3d 20 70 54 72 69 67 67 65  erStep = pTrigge
61c0: 72 53 74 65 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  rStep->pNext;.  
61d0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
61e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6e 74  ddOp2(v, OP_Cont
61f0: 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  extPop, 0, 0);. 
6200: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
6210: 20 22 65 6e 64 20 74 72 69 67 67 65 72 20 25 73   "end trigger %s
6220: 22 2c 20 70 53 74 65 70 4c 69 73 74 2d 3e 70 54  ", pStepList->pT
6230: 72 69 67 2d 3e 6e 61 6d 65 29 29 3b 0a 0a 20 20  rig->name));..  
6240: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
6250: 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
6260: 64 20 74 6f 20 63 6f 64 65 20 46 4f 52 20 45 41  d to code FOR EA
6270: 43 48 20 52 4f 57 20 74 72 69 67 67 65 72 73 2e  CH ROW triggers.
6280: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
6290: 63 6f 64 65 20 74 68 61 74 20 74 68 69 73 20 66  code that this f
62a0: 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65  unction generate
62b0: 73 20 69 73 20 65 78 65 63 75 74 65 64 2c 20 74  s is executed, t
62c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  he following .**
62d0: 20 6d 75 73 74 20 62 65 20 74 72 75 65 3a 0a 2a   must be true:.*
62e0: 2a 0a 2a 2a 20 31 2e 20 4e 6f 20 63 75 72 73 6f  *.** 1. No curso
62f0: 72 73 20 6d 61 79 20 62 65 20 6f 70 65 6e 20 69  rs may be open i
6300: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
6310: 61 73 65 2e 20 20 28 42 75 74 20 6e 65 77 49 64  ase.  (But newId
6320: 78 20 61 6e 64 20 6f 6c 64 49 64 78 0a 2a 2a 20  x and oldIdx.** 
6330: 20 20 20 63 61 6e 20 62 65 20 69 6e 64 69 63 65     can be indice
6340: 73 20 6f 66 20 63 75 72 73 6f 72 73 20 69 6e 20  s of cursors in 
6350: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
6360: 2e 20 20 53 65 65 20 62 65 6c 6f 77 2e 29 0a 2a  .  See below.).*
6370: 2a 0a 2a 2a 20 32 2e 20 49 66 20 74 68 65 20 74  *.** 2. If the t
6380: 72 69 67 67 65 72 73 20 62 65 69 6e 67 20 63 6f  riggers being co
6390: 64 65 64 20 61 72 65 20 4f 4e 20 49 4e 53 45 52  ded are ON INSER
63a0: 54 20 6f 72 20 4f 4e 20 55 50 44 41 54 45 20 74  T or ON UPDATE t
63b0: 72 69 67 67 65 72 73 2c 20 74 68 65 6e 0a 2a 2a  riggers, then.**
63c0: 20 20 20 20 61 20 74 65 6d 70 6f 72 61 72 79 20      a temporary 
63d0: 76 64 62 65 20 63 75 72 73 6f 72 20 28 69 6e 64  vdbe cursor (ind
63e0: 65 78 20 6e 65 77 49 64 78 29 20 6d 75 73 74 20  ex newIdx) must 
63f0: 62 65 20 6f 70 65 6e 20 61 6e 64 20 70 6f 69 6e  be open and poin
6400: 74 69 6e 67 20 61 74 0a 2a 2a 20 20 20 20 61 20  ting at.**    a 
6410: 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  row containing v
6420: 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62 73  alues to be subs
6430: 74 69 74 75 74 65 64 20 66 6f 72 20 6e 65 77 2e  tituted for new.
6440: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
6450: 20 74 68 65 0a 2a 2a 20 20 20 20 74 72 69 67 67   the.**    trigg
6460: 65 72 20 70 72 6f 67 72 61 6d 28 73 29 2e 0a 2a  er program(s)..*
6470: 2a 0a 2a 2a 20 33 2e 20 49 66 20 74 68 65 20 74  *.** 3. If the t
6480: 72 69 67 67 65 72 73 20 62 65 69 6e 67 20 63 6f  riggers being co
6490: 64 65 64 20 61 72 65 20 4f 4e 20 44 45 4c 45 54  ded are ON DELET
64a0: 45 20 6f 72 20 4f 4e 20 55 50 44 41 54 45 20 74  E or ON UPDATE t
64b0: 72 69 67 67 65 72 73 2c 20 74 68 65 6e 0a 2a 2a  riggers, then.**
64c0: 20 20 20 20 61 20 74 65 6d 70 6f 72 61 72 79 20      a temporary 
64d0: 76 64 62 65 20 63 75 72 73 6f 72 20 28 69 6e 64  vdbe cursor (ind
64e0: 65 78 20 6f 6c 64 49 64 78 29 20 6d 75 73 74 20  ex oldIdx) must 
64f0: 62 65 20 6f 70 65 6e 20 61 6e 64 20 70 6f 69 6e  be open and poin
6500: 74 69 6e 67 20 61 74 0a 2a 2a 20 20 20 20 61 20  ting at.**    a 
6510: 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  row containing v
6520: 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62 73  alues to be subs
6530: 74 69 74 75 74 65 64 20 66 6f 72 20 6f 6c 64 2e  tituted for old.
6540: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
6550: 20 74 68 65 0a 2a 2a 20 20 20 20 74 72 69 67 67   the.**    trigg
6560: 65 72 20 70 72 6f 67 72 61 6d 28 73 29 2e 0a 2a  er program(s)..*
6570: 2a 0a 2a 2a 20 49 66 20 74 68 65 79 20 61 72 65  *.** If they are
6580: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 70   not NULL, the p
6590: 69 4f 6c 64 43 6f 6c 4d 61 73 6b 20 61 6e 64 20  iOldColMask and 
65a0: 70 69 4e 65 77 43 6f 6c 4d 61 73 6b 20 6f 75 74  piNewColMask out
65b0: 70 75 74 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a  put variables.**
65c0: 20 61 72 65 20 73 65 74 20 74 6f 20 76 61 6c 75   are set to valu
65d0: 65 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  es that describe
65e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 75 73 65   the columns use
65f0: 64 20 62 79 20 74 68 65 20 74 72 69 67 67 65 72  d by the trigger
6600: 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 69 6e 20 74   program.** in t
6610: 68 65 20 4f 4c 44 2e 2a 20 61 6e 64 20 4e 45 57  he OLD.* and NEW
6620: 2e 2a 20 74 61 62 6c 65 73 20 72 65 73 70 65 63  .* tables respec
6630: 74 69 76 65 6c 79 2e 20 49 66 20 63 6f 6c 75 6d  tively. If colum
6640: 6e 20 4e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  n N of the .** p
6650: 73 65 75 64 6f 2d 74 61 62 6c 65 20 69 73 20 72  seudo-table is r
6660: 65 61 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ead at least onc
6670: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
6680: 64 69 6e 67 20 62 69 74 20 6f 66 20 74 68 65 20  ding bit of the 
6690: 6f 75 74 70 75 74 0a 2a 2a 20 6d 61 73 6b 20 69  output.** mask i
66a0: 73 20 73 65 74 2e 20 49 66 20 61 20 63 6f 6c 75  s set. If a colu
66b0: 6d 6e 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  mn with an index
66c0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 33 32   greater than 32
66d0: 20 69 73 20 72 65 61 64 2c 20 74 68 65 0a 2a 2a   is read, the.**
66e0: 20 6f 75 74 70 75 74 20 6d 61 73 6b 20 69 73 20   output mask is 
66f0: 73 65 74 20 74 6f 20 74 68 65 20 73 70 65 63 69  set to the speci
6700: 61 6c 20 76 61 6c 75 65 20 30 78 66 66 66 66 66  al value 0xfffff
6710: 66 66 66 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  fff..**.*/.int s
6720: 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69  qlite3CodeRowTri
6730: 67 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  gger(.  Parse *p
6740: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
6750: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
6760: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
6770: 67 67 65 72 2c 20 20 20 2f 2a 20 4c 69 73 74 20  gger,   /* List 
6780: 6f 66 20 74 72 69 67 67 65 72 73 20 6f 6e 20 74  of triggers on t
6790: 61 62 6c 65 20 70 54 61 62 20 2a 2f 0a 20 20 69  able pTab */.  i
67a0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
67b0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
67c0: 5f 55 50 44 41 54 45 2c 20 54 4b 5f 49 4e 53 45  _UPDATE, TK_INSE
67d0: 52 54 2c 20 54 4b 5f 44 45 4c 45 54 45 20 2a 2f  RT, TK_DELETE */
67e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68  .  ExprList *pCh
67f0: 61 6e 67 65 73 2c 20 20 2f 2a 20 43 68 61 6e 67  anges,  /* Chang
6800: 65 73 20 6c 69 73 74 20 66 6f 72 20 61 6e 79 20  es list for any 
6810: 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67 65  UPDATE OF trigge
6820: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74  rs */.  int tr_t
6830: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m,           /* 
6840: 4f 6e 65 20 6f 66 20 54 52 49 47 47 45 52 5f 42  One of TRIGGER_B
6850: 45 46 4f 52 45 2c 20 54 52 49 47 47 45 52 5f 41  EFORE, TRIGGER_A
6860: 46 54 45 52 20 2a 2f 0a 20 20 54 61 62 6c 65 20  FTER */.  Table 
6870: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  *pTab,         /
6880: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 63  * The table to c
6890: 6f 64 65 20 74 72 69 67 67 65 72 73 20 66 72 6f  ode triggers fro
68a0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 49 64  m */.  int newId
68b0: 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  x,          /* T
68c0: 68 65 20 69 6e 64 69 63 65 20 6f 66 20 74 68 65  he indice of the
68d0: 20 22 6e 65 77 22 20 72 6f 77 20 74 6f 20 61 63   "new" row to ac
68e0: 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 6c  cess */.  int ol
68f0: 64 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 2f  dIdx,          /
6900: 2a 20 54 68 65 20 69 6e 64 69 63 65 20 6f 66 20  * The indice of 
6910: 74 68 65 20 22 6f 6c 64 22 20 72 6f 77 20 74 6f  the "old" row to
6920: 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74   access */.  int
6930: 20 6f 72 63 6f 6e 66 2c 20 20 20 20 20 20 20 20   orconf,        
6940: 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    /* ON CONFLICT
6950: 20 70 6f 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74   policy */.  int
6960: 20 69 67 6e 6f 72 65 4a 75 6d 70 2c 20 20 20 20   ignoreJump,    
6970: 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e    /* Instruction
6980: 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20   to jump to for 
6990: 52 41 49 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f  RAISE(IGNORE) */
69a0: 0a 20 20 75 33 32 20 2a 70 69 4f 6c 64 43 6f 6c  .  u32 *piOldCol
69b0: 4d 61 73 6b 2c 20 20 20 2f 2a 20 4f 55 54 3a 20  Mask,   /* OUT: 
69c0: 4d 61 73 6b 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  Mask of columns 
69d0: 75 73 65 64 20 66 72 6f 6d 20 74 68 65 20 4f 4c  used from the OL
69e0: 44 2e 2a 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  D.* table */.  u
69f0: 33 32 20 2a 70 69 4e 65 77 43 6f 6c 4d 61 73 6b  32 *piNewColMask
6a00: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b      /* OUT: Mask
6a10: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64   of columns used
6a20: 20 66 72 6f 6d 20 74 68 65 20 4e 45 57 2e 2a 20   from the NEW.* 
6a30: 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 54 72  table */.){.  Tr
6a40: 69 67 67 65 72 20 2a 70 3b 0a 20 20 73 71 6c 69  igger *p;.  sqli
6a50: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6a60: 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 53  ->db;.  TriggerS
6a70: 74 61 63 6b 20 74 72 69 67 53 74 61 63 6b 45 6e  tack trigStackEn
6a80: 74 72 79 3b 0a 0a 20 20 74 72 69 67 53 74 61 63  try;..  trigStac
6a90: 6b 45 6e 74 72 79 2e 6f 6c 64 43 6f 6c 4d 61 73  kEntry.oldColMas
6aa0: 6b 20 3d 20 30 3b 0a 20 20 74 72 69 67 53 74 61  k = 0;.  trigSta
6ab0: 63 6b 45 6e 74 72 79 2e 6e 65 77 43 6f 6c 4d 61  ckEntry.newColMa
6ac0: 73 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  sk = 0;..  asser
6ad0: 74 28 6f 70 20 3d 3d 20 54 4b 5f 55 50 44 41 54  t(op == TK_UPDAT
6ae0: 45 20 7c 7c 20 6f 70 20 3d 3d 20 54 4b 5f 49 4e  E || op == TK_IN
6af0: 53 45 52 54 20 7c 7c 20 6f 70 20 3d 3d 20 54 4b  SERT || op == TK
6b00: 5f 44 45 4c 45 54 45 29 3b 0a 20 20 61 73 73 65  _DELETE);.  asse
6b10: 72 74 28 74 72 5f 74 6d 20 3d 3d 20 54 52 49 47  rt(tr_tm == TRIG
6b20: 47 45 52 5f 42 45 46 4f 52 45 20 7c 7c 20 74 72  GER_BEFORE || tr
6b30: 5f 74 6d 20 3d 3d 20 54 52 49 47 47 45 52 5f 41  _tm == TRIGGER_A
6b40: 46 54 45 52 20 29 3b 0a 0a 20 20 61 73 73 65 72  FTER );..  asser
6b50: 74 28 6e 65 77 49 64 78 20 21 3d 20 2d 31 20 7c  t(newIdx != -1 |
6b60: 7c 20 6f 6c 64 49 64 78 20 21 3d 20 2d 31 29 3b  | oldIdx != -1);
6b70: 0a 0a 20 20 66 6f 72 28 70 3d 70 54 72 69 67 67  ..  for(p=pTrigg
6b80: 65 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  er; p; p=p->pNex
6b90: 74 29 7b 0a 20 20 20 20 69 6e 74 20 66 69 72 65  t){.    int fire
6ba0: 5f 74 68 69 73 20 3d 20 30 3b 0a 0a 20 20 20 20  _this = 0;..    
6bb0: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  /* Determine whe
6bc0: 74 68 65 72 20 77 65 20 73 68 6f 75 6c 64 20 63  ther we should c
6bd0: 6f 64 65 20 74 68 69 73 20 74 72 69 67 67 65 72  ode this trigger
6be0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 0a 20 20 20   */.    if( .   
6bf0: 20 20 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20     p->op==op && 
6c00: 0a 20 20 20 20 20 20 70 2d 3e 74 72 5f 74 6d 3d  .      p->tr_tm=
6c10: 3d 74 72 5f 74 6d 20 26 26 20 0a 20 20 20 20 20  =tr_tm && .     
6c20: 20 28 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 2d   (p->pSchema==p-
6c30: 3e 70 54 61 62 53 63 68 65 6d 61 20 7c 7c 20 70  >pTabSchema || p
6c40: 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
6c50: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 20 26  Db[1].pSchema) &
6c60: 26 0a 20 20 20 20 20 20 28 6f 70 21 3d 54 4b 5f  &.      (op!=TK_
6c70: 55 50 44 41 54 45 7c 7c 21 70 2d 3e 70 43 6f 6c  UPDATE||!p->pCol
6c80: 75 6d 6e 73 7c 7c 63 68 65 63 6b 43 6f 6c 75 6d  umns||checkColum
6c90: 6e 4f 76 65 72 4c 61 70 28 70 2d 3e 70 43 6f 6c  nOverLap(p->pCol
6ca0: 75 6d 6e 73 2c 70 43 68 61 6e 67 65 73 29 29 0a  umns,pChanges)).
6cb0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 54 72 69      ){.      Tri
6cc0: 67 67 65 72 53 74 61 63 6b 20 2a 70 53 3b 20 20  ggerStack *pS;  
6cd0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
6ce0: 6f 20 74 72 69 67 67 65 72 2d 73 74 61 63 6b 20  o trigger-stack 
6cf0: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 20 20 66  entry */.      f
6d00: 6f 72 28 70 53 3d 70 50 61 72 73 65 2d 3e 74 72  or(pS=pParse->tr
6d10: 69 67 53 74 61 63 6b 3b 20 70 53 20 26 26 20 70  igStack; pS && p
6d20: 21 3d 70 53 2d 3e 70 54 72 69 67 67 65 72 3b 20  !=pS->pTrigger; 
6d30: 70 53 3d 70 53 2d 3e 70 4e 65 78 74 29 7b 7d 0a  pS=pS->pNext){}.
6d40: 20 20 20 20 20 20 69 66 28 20 21 70 53 20 29 7b        if( !pS ){
6d50: 0a 20 20 20 20 20 20 20 20 66 69 72 65 5f 74 68  .        fire_th
6d60: 69 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  is = 1;.      }.
6d70: 23 69 66 20 30 20 20 20 20 2f 2a 20 47 69 76 65  #if 0    /* Give
6d80: 20 6e 6f 20 77 61 72 6e 69 6e 67 20 66 6f 72 20   no warning for 
6d90: 72 65 63 75 72 73 69 76 65 20 74 72 69 67 67 65  recursive trigge
6da0: 72 73 2e 20 20 4a 75 73 74 20 64 6f 20 6e 6f 74  rs.  Just do not
6db0: 20 64 6f 20 74 68 65 6d 20 2a 2f 0a 20 20 20 20   do them */.    
6dc0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
6dd0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6de0: 70 50 61 72 73 65 2c 20 22 72 65 63 75 72 73 69  pParse, "recursi
6df0: 76 65 20 74 72 69 67 67 65 72 73 20 6e 6f 74 20  ve triggers not 
6e00: 73 75 70 70 6f 72 74 65 64 20 28 25 73 29 22 2c  supported (%s)",
6e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
6e20: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 72  name);.        r
6e30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
6e40: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  OR;.      }.#end
6e50: 69 66 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 69  if.    }. .    i
6e60: 66 28 20 66 69 72 65 5f 74 68 69 73 20 29 7b 0a  f( fire_this ){.
6e70: 20 20 20 20 20 20 69 6e 74 20 65 6e 64 54 72 69        int endTri
6e80: 67 67 65 72 3b 0a 20 20 20 20 20 20 45 78 70 72  gger;.      Expr
6e90: 20 2a 20 77 68 65 6e 45 78 70 72 3b 0a 20 20 20   * whenExpr;.   
6ea0: 20 20 20 41 75 74 68 43 6f 6e 74 65 78 74 20 73     AuthContext s
6eb0: 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 4e  Context;.      N
6ec0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
6ed0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6ee0: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 20  OMIT_TRACE.     
6ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6f00: 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p4(pParse->pVdbe
6f10: 2c 20 4f 50 5f 54 72 61 63 65 2c 20 30 2c 20 30  , OP_Trace, 0, 0
6f20: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
6f40: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
6f50: 22 2d 2d 20 54 52 49 47 47 45 52 20 25 73 22 2c  "-- TRIGGER %s",
6f60: 20 70 2d 3e 6e 61 6d 65 29 2c 0a 20 20 20 20 20   p->name),.     
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f80: 20 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a     P4_DYNAMIC);.
6f90: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6d 65 6d  #endif.      mem
6fa0: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
6fb0: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 20  eof(sNC));.     
6fc0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
6fd0: 61 72 73 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  arse;..      /* 
6fe0: 50 75 73 68 20 61 6e 20 65 6e 74 72 79 20 6f 6e  Push an entry on
6ff0: 20 74 6f 20 74 68 65 20 74 72 69 67 67 65 72 20   to the trigger 
7000: 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 74  stack */.      t
7010: 72 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 70 54  rigStackEntry.pT
7020: 72 69 67 67 65 72 20 3d 20 70 3b 0a 20 20 20 20  rigger = p;.    
7030: 20 20 74 72 69 67 53 74 61 63 6b 45 6e 74 72 79    trigStackEntry
7040: 2e 6e 65 77 49 64 78 20 3d 20 6e 65 77 49 64 78  .newIdx = newIdx
7050: 3b 0a 20 20 20 20 20 20 74 72 69 67 53 74 61 63  ;.      trigStac
7060: 6b 45 6e 74 72 79 2e 6f 6c 64 49 64 78 20 3d 20  kEntry.oldIdx = 
7070: 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 74 72  oldIdx;.      tr
7080: 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 70 54 61  igStackEntry.pTa
7090: 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
70a0: 74 72 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 70  trigStackEntry.p
70b0: 4e 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 74  Next = pParse->t
70c0: 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20  rigStack;.      
70d0: 74 72 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 69  trigStackEntry.i
70e0: 67 6e 6f 72 65 4a 75 6d 70 20 3d 20 69 67 6e 6f  gnoreJump = igno
70f0: 72 65 4a 75 6d 70 3b 0a 20 20 20 20 20 20 70 50  reJump;.      pP
7100: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
7110: 3d 20 26 74 72 69 67 53 74 61 63 6b 45 6e 74 72  = &trigStackEntr
7120: 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  y;.      sqlite3
7130: 41 75 74 68 43 6f 6e 74 65 78 74 50 75 73 68 28  AuthContextPush(
7140: 70 50 61 72 73 65 2c 20 26 73 43 6f 6e 74 65 78  pParse, &sContex
7150: 74 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 0a 20 20  t, p->name);..  
7160: 20 20 20 20 2f 2a 20 63 6f 64 65 20 74 68 65 20      /* code the 
7170: 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WHEN clause */. 
7180: 20 20 20 20 20 65 6e 64 54 72 69 67 67 65 72 20       endTrigger 
7190: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
71a0: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 2d 3e 70  eLabel(pParse->p
71b0: 56 64 62 65 29 3b 0a 20 20 20 20 20 20 77 68 65  Vdbe);.      whe
71c0: 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  nExpr = sqlite3E
71d0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 57  xprDup(db, p->pW
71e0: 68 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  hen, 0);.      i
71f0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
7200: 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 33 52 65  led || sqlite3Re
7210: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26  solveExprNames(&
7220: 73 4e 43 2c 20 77 68 65 6e 45 78 70 72 29 20 29  sNC, whenExpr) )
7230: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  {.        pParse
7240: 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 74 72  ->trigStack = tr
7250: 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 70 4e 65  igStackEntry.pNe
7260: 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  xt;.        sqli
7270: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
7280: 2c 20 77 68 65 6e 45 78 70 72 29 3b 0a 20 20 20  , whenExpr);.   
7290: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
72a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
72b0: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
72c0: 70 50 61 72 73 65 2c 20 77 68 65 6e 45 78 70 72  pParse, whenExpr
72d0: 2c 20 65 6e 64 54 72 69 67 67 65 72 2c 20 53 51  , endTrigger, SQ
72e0: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
72f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
7300: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 77 68  xprDelete(db, wh
7310: 65 6e 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20  enExpr);..      
7320: 63 6f 64 65 54 72 69 67 67 65 72 50 72 6f 67 72  codeTriggerProgr
7330: 61 6d 28 70 50 61 72 73 65 2c 20 70 2d 3e 73 74  am(pParse, p->st
7340: 65 70 5f 6c 69 73 74 2c 20 6f 72 63 6f 6e 66 29  ep_list, orconf)
7350: 3b 20 0a 0a 20 20 20 20 20 20 2f 2a 20 50 6f 70  ; ..      /* Pop
7360: 20 74 68 65 20 65 6e 74 72 79 20 6f 66 66 20 74   the entry off t
7370: 68 65 20 74 72 69 67 67 65 72 20 73 74 61 63 6b  he trigger stack
7380: 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73 65   */.      pParse
7390: 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 74 72  ->trigStack = tr
73a0: 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 70 4e 65  igStackEntry.pNe
73b0: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
73c0: 33 41 75 74 68 43 6f 6e 74 65 78 74 50 6f 70 28  3AuthContextPop(
73d0: 26 73 43 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 20  &sContext);..   
73e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
73f0: 73 6f 6c 76 65 4c 61 62 65 6c 28 70 50 61 72 73  solveLabel(pPars
7400: 65 2d 3e 70 56 64 62 65 2c 20 65 6e 64 54 72 69  e->pVdbe, endTri
7410: 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  gger);.    }.  }
7420: 0a 20 20 69 66 28 20 70 69 4f 6c 64 43 6f 6c 4d  .  if( piOldColM
7430: 61 73 6b 20 29 20 2a 70 69 4f 6c 64 43 6f 6c 4d  ask ) *piOldColM
7440: 61 73 6b 20 7c 3d 20 74 72 69 67 53 74 61 63 6b  ask |= trigStack
7450: 45 6e 74 72 79 2e 6f 6c 64 43 6f 6c 4d 61 73 6b  Entry.oldColMask
7460: 3b 0a 20 20 69 66 28 20 70 69 4e 65 77 43 6f 6c  ;.  if( piNewCol
7470: 4d 61 73 6b 20 29 20 2a 70 69 4e 65 77 43 6f 6c  Mask ) *piNewCol
7480: 4d 61 73 6b 20 7c 3d 20 74 72 69 67 53 74 61 63  Mask |= trigStac
7490: 6b 45 6e 74 72 79 2e 6e 65 77 43 6f 6c 4d 61 73  kEntry.newColMas
74a0: 6b 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  k;.  return 0;.}
74b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
74c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
74d0: 54 52 49 47 47 45 52 29 20 2a 2f 0a              TRIGGER) */.