/ Hex Artifact Content
Login

Artifact b61aaf7bff8e3763b234dbf46a1a64fb88a34e64:


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 32  trigger.c,v 1.12
0180: 38 20 32 30 30 38 2f 30 37 2f 32 38 20 31 39 3a  8 2008/07/28 19:
0190: 33 34 3a 35 34 20 64 72 68 20 45 78 70 20 24 0a  34:54 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 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
03f0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
0400: 65 6e 20 69 74 20 73 65 65 73 20 61 20 43 52 45  en it sees a CRE
0410: 41 54 45 20 54 52 49 47 47 45 52 20 73 74 61 74  ATE TRIGGER stat
0420: 65 6d 65 6e 74 0a 2a 2a 20 75 70 20 74 6f 20 74  ement.** up to t
0430: 68 65 20 70 6f 69 6e 74 20 6f 66 20 74 68 65 20  he point of the 
0440: 42 45 47 49 4e 20 62 65 66 6f 72 65 20 74 68 65  BEGIN before the
0450: 20 74 72 69 67 67 65 72 20 61 63 74 69 6f 6e 73   trigger actions
0460: 2e 20 20 41 20 54 72 69 67 67 65 72 0a 2a 2a 20  .  A Trigger.** 
0470: 73 74 72 75 63 74 75 72 65 20 69 73 20 67 65 6e  structure is gen
0480: 65 72 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  erated based on 
0490: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
04a0: 61 76 61 69 6c 61 62 6c 65 20 61 6e 64 20 73 74  available and st
04b0: 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 50 61 72 73  ored.** in pPars
04c0: 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 2e 20  e->pNewTrigger. 
04d0: 20 41 66 74 65 72 20 74 68 65 20 74 72 69 67 67   After the trigg
04e0: 65 72 20 61 63 74 69 6f 6e 73 20 68 61 76 65 20  er actions have 
04f0: 62 65 65 6e 20 70 61 72 73 65 64 2c 20 74 68 65  been parsed, the
0500: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 69 73  .** sqlite3Finis
0510: 68 54 72 69 67 67 65 72 28 29 20 66 75 6e 63 74  hTrigger() funct
0520: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
0530: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 74 72   complete the tr
0540: 69 67 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 72 75  igger.** constru
0550: 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 0a 2a  ction process..*
0560: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
0570: 67 69 6e 54 72 69 67 67 65 72 28 0a 20 20 50 61  ginTrigger(.  Pa
0580: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
0590: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20 63    /* The parse c
05a0: 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  ontext of the CR
05b0: 45 41 54 45 20 54 52 49 47 47 45 52 20 73 74 61  EATE TRIGGER sta
05c0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
05d0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20  n *pName1,      
05e0: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  /* The name of t
05f0: 68 65 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20  he trigger */.  
0600: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
0610: 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20      /* The name 
0620: 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20 2a  of the trigger *
0630: 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20 20  /.  int tr_tm,  
0640: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
0650: 66 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54 4b 5f  f TK_BEFORE, TK_
0660: 41 46 54 45 52 2c 20 54 4b 5f 49 4e 53 54 45 41  AFTER, TK_INSTEA
0670: 44 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  D */.  int op,  
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
0690: 65 20 6f 66 20 54 4b 5f 49 4e 53 45 52 54 2c 20  e of TK_INSERT, 
06a0: 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f 44 45  TK_UPDATE, TK_DE
06b0: 4c 45 54 45 20 2a 2f 0a 20 20 49 64 4c 69 73 74  LETE */.  IdList
06c0: 20 2a 70 43 6f 6c 75 6d 6e 73 2c 20 20 20 2f 2a   *pColumns,   /*
06d0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 69 66 20   column list if 
06e0: 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54  this is an UPDAT
06f0: 45 20 4f 46 20 74 72 69 67 67 65 72 20 2a 2f 0a  E OF trigger */.
0700: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 6c    SrcList *pTabl
0710: 65 4e 61 6d 65 2c 2f 2a 20 54 68 65 20 6e 61 6d  eName,/* The nam
0720: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2f 76  e of the table/v
0730: 69 65 77 20 74 68 65 20 74 72 69 67 67 65 72 20  iew the trigger 
0740: 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
0750: 45 78 70 72 20 2a 70 57 68 65 6e 2c 20 20 20 20  Expr *pWhen,    
0760: 20 20 20 20 2f 2a 20 57 48 45 4e 20 63 6c 61 75      /* WHEN clau
0770: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  se */.  int isTe
0780: 6d 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  mp,         /* T
0790: 72 75 65 20 69 66 20 74 68 65 20 54 45 4d 50 4f  rue if the TEMPO
07a0: 52 41 52 59 20 6b 65 79 77 6f 72 64 20 69 73 20  RARY keyword is 
07b0: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
07c0: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
07d0: 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72   /* Suppress err
07e0: 6f 72 73 20 69 66 20 74 68 65 20 74 72 69 67 67  ors if the trigg
07f0: 65 72 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  er already exist
0800: 73 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65  s */.){.  Trigge
0810: 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20 30 3b  r *pTrigger = 0;
0820: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
0830: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
0840: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  0;        /* Nam
0850: 65 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72  e of the trigger
0860: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
0870: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0880: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
0890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
08a0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 73 74 6f   database to sto
08b0: 72 65 20 74 68 65 20 74 72 69 67 67 65 72 20 69  re the trigger i
08c0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
08d0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
08e0: 2a 20 54 68 65 20 75 6e 71 75 61 6c 69 66 69 65  * The unqualifie
08f0: 64 20 64 62 20 6e 61 6d 65 20 2a 2f 0a 20 20 44  d db name */.  D
0900: 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 69  bFixer sFix;.  i
0910: 6e 74 20 69 54 61 62 44 62 3b 0a 0a 20 20 61 73  nt iTabDb;..  as
0920: 73 65 72 74 28 20 70 4e 61 6d 65 31 21 3d 30 20  sert( pName1!=0 
0930: 29 3b 20 20 20 2f 2a 20 70 4e 61 6d 65 31 2d 3e  );   /* pName1->
0940: 7a 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 2c  z might be NULL,
0950: 20 62 75 74 20 6e 6f 74 20 70 4e 61 6d 65 31 20   but not pName1 
0960: 69 74 73 65 6c 66 20 2a 2f 0a 20 20 61 73 73 65  itself */.  asse
0970: 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b  rt( pName2!=0 );
0980: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b  .  if( isTemp ){
0990: 0a 20 20 20 20 2f 2a 20 49 66 20 54 45 4d 50 20  .    /* If TEMP 
09a0: 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20 74  was specified, t
09b0: 68 65 6e 20 74 68 65 20 74 72 69 67 67 65 72 20  hen the trigger 
09c0: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
09d0: 71 75 61 6c 69 66 69 65 64 2e 20 2a 2f 0a 20 20  qualified. */.  
09e0: 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e    if( pName2->n>
09f0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
0a00: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
0a10: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 72  e, "temporary tr
0a20: 69 67 67 65 72 20 6d 61 79 20 6e 6f 74 20 68 61  igger may not ha
0a30: 76 65 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d  ve qualified nam
0a40: 65 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  e");.      goto 
0a50: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
0a60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 44 62 20 3d  .    }.    iDb =
0a70: 20 31 3b 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20   1;.    pName = 
0a80: 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b  pName1;.  }else{
0a90: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
0aa0: 75 74 20 74 68 65 20 64 62 20 74 68 61 74 20 74  ut the db that t
0ab0: 68 65 20 74 68 65 20 74 72 69 67 67 65 72 20 77  he the trigger w
0ac0: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 69  ill be created i
0ad0: 6e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  n */.    iDb = s
0ae0: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
0af0: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
0b00: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
0b10: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
0b20: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74   ){.      goto t
0b30: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
0b40: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
0b50: 49 66 20 74 68 65 20 74 72 69 67 67 65 72 20 6e  If the trigger n
0b60: 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
0b70: 69 65 64 2c 20 61 6e 64 20 74 68 65 20 74 61 62  ied, and the tab
0b80: 6c 65 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  le is a temp tab
0b90: 6c 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65  le,.  ** then se
0ba0: 74 20 69 44 62 20 74 6f 20 31 20 74 6f 20 63 72  t iDb to 1 to cr
0bb0: 65 61 74 65 20 74 68 65 20 74 72 69 67 67 65 72  eate the trigger
0bc0: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
0bd0: 79 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  y database..  **
0be0: 20 49 66 20 73 71 6c 69 74 65 33 53 72 63 4c 69   If sqlite3SrcLi
0bf0: 73 74 4c 6f 6f 6b 75 70 28 29 20 72 65 74 75 72  stLookup() retur
0c00: 6e 73 20 30 2c 20 69 6e 64 69 63 61 74 69 6e 67  ns 0, indicating
0c10: 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
0c20: 6e 6f 74 0a 20 20 2a 2a 20 65 78 69 73 74 2c 20  not.  ** exist, 
0c30: 74 68 65 20 65 72 72 6f 72 20 69 73 20 63 61 75  the error is cau
0c40: 67 68 74 20 62 79 20 74 68 65 20 62 6c 6f 63 6b  ght by the block
0c50: 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69   below..  */.  i
0c60: 66 28 20 21 70 54 61 62 6c 65 4e 61 6d 65 20 7c  f( !pTableName |
0c70: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
0c80: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  ed ){.    goto t
0c90: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
0ca0: 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c    }.  pTab = sql
0cb0: 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
0cc0: 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  p(pParse, pTable
0cd0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 61  Name);.  if( pNa
0ce0: 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
0cf0: 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
0d00: 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
0d10: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 44  Schema ){.    iD
0d20: 62 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b = 1;.  }..  /*
0d30: 20 45 6e 73 75 72 65 20 74 68 65 20 74 61 62 6c   Ensure the tabl
0d40: 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 20 64  e name matches d
0d50: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 61 6e 64  atabase name and
0d60: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
0d70: 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20  exists */.  if( 
0d80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0d90: 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f   ) goto trigger_
0da0: 63 6c 65 61 6e 75 70 3b 0a 20 20 61 73 73 65 72  cleanup;.  asser
0db0: 74 28 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 6e  t( pTableName->n
0dc0: 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
0dd0: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
0de0: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
0df0: 62 2c 20 22 74 72 69 67 67 65 72 22 2c 20 70 4e  b, "trigger", pN
0e00: 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 73  ame) && .      s
0e10: 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
0e20: 28 26 73 46 69 78 2c 20 70 54 61 62 6c 65 4e 61  (&sFix, pTableNa
0e30: 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  me) ){.    goto 
0e40: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
0e50: 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71  .  }.  pTab = sq
0e60: 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
0e70: 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  up(pParse, pTabl
0e80: 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70  eName);.  if( !p
0e90: 54 61 62 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Tab ){.    /* Th
0ea0: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
0eb0: 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 67   exist. */.    g
0ec0: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
0ed0: 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49  nup;.  }.  if( I
0ee0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
0ef0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
0f00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
0f10: 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74 72 69  annot create tri
0f20: 67 67 65 72 73 20 6f 6e 20 76 69 72 74 75 61 6c  ggers on virtual
0f30: 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 67   tables");.    g
0f40: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
0f50: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  nup;.  }..  /* C
0f60: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 74 72  heck that the tr
0f70: 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 6e 6f  igger name is no
0f80: 74 20 72 65 73 65 72 76 65 64 20 61 6e 64 20 74  t reserved and t
0f90: 68 61 74 20 6e 6f 20 74 72 69 67 67 65 72 20 6f  hat no trigger o
0fa0: 66 20 74 68 65 0a 20 20 2a 2a 20 73 70 65 63 69  f the.  ** speci
0fb0: 66 69 65 64 20 6e 61 6d 65 20 65 78 69 73 74 73  fied name exists
0fc0: 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71   */.  zName = sq
0fd0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
0fe0: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
0ff0: 20 69 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 53   if( !zName || S
1000: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1010: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
1020: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
1030: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67  ){.    goto trig
1040: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ger_cleanup;.  }
1050: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 48 61  .  if( sqlite3Ha
1060: 73 68 46 69 6e 64 28 26 28 64 62 2d 3e 61 44 62  shFind(&(db->aDb
1070: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [iDb].pSchema->t
1080: 72 69 67 48 61 73 68 29 2c 20 7a 4e 61 6d 65 2c  rigHash), zName,
1090: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 20 29  strlen(zName)) )
10a0: 7b 0a 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72  {.    if( !noErr
10b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10d0: 2c 20 22 74 72 69 67 67 65 72 20 25 54 20 61 6c  , "trigger %T al
10e0: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70  ready exists", p
10f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
1100: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c   goto trigger_cl
1110: 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eanup;.  }..  /*
1120: 20 44 6f 20 6e 6f 74 20 63 72 65 61 74 65 20 61   Do not create a
1130: 20 74 72 69 67 67 65 72 20 6f 6e 20 61 20 73 79   trigger on a sy
1140: 73 74 65 6d 20 74 61 62 6c 65 20 2a 2f 0a 20 20  stem table */.  
1150: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
1160: 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
1170: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
1180: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1190: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11a0: 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "cannot create 
11b0: 74 72 69 67 67 65 72 20 6f 6e 20 73 79 73 74 65  trigger on syste
11c0: 6d 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 70  m table");.    p
11d0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
11e0: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
11f0: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20  cleanup;.  }..  
1200: 2f 2a 20 49 4e 53 54 45 41 44 20 6f 66 20 74 72  /* INSTEAD of tr
1210: 69 67 67 65 72 73 20 61 72 65 20 6f 6e 6c 79 20  iggers are only 
1220: 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20 76 69  for views and vi
1230: 65 77 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  ews only support
1240: 20 49 4e 53 54 45 41 44 0a 20 20 2a 2a 20 6f 66   INSTEAD.  ** of
1250: 20 74 72 69 67 67 65 72 73 2e 0a 20 20 2a 2f 0a   triggers..  */.
1260: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
1270: 65 63 74 20 26 26 20 74 72 5f 74 6d 21 3d 54 4b  ect && tr_tm!=TK
1280: 5f 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20  _INSTEAD ){.    
1290: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12a0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
12b0: 63 72 65 61 74 65 20 25 73 20 74 72 69 67 67 65  create %s trigge
12c0: 72 20 6f 6e 20 76 69 65 77 3a 20 25 53 22 2c 20  r on view: %S", 
12d0: 0a 20 20 20 20 20 20 20 20 28 74 72 5f 74 6d 20  .        (tr_tm 
12e0: 3d 3d 20 54 4b 5f 42 45 46 4f 52 45 29 3f 22 42  == TK_BEFORE)?"B
12f0: 45 46 4f 52 45 22 3a 22 41 46 54 45 52 22 2c 20  EFORE":"AFTER", 
1300: 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a  pTableName, 0);.
1310: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
1320: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
1330: 69 66 28 20 21 70 54 61 62 2d 3e 70 53 65 6c 65  if( !pTab->pSele
1340: 63 74 20 26 26 20 74 72 5f 74 6d 3d 3d 54 4b 5f  ct && tr_tm==TK_
1350: 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73  INSTEAD ){.    s
1360: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1370: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63  Parse, "cannot c
1380: 72 65 61 74 65 20 49 4e 53 54 45 41 44 20 4f 46  reate INSTEAD OF
1390: 22 0a 20 20 20 20 20 20 20 20 22 20 74 72 69 67  ".        " trig
13a0: 67 65 72 20 6f 6e 20 74 61 62 6c 65 3a 20 25 53  ger on table: %S
13b0: 22 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30  ", pTableName, 0
13c0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67  );.    goto trig
13d0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ger_cleanup;.  }
13e0: 0a 20 20 69 54 61 62 44 62 20 3d 20 73 71 6c 69  .  iTabDb = sqli
13f0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1400: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
1410: 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
1420: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
1430: 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
1440: 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
1450: 45 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52  E_CREATE_TRIGGER
1460: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1470: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
1480: 69 54 61 62 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  iTabDb].zName;. 
1490: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14a0: 44 62 54 72 69 67 20 3d 20 69 73 54 65 6d 70 20  DbTrig = isTemp 
14b0: 3f 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61  ? db->aDb[1].zNa
14c0: 6d 65 20 3a 20 7a 44 62 3b 0a 20 20 20 20 69 66  me : zDb;.    if
14d0: 28 20 69 54 61 62 44 62 3d 3d 31 20 7c 7c 20 69  ( iTabDb==1 || i
14e0: 73 54 65 6d 70 20 29 20 63 6f 64 65 20 3d 20 53  sTemp ) code = S
14f0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
1500: 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 69  P_TRIGGER;.    i
1510: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1520: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
1530: 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
1540: 4e 61 6d 65 2c 20 7a 44 62 54 72 69 67 29 20 29  Name, zDbTrig) )
1550: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69  {.      goto tri
1560: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
1570: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
1580: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1590: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
15a0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
15b0: 28 69 54 61 62 44 62 29 2c 30 2c 7a 44 62 29 29  (iTabDb),0,zDb))
15c0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69  {.      goto tri
15d0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
15e0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
15f0: 20 20 2f 2a 20 49 4e 53 54 45 41 44 20 4f 46 20    /* INSTEAD OF 
1600: 74 72 69 67 67 65 72 73 20 63 61 6e 20 6f 6e 6c  triggers can onl
1610: 79 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65 77  y appear on view
1620: 73 20 61 6e 64 20 42 45 46 4f 52 45 20 74 72 69  s and BEFORE tri
1630: 67 67 65 72 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f  ggers.  ** canno
1640: 74 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65 77  t appear on view
1650: 73 2e 20 20 53 6f 20 77 65 20 6d 69 67 68 74 20  s.  So we might 
1660: 61 73 20 77 65 6c 6c 20 74 72 61 6e 73 6c 61 74  as well translat
1670: 65 20 65 76 65 72 79 0a 20 20 2a 2a 20 49 4e 53  e every.  ** INS
1680: 54 45 41 44 20 4f 46 20 74 72 69 67 67 65 72 20  TEAD OF trigger 
1690: 69 6e 74 6f 20 61 20 42 45 46 4f 52 45 20 74 72  into a BEFORE tr
16a0: 69 67 67 65 72 2e 20 20 49 74 20 73 69 6d 70 6c  igger.  It simpl
16b0: 69 66 69 65 73 20 63 6f 64 65 0a 20 20 2a 2a 20  ifies code.  ** 
16c0: 65 6c 73 65 77 68 65 72 65 2e 0a 20 20 2a 2f 0a  elsewhere..  */.
16d0: 20 20 69 66 20 28 74 72 5f 74 6d 20 3d 3d 20 54    if (tr_tm == T
16e0: 4b 5f 49 4e 53 54 45 41 44 29 7b 0a 20 20 20 20  K_INSTEAD){.    
16f0: 74 72 5f 74 6d 20 3d 20 54 4b 5f 42 45 46 4f 52  tr_tm = TK_BEFOR
1700: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69  E;.  }..  /* Bui
1710: 6c 64 20 74 68 65 20 54 72 69 67 67 65 72 20 6f  ld the Trigger o
1720: 62 6a 65 63 74 20 2a 2f 0a 20 20 70 54 72 69 67  bject */.  pTrig
1730: 67 65 72 20 3d 20 28 54 72 69 67 67 65 72 2a 29  ger = (Trigger*)
1740: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1750: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
1760: 72 69 67 67 65 72 29 29 3b 0a 20 20 69 66 28 20  rigger));.  if( 
1770: 70 54 72 69 67 67 65 72 3d 3d 30 20 29 20 67 6f  pTrigger==0 ) go
1780: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
1790: 75 70 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e  up;.  pTrigger->
17a0: 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
17b0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 72  zName = 0;.  pTr
17c0: 69 67 67 65 72 2d 3e 74 61 62 6c 65 20 3d 20 73  igger->table = s
17d0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
17e0: 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 61  b, pTableName->a
17f0: 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 70 54  [0].zName);.  pT
1800: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 20  rigger->pSchema 
1810: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
1820: 53 63 68 65 6d 61 3b 0a 20 20 70 54 72 69 67 67  Schema;.  pTrigg
1830: 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 3d  er->pTabSchema =
1840: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a   pTab->pSchema;.
1850: 20 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 20 3d    pTrigger->op =
1860: 20 6f 70 3b 0a 20 20 70 54 72 69 67 67 65 72 2d   op;.  pTrigger-
1870: 3e 74 72 5f 74 6d 20 3d 20 74 72 5f 74 6d 3d 3d  >tr_tm = tr_tm==
1880: 54 4b 5f 42 45 46 4f 52 45 20 3f 20 54 52 49 47  TK_BEFORE ? TRIG
1890: 47 45 52 5f 42 45 46 4f 52 45 20 3a 20 54 52 49  GER_BEFORE : TRI
18a0: 47 47 45 52 5f 41 46 54 45 52 3b 0a 20 20 70 54  GGER_AFTER;.  pT
18b0: 72 69 67 67 65 72 2d 3e 70 57 68 65 6e 20 3d 20  rigger->pWhen = 
18c0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
18d0: 62 2c 20 70 57 68 65 6e 29 3b 0a 20 20 70 54 72  b, pWhen);.  pTr
18e0: 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 20  igger->pColumns 
18f0: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
1900: 75 70 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 73 29  up(db, pColumns)
1910: 3b 0a 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e  ;.  sqlite3Token
1920: 43 6f 70 79 28 64 62 2c 20 26 70 54 72 69 67 67  Copy(db, &pTrigg
1930: 65 72 2d 3e 6e 61 6d 65 54 6f 6b 65 6e 2c 70 4e  er->nameToken,pN
1940: 61 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ame);.  assert( 
1950: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
1960: 67 65 72 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72  ger==0 );.  pPar
1970: 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20  se->pNewTrigger 
1980: 3d 20 70 54 72 69 67 67 65 72 3b 0a 0a 74 72 69  = pTrigger;..tri
1990: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  gger_cleanup:.  
19a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
19b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
19c0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
19d0: 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29  (db, pTableName)
19e0: 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
19f0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  tDelete(db, pCol
1a00: 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  umns);.  sqlite3
1a10: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1a20: 57 68 65 6e 29 3b 0a 20 20 69 66 28 20 21 70 50  When);.  if( !pP
1a30: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
1a40: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1a50: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62  DeleteTrigger(db
1a60: 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 7d  , pTrigger);.  }
1a70: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1a80: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72  ( pParse->pNewTr
1a90: 69 67 67 65 72 3d 3d 70 54 72 69 67 67 65 72 20  igger==pTrigger 
1aa0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1ab0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1ac0: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c  called after all
1ad0: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
1ae0: 61 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65  actions have bee
1af0: 6e 20 70 61 72 73 65 64 0a 2a 2a 20 69 6e 20 6f  n parsed.** in o
1b00: 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
1b10: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
1b20: 62 75 69 6c 64 69 6e 67 20 74 68 65 20 74 72 69  building the tri
1b30: 67 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gger..*/.void sq
1b40: 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67 67  lite3FinishTrigg
1b50: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
1b60: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
1b70: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
1b80: 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  */.  TriggerStep
1b90: 20 2a 70 53 74 65 70 4c 69 73 74 2c 20 2f 2a 20   *pStepList, /* 
1ba0: 54 68 65 20 74 72 69 67 67 65 72 65 64 20 70 72  The triggered pr
1bb0: 6f 67 72 61 6d 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ogram */.  Token
1bc0: 20 2a 70 41 6c 6c 20 20 20 20 20 20 20 20 20 20   *pAll          
1bd0: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 68 61 74     /* Token that
1be0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63   describes the c
1bf0: 6f 6d 70 6c 65 74 65 20 43 52 45 41 54 45 20 54  omplete CREATE T
1c00: 52 49 47 47 45 52 20 2a 2f 0a 29 7b 0a 20 20 54  RIGGER */.){.  T
1c10: 72 69 67 67 65 72 20 2a 70 54 72 69 67 20 3d 20  rigger *pTrig = 
1c20: 30 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72  0;     /* The tr
1c30: 69 67 67 65 72 20 77 68 6f 73 65 20 63 6f 6e 73  igger whose cons
1c40: 74 72 75 63 74 69 6f 6e 20 69 73 20 66 69 6e 69  truction is fini
1c50: 73 68 69 6e 67 20 75 70 20 2a 2f 0a 20 20 73 71  shing up */.  sq
1c60: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1c70: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
1c80: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 44 62  database */.  Db
1c90: 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 69 6e  Fixer sFix;.  in
1ca0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
1cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1cc0: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1cd0: 74 68 65 20 74 72 69 67 67 65 72 20 2a 2f 0a 0a  the trigger */..
1ce0: 20 20 70 54 72 69 67 20 3d 20 70 50 61 72 73 65    pTrig = pParse
1cf0: 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 3b 0a 20  ->pNewTrigger;. 
1d00: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69   pParse->pNewTri
1d10: 67 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  gger = 0;.  if( 
1d20: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1d30: 21 70 54 72 69 67 20 29 20 67 6f 74 6f 20 74 72  !pTrig ) goto tr
1d40: 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61  iggerfinish_clea
1d50: 6e 75 70 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  nup;.  iDb = sql
1d60: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1d70: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
1d80: 72 69 67 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  rig->pSchema);. 
1d90: 20 70 54 72 69 67 2d 3e 73 74 65 70 5f 6c 69 73   pTrig->step_lis
1da0: 74 20 3d 20 70 53 74 65 70 4c 69 73 74 3b 0a 20  t = pStepList;. 
1db0: 20 77 68 69 6c 65 28 20 70 53 74 65 70 4c 69 73   while( pStepLis
1dc0: 74 20 29 7b 0a 20 20 20 20 70 53 74 65 70 4c 69  t ){.    pStepLi
1dd0: 73 74 2d 3e 70 54 72 69 67 20 3d 20 70 54 72 69  st->pTrig = pTri
1de0: 67 3b 0a 20 20 20 20 70 53 74 65 70 4c 69 73 74  g;.    pStepList
1df0: 20 3d 20 70 53 74 65 70 4c 69 73 74 2d 3e 70 4e   = pStepList->pN
1e00: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ext;.  }.  if( s
1e10: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
1e20: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
1e30: 2c 20 22 74 72 69 67 67 65 72 22 2c 20 26 70 54  , "trigger", &pT
1e40: 72 69 67 2d 3e 6e 61 6d 65 54 6f 6b 65 6e 29 20  rig->nameToken) 
1e50: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71  .          && sq
1e60: 6c 69 74 65 33 46 69 78 54 72 69 67 67 65 72 53  lite3FixTriggerS
1e70: 74 65 70 28 26 73 46 69 78 2c 20 70 54 72 69 67  tep(&sFix, pTrig
1e80: 2d 3e 73 74 65 70 5f 6c 69 73 74 29 20 29 7b 0a  ->step_list) ){.
1e90: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
1ea0: 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a  finish_cleanup;.
1eb0: 20 20 7d 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20    }..  /* if we 
1ec0: 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69  are not initiali
1ed0: 7a 69 6e 67 2c 20 61 6e 64 20 74 68 69 73 20 74  zing, and this t
1ee0: 72 69 67 67 65 72 20 69 73 20 6e 6f 74 20 6f 6e  rigger is not on
1ef0: 20 61 20 54 45 4d 50 20 74 61 62 6c 65 2c 20 0a   a TEMP table, .
1f00: 20 20 2a 2a 20 62 75 69 6c 64 20 74 68 65 20 73    ** build the s
1f10: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 65 6e 74  qlite_master ent
1f20: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  ry.  */.  if( !d
1f30: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
1f40: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
1f50: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20 2f   char *z;..    /
1f60: 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
1f70: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
1f80: 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
1f90: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1fa0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1fb0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
1fc0: 6f 20 74 72 69 67 67 65 72 66 69 6e 69 73 68 5f  o triggerfinish_
1fd0: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 73 71 6c  cleanup;.    sql
1fe0: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1ff0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
2000: 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 7a 20 3d  0, iDb);.    z =
2010: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
2020: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 41 6c  p(db, (char*)pAl
2030: 6c 2d 3e 7a 2c 20 70 41 6c 6c 2d 3e 6e 29 3b 0a  l->z, pAll->n);.
2040: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
2050: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
2060: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
2070: 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28  TO %Q.%s VALUES(
2080: 27 74 72 69 67 67 65 72 27 2c 25 51 2c 25 51 2c  'trigger',%Q,%Q,
2090: 30 2c 27 43 52 45 41 54 45 20 54 52 49 47 47 45  0,'CREATE TRIGGE
20a0: 52 20 25 71 27 29 22 2c 0a 20 20 20 20 20 20 20  R %q')",.       
20b0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
20c0: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
20d0: 28 69 44 62 29 2c 20 70 54 72 69 67 2d 3e 6e 61  (iDb), pTrig->na
20e0: 6d 65 2c 0a 20 20 20 20 20 20 20 70 54 72 69 67  me,.       pTrig
20f0: 2d 3e 74 61 62 6c 65 2c 20 7a 29 3b 0a 20 20 20  ->table, z);.   
2100: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2110: 62 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, z);.    sqlit
2120: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
2130: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
2140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2150: 70 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p4(v, OP_ParseSc
2160: 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c  hema, iDb, 0, 0,
2170: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
2180: 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 74 79  .        db, "ty
2190: 70 65 3d 27 74 72 69 67 67 65 72 27 20 41 4e 44  pe='trigger' AND
21a0: 20 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 54 72   name='%q'", pTr
21b0: 69 67 2d 3e 6e 61 6d 65 29 2c 20 50 34 5f 44 59  ig->name), P4_DY
21c0: 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d  NAMIC.    );.  }
21d0: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  ..  if( db->init
21e0: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74  .busy ){.    int
21f0: 20 6e 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   n;.    Table *p
2200: 54 61 62 3b 0a 20 20 20 20 54 72 69 67 67 65 72  Tab;.    Trigger
2210: 20 2a 70 44 65 6c 3b 0a 20 20 20 20 70 44 65 6c   *pDel;.    pDel
2220: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
2230: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 44  sert(&db->aDb[iD
2240: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67  b].pSchema->trig
2250: 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
2260: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 72 69              pTri
2270: 67 2d 3e 6e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  g->name, strlen(
2280: 70 54 72 69 67 2d 3e 6e 61 6d 65 29 2c 20 70 54  pTrig->name), pT
2290: 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 70 44  rig);.    if( pD
22a0: 65 6c 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  el ){.      asse
22b0: 72 74 28 20 70 44 65 6c 3d 3d 70 54 72 69 67 20  rt( pDel==pTrig 
22c0: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  );.      db->mal
22d0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
22e0: 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65       goto trigge
22f0: 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b  rfinish_cleanup;
2300: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 73  .    }.    n = s
2310: 74 72 6c 65 6e 28 70 54 72 69 67 2d 3e 74 61 62  trlen(pTrig->tab
2320: 6c 65 29 20 2b 20 31 3b 0a 20 20 20 20 70 54 61  le) + 1;.    pTa
2330: 62 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  b = sqlite3HashF
2340: 69 6e 64 28 26 70 54 72 69 67 2d 3e 70 54 61 62  ind(&pTrig->pTab
2350: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
2360: 20 70 54 72 69 67 2d 3e 74 61 62 6c 65 2c 20 6e   pTrig->table, n
2370: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2380: 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 54  Tab!=0 );.    pT
2390: 72 69 67 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  rig->pNext = pTa
23a0: 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  b->pTrigger;.   
23b0: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 20   pTab->pTrigger 
23c0: 3d 20 70 54 72 69 67 3b 0a 20 20 20 20 70 54 72  = pTrig;.    pTr
23d0: 69 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 74 72 69  ig = 0;.  }..tri
23e0: 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e  ggerfinish_clean
23f0: 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  up:.  sqlite3Del
2400: 65 74 65 54 72 69 67 67 65 72 28 64 62 2c 20 70  eteTrigger(db, p
2410: 54 72 69 67 29 3b 0a 20 20 61 73 73 65 72 74 28  Trig);.  assert(
2420: 20 21 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72   !pParse->pNewTr
2430: 69 67 67 65 72 20 29 3b 0a 20 20 73 71 6c 69 74  igger );.  sqlit
2440: 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 53  e3DeleteTriggerS
2450: 74 65 70 28 64 62 2c 20 70 53 74 65 70 4c 69 73  tep(db, pStepLis
2460: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  t);.}../*.** Mak
2470: 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20  e a copy of all 
2480: 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 74 68  components of th
2490: 65 20 67 69 76 65 6e 20 74 72 69 67 67 65 72 20  e given trigger 
24a0: 73 74 65 70 2e 20 20 54 68 69 73 20 68 61 73 0a  step.  This has.
24b0: 2a 2a 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  ** the effect of
24c0: 20 63 6f 70 79 69 6e 67 20 61 6c 6c 20 45 78 70   copying all Exp
24d0: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
24e0: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
24f0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
2500: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20  lite3_malloc(). 
2510: 20 41 73 20 69 6e 69 74 69 61 6c 6c 79 20 63 72   As initially cr
2520: 65 61 74 65 64 2c 20 74 68 65 20 45 78 70 72 2e  eated, the Expr.
2530: 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 0a 2a  token.z values.*
2540: 2a 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74  * all point to t
2550: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
2560: 74 68 61 74 20 77 61 73 20 66 65 64 20 74 6f 20  that was fed to 
2570: 74 68 65 20 70 61 72 73 65 72 2e 20 20 42 75 74  the parser.  But
2580: 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20   that.** string 
2590: 69 73 20 65 70 68 65 6d 65 72 61 6c 20 2d 20 69  is ephemeral - i
25a0: 74 20 77 69 6c 6c 20 67 6f 20 61 77 61 79 20 61  t will go away a
25b0: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 73 71  s soon as the sq
25c0: 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20  lite3_exec().** 
25d0: 63 61 6c 6c 20 74 68 61 74 20 73 74 61 72 74 65  call that starte
25e0: 64 20 74 68 65 20 70 61 72 73 65 72 20 65 78 69  d the parser exi
25f0: 74 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ts.  This routin
2600: 65 20 6d 61 6b 65 73 20 61 20 70 65 72 73 69 73  e makes a persis
2610: 74 65 6e 74 0a 2a 2a 20 63 6f 70 79 20 6f 66 20  tent.** copy of 
2620: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
2630: 65 6e 2e 7a 20 73 74 72 69 6e 67 73 20 73 6f 20  en.z strings so 
2640: 74 68 61 74 20 74 68 65 20 54 72 69 67 67 65 72  that the Trigger
2650: 53 74 65 70 20 73 74 72 75 63 74 75 72 65 0a 2a  Step structure.*
2660: 2a 20 77 69 6c 6c 20 62 65 20 76 61 6c 69 64 20  * will be valid 
2670: 65 76 65 6e 20 61 66 74 65 72 20 74 68 65 20 73  even after the s
2680: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
2690: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73  ll returns..*/.s
26a0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
26b0: 65 50 65 72 73 69 73 74 54 72 69 67 67 65 72 53  ePersistTriggerS
26c0: 74 65 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  tep(sqlite3 *db,
26d0: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 29   TriggerStep *p)
26e0: 7b 0a 20 20 69 66 28 20 70 2d 3e 74 61 72 67 65  {.  if( p->targe
26f0: 74 2e 7a 20 29 7b 0a 20 20 20 20 70 2d 3e 74 61  t.z ){.    p->ta
2700: 72 67 65 74 2e 7a 20 3d 20 28 75 38 2a 29 73 71  rget.z = (u8*)sq
2710: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
2720: 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e 74 61 72  b, (char*)p->tar
2730: 67 65 74 2e 7a 2c 20 70 2d 3e 74 61 72 67 65 74  get.z, p->target
2740: 2e 6e 29 3b 0a 20 20 20 20 70 2d 3e 74 61 72 67  .n);.    p->targ
2750: 65 74 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 0a  et.dyn = 1;.  }.
2760: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
2770: 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
2780: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65  pNew = sqlite3Se
2790: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  lectDup(db, p->p
27a0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
27b0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
27c0: 28 64 62 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29  (db, p->pSelect)
27d0: 3b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65 63 74  ;.    p->pSelect
27e0: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69   = pNew;.  }.  i
27f0: 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a  f( p->pWhere ){.
2800: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
2810: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
2820: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a  db, p->pWhere);.
2830: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
2840: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68  elete(db, p->pWh
2850: 65 72 65 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68  ere);.    p->pWh
2860: 65 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ere = pNew;.  }.
2870: 20 20 69 66 28 20 70 2d 3e 70 45 78 70 72 4c 69    if( p->pExprLi
2880: 73 74 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  st ){.    ExprLi
2890: 73 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  st *pNew = sqlit
28a0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
28b0: 2c 20 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b  , p->pExprList);
28c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
28d0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
28e0: 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b 0a 20 20  ->pExprList);.  
28f0: 20 20 70 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d    p->pExprList =
2900: 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28   pNew;.  }.  if(
2910: 20 70 2d 3e 70 49 64 4c 69 73 74 20 29 7b 0a 20   p->pIdList ){. 
2920: 20 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 20     IdList *pNew 
2930: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
2940: 75 70 28 64 62 2c 20 70 2d 3e 70 49 64 4c 69 73  up(db, p->pIdLis
2950: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  t);.    sqlite3I
2960: 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
2970: 70 2d 3e 70 49 64 4c 69 73 74 29 3b 0a 20 20 20  p->pIdList);.   
2980: 20 70 2d 3e 70 49 64 4c 69 73 74 20 3d 20 70 4e   p->pIdList = pN
2990: 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ew;.  }.}../*.**
29a0: 20 54 75 72 6e 20 61 20 53 45 4c 45 43 54 20 73   Turn a SELECT s
29b0: 74 61 74 65 6d 65 6e 74 20 28 74 68 61 74 20 74  tatement (that t
29c0: 68 65 20 70 53 65 6c 65 63 74 20 70 61 72 61 6d  he pSelect param
29d0: 65 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 29 20  eter points to) 
29e0: 69 6e 74 6f 0a 2a 2a 20 61 20 74 72 69 67 67 65  into.** a trigge
29f0: 72 20 73 74 65 70 2e 20 20 52 65 74 75 72 6e 20  r step.  Return 
2a00: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
2a10: 72 69 67 67 65 72 53 74 65 70 20 73 74 72 75 63  riggerStep struc
2a20: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ture..**.** The 
2a30: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
2a40: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69  s routine when i
2a50: 74 20 66 69 6e 64 73 20 61 20 53 45 4c 45 43 54  t finds a SELECT
2a60: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 0a 2a 2a   statement in.**
2a70: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
2a80: 45 52 2e 20 20 0a 2a 2f 0a 54 72 69 67 67 65 72  ER.  .*/.Trigger
2a90: 53 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72 69  Step *sqlite3Tri
2aa0: 67 67 65 72 53 65 6c 65 63 74 53 74 65 70 28 73  ggerSelectStep(s
2ab0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
2ac0: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
2ad0: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54 72  TriggerStep *pTr
2ae0: 69 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c 69  iggerStep = sqli
2af0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
2b00: 64 62 2c 20 73 69 7a 65 6f 66 28 54 72 69 67 67  db, sizeof(Trigg
2b10: 65 72 53 74 65 70 29 29 3b 0a 20 20 69 66 28 20  erStep));.  if( 
2b20: 70 54 72 69 67 67 65 72 53 74 65 70 3d 3d 30 20  pTriggerStep==0 
2b30: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ) {.    sqlite3S
2b40: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
2b50: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
2b60: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  turn 0;.  }..  p
2b70: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20  TriggerStep->op 
2b80: 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
2b90: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 53 65  TriggerStep->pSe
2ba0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a  lect = pSelect;.
2bb0: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
2bc0: 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f 44 65 66 61  orconf = OE_Defa
2bd0: 75 6c 74 3b 0a 20 20 73 71 6c 69 74 65 50 65 72  ult;.  sqlitePer
2be0: 73 69 73 74 54 72 69 67 67 65 72 53 74 65 70 28  sistTriggerStep(
2bf0: 64 62 2c 20 70 54 72 69 67 67 65 72 53 74 65 70  db, pTriggerStep
2c00: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 72  );..  return pTr
2c10: 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a  iggerStep;.}../*
2c20: 0a 2a 2a 20 42 75 69 6c 64 20 61 20 74 72 69 67  .** Build a trig
2c30: 67 65 72 20 73 74 65 70 20 6f 75 74 20 6f 66 20  ger step out of 
2c40: 61 6e 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  an INSERT statem
2c50: 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ent.  Return a p
2c60: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
2c70: 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 74 65   new trigger ste
2c80: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  p..**.** The par
2c90: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
2ca0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 20 73  outine when it s
2cb0: 65 65 73 20 61 6e 20 49 4e 53 45 52 54 20 69 6e  ees an INSERT in
2cc0: 73 69 64 65 20 74 68 65 0a 2a 2a 20 62 6f 64 79  side the.** body
2cd0: 20 6f 66 20 61 20 74 72 69 67 67 65 72 2e 0a 2a   of a trigger..*
2ce0: 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a 73  /.TriggerStep *s
2cf0: 71 6c 69 74 65 33 54 72 69 67 67 65 72 49 6e 73  qlite3TriggerIns
2d00: 65 72 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74  ertStep(.  sqlit
2d10: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
2d20: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
2d30: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
2d40: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65  oken *pTableName
2d50: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
2d60: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  e table into whi
2d70: 63 68 20 77 65 20 69 6e 73 65 72 74 20 2a 2f 0a  ch we insert */.
2d80: 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d    IdList *pColum
2d90: 6e 2c 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  n,    /* List of
2da0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 54 61 62   columns in pTab
2db0: 6c 65 4e 61 6d 65 20 74 6f 20 69 6e 73 65 72 74  leName to insert
2dc0: 20 69 6e 74 6f 20 2a 2f 0a 20 20 45 78 70 72 4c   into */.  ExprL
2dd0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 2f  ist *pEList,   /
2de0: 2a 20 54 68 65 20 56 41 4c 55 45 20 63 6c 61 75  * The VALUE clau
2df0: 73 65 3a 20 61 20 6c 69 73 74 20 6f 66 20 76 61  se: a list of va
2e00: 6c 75 65 73 20 74 6f 20 62 65 20 69 6e 73 65 72  lues to be inser
2e10: 74 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ted */.  Select 
2e20: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 2f 2a 20  *pSelect,    /* 
2e30: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
2e40: 6e 74 20 74 68 61 74 20 73 75 70 70 6c 69 65 73  nt that supplies
2e50: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
2e60: 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20 20   orconf         
2e70: 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74   /* The conflict
2e80: 20 61 6c 67 6f 72 69 74 68 6d 20 28 4f 45 5f 41   algorithm (OE_A
2e90: 62 6f 72 74 2c 20 4f 45 5f 52 65 70 6c 61 63 65  bort, OE_Replace
2ea0: 2c 20 65 74 63 2e 29 20 2a 2f 0a 29 7b 0a 20 20  , etc.) */.){.  
2eb0: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54 72  TriggerStep *pTr
2ec0: 69 67 67 65 72 53 74 65 70 3b 0a 0a 20 20 61 73  iggerStep;..  as
2ed0: 73 65 72 74 28 70 45 4c 69 73 74 20 3d 3d 20 30  sert(pEList == 0
2ee0: 20 7c 7c 20 70 53 65 6c 65 63 74 20 3d 3d 20 30   || pSelect == 0
2ef0: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 45 4c 69  );.  assert(pELi
2f00: 73 74 20 21 3d 20 30 20 7c 7c 20 70 53 65 6c 65  st != 0 || pSele
2f10: 63 74 20 21 3d 20 30 20 7c 7c 20 64 62 2d 3e 6d  ct != 0 || db->m
2f20: 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 0a 20  allocFailed);.. 
2f30: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20   pTriggerStep = 
2f40: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
2f50: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
2f60: 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a 20 20  riggerStep));.  
2f70: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70  if( pTriggerStep
2f80: 20 29 7b 0a 20 20 20 20 70 54 72 69 67 67 65 72   ){.    pTrigger
2f90: 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e  Step->op = TK_IN
2fa0: 53 45 52 54 3b 0a 20 20 20 20 70 54 72 69 67 67  SERT;.    pTrigg
2fb0: 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 20  erStep->pSelect 
2fc0: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70  = pSelect;.    p
2fd0: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 74 61 72  TriggerStep->tar
2fe0: 67 65 74 20 20 3d 20 2a 70 54 61 62 6c 65 4e 61  get  = *pTableNa
2ff0: 6d 65 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  me;.    pTrigger
3000: 53 74 65 70 2d 3e 70 49 64 4c 69 73 74 20 3d 20  Step->pIdList = 
3010: 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 54 72  pColumn;.    pTr
3020: 69 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70 72  iggerStep->pExpr
3030: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
3040: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
3050: 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66  >orconf = orconf
3060: 3b 0a 20 20 20 20 73 71 6c 69 74 65 50 65 72 73  ;.    sqlitePers
3070: 69 73 74 54 72 69 67 67 65 72 53 74 65 70 28 64  istTriggerStep(d
3080: 62 2c 20 70 54 72 69 67 67 65 72 53 74 65 70 29  b, pTriggerStep)
3090: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
30a0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
30b0: 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b  te(db, pColumn);
30c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
30d0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
30e0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
30f0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
3100: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
3110: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69  }..  return pTri
3120: 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a  ggerStep;.}../*.
3130: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 74  ** Construct a t
3140: 72 69 67 67 65 72 20 73 74 65 70 20 74 68 61 74  rigger step that
3150: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 55   implements an U
3160: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  PDATE statement 
3170: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20  and return.** a 
3180: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20  pointer to that 
3190: 74 72 69 67 67 65 72 20 73 74 65 70 2e 20 20 54  trigger step.  T
31a0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
31b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
31c0: 6e 20 69 74 0a 2a 2a 20 73 65 65 73 20 61 6e 20  n it.** sees an 
31d0: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
31e0: 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79   inside the body
31f0: 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 52 49   of a CREATE TRI
3200: 47 47 45 52 2e 0a 2a 2f 0a 54 72 69 67 67 65 72  GGER..*/.Trigger
3210: 53 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72 69  Step *sqlite3Tri
3220: 67 67 65 72 55 70 64 61 74 65 53 74 65 70 28 0a  ggerUpdateStep(.
3230: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
3240: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
3250: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
3260: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  n */.  Token *pT
3270: 61 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 4e  ableName,   /* N
3280: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
3290: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
32a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
32b0: 4c 69 73 74 2c 20 20 20 20 2f 2a 20 54 68 65 20  List,    /* The 
32c0: 53 45 54 20 63 6c 61 75 73 65 3a 20 6c 69 73 74  SET clause: list
32d0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 6e   of column and n
32e0: 65 77 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 45  ew values */.  E
32f0: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
3300: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
3310: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
3320: 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20 20   orconf         
3330: 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63    /* The conflic
3340: 74 20 61 6c 67 6f 72 69 74 68 6d 2e 20 28 4f 45  t algorithm. (OE
3350: 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
3360: 65 2c 20 65 74 63 29 20 2a 2f 0a 29 7b 0a 20 20  e, etc) */.){.  
3370: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54 72  TriggerStep *pTr
3380: 69 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c 69  iggerStep = sqli
3390: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
33a0: 64 62 2c 20 73 69 7a 65 6f 66 28 54 72 69 67 67  db, sizeof(Trigg
33b0: 65 72 53 74 65 70 29 29 3b 0a 20 20 69 66 28 20  erStep));.  if( 
33c0: 70 54 72 69 67 67 65 72 53 74 65 70 3d 3d 30 20  pTriggerStep==0 
33d0: 29 7b 0a 20 20 20 20 20 73 71 6c 69 74 65 33 45  ){.     sqlite3E
33e0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
33f0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  , pEList);.     
3400: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3410: 65 28 64 62 2c 20 70 57 68 65 72 65 29 3b 0a 20  e(db, pWhere);. 
3420: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3430: 7d 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  }..  pTriggerSte
3440: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 55 50 44 41 54  p->op = TK_UPDAT
3450: 45 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  E;.  pTriggerSte
3460: 70 2d 3e 74 61 72 67 65 74 20 20 3d 20 2a 70 54  p->target  = *pT
3470: 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 70 54 72 69  ableName;.  pTri
3480: 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70 72 4c  ggerStep->pExprL
3490: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
34a0: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57  pTriggerStep->pW
34b0: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
34c0: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f   pTriggerStep->o
34d0: 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a  rconf = orconf;.
34e0: 20 20 73 71 6c 69 74 65 50 65 72 73 69 73 74 54    sqlitePersistT
34f0: 72 69 67 67 65 72 53 74 65 70 28 64 62 2c 20 70  riggerStep(db, p
3500: 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a 0a 20  TriggerStep);.. 
3510: 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72   return pTrigger
3520: 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Step;.}../*.** C
3530: 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69 67 67  onstruct a trigg
3540: 65 72 20 73 74 65 70 20 74 68 61 74 20 69 6d 70  er step that imp
3550: 6c 65 6d 65 6e 74 73 20 61 20 44 45 4c 45 54 45  lements a DELETE
3560: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
3570: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
3580: 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67 67  er to that trigg
3590: 65 72 20 73 74 65 70 2e 20 20 54 68 65 20 70 61  er step.  The pa
35a0: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
35b0: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 0a  routine when it.
35c0: 2a 2a 20 73 65 65 73 20 61 20 44 45 4c 45 54 45  ** sees a DELETE
35d0: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 69 64   statement insid
35e0: 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  e the body of a 
35f0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 2e 0a  CREATE TRIGGER..
3600: 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a  */.TriggerStep *
3610: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 44 65  sqlite3TriggerDe
3620: 6c 65 74 65 53 74 65 70 28 0a 20 20 73 71 6c 69  leteStep(.  sqli
3630: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
3640: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* 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 20 20 20 2f 2a 20 54 68 65 20 74  e,      /* The t
3680: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
3690: 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65 64  rows are deleted
36a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
36b0: 72 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  re            /*
36c0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
36d0: 65 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65  e */.){.  Trigge
36e0: 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53  rStep *pTriggerS
36f0: 74 65 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tep = sqlite3DbM
3700: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
3710: 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70  zeof(TriggerStep
3720: 29 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67  ));.  if( pTrigg
3730: 65 72 53 74 65 70 3d 3d 30 20 29 7b 0a 20 20 20  erStep==0 ){.   
3740: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3750: 74 65 28 64 62 2c 20 70 57 68 65 72 65 29 3b 0a  te(db, pWhere);.
3760: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3770: 7d 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  }..  pTriggerSte
3780: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 44 45 4c 45 54  p->op = TK_DELET
3790: 45 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  E;.  pTriggerSte
37a0: 70 2d 3e 74 61 72 67 65 74 20 20 3d 20 2a 70 54  p->target  = *pT
37b0: 61 62 6c 65 4e 61 6d 65 3b 0a 20 20 70 54 72 69  ableName;.  pTri
37c0: 67 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65  ggerStep->pWhere
37d0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 54 72   = pWhere;.  pTr
37e0: 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e  iggerStep->orcon
37f0: 66 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a  f = OE_Default;.
3800: 20 20 73 71 6c 69 74 65 50 65 72 73 69 73 74 54    sqlitePersistT
3810: 72 69 67 67 65 72 53 74 65 70 28 64 62 2c 20 70  riggerStep(db, p
3820: 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a 0a 20  TriggerStep);.. 
3830: 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72   return pTrigger
3840: 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  Step;.}../* .** 
3850: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
3860: 74 65 20 61 20 54 72 69 67 67 65 72 20 73 74 72  te a Trigger str
3870: 75 63 74 75 72 65 0a 2a 2f 0a 76 6f 69 64 20 73  ucture.*/.void s
3880: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
3890: 67 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ger(sqlite3 *db,
38a0: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
38b0: 65 72 29 7b 0a 20 20 69 66 28 20 70 54 72 69 67  er){.  if( pTrig
38c0: 67 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ger==0 ) return;
38d0: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
38e0: 54 72 69 67 67 65 72 53 74 65 70 28 64 62 2c 20  TriggerStep(db, 
38f0: 70 54 72 69 67 67 65 72 2d 3e 73 74 65 70 5f 6c  pTrigger->step_l
3900: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ist);.  sqlite3D
3910: 62 46 72 65 65 28 64 62 2c 20 70 54 72 69 67 67  bFree(db, pTrigg
3920: 65 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 73 71 6c  er->name);.  sql
3930: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3940: 54 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 29 3b  Trigger->table);
3950: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
3960: 6c 65 74 65 28 64 62 2c 20 70 54 72 69 67 67 65  lete(db, pTrigge
3970: 72 2d 3e 70 57 68 65 6e 29 3b 0a 20 20 73 71 6c  r->pWhen);.  sql
3980: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
3990: 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70  (db, pTrigger->p
39a0: 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 69 66 28 20  Columns);.  if( 
39b0: 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 54 6f  pTrigger->nameTo
39c0: 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65  ken.dyn ) sqlite
39d0: 33 44 62 46 72 65 65 28 64 62 2c 20 28 63 68 61  3DbFree(db, (cha
39e0: 72 2a 29 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  r*)pTrigger->nam
39f0: 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c  eToken.z);.  sql
3a00: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3a10: 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Trigger);.}../*.
3a20: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3a30: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 72   is called to dr
3a40: 6f 70 20 61 20 74 72 69 67 67 65 72 20 66 72 6f  op a trigger fro
3a50: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  m the database s
3a60: 63 68 65 6d 61 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  chema. .**.** Th
3a70: 69 73 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  is may be called
3a80: 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
3a90: 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 74 68  he parser and th
3aa0: 65 72 65 66 6f 72 65 20 69 64 65 6e 74 69 66 69  erefore identifi
3ab0: 65 73 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65  es.** the trigge
3ac0: 72 20 62 79 20 6e 61 6d 65 2e 20 20 54 68 65 20  r by name.  The 
3ad0: 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
3ae0: 65 72 50 74 72 28 29 20 72 6f 75 74 69 6e 65 20  erPtr() routine 
3af0: 64 6f 65 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65  does the.** same
3b00: 20 6a 6f 62 20 61 73 20 74 68 69 73 20 72 6f 75   job as this rou
3b10: 74 69 6e 65 20 65 78 63 65 70 74 20 69 74 20 74  tine except it t
3b20: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
3b30: 6f 20 74 68 65 20 74 72 69 67 67 65 72 0a 2a 2a  o the trigger.**
3b40: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
3b50: 74 72 69 67 67 65 72 20 6e 61 6d 65 2e 0a 2a 2a  trigger name..**
3b60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
3b70: 6f 70 54 72 69 67 67 65 72 28 50 61 72 73 65 20  opTrigger(Parse 
3b80: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
3b90: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 6e 6f 45   *pName, int noE
3ba0: 72 72 29 7b 0a 20 20 54 72 69 67 67 65 72 20 2a  rr){.  Trigger *
3bb0: 70 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20  pTrigger = 0;.  
3bc0: 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63  int i;.  const c
3bd0: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73  har *zDb;.  cons
3be0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
3bf0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 73 71   int nName;.  sq
3c00: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
3c10: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64  se->db;..  if( d
3c20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3c30: 29 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67  ) goto drop_trig
3c40: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69  ger_cleanup;.  i
3c50: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
3c60: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
3c70: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
3c80: 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 67 65 72  oto drop_trigger
3c90: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
3ca0: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
3cb0: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 7a 44 62  nSrc==1 );.  zDb
3cc0: 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a   = pName->a[0].z
3cd0: 44 61 74 61 62 61 73 65 3b 0a 20 20 7a 4e 61 6d  Database;.  zNam
3ce0: 65 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  e = pName->a[0].
3cf0: 7a 4e 61 6d 65 3b 0a 20 20 6e 4e 61 6d 65 20 3d  zName;.  nName =
3d00: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
3d10: 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d    for(i=OMIT_TEM
3d20: 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  PDB; i<db->nDb; 
3d30: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
3d40: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
3d50: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
3d60: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
3d70: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  /.    if( zDb &&
3d80: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
3d90: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
3da0: 2c 20 7a 44 62 29 20 29 20 63 6f 6e 74 69 6e 75  , zDb) ) continu
3db0: 65 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  e;.    pTrigger 
3dc0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
3dd0: 64 28 26 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  d(&(db->aDb[j].p
3de0: 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68  Schema->trigHash
3df0: 29 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  ), zName, nName)
3e00: 3b 0a 20 20 20 20 69 66 28 20 70 54 72 69 67 67  ;.    if( pTrigg
3e10: 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  er ) break;.  }.
3e20: 20 20 69 66 28 20 21 70 54 72 69 67 67 65 72 20    if( !pTrigger 
3e30: 29 7b 0a 20 20 20 20 69 66 28 20 21 6e 6f 45 72  ){.    if( !noEr
3e40: 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
3e50: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
3e60: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 72 69 67  e, "no such trig
3e70: 67 65 72 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  ger: %S", pName,
3e80: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67   0);.    }.    g
3e90: 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 67 65 72  oto drop_trigger
3ea0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
3eb0: 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
3ec0: 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54  erPtr(pParse, pT
3ed0: 72 69 67 67 65 72 29 3b 0a 0a 64 72 6f 70 5f 74  rigger);..drop_t
3ee0: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a  rigger_cleanup:.
3ef0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
3f00: 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
3f10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
3f20: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
3f30: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
3f40: 75 72 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ure for the tabl
3f50: 65 20 74 68 61 74 20 61 20 74 72 69 67 67 65 72  e that a trigger
3f60: 0a 2a 2a 20 69 73 20 73 65 74 20 6f 6e 2e 0a 2a  .** is set on..*
3f70: 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
3f80: 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72 28 54  tableOfTrigger(T
3f90: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
3fa0: 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72  ){.  int n = str
3fb0: 6c 65 6e 28 70 54 72 69 67 67 65 72 2d 3e 74 61  len(pTrigger->ta
3fc0: 62 6c 65 29 20 2b 20 31 3b 0a 20 20 72 65 74 75  ble) + 1;.  retu
3fd0: 72 6e 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  rn sqlite3HashFi
3fe0: 6e 64 28 26 70 54 72 69 67 67 65 72 2d 3e 70 54  nd(&pTrigger->pT
3ff0: 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  abSchema->tblHas
4000: 68 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61 62  h, pTrigger->tab
4010: 6c 65 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  le, n);.}.../*.*
4020: 2a 20 44 72 6f 70 20 61 20 74 72 69 67 67 65 72  * Drop a trigger
4030: 20 67 69 76 65 6e 20 61 20 70 6f 69 6e 74 65 72   given a pointer
4040: 20 74 6f 20 74 68 61 74 20 74 72 69 67 67 65 72   to that trigger
4050: 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
4060: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
4070: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4080: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
4090: 72 29 7b 0a 20 20 54 61 62 6c 65 20 20 20 2a 70  r){.  Table   *p
40a0: 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76  Table;.  Vdbe *v
40b0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
40c0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
40d0: 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 44 62 20  int iDb;..  iDb 
40e0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
40f0: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
4100: 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  b, pTrigger->pSc
4110: 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
4120: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
4130: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 70 54 61 62  b->nDb );.  pTab
4140: 6c 65 20 3d 20 74 61 62 6c 65 4f 66 54 72 69 67  le = tableOfTrig
4150: 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20  ger(pTrigger);. 
4160: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
4170: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
4180: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ble->pSchema==pT
4190: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 20  rigger->pSchema 
41a0: 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 23 69 66  || iDb==1 );.#if
41b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
41c0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
41d0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
41e0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  = SQLITE_DROP_TR
41f0: 49 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e 73 74  IGGER;.    const
4200: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
4210: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
4220: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
4230: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
4240: 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69  ABLE(iDb);.    i
4250: 66 28 20 69 44 62 3d 3d 31 20 29 20 63 6f 64 65  f( iDb==1 ) code
4260: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
4270: 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20  EMP_TRIGGER;.   
4280: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
4290: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
42a0: 64 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e 61  de, pTrigger->na
42b0: 6d 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  me, pTable->zNam
42c0: 65 2c 20 7a 44 62 29 20 7c 7c 0a 20 20 20 20 20  e, zDb) ||.     
42d0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
42e0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
42f0: 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
4300: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
4310: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
4320: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
4330: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
4340: 64 65 73 74 72 6f 79 20 74 68 65 20 64 61 74 61  destroy the data
4350: 62 61 73 65 20 72 65 63 6f 72 64 20 6f 66 20 74  base record of t
4360: 68 65 20 74 72 69 67 67 65 72 2e 0a 20 20 2a 2f  he trigger..  */
4370: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
4380: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 76  e!=0 );.  if( (v
4390: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
43a0: 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b  e(pParse))!=0 ){
43b0: 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 20  .    int base;. 
43c0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
43d0: 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70 54  VdbeOpList dropT
43e0: 72 69 67 67 65 72 5b 5d 20 3d 20 7b 0a 20 20 20  rigger[] = {.   
43f0: 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
4400: 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
4410: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
4420: 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 31  String8,    0, 1
4430: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  ,        0}, /* 
4440: 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  1 */.      { OP_
4450: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31  Column,     0, 1
4460: 2c 20 20 20 20 20 20 20 20 32 7d 2c 0a 20 20 20  ,        2},.   
4470: 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20     { OP_Ne,     
4480: 20 20 20 20 32 2c 20 41 44 44 52 28 38 29 2c 20      2, ADDR(8), 
4490: 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   1},.      { OP_
44a0: 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 31  String8,    0, 1
44b0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  ,        0}, /* 
44c0: 34 3a 20 22 74 72 69 67 67 65 72 22 20 2a 2f 0a  4: "trigger" */.
44d0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
44e0: 6e 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  n,     0, 0,    
44f0: 20 20 20 20 32 7d 2c 0a 20 20 20 20 20 20 7b 20      2},.      { 
4500: 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 32  OP_Ne,         2
4510: 2c 20 41 44 44 52 28 38 29 2c 20 20 31 7d 2c 0a  , ADDR(8),  1},.
4520: 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74        { OP_Delet
4530: 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  e,     0, 0,    
4540: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
4550: 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30  OP_Next,       0
4560: 2c 20 41 44 44 52 28 31 29 2c 20 20 30 7d 2c 20  , ADDR(1),  0}, 
4570: 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a 0a  /* 8 */.    };..
4580: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
4590: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
45a0: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
45b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
45c0: 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73  asterTable(pPars
45d0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 62 61 73  e, iDb);.    bas
45e0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
45f0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 20 41 72 72  ddOpList(v,  Arr
4600: 61 79 53 69 7a 65 28 64 72 6f 70 54 72 69 67 67  aySize(dropTrigg
4610: 65 72 29 2c 20 64 72 6f 70 54 72 69 67 67 65 72  er), dropTrigger
4620: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4630: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 62 61  beChangeP4(v, ba
4640: 73 65 2b 31 2c 20 70 54 72 69 67 67 65 72 2d 3e  se+1, pTrigger->
4650: 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  name, 0);.    sq
4660: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
4670: 34 28 76 2c 20 62 61 73 65 2b 34 2c 20 22 74 72  4(v, base+4, "tr
4680: 69 67 67 65 72 22 2c 20 50 34 5f 53 54 41 54 49  igger", P4_STATI
4690: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  C);.    sqlite3C
46a0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
46b0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
46c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
46d0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
46e0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
46f0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
4700: 44 72 6f 70 54 72 69 67 67 65 72 2c 20 69 44 62  DropTrigger, iDb
4710: 2c 20 30 2c 20 30 2c 20 70 54 72 69 67 67 65 72  , 0, 0, pTrigger
4720: 2d 3e 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  ->name, 0);.  }.
4730: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
4740: 61 20 74 72 69 67 67 65 72 20 66 72 6f 6d 20 74  a trigger from t
4750: 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f  he hash tables o
4760: 66 20 74 68 65 20 73 71 6c 69 74 65 2a 20 70 6f  f the sqlite* po
4770: 69 6e 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  inter..*/.void s
4780: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
4790: 65 6c 65 74 65 54 72 69 67 67 65 72 28 73 71 6c  eleteTrigger(sql
47a0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
47b0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
47c0: 4e 61 6d 65 29 7b 0a 20 20 54 72 69 67 67 65 72  Name){.  Trigger
47d0: 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 69 6e   *pTrigger;.  in
47e0: 74 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e  t nName = strlen
47f0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 54 72 69 67  (zName);.  pTrig
4800: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 48 61 73  ger = sqlite3Has
4810: 68 49 6e 73 65 72 74 28 26 28 64 62 2d 3e 61 44  hInsert(&(db->aD
4820: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
4830: 74 72 69 67 48 61 73 68 29 2c 0a 20 20 20 20 20  trigHash),.     
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c            zName,
4860: 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66   nName, 0);.  if
4870: 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
4880: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 20    Table *pTable 
4890: 3d 20 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72  = tableOfTrigger
48a0: 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20  (pTrigger);.    
48b0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
48c0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
48d0: 62 6c 65 2d 3e 70 54 72 69 67 67 65 72 20 3d 3d  ble->pTrigger ==
48e0: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
48f0: 20 20 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67     pTable->pTrig
4900: 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
4910: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
4920: 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 20  {.      Trigger 
4930: 2a 63 63 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54  *cc = pTable->pT
4940: 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 77 68  rigger;.      wh
4950: 69 6c 65 28 20 63 63 20 29 7b 20 0a 20 20 20 20  ile( cc ){ .    
4960: 20 20 20 20 69 66 28 20 63 63 2d 3e 70 4e 65 78      if( cc->pNex
4970: 74 20 3d 3d 20 70 54 72 69 67 67 65 72 20 29 7b  t == pTrigger ){
4980: 0a 20 20 20 20 20 20 20 20 20 20 63 63 2d 3e 70  .          cc->p
4990: 4e 65 78 74 20 3d 20 63 63 2d 3e 70 4e 65 78 74  Next = cc->pNext
49a0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
49b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
49c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 63 20 3d    }.        cc =
49d0: 20 63 63 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   cc->pNext;.    
49e0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
49f0: 28 63 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  (cc);.    }.    
4a00: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69  sqlite3DeleteTri
4a10: 67 67 65 72 28 64 62 2c 20 70 54 72 69 67 67 65  gger(db, pTrigge
4a20: 72 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  r);.    db->flag
4a30: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
4a40: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d  rnChanges;.  }.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69  ../*.** pEList i
4a60: 73 20 74 68 65 20 53 45 54 20 63 6c 61 75 73 65  s the SET clause
4a70: 20 6f 66 20 61 6e 20 55 50 44 41 54 45 20 73 74   of an UPDATE st
4a80: 61 74 65 6d 65 6e 74 2e 20 20 45 61 63 68 20 65  atement.  Each e
4a90: 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 45 4c 69 73  ntry.** in pELis
4aa0: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
4ab0: 61 74 20 3c 69 64 3e 3d 3c 65 78 70 72 3e 2e 20  at <id>=<expr>. 
4ac0: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
4ad0: 6e 74 72 69 65 73 0a 2a 2a 20 69 6e 20 70 45 4c  ntries.** in pEL
4ae0: 69 73 74 20 68 61 76 65 20 61 6e 20 3c 69 64 3e  ist have an <id>
4af0: 20 77 68 69 63 68 20 6d 61 74 63 68 65 73 20 61   which matches a
4b00: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 69 6e 20  n identifier in 
4b10: 70 49 64 4c 69 73 74 2c 0a 2a 2a 20 74 68 65 6e  pIdList,.** then
4b20: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49   return TRUE.  I
4b30: 66 20 70 49 64 4c 69 73 74 3d 3d 4e 55 4c 4c 2c  f pIdList==NULL,
4b40: 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 6e 73   then it is cons
4b50: 69 64 65 72 65 64 20 61 0a 2a 2a 20 77 69 6c 64  idered a.** wild
4b60: 63 61 72 64 20 74 68 61 74 20 6d 61 74 63 68 65  card that matche
4b70: 73 20 61 6e 79 74 68 69 6e 67 2e 20 20 4c 69 6b  s anything.  Lik
4b80: 65 77 69 73 65 20 69 66 20 70 45 4c 69 73 74 3d  ewise if pEList=
4b90: 3d 4e 55 4c 4c 20 74 68 65 6e 0a 2a 2a 20 69 74  =NULL then.** it
4ba0: 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68 69 6e   matches anythin
4bb0: 67 20 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75  g so always retu
4bc0: 72 6e 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e  rn true.  Return
4bd0: 20 66 61 6c 73 65 20 6f 6e 6c 79 0a 2a 2a 20 69   false only.** i
4be0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
4bf0: 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tch..*/.static i
4c00: 6e 74 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76  nt checkColumnOv
4c10: 65 72 4c 61 70 28 49 64 4c 69 73 74 20 2a 70 49  erLap(IdList *pI
4c20: 64 4c 69 73 74 2c 20 45 78 70 72 4c 69 73 74 20  dList, ExprList 
4c30: 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20  *pEList){.  int 
4c40: 65 3b 0a 20 20 69 66 28 20 21 70 49 64 4c 69 73  e;.  if( !pIdLis
4c50: 74 20 7c 7c 20 21 70 45 4c 69 73 74 20 29 20 72  t || !pEList ) r
4c60: 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 65  eturn 1;.  for(e
4c70: 3d 30 3b 20 65 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; e<pEList->nE
4c80: 78 70 72 3b 20 65 2b 2b 29 7b 0a 20 20 20 20 69  xpr; e++){.    i
4c90: 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  f( sqlite3IdList
4ca0: 49 6e 64 65 78 28 70 49 64 4c 69 73 74 2c 20 70  Index(pIdList, p
4cb0: 45 4c 69 73 74 2d 3e 61 5b 65 5d 2e 7a 4e 61 6d  EList->a[e].zNam
4cc0: 65 29 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 31  e)>=0 ) return 1
4cd0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
4ce0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ; .}../*.** Retu
4cf0: 72 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 20  rn a bit vector 
4d00: 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  to indicate what
4d10: 20 6b 69 6e 64 20 6f 66 20 74 72 69 67 67 65 72   kind of trigger
4d20: 73 20 65 78 69 73 74 20 66 6f 72 20 6f 70 65 72  s exist for oper
4d30: 61 74 69 6f 6e 0a 2a 2a 20 22 6f 70 22 20 6f 6e  ation.** "op" on
4d40: 20 74 61 62 6c 65 20 70 54 61 62 2e 20 20 49 66   table pTab.  If
4d50: 20 70 43 68 61 6e 67 65 73 20 69 73 20 6e 6f 74   pChanges is not
4d60: 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73   NULL then it is
4d70: 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
4d80: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 62  ns.** that are b
4d90: 65 69 6e 67 20 75 70 64 61 74 65 64 2e 20 20 54  eing updated.  T
4da0: 72 69 67 67 65 72 73 20 6f 6e 6c 79 20 6d 61 74  riggers only mat
4db0: 63 68 20 69 66 20 74 68 65 20 4f 4e 20 63 6c 61  ch if the ON cla
4dc0: 75 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  use of the.** tr
4dd0: 69 67 67 65 72 20 64 65 66 69 6e 69 74 69 6f 6e  igger definition
4de0: 20 6f 76 65 72 6c 61 70 73 20 74 68 65 20 73 65   overlaps the se
4df0: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 62 65 69  t of columns bei
4e00: 6e 67 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  ng updated..**.*
4e10: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 62  * The returned b
4e20: 69 74 20 76 65 63 74 6f 72 20 69 73 20 73 6f 6d  it vector is som
4e30: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
4e40: 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20   TRIGGER_BEFORE 
4e50: 61 6e 64 0a 2a 2a 20 54 52 49 47 47 45 52 5f 41  and.** TRIGGER_A
4e60: 46 54 45 52 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  FTER..*/.int sql
4e70: 69 74 65 33 54 72 69 67 67 65 72 73 45 78 69 73  ite3TriggersExis
4e80: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
4e90: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
4ea0: 55 73 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f  Used to check fo
4eb0: 72 20 72 65 63 75 72 73 69 76 65 20 74 72 69 67  r recursive trig
4ec0: 67 65 72 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20  gers */.  Table 
4ed0: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
4ee0: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
4ef0: 68 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  he contains the 
4f00: 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e  triggers */.  in
4f10: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
4f20: 20 20 20 20 20 20 2f 2a 20 6f 6e 65 20 6f 66 20        /* one of 
4f30: 54 4b 5f 44 45 4c 45 54 45 2c 20 54 4b 5f 49 4e  TK_DELETE, TK_IN
4f40: 53 45 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 20  SERT, TK_UPDATE 
4f50: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
4f60: 43 68 61 6e 67 65 73 20 20 20 20 20 20 2f 2a 20  Changes      /* 
4f70: 43 6f 6c 75 6d 6e 73 20 74 68 61 74 20 63 68 61  Columns that cha
4f80: 6e 67 65 20 69 6e 20 61 6e 20 55 50 44 41 54 45  nge in an UPDATE
4f90: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
4fa0: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
4fb0: 67 67 65 72 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  gger;.  int mask
4fc0: 20 3d 20 30 3b 0a 0a 20 20 70 54 72 69 67 67 65   = 0;..  pTrigge
4fd0: 72 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54  r = IsVirtual(pT
4fe0: 61 62 29 20 3f 20 30 20 3a 20 70 54 61 62 2d 3e  ab) ? 0 : pTab->
4ff0: 70 54 72 69 67 67 65 72 3b 0a 20 20 77 68 69 6c  pTrigger;.  whil
5000: 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
5010: 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72 2d     if( pTrigger-
5020: 3e 6f 70 3d 3d 6f 70 20 26 26 20 63 68 65 63 6b  >op==op && check
5030: 43 6f 6c 75 6d 6e 4f 76 65 72 4c 61 70 28 70 54  ColumnOverLap(pT
5040: 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73  rigger->pColumns
5050: 2c 20 70 43 68 61 6e 67 65 73 29 20 29 7b 0a 20  , pChanges) ){. 
5060: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 70 54 72       mask |= pTr
5070: 69 67 67 65 72 2d 3e 74 72 5f 74 6d 3b 0a 20 20  igger->tr_tm;.  
5080: 20 20 7d 0a 20 20 20 20 70 54 72 69 67 67 65 72    }.    pTrigger
5090: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
50a0: 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
50b0: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
50c0: 43 6f 6e 76 65 72 74 20 74 68 65 20 70 53 74 65  Convert the pSte
50d0: 70 2d 3e 74 61 72 67 65 74 20 74 6f 6b 65 6e 20  p->target token 
50e0: 69 6e 74 6f 20 61 20 53 72 63 4c 69 73 74 20 61  into a SrcList a
50f0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
5100: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20 53  ter.** to that S
5110: 72 63 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  rcList..**.** Th
5120: 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
5130: 61 20 73 70 65 63 69 66 69 63 20 64 61 74 61 62  a specific datab
5140: 61 73 65 20 6e 61 6d 65 2c 20 69 66 20 6e 65 65  ase name, if nee
5150: 64 65 64 2c 20 74 6f 20 74 68 65 20 74 61 72 67  ded, to the targ
5160: 65 74 20 77 68 65 6e 0a 2a 2a 20 66 6f 72 6d 69  et when.** formi
5170: 6e 67 20 74 68 65 20 53 72 63 4c 69 73 74 2e 20  ng the SrcList. 
5180: 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 61   This prevents a
5190: 20 74 72 69 67 67 65 72 20 69 6e 20 6f 6e 65 20   trigger in one 
51a0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 0a 2a 2a  database from.**
51b0: 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 61 20   referring to a 
51c0: 74 61 72 67 65 74 20 69 6e 20 61 6e 6f 74 68 65  target in anothe
51d0: 72 20 64 61 74 61 62 61 73 65 2e 20 20 41 6e 20  r database.  An 
51e0: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65  exception is whe
51f0: 6e 20 74 68 65 0a 2a 2a 20 74 72 69 67 67 65 72  n the.** trigger
5200: 20 69 73 20 69 6e 20 54 45 4d 50 20 69 6e 20 77   is in TEMP in w
5210: 68 69 63 68 20 63 61 73 65 20 69 74 20 63 61 6e  hich case it can
5220: 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6f 74   refer to any ot
5230: 68 65 72 20 64 61 74 61 62 61 73 65 20 69 74 0a  her database it.
5240: 2a 2a 20 77 61 6e 74 73 2e 0a 2a 2f 0a 73 74 61  ** wants..*/.sta
5250: 74 69 63 20 53 72 63 4c 69 73 74 20 2a 74 61 72  tic SrcList *tar
5260: 67 65 74 53 72 63 4c 69 73 74 28 0a 20 20 50 61  getSrcList(.  Pa
5270: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5280: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
5290: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
52a0: 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74 65  riggerStep *pSte
52b0: 70 20 20 20 2f 2a 20 54 68 65 20 74 72 69 67 67  p   /* The trigg
52c0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
52d0: 65 20 74 61 72 67 65 74 20 74 6f 6b 65 6e 20 2a  e target token *
52e0: 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 44 62  /.){.  Token sDb
52f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
5300: 75 6d 6d 79 20 64 61 74 61 62 61 73 65 20 6e 61  ummy database na
5310: 6d 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e  me token */.  in
5320: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
5330: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
5340: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 75  he database to u
5350: 73 65 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  se */.  SrcList 
5360: 2a 70 53 72 63 3b 20 20 20 20 20 20 20 2f 2a 20  *pSrc;       /* 
5370: 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 72 65  SrcList to be re
5380: 74 75 72 6e 65 64 20 2a 2f 0a 0a 20 20 69 44 62  turned */..  iDb
5390: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
53a0: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
53b0: 64 62 2c 20 70 53 74 65 70 2d 3e 70 54 72 69 67  db, pStep->pTrig
53c0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66  ->pSchema);.  if
53d0: 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e  ( iDb==0 || iDb>
53e0: 3d 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =2 ){.    assert
53f0: 28 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62  ( iDb<pParse->db
5400: 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 73 44 62  ->nDb );.    sDb
5410: 2e 7a 20 3d 20 28 75 38 2a 29 70 50 61 72 73 65  .z = (u8*)pParse
5420: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
5430: 4e 61 6d 65 3b 0a 20 20 20 20 73 44 62 2e 6e 20  Name;.    sDb.n 
5440: 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29  = strlen((char*)
5450: 73 44 62 2e 7a 29 3b 0a 20 20 20 20 70 53 72 63  sDb.z);.    pSrc
5460: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
5470: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2d 3e  tAppend(pParse->
5480: 64 62 2c 20 30 2c 20 26 73 44 62 2c 20 26 70 53  db, 0, &sDb, &pS
5490: 74 65 70 2d 3e 74 61 72 67 65 74 29 3b 0a 20 20  tep->target);.  
54a0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 53 72  } else {.    pSr
54b0: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
54c0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2d  stAppend(pParse-
54d0: 3e 64 62 2c 20 30 2c 20 26 70 53 74 65 70 2d 3e  >db, 0, &pStep->
54e0: 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 0a  target, 0);.  }.
54f0: 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d    return pSrc;.}
5500: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
5510: 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 7a   VDBE code for z
5520: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73 74 61 74  ero or more stat
5530: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 20 74 68  ements inside th
5540: 65 20 62 6f 64 79 20 6f 66 20 61 0a 2a 2a 20 74  e body of a.** t
5550: 72 69 67 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61  rigger.  .*/.sta
5560: 74 69 63 20 69 6e 74 20 63 6f 64 65 54 72 69 67  tic int codeTrig
5570: 67 65 72 50 72 6f 67 72 61 6d 28 0a 20 20 50 61  gerProgram(.  Pa
5580: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5590: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
55a0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
55b0: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
55c0: 70 53 74 65 70 4c 69 73 74 2c 20 20 20 2f 2a 20  pStepList,   /* 
55d0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 6d 65 6e  List of statemen
55e0: 74 73 20 69 6e 73 69 64 65 20 74 68 65 20 74 72  ts inside the tr
55f0: 69 67 67 65 72 20 62 6f 64 79 20 2a 2f 0a 20 20  igger body */.  
5600: 69 6e 74 20 6f 72 63 6f 6e 66 69 6e 20 20 20 20  int orconfin    
5610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
5620: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 2e  flict algorithm.
5630: 20 28 4f 45 5f 41 62 6f 72 74 2c 20 65 74 63 29   (OE_Abort, etc)
5640: 20 2a 2f 20 20 0a 29 7b 0a 20 20 54 72 69 67 67   */  .){.  Trigg
5650: 65 72 53 74 65 70 20 2a 20 70 54 72 69 67 67 65  erStep * pTrigge
5660: 72 53 74 65 70 20 3d 20 70 53 74 65 70 4c 69 73  rStep = pStepLis
5670: 74 3b 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 3b  t;.  int orconf;
5680: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
5690: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71  rse->pVdbe;.  sq
56a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
56b0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
56c0: 74 28 20 70 54 72 69 67 67 65 72 53 74 65 70 21  t( pTriggerStep!
56d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
56e0: 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
56f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5700: 50 5f 43 6f 6e 74 65 78 74 50 75 73 68 2c 20 30  P_ContextPush, 0
5710: 2c 20 30 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  , 0);.  VdbeComm
5720: 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74  ent((v, "begin t
5730: 72 69 67 67 65 72 20 25 73 22 2c 20 70 53 74 65  rigger %s", pSte
5740: 70 4c 69 73 74 2d 3e 70 54 72 69 67 2d 3e 6e 61  pList->pTrig->na
5750: 6d 65 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  me));.  while( p
5760: 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20  TriggerStep ){. 
5770: 20 20 20 6f 72 63 6f 6e 66 20 3d 20 28 6f 72 63     orconf = (orc
5780: 6f 6e 66 69 6e 20 3d 3d 20 4f 45 5f 44 65 66 61  onfin == OE_Defa
5790: 75 6c 74 29 3f 70 54 72 69 67 67 65 72 53 74 65  ult)?pTriggerSte
57a0: 70 2d 3e 6f 72 63 6f 6e 66 3a 6f 72 63 6f 6e 66  p->orconf:orconf
57b0: 69 6e 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  in;.    pParse->
57c0: 74 72 69 67 53 74 61 63 6b 2d 3e 6f 72 63 6f 6e  trigStack->orcon
57d0: 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 20 20  f = orconf;.    
57e0: 73 77 69 74 63 68 28 20 70 54 72 69 67 67 65 72  switch( pTrigger
57f0: 53 74 65 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Step->op ){.    
5800: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
5810: 3a 20 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65  : {.        Sele
5820: 63 74 20 2a 73 73 20 3d 20 73 71 6c 69 74 65 33  ct *ss = sqlite3
5830: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
5840: 72 69 67 67 65 72 53 74 65 70 2d 3e 70 53 65 6c  riggerStep->pSel
5850: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ect);.        if
5860: 28 20 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ( ss ){.        
5870: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
5880: 74 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 73 71  t;..          sq
5890: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
58a0: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 44  nit(&dest, SRT_D
58b0: 69 73 63 61 72 64 2c 20 30 29 3b 0a 20 20 20 20  iscard, 0);.    
58c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
58d0: 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
58e0: 65 2c 20 73 73 2c 20 30 29 3b 0a 20 20 20 20 20  e, ss, 0);.     
58f0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
5900: 63 74 28 70 50 61 72 73 65 2c 20 73 73 2c 20 26  ct(pParse, ss, &
5910: 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  dest, 0, 0, 0);.
5920: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5930: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
5940: 2c 20 73 73 29 3b 0a 20 20 20 20 20 20 20 20 7d  , ss);.        }
5950: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
5970: 73 65 20 54 4b 5f 55 50 44 41 54 45 3a 20 7b 0a  se TK_UPDATE: {.
5980: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
5990: 2a 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 70  *pSrc;.        p
59a0: 53 72 63 20 3d 20 74 61 72 67 65 74 53 72 63 4c  Src = targetSrcL
59b0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 72 69  ist(pParse, pTri
59c0: 67 67 65 72 53 74 65 70 29 3b 0a 20 20 20 20 20  ggerStep);.     
59d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
59e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp2(v, OP_Reset
59f0: 43 6f 75 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  Count, 0, 0);.  
5a00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 55 70 64        sqlite3Upd
5a10: 61 74 65 28 70 50 61 72 73 65 2c 20 70 53 72 63  ate(pParse, pSrc
5a20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5a30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
5a40: 74 44 75 70 28 64 62 2c 20 70 54 72 69 67 67 65  tDup(db, pTrigge
5a50: 72 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74  rStep->pExprList
5a60: 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
5a70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5a80: 75 70 28 64 62 2c 20 70 54 72 69 67 67 65 72 53  up(db, pTriggerS
5a90: 74 65 70 2d 3e 70 57 68 65 72 65 29 2c 20 6f 72  tep->pWhere), or
5aa0: 63 6f 6e 66 29 3b 0a 20 20 20 20 20 20 20 20 73  conf);.        s
5ab0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5ac0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e  (v, OP_ResetCoun
5ad0: 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
5ae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5af0: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49  .      case TK_I
5b00: 4e 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 20  NSERT: {.       
5b10: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
5b20: 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20 74          pSrc = t
5b30: 61 72 67 65 74 53 72 63 4c 69 73 74 28 70 50 61  argetSrcList(pPa
5b40: 72 73 65 2c 20 70 54 72 69 67 67 65 72 53 74 65  rse, pTriggerSte
5b50: 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
5b60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5b70: 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20   OP_ResetCount, 
5b80: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
5b90: 71 6c 69 74 65 33 49 6e 73 65 72 74 28 70 50 61  qlite3Insert(pPa
5ba0: 72 73 65 2c 20 70 53 72 63 2c 0a 20 20 20 20 20  rse, pSrc,.     
5bb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5bc0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 54 72 69  ListDup(db, pTri
5bd0: 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70 72 4c  ggerStep->pExprL
5be0: 69 73 74 29 2c 20 0a 20 20 20 20 20 20 20 20 20  ist), .         
5bf0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
5c00: 70 28 64 62 2c 20 70 54 72 69 67 67 65 72 53 74  p(db, pTriggerSt
5c10: 65 70 2d 3e 70 53 65 6c 65 63 74 29 2c 20 0a 20  ep->pSelect), . 
5c20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5c30: 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 54  IdListDup(db, pT
5c40: 72 69 67 67 65 72 53 74 65 70 2d 3e 70 49 64 4c  riggerStep->pIdL
5c50: 69 73 74 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20  ist), orconf);. 
5c60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5c70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
5c80: 65 73 65 74 43 6f 75 6e 74 2c 20 31 2c 20 30 29  esetCount, 1, 0)
5c90: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
5ca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
5cb0: 61 73 65 20 54 4b 5f 44 45 4c 45 54 45 3a 20 7b  ase TK_DELETE: {
5cc0: 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74  .        SrcList
5cd0: 20 2a 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20   *pSrc;.        
5ce0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5cf0: 32 28 76 2c 20 4f 50 5f 52 65 73 65 74 43 6f 75  2(v, OP_ResetCou
5d00: 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  nt, 0, 0);.     
5d10: 20 20 20 70 53 72 63 20 3d 20 74 61 72 67 65 74     pSrc = target
5d20: 53 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20  SrcList(pParse, 
5d30: 70 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a 20  pTriggerStep);. 
5d40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
5d50: 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c  leteFrom(pParse,
5d60: 20 70 53 72 63 2c 20 0a 20 20 20 20 20 20 20 20   pSrc, .        
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
5d90: 28 64 62 2c 20 70 54 72 69 67 67 65 72 53 74 65  (db, pTriggerSte
5da0: 70 2d 3e 70 57 68 65 72 65 29 29 3b 0a 20 20 20  p->pWhere));.   
5db0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5dc0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
5dd0: 65 74 43 6f 75 6e 74 2c 20 31 2c 20 30 29 3b 0a  etCount, 1, 0);.
5de0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5df0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
5e00: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73  ault:.        as
5e10: 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 20 0a  sert(0);.    } .
5e20: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
5e30: 20 3d 20 70 54 72 69 67 67 65 72 53 74 65 70 2d   = pTriggerStep-
5e40: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 73 71  >pNext;.  }.  sq
5e50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5e60: 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70  v, OP_ContextPop
5e70: 2c 20 30 2c 20 30 29 3b 0a 20 20 56 64 62 65 43  , 0, 0);.  VdbeC
5e80: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
5e90: 74 72 69 67 67 65 72 20 25 73 22 2c 20 70 53 74  trigger %s", pSt
5ea0: 65 70 4c 69 73 74 2d 3e 70 54 72 69 67 2d 3e 6e  epList->pTrig->n
5eb0: 61 6d 65 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ame));..  return
5ec0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
5ed0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  s is called to c
5ee0: 6f 64 65 20 46 4f 52 20 45 41 43 48 20 52 4f 57  ode FOR EACH ROW
5ef0: 20 74 72 69 67 67 65 72 73 2e 0a 2a 2a 0a 2a 2a   triggers..**.**
5f00: 20 57 68 65 6e 20 74 68 65 20 63 6f 64 65 20 74   When the code t
5f10: 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
5f20: 6e 20 67 65 6e 65 72 61 74 65 73 20 69 73 20 65  n generates is e
5f30: 78 65 63 75 74 65 64 2c 20 74 68 65 20 66 6f 6c  xecuted, the fol
5f40: 6c 6f 77 69 6e 67 20 0a 2a 2a 20 6d 75 73 74 20  lowing .** must 
5f50: 62 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 31  be true:.**.** 1
5f60: 2e 20 4e 6f 20 63 75 72 73 6f 72 73 20 6d 61 79  . No cursors may
5f70: 20 62 65 20 6f 70 65 6e 20 69 6e 20 74 68 65 20   be open in the 
5f80: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 20  main database.  
5f90: 28 42 75 74 20 6e 65 77 49 64 78 20 61 6e 64 20  (But newIdx and 
5fa0: 6f 6c 64 49 64 78 0a 2a 2a 20 20 20 20 63 61 6e  oldIdx.**    can
5fb0: 20 62 65 20 69 6e 64 69 63 65 73 20 6f 66 20 63   be indices of c
5fc0: 75 72 73 6f 72 73 20 69 6e 20 74 65 6d 70 6f 72  ursors in tempor
5fd0: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 53 65 65  ary tables.  See
5fe0: 20 62 65 6c 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 32   below.).**.** 2
5ff0: 2e 20 49 66 20 74 68 65 20 74 72 69 67 67 65 72  . If the trigger
6000: 73 20 62 65 69 6e 67 20 63 6f 64 65 64 20 61 72  s being coded ar
6010: 65 20 4f 4e 20 49 4e 53 45 52 54 20 6f 72 20 4f  e ON INSERT or O
6020: 4e 20 55 50 44 41 54 45 20 74 72 69 67 67 65 72  N UPDATE trigger
6030: 73 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 61 20  s, then.**    a 
6040: 74 65 6d 70 6f 72 61 72 79 20 76 64 62 65 20 63  temporary vdbe c
6050: 75 72 73 6f 72 20 28 69 6e 64 65 78 20 6e 65 77  ursor (index new
6060: 49 64 78 29 20 6d 75 73 74 20 62 65 20 6f 70 65  Idx) must be ope
6070: 6e 20 61 6e 64 20 70 6f 69 6e 74 69 6e 67 20 61  n and pointing a
6080: 74 0a 2a 2a 20 20 20 20 61 20 72 6f 77 20 63 6f  t.**    a row co
6090: 6e 74 61 69 6e 69 6e 67 20 76 61 6c 75 65 73 20  ntaining values 
60a0: 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
60b0: 64 20 66 6f 72 20 6e 65 77 2e 2a 20 65 78 70 72  d for new.* expr
60c0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 2a  essions in the.*
60d0: 2a 20 20 20 20 74 72 69 67 67 65 72 20 70 72 6f  *    trigger pro
60e0: 67 72 61 6d 28 73 29 2e 0a 2a 2a 0a 2a 2a 20 33  gram(s)..**.** 3
60f0: 2e 20 49 66 20 74 68 65 20 74 72 69 67 67 65 72  . If the trigger
6100: 73 20 62 65 69 6e 67 20 63 6f 64 65 64 20 61 72  s being coded ar
6110: 65 20 4f 4e 20 44 45 4c 45 54 45 20 6f 72 20 4f  e ON DELETE or O
6120: 4e 20 55 50 44 41 54 45 20 74 72 69 67 67 65 72  N UPDATE trigger
6130: 73 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 61 20  s, then.**    a 
6140: 74 65 6d 70 6f 72 61 72 79 20 76 64 62 65 20 63  temporary vdbe c
6150: 75 72 73 6f 72 20 28 69 6e 64 65 78 20 6f 6c 64  ursor (index old
6160: 49 64 78 29 20 6d 75 73 74 20 62 65 20 6f 70 65  Idx) must be ope
6170: 6e 20 61 6e 64 20 70 6f 69 6e 74 69 6e 67 20 61  n and pointing a
6180: 74 0a 2a 2a 20 20 20 20 61 20 72 6f 77 20 63 6f  t.**    a row co
6190: 6e 74 61 69 6e 69 6e 67 20 76 61 6c 75 65 73 20  ntaining values 
61a0: 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
61b0: 64 20 66 6f 72 20 6f 6c 64 2e 2a 20 65 78 70 72  d for old.* expr
61c0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 2a  essions in the.*
61d0: 2a 20 20 20 20 74 72 69 67 67 65 72 20 70 72 6f  *    trigger pro
61e0: 67 72 61 6d 28 73 29 2e 0a 2a 2a 0a 2a 2a 20 49  gram(s)..**.** I
61f0: 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 4e  f they are not N
6200: 55 4c 4c 2c 20 74 68 65 20 70 69 4f 6c 64 43 6f  ULL, the piOldCo
6210: 6c 4d 61 73 6b 20 61 6e 64 20 70 69 4e 65 77 43  lMask and piNewC
6220: 6f 6c 4d 61 73 6b 20 6f 75 74 70 75 74 20 76 61  olMask output va
6230: 72 69 61 62 6c 65 73 0a 2a 2a 20 61 72 65 20 73  riables.** are s
6240: 65 74 20 74 6f 20 76 61 6c 75 65 73 20 74 68 61  et to values tha
6250: 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20 63  t describe the c
6260: 6f 6c 75 6d 6e 73 20 75 73 65 64 20 62 79 20 74  olumns used by t
6270: 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  he trigger progr
6280: 61 6d 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4c 44  am.** in the OLD
6290: 2e 2a 20 61 6e 64 20 4e 45 57 2e 2a 20 74 61 62  .* and NEW.* tab
62a0: 6c 65 73 20 72 65 73 70 65 63 74 69 76 65 6c 79  les respectively
62b0: 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 4e 20 6f 66  . If column N of
62c0: 20 74 68 65 20 0a 2a 2a 20 70 73 65 75 64 6f 2d   the .** pseudo-
62d0: 74 61 62 6c 65 20 69 73 20 72 65 61 64 20 61 74  table is read at
62e0: 20 6c 65 61 73 74 20 6f 6e 63 65 2c 20 74 68 65   least once, the
62f0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
6300: 69 74 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  it of the output
6310: 0a 2a 2a 20 6d 61 73 6b 20 69 73 20 73 65 74 2e  .** mask is set.
6320: 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74   If a column wit
6330: 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  h an index great
6340: 65 72 20 74 68 61 6e 20 33 32 20 69 73 20 72 65  er than 32 is re
6350: 61 64 2c 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75  ad, the.** outpu
6360: 74 20 6d 61 73 6b 20 69 73 20 73 65 74 20 74 6f  t mask is set to
6370: 20 74 68 65 20 73 70 65 63 69 61 6c 20 76 61 6c   the special val
6380: 75 65 20 30 78 66 66 66 66 66 66 66 66 2e 0a 2a  ue 0xffffffff..*
6390: 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
63a0: 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 0a  CodeRowTrigger(.
63b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
63c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
63d0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
63e0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
63f0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55    /* One of TK_U
6400: 50 44 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54  PDATE, TK_INSERT
6410: 2c 20 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20  , TK_DELETE */. 
6420: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e   ExprList *pChan
6430: 67 65 73 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73  ges,  /* Changes
6440: 20 6c 69 73 74 20 66 6f 72 20 61 6e 79 20 55 50   list for any UP
6450: 44 41 54 45 20 4f 46 20 74 72 69 67 67 65 72 73  DATE OF triggers
6460: 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c   */.  int tr_tm,
6470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
6480: 65 20 6f 66 20 54 52 49 47 47 45 52 5f 42 45 46  e of TRIGGER_BEF
6490: 4f 52 45 2c 20 54 52 49 47 47 45 52 5f 41 46 54  ORE, TRIGGER_AFT
64a0: 45 52 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ER */.  Table *p
64b0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab,         /* 
64c0: 54 68 65 20 74 61 62 6c 65 20 74 6f 20 63 6f 64  The table to cod
64d0: 65 20 74 72 69 67 67 65 72 73 20 66 72 6f 6d 20  e triggers from 
64e0: 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 49 64 78 2c  */.  int newIdx,
64f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
6500: 20 69 6e 64 69 63 65 20 6f 66 20 74 68 65 20 22   indice of the "
6510: 6e 65 77 22 20 72 6f 77 20 74 6f 20 61 63 63 65  new" row to acce
6520: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 6c 64 49  ss */.  int oldI
6530: 64 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx,          /* 
6540: 54 68 65 20 69 6e 64 69 63 65 20 6f 66 20 74 68  The indice of th
6550: 65 20 22 6f 6c 64 22 20 72 6f 77 20 74 6f 20 61  e "old" row to a
6560: 63 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6f  ccess */.  int o
6570: 72 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20  rconf,          
6580: 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70  /* ON CONFLICT p
6590: 6f 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69  olicy */.  int i
65a0: 67 6e 6f 72 65 4a 75 6d 70 2c 20 20 20 20 20 20  gnoreJump,      
65b0: 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 74  /* Instruction t
65c0: 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52 41  o jump to for RA
65d0: 49 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a 20  ISE(IGNORE) */. 
65e0: 20 75 33 32 20 2a 70 69 4f 6c 64 43 6f 6c 4d 61   u32 *piOldColMa
65f0: 73 6b 2c 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61  sk,   /* OUT: Ma
6600: 73 6b 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73  sk of columns us
6610: 65 64 20 66 72 6f 6d 20 74 68 65 20 4f 4c 44 2e  ed from the OLD.
6620: 2a 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 33 32  * table */.  u32
6630: 20 2a 70 69 4e 65 77 43 6f 6c 4d 61 73 6b 20 20   *piNewColMask  
6640: 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f    /* OUT: Mask o
6650: 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66  f columns used f
6660: 72 6f 6d 20 74 68 65 20 4e 45 57 2e 2a 20 74 61  rom the NEW.* ta
6670: 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67  ble */.){.  Trig
6680: 67 65 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  ger *p;.  sqlite
6690: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
66a0: 64 62 3b 0a 20 20 54 72 69 67 67 65 72 53 74 61  db;.  TriggerSta
66b0: 63 6b 20 74 72 69 67 53 74 61 63 6b 45 6e 74 72  ck trigStackEntr
66c0: 79 3b 0a 0a 20 20 74 72 69 67 53 74 61 63 6b 45  y;..  trigStackE
66d0: 6e 74 72 79 2e 6f 6c 64 43 6f 6c 4d 61 73 6b 20  ntry.oldColMask 
66e0: 3d 20 30 3b 0a 20 20 74 72 69 67 53 74 61 63 6b  = 0;.  trigStack
66f0: 45 6e 74 72 79 2e 6e 65 77 43 6f 6c 4d 61 73 6b  Entry.newColMask
6700: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
6710: 6f 70 20 3d 3d 20 54 4b 5f 55 50 44 41 54 45 20  op == TK_UPDATE 
6720: 7c 7c 20 6f 70 20 3d 3d 20 54 4b 5f 49 4e 53 45  || op == TK_INSE
6730: 52 54 20 7c 7c 20 6f 70 20 3d 3d 20 54 4b 5f 44  RT || op == TK_D
6740: 45 4c 45 54 45 29 3b 0a 20 20 61 73 73 65 72 74  ELETE);.  assert
6750: 28 74 72 5f 74 6d 20 3d 3d 20 54 52 49 47 47 45  (tr_tm == TRIGGE
6760: 52 5f 42 45 46 4f 52 45 20 7c 7c 20 74 72 5f 74  R_BEFORE || tr_t
6770: 6d 20 3d 3d 20 54 52 49 47 47 45 52 5f 41 46 54  m == TRIGGER_AFT
6780: 45 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ER );..  assert(
6790: 6e 65 77 49 64 78 20 21 3d 20 2d 31 20 7c 7c 20  newIdx != -1 || 
67a0: 6f 6c 64 49 64 78 20 21 3d 20 2d 31 29 3b 0a 0a  oldIdx != -1);..
67b0: 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 54    for(p=pTab->pT
67c0: 72 69 67 67 65 72 3b 20 70 3b 20 70 3d 70 2d 3e  rigger; p; p=p->
67d0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
67e0: 66 69 72 65 5f 74 68 69 73 20 3d 20 30 3b 0a 0a  fire_this = 0;..
67f0: 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65      /* Determine
6800: 20 77 68 65 74 68 65 72 20 77 65 20 73 68 6f 75   whether we shou
6810: 6c 64 20 63 6f 64 65 20 74 68 69 73 20 74 72 69  ld code this tri
6820: 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  gger */.    if( 
6830: 0a 20 20 20 20 20 20 70 2d 3e 6f 70 3d 3d 6f 70  .      p->op==op
6840: 20 26 26 20 0a 20 20 20 20 20 20 70 2d 3e 74 72   && .      p->tr
6850: 5f 74 6d 3d 3d 74 72 5f 74 6d 20 26 26 20 0a 20  _tm==tr_tm && . 
6860: 20 20 20 20 20 28 70 2d 3e 70 53 63 68 65 6d 61       (p->pSchema
6870: 3d 3d 70 2d 3e 70 54 61 62 53 63 68 65 6d 61 20  ==p->pTabSchema 
6880: 7c 7c 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  || p->pSchema==d
6890: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
68a0: 61 29 20 26 26 0a 20 20 20 20 20 20 28 6f 70 21  a) &&.      (op!
68b0: 3d 54 4b 5f 55 50 44 41 54 45 7c 7c 21 70 2d 3e  =TK_UPDATE||!p->
68c0: 70 43 6f 6c 75 6d 6e 73 7c 7c 63 68 65 63 6b 43  pColumns||checkC
68d0: 6f 6c 75 6d 6e 4f 76 65 72 4c 61 70 28 70 2d 3e  olumnOverLap(p->
68e0: 70 43 6f 6c 75 6d 6e 73 2c 70 43 68 61 6e 67 65  pColumns,pChange
68f0: 73 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  s)).    ){.     
6900: 20 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70   TriggerStack *p
6910: 53 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  S;      /* Point
6920: 65 72 20 74 6f 20 74 72 69 67 67 65 72 2d 73 74  er to trigger-st
6930: 61 63 6b 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  ack entry */.   
6940: 20 20 20 66 6f 72 28 70 53 3d 70 50 61 72 73 65     for(pS=pParse
6950: 2d 3e 74 72 69 67 53 74 61 63 6b 3b 20 70 53 20  ->trigStack; pS 
6960: 26 26 20 70 21 3d 70 53 2d 3e 70 54 72 69 67 67  && p!=pS->pTrigg
6970: 65 72 3b 20 70 53 3d 70 53 2d 3e 70 4e 65 78 74  er; pS=pS->pNext
6980: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70  ){}.      if( !p
6990: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 66 69 72  S ){.        fir
69a0: 65 5f 74 68 69 73 20 3d 20 31 3b 0a 20 20 20 20  e_this = 1;.    
69b0: 20 20 7d 0a 23 69 66 20 30 20 20 20 20 2f 2a 20    }.#if 0    /* 
69c0: 47 69 76 65 20 6e 6f 20 77 61 72 6e 69 6e 67 20  Give no warning 
69d0: 66 6f 72 20 72 65 63 75 72 73 69 76 65 20 74 72  for recursive tr
69e0: 69 67 67 65 72 73 2e 20 20 4a 75 73 74 20 64 6f  iggers.  Just do
69f0: 20 6e 6f 74 20 64 6f 20 74 68 65 6d 20 2a 2f 0a   not do them */.
6a00: 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20        else{.    
6a10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6a20: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 65 63  Msg(pParse, "rec
6a30: 75 72 73 69 76 65 20 74 72 69 67 67 65 72 73 20  ursive triggers 
6a40: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 28 25  not supported (%
6a50: 73 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s)",.           
6a60: 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20   p->name);.     
6a70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6a80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
6a90: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 0a 20  #endif.    }. . 
6aa0: 20 20 20 69 66 28 20 66 69 72 65 5f 74 68 69 73     if( fire_this
6ab0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e   ){.      int en
6ac0: 64 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20  dTrigger;.      
6ad0: 45 78 70 72 20 2a 20 77 68 65 6e 45 78 70 72 3b  Expr * whenExpr;
6ae0: 0a 20 20 20 20 20 20 41 75 74 68 43 6f 6e 74 65  .      AuthConte
6af0: 78 74 20 73 43 6f 6e 74 65 78 74 3b 0a 20 20 20  xt sContext;.   
6b00: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
6b10: 4e 43 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  NC;..#ifndef SQL
6b20: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
6b30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6b40: 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70  AddOp4(pParse->p
6b50: 56 64 62 65 2c 20 4f 50 5f 54 72 61 63 65 2c 20  Vdbe, OP_Trace, 
6b60: 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  0, 0, 0,.       
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b80: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
6b90: 64 62 2c 20 22 2d 2d 20 54 52 49 47 47 45 52 20  db, "-- TRIGGER 
6ba0: 25 73 22 2c 20 70 2d 3e 6e 61 6d 65 29 2c 0a 20  %s", p->name),. 
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bc0: 20 20 20 20 20 20 20 50 34 5f 44 59 4e 41 4d 49         P4_DYNAMI
6bd0: 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  C);.#endif.     
6be0: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
6bf0: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
6c00: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
6c10: 3d 20 70 50 61 72 73 65 3b 0a 0a 20 20 20 20 20  = pParse;..     
6c20: 20 2f 2a 20 50 75 73 68 20 61 6e 20 65 6e 74 72   /* Push an entr
6c30: 79 20 6f 6e 20 74 6f 20 74 68 65 20 74 72 69 67  y on to the trig
6c40: 67 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20  ger stack */.   
6c50: 20 20 20 74 72 69 67 53 74 61 63 6b 45 6e 74 72     trigStackEntr
6c60: 79 2e 70 54 72 69 67 67 65 72 20 3d 20 70 3b 0a  y.pTrigger = p;.
6c70: 20 20 20 20 20 20 74 72 69 67 53 74 61 63 6b 45        trigStackE
6c80: 6e 74 72 79 2e 6e 65 77 49 64 78 20 3d 20 6e 65  ntry.newIdx = ne
6c90: 77 49 64 78 3b 0a 20 20 20 20 20 20 74 72 69 67  wIdx;.      trig
6ca0: 53 74 61 63 6b 45 6e 74 72 79 2e 6f 6c 64 49 64  StackEntry.oldId
6cb0: 78 20 3d 20 6f 6c 64 49 64 78 3b 0a 20 20 20 20  x = oldIdx;.    
6cc0: 20 20 74 72 69 67 53 74 61 63 6b 45 6e 74 72 79    trigStackEntry
6cd0: 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  .pTab = pTab;.  
6ce0: 20 20 20 20 74 72 69 67 53 74 61 63 6b 45 6e 74      trigStackEnt
6cf0: 72 79 2e 70 4e 65 78 74 20 3d 20 70 50 61 72 73  ry.pNext = pPars
6d00: 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20  e->trigStack;.  
6d10: 20 20 20 20 74 72 69 67 53 74 61 63 6b 45 6e 74      trigStackEnt
6d20: 72 79 2e 69 67 6e 6f 72 65 4a 75 6d 70 20 3d 20  ry.ignoreJump = 
6d30: 69 67 6e 6f 72 65 4a 75 6d 70 3b 0a 20 20 20 20  ignoreJump;.    
6d40: 20 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74    pParse->trigSt
6d50: 61 63 6b 20 3d 20 26 74 72 69 67 53 74 61 63 6b  ack = &trigStack
6d60: 45 6e 74 72 79 3b 0a 20 20 20 20 20 20 73 71 6c  Entry;.      sql
6d70: 69 74 65 33 41 75 74 68 43 6f 6e 74 65 78 74 50  ite3AuthContextP
6d80: 75 73 68 28 70 50 61 72 73 65 2c 20 26 73 43 6f  ush(pParse, &sCo
6d90: 6e 74 65 78 74 2c 20 70 2d 3e 6e 61 6d 65 29 3b  ntext, p->name);
6da0: 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6f 64 65 20  ..      /* code 
6db0: 74 68 65 20 57 48 45 4e 20 63 6c 61 75 73 65 20  the WHEN clause 
6dc0: 2a 2f 0a 20 20 20 20 20 20 65 6e 64 54 72 69 67  */.      endTrig
6dd0: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ger = sqlite3Vdb
6de0: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
6df0: 65 2d 3e 70 56 64 62 65 29 3b 0a 20 20 20 20 20  e->pVdbe);.     
6e00: 20 77 68 65 6e 45 78 70 72 20 3d 20 73 71 6c 69   whenExpr = sqli
6e10: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
6e20: 2d 3e 70 57 68 65 6e 29 3b 0a 20 20 20 20 20 20  ->pWhen);.      
6e30: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
6e40: 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 33 45  iled || sqlite3E
6e50: 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
6e60: 26 73 4e 43 2c 20 77 68 65 6e 45 78 70 72 29 20  &sNC, whenExpr) 
6e70: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
6e80: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 74  e->trigStack = t
6e90: 72 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 70 4e  rigStackEntry.pN
6ea0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ext;.        sql
6eb0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6ec0: 62 2c 20 77 68 65 6e 45 78 70 72 29 3b 0a 20 20  b, whenExpr);.  
6ed0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
6ee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
6ef0: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
6f00: 28 70 50 61 72 73 65 2c 20 77 68 65 6e 45 78 70  (pParse, whenExp
6f10: 72 2c 20 65 6e 64 54 72 69 67 67 65 72 2c 20 53  r, endTrigger, S
6f20: 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
6f30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6f40: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 77  ExprDelete(db, w
6f50: 68 65 6e 45 78 70 72 29 3b 0a 0a 20 20 20 20 20  henExpr);..     
6f60: 20 63 6f 64 65 54 72 69 67 67 65 72 50 72 6f 67   codeTriggerProg
6f70: 72 61 6d 28 70 50 61 72 73 65 2c 20 70 2d 3e 73  ram(pParse, p->s
6f80: 74 65 70 5f 6c 69 73 74 2c 20 6f 72 63 6f 6e 66  tep_list, orconf
6f90: 29 3b 20 0a 0a 20 20 20 20 20 20 2f 2a 20 50 6f  ); ..      /* Po
6fa0: 70 20 74 68 65 20 65 6e 74 72 79 20 6f 66 66 20  p the entry off 
6fb0: 74 68 65 20 74 72 69 67 67 65 72 20 73 74 61 63  the trigger stac
6fc0: 6b 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 72 73  k */.      pPars
6fd0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 74  e->trigStack = t
6fe0: 72 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 70 4e  rigStackEntry.pN
6ff0: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
7000: 65 33 41 75 74 68 43 6f 6e 74 65 78 74 50 6f 70  e3AuthContextPop
7010: 28 26 73 43 6f 6e 74 65 78 74 29 3b 0a 0a 20 20  (&sContext);..  
7020: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
7030: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 70 50 61 72  esolveLabel(pPar
7040: 73 65 2d 3e 70 56 64 62 65 2c 20 65 6e 64 54 72  se->pVdbe, endTr
7050: 69 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  igger);.    }.  
7060: 7d 0a 20 20 69 66 28 20 70 69 4f 6c 64 43 6f 6c  }.  if( piOldCol
7070: 4d 61 73 6b 20 29 20 2a 70 69 4f 6c 64 43 6f 6c  Mask ) *piOldCol
7080: 4d 61 73 6b 20 7c 3d 20 74 72 69 67 53 74 61 63  Mask |= trigStac
7090: 6b 45 6e 74 72 79 2e 6f 6c 64 43 6f 6c 4d 61 73  kEntry.oldColMas
70a0: 6b 3b 0a 20 20 69 66 28 20 70 69 4e 65 77 43 6f  k;.  if( piNewCo
70b0: 6c 4d 61 73 6b 20 29 20 2a 70 69 4e 65 77 43 6f  lMask ) *piNewCo
70c0: 6c 4d 61 73 6b 20 7c 3d 20 74 72 69 67 53 74 61  lMask |= trigSta
70d0: 63 6b 45 6e 74 72 79 2e 6e 65 77 43 6f 6c 4d 61  ckEntry.newColMa
70e0: 73 6b 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  sk;.  return 0;.
70f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
7100: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7110: 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a           _TRIGGER) */.