/ Hex Artifact Content
Login

Artifact bdead679e3688fa9e3d690ac83e471e1b5358318:


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 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  *.*.*/.#include 
0170: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23  "sqliteInt.h"..#
0180: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0190: 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a  IT_TRIGGER./*.**
01a0: 20 44 65 6c 65 74 65 20 61 20 6c 69 6e 6b 65 64   Delete a linked
01b0: 20 6c 69 73 74 20 6f 66 20 54 72 69 67 67 65 72   list of Trigger
01c0: 53 74 65 70 20 73 74 72 75 63 74 75 72 65 73 2e  Step structures.
01d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
01e0: 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65  DeleteTriggerSte
01f0: 70 28 54 72 69 67 67 65 72 53 74 65 70 20 2a 70  p(TriggerStep *p
0200: 54 72 69 67 67 65 72 53 74 65 70 29 7b 0a 20 20  TriggerStep){.  
0210: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 53  while( pTriggerS
0220: 74 65 70 20 29 7b 0a 20 20 20 20 54 72 69 67 67  tep ){.    Trigg
0230: 65 72 53 74 65 70 20 2a 20 70 54 6d 70 20 3d 20  erStep * pTmp = 
0240: 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 20 20  pTriggerStep;.  
0250: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d    pTriggerStep =
0260: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
0270: 4e 65 78 74 3b 0a 0a 20 20 20 20 69 66 28 20 70  Next;..    if( p
0280: 54 6d 70 2d 3e 74 61 72 67 65 74 2e 64 79 6e 20  Tmp->target.dyn 
0290: 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68  ) sqliteFree((ch
02a0: 61 72 2a 29 70 54 6d 70 2d 3e 74 61 72 67 65 74  ar*)pTmp->target
02b0: 2e 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  .z);.    sqlite3
02c0: 45 78 70 72 44 65 6c 65 74 65 28 70 54 6d 70 2d  ExprDelete(pTmp-
02d0: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
02e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
02f0: 65 74 65 28 70 54 6d 70 2d 3e 70 45 78 70 72 4c  ete(pTmp->pExprL
0300: 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
0310: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54  3SelectDelete(pT
0320: 6d 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  mp->pSelect);.  
0330: 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
0340: 65 6c 65 74 65 28 70 54 6d 70 2d 3e 70 49 64 4c  elete(pTmp->pIdL
0350: 69 73 74 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  ist);..    sqlit
0360: 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 7d  eFree(pTmp);.  }
0370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
0380: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
0390: 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 73  parser when it s
03a0: 65 65 73 20 61 20 43 52 45 41 54 45 20 54 52 49  ees a CREATE TRI
03b0: 47 47 45 52 20 73 74 61 74 65 6d 65 6e 74 0a 2a  GGER statement.*
03c0: 2a 20 75 70 20 74 6f 20 74 68 65 20 70 6f 69 6e  * up to the poin
03d0: 74 20 6f 66 20 74 68 65 20 42 45 47 49 4e 20 62  t of the BEGIN b
03e0: 65 66 6f 72 65 20 74 68 65 20 74 72 69 67 67 65  efore the trigge
03f0: 72 20 61 63 74 69 6f 6e 73 2e 20 20 41 20 54 72  r actions.  A Tr
0400: 69 67 67 65 72 0a 2a 2a 20 73 74 72 75 63 74 75  igger.** structu
0410: 72 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  re is generated 
0420: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 69 6e 66  based on the inf
0430: 6f 72 6d 61 74 69 6f 6e 20 61 76 61 69 6c 61 62  ormation availab
0440: 6c 65 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a  le and stored.**
0450: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
0460: 54 72 69 67 67 65 72 2e 20 20 41 66 74 65 72 20  Trigger.  After 
0470: 74 68 65 20 74 72 69 67 67 65 72 20 61 63 74 69  the trigger acti
0480: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 70 61  ons have been pa
0490: 72 73 65 64 2c 20 74 68 65 0a 2a 2a 20 73 71 6c  rsed, the.** sql
04a0: 69 74 65 33 46 69 6e 69 73 68 54 72 69 67 67 65  ite3FinishTrigge
04b0: 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  r() function is 
04c0: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
04d0: 74 65 20 74 68 65 20 74 72 69 67 67 65 72 0a 2a  te the trigger.*
04e0: 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 70  * construction p
04f0: 72 6f 63 65 73 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rocess..*/.void 
0500: 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 69 67  sqlite3BeginTrig
0510: 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ger(.  Parse *pP
0520: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
0530: 65 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74 20  e parse context 
0540: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 52  of the CREATE TR
0550: 49 47 47 45 52 20 73 74 61 74 65 6d 65 6e 74 20  IGGER statement 
0560: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
0570: 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e1,      /* The 
0580: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67  name of the trig
0590: 67 65 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ger */.  Token *
05a0: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
05b0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
05c0: 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 69 6e 74  trigger */.  int
05d0: 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20 20 20   tr_tm,         
05e0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 42 45   /* One of TK_BE
05f0: 46 4f 52 45 2c 20 54 4b 5f 41 46 54 45 52 2c 20  FORE, TK_AFTER, 
0600: 54 4b 5f 49 4e 53 54 45 41 44 20 2a 2f 0a 20 20  TK_INSTEAD */.  
0610: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
0620: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
0630: 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 55 50 44 41  _INSERT, TK_UPDA
0640: 54 45 2c 20 54 4b 5f 44 45 4c 45 54 45 20 2a 2f  TE, TK_DELETE */
0650: 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75  .  IdList *pColu
0660: 6d 6e 73 2c 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e  mns,   /* column
0670: 20 6c 69 73 74 20 69 66 20 74 68 69 73 20 69 73   list if this is
0680: 20 61 6e 20 55 50 44 41 54 45 20 4f 46 20 74 72   an UPDATE OF tr
0690: 69 67 67 65 72 20 2a 2f 0a 20 20 53 72 63 4c 69  igger */.  SrcLi
06a0: 73 74 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 2f  st *pTableName,/
06b0: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
06c0: 65 20 74 61 62 6c 65 2f 76 69 65 77 20 74 68 65  e table/view the
06d0: 20 74 72 69 67 67 65 72 20 61 70 70 6c 69 65 73   trigger applies
06e0: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6f 72   to */.  int for
06f0: 65 61 63 68 2c 20 20 20 20 20 20 20 20 2f 2a 20  each,        /* 
0700: 4f 6e 65 20 6f 66 20 54 4b 5f 52 4f 57 20 6f 72  One of TK_ROW or
0710: 20 54 4b 5f 53 54 41 54 45 4d 45 4e 54 20 2a 2f   TK_STATEMENT */
0720: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 6e 2c 20  .  Expr *pWhen, 
0730: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 4e 20 63         /* WHEN c
0740: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
0750: 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  sTemp          /
0760: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 54 45  * True if the TE
0770: 4d 50 4f 52 41 52 59 20 6b 65 79 77 6f 72 64 20  MPORARY keyword 
0780: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b  is present */.){
0790: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
07a0: 67 67 65 72 20 3d 20 30 3b 0a 20 20 54 61 62 6c  gger = 0;.  Tabl
07b0: 65 20 2a 70 54 61 62 3b 0a 20 20 63 68 61 72 20  e *pTab;.  char 
07c0: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
07d0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
07e0: 65 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 73  e trigger */.  s
07f0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
0800: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
0810: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
0820: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
0830: 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  se to store the 
0840: 74 72 69 67 67 65 72 20 69 6e 20 2a 2f 0a 20 20  trigger in */.  
0850: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
0860: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
0870: 6e 71 75 61 6c 69 66 69 65 64 20 64 62 20 6e 61  nqualified db na
0880: 6d 65 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20  me */.  DbFixer 
0890: 73 46 69 78 3b 0a 20 20 69 6e 74 20 69 54 61 62  sFix;.  int iTab
08a0: 44 62 3b 0a 0a 20 20 69 66 28 20 69 73 54 65 6d  Db;..  if( isTem
08b0: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 54  p ){.    /* If T
08c0: 45 4d 50 20 77 61 73 20 73 70 65 63 69 66 69 65  EMP was specifie
08d0: 64 2c 20 74 68 65 6e 20 74 68 65 20 74 72 69 67  d, then the trig
08e0: 67 65 72 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74  ger name may not
08f0: 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20 2a   be qualified. *
0900: 2f 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32  /.    if( pName2
0910: 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20   && pName2->n>0 
0920: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
0930: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
0940: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 72 69 67   "temporary trig
0950: 67 65 72 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ger may not have
0960: 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 22   qualified name"
0970: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72  );.      goto tr
0980: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
0990: 20 20 20 7d 0a 20 20 20 20 69 44 62 20 3d 20 31     }.    iDb = 1
09a0: 3b 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e  ;.    pName = pN
09b0: 61 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame1;.  }else{. 
09c0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
09d0: 20 74 68 65 20 64 62 20 74 68 61 74 20 74 68 65   the db that the
09e0: 20 74 68 65 20 74 72 69 67 67 65 72 20 77 69 6c   the trigger wil
09f0: 6c 20 62 65 20 63 72 65 61 74 65 64 20 69 6e 20  l be created in 
0a00: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  */.    iDb = sql
0a10: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
0a20: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
0a30: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
0a40: 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
0a50: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69  {.      goto tri
0a60: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
0a70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
0a80: 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d   the trigger nam
0a90: 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
0aa0: 64 2c 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  d, and the table
0ab0: 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
0ac0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20  ,.  ** then set 
0ad0: 69 44 62 20 74 6f 20 31 20 74 6f 20 63 72 65 61  iDb to 1 to crea
0ae0: 74 65 20 74 68 65 20 74 72 69 67 67 65 72 20 69  te the trigger i
0af0: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
0b00: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20 49  database..  ** I
0b10: 66 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  f sqlite3SrcList
0b20: 4c 6f 6f 6b 75 70 28 29 20 72 65 74 75 72 6e 73  Lookup() returns
0b30: 20 30 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74   0, indicating t
0b40: 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  he table does no
0b50: 74 0a 20 20 2a 2a 20 65 78 69 73 74 2c 20 74 68  t.  ** exist, th
0b60: 65 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  e error is caugh
0b70: 74 20 62 79 20 74 68 65 20 62 6c 6f 63 6b 20 62  t by the block b
0b80: 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  elow..  */.  if(
0b90: 20 21 70 54 61 62 6c 65 4e 61 6d 65 20 7c 7c 20   !pTableName || 
0ba0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
0bb0: 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74  led() ){.    got
0bc0: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
0bd0: 70 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  p;.  }.  pTab = 
0be0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
0bf0: 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61  okup(pParse, pTa
0c00: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  bleName);.  if( 
0c10: 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
0c20: 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53  pTab && pTab->pS
0c30: 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
0c40: 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
0c50: 20 69 44 62 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20   iDb = 1;.  }.. 
0c60: 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 74   /* Ensure the t
0c70: 61 62 6c 65 20 6e 61 6d 65 20 6d 61 74 63 68 65  able name matche
0c80: 73 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  s database name 
0c90: 61 6e 64 20 74 68 61 74 20 74 68 65 20 74 61 62  and that the tab
0ca0: 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69  le exists */.  i
0cb0: 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
0cc0: 46 61 69 6c 65 64 28 29 20 29 20 67 6f 74 6f 20  Failed() ) goto 
0cd0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
0ce0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
0cf0: 65 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  eName->nSrc==1 )
0d00: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
0d10: 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
0d20: 61 72 73 65 2c 20 69 44 62 2c 20 22 74 72 69 67  arse, iDb, "trig
0d30: 67 65 72 22 2c 20 70 4e 61 6d 65 29 20 26 26 20  ger", pName) && 
0d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69  .      sqlite3Fi
0d50: 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
0d60: 70 54 61 62 6c 65 4e 61 6d 65 29 20 29 7b 0a 20  pTableName) ){. 
0d70: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
0d80: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70  cleanup;.  }.  p
0d90: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
0da0: 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
0db0: 65 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  e, pTableName);.
0dc0: 20 20 69 66 28 20 21 70 54 61 62 20 29 7b 0a 20    if( !pTab ){. 
0dd0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
0de0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20  does not exist. 
0df0: 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67  */.    goto trig
0e00: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ger_cleanup;.  }
0e10: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
0e20: 74 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61  t the trigger na
0e30: 6d 65 20 69 73 20 6e 6f 74 20 72 65 73 65 72 76  me is not reserv
0e40: 65 64 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 74  ed and that no t
0e50: 72 69 67 67 65 72 20 6f 66 20 74 68 65 0a 20 20  rigger of the.  
0e60: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 61 6d  ** specified nam
0e70: 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 7a 4e  e exists */.  zN
0e80: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
0e90: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
0ea0: 29 3b 0a 20 20 69 66 28 20 21 7a 4e 61 6d 65 20  );.  if( !zName 
0eb0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  || SQLITE_OK!=sq
0ec0: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
0ed0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
0ee0: 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  me) ){.    goto 
0ef0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
0f00: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
0f10: 65 33 48 61 73 68 46 69 6e 64 28 26 28 64 62 2d  e3HashFind(&(db-
0f20: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
0f30: 61 2d 3e 74 72 69 67 48 61 73 68 29 2c 20 7a 4e  a->trigHash), zN
0f40: 61 6d 65 2c 70 4e 61 6d 65 2d 3e 6e 2b 31 29 20  ame,pName->n+1) 
0f50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
0f60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
0f70: 74 72 69 67 67 65 72 20 25 54 20 61 6c 72 65 61  trigger %T alrea
0f80: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
0f90: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69  e);.    goto tri
0fa0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
0fb0: 7d 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 63  }..  /* Do not c
0fc0: 72 65 61 74 65 20 61 20 74 72 69 67 67 65 72 20  reate a trigger 
0fd0: 6f 6e 20 61 20 73 79 73 74 65 6d 20 74 61 62 6c  on a system tabl
0fe0: 65 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  e */.  if( sqlit
0ff0: 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
1000: 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
1010: 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 7)==0 ){.    
1020: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1030: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
1040: 63 72 65 61 74 65 20 74 72 69 67 67 65 72 20 6f  create trigger o
1050: 6e 20 73 79 73 74 65 6d 20 74 61 62 6c 65 22 29  n system table")
1060: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
1070: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 74  rr++;.    goto t
1080: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
1090: 20 20 7d 0a 0a 20 20 2f 2a 20 49 4e 53 54 45 41    }..  /* INSTEA
10a0: 44 20 6f 66 20 74 72 69 67 67 65 72 73 20 61 72  D of triggers ar
10b0: 65 20 6f 6e 6c 79 20 66 6f 72 20 76 69 65 77 73  e only for views
10c0: 20 61 6e 64 20 76 69 65 77 73 20 6f 6e 6c 79 20   and views only 
10d0: 73 75 70 70 6f 72 74 20 49 4e 53 54 45 41 44 0a  support INSTEAD.
10e0: 20 20 2a 2a 20 6f 66 20 74 72 69 67 67 65 72 73    ** of triggers
10f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
1100: 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 74 72  b->pSelect && tr
1110: 5f 74 6d 21 3d 54 4b 5f 49 4e 53 54 45 41 44 20  _tm!=TK_INSTEAD 
1120: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1130: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1140: 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 25 73  cannot create %s
1150: 20 74 72 69 67 67 65 72 20 6f 6e 20 76 69 65 77   trigger on view
1160: 3a 20 25 53 22 2c 20 0a 20 20 20 20 20 20 20 20  : %S", .        
1170: 28 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f 42 45 46  (tr_tm == TK_BEF
1180: 4f 52 45 29 3f 22 42 45 46 4f 52 45 22 3a 22 41  ORE)?"BEFORE":"A
1190: 46 54 45 52 22 2c 20 70 54 61 62 6c 65 4e 61 6d  FTER", pTableNam
11a0: 65 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  e, 0);.    goto 
11b0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
11c0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 54 61 62  .  }.  if( !pTab
11d0: 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 74 72 5f  ->pSelect && tr_
11e0: 74 6d 3d 3d 54 4b 5f 49 4e 53 54 45 41 44 20 29  tm==TK_INSTEAD )
11f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1200: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
1210: 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 49 4e 53  annot create INS
1220: 54 45 41 44 20 4f 46 22 0a 20 20 20 20 20 20 20  TEAD OF".       
1230: 20 22 20 74 72 69 67 67 65 72 20 6f 6e 20 74 61   " trigger on ta
1240: 62 6c 65 3a 20 25 53 22 2c 20 70 54 61 62 6c 65  ble: %S", pTable
1250: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 67 6f  Name, 0);.    go
1260: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
1270: 75 70 3b 0a 20 20 7d 0a 20 20 69 54 61 62 44 62  up;.  }.  iTabDb
1280: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1290: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
12a0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
12b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12c0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
12d0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
12e0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
12f0: 54 52 49 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e  TRIGGER;.    con
1300: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
1310: 62 2d 3e 61 44 62 5b 69 54 61 62 44 62 5d 2e 7a  b->aDb[iTabDb].z
1320: 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
1330: 63 68 61 72 20 2a 7a 44 62 54 72 69 67 20 3d 20  char *zDbTrig = 
1340: 69 73 54 65 6d 70 20 3f 20 64 62 2d 3e 61 44 62  isTemp ? db->aDb
1350: 5b 31 5d 2e 7a 4e 61 6d 65 20 3a 20 7a 44 62 3b  [1].zName : zDb;
1360: 0a 20 20 20 20 69 66 28 20 69 54 61 62 44 62 3d  .    if( iTabDb=
1370: 3d 31 20 7c 7c 20 69 73 54 65 6d 70 20 29 20 63  =1 || isTemp ) c
1380: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
1390: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
13a0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13b0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
13c0: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
13d0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
13e0: 54 72 69 67 29 20 29 7b 0a 20 20 20 20 20 20 67  Trig) ){.      g
13f0: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
1400: 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nup;.    }.    i
1410: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1420: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1430: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
1440: 41 5f 54 41 42 4c 45 28 69 54 61 62 44 62 29 2c  A_TABLE(iTabDb),
1450: 30 2c 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  0,zDb)){.      g
1460: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
1470: 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  nup;.    }.  }.#
1480: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 4e 53 54  endif..  /* INST
1490: 45 41 44 20 4f 46 20 74 72 69 67 67 65 72 73 20  EAD OF triggers 
14a0: 63 61 6e 20 6f 6e 6c 79 20 61 70 70 65 61 72 20  can only appear 
14b0: 6f 6e 20 76 69 65 77 73 20 61 6e 64 20 42 45 46  on views and BEF
14c0: 4f 52 45 20 74 72 69 67 67 65 72 73 0a 20 20 2a  ORE triggers.  *
14d0: 2a 20 63 61 6e 6e 6f 74 20 61 70 70 65 61 72 20  * cannot appear 
14e0: 6f 6e 20 76 69 65 77 73 2e 20 20 53 6f 20 77 65  on views.  So we
14f0: 20 6d 69 67 68 74 20 61 73 20 77 65 6c 6c 20 74   might as well t
1500: 72 61 6e 73 6c 61 74 65 20 65 76 65 72 79 0a 20  ranslate every. 
1510: 20 2a 2a 20 49 4e 53 54 45 41 44 20 4f 46 20 74   ** INSTEAD OF t
1520: 72 69 67 67 65 72 20 69 6e 74 6f 20 61 20 42 45  rigger into a BE
1530: 46 4f 52 45 20 74 72 69 67 67 65 72 2e 20 20 49  FORE trigger.  I
1540: 74 20 73 69 6d 70 6c 69 66 69 65 73 20 63 6f 64  t simplifies cod
1550: 65 0a 20 20 2a 2a 20 65 6c 73 65 77 68 65 72 65  e.  ** elsewhere
1560: 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 74 72 5f  ..  */.  if (tr_
1570: 74 6d 20 3d 3d 20 54 4b 5f 49 4e 53 54 45 41 44  tm == TK_INSTEAD
1580: 29 7b 0a 20 20 20 20 74 72 5f 74 6d 20 3d 20 54  ){.    tr_tm = T
1590: 4b 5f 42 45 46 4f 52 45 3b 0a 20 20 7d 0a 0a 20  K_BEFORE;.  }.. 
15a0: 20 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 54 72   /* Build the Tr
15b0: 69 67 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  igger object */.
15c0: 20 20 70 54 72 69 67 67 65 72 20 3d 20 28 54 72    pTrigger = (Tr
15d0: 69 67 67 65 72 2a 29 73 71 6c 69 74 65 4d 61 6c  igger*)sqliteMal
15e0: 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72 69 67 67  loc(sizeof(Trigg
15f0: 65 72 29 29 3b 0a 20 20 69 66 28 20 70 54 72 69  er));.  if( pTri
1600: 67 67 65 72 3d 3d 30 20 29 20 67 6f 74 6f 20 74  gger==0 ) goto t
1610: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
1620: 20 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65    pTrigger->name
1630: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d   = zName;.  zNam
1640: 65 20 3d 20 30 3b 0a 20 20 70 54 72 69 67 67 65  e = 0;.  pTrigge
1650: 72 2d 3e 74 61 62 6c 65 20 3d 20 73 71 6c 69 74  r->table = sqlit
1660: 65 53 74 72 44 75 70 28 70 54 61 62 6c 65 4e 61  eStrDup(pTableNa
1670: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 29 3b  me->a[0].zName);
1680: 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  .  pTrigger->pSc
1690: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
16a0: 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
16b0: 54 72 69 67 67 65 72 2d 3e 70 54 61 62 53 63 68  Trigger->pTabSch
16c0: 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68  ema = pTab->pSch
16d0: 65 6d 61 3b 0a 20 20 70 54 72 69 67 67 65 72 2d  ema;.  pTrigger-
16e0: 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 54 72 69  >op = op;.  pTri
16f0: 67 67 65 72 2d 3e 74 72 5f 74 6d 20 3d 20 74 72  gger->tr_tm = tr
1700: 5f 74 6d 3d 3d 54 4b 5f 42 45 46 4f 52 45 20 3f  _tm==TK_BEFORE ?
1710: 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20   TRIGGER_BEFORE 
1720: 3a 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 3b  : TRIGGER_AFTER;
1730: 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68  .  pTrigger->pWh
1740: 65 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  en = sqlite3Expr
1750: 44 75 70 28 70 57 68 65 6e 29 3b 0a 20 20 70 54  Dup(pWhen);.  pT
1760: 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73  rigger->pColumns
1770: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
1780: 44 75 70 28 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20  Dup(pColumns);. 
1790: 20 70 54 72 69 67 67 65 72 2d 3e 66 6f 72 65 61   pTrigger->forea
17a0: 63 68 20 3d 20 66 6f 72 65 61 63 68 3b 0a 20 20  ch = foreach;.  
17b0: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
17c0: 28 26 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65  (&pTrigger->name
17d0: 54 6f 6b 65 6e 2c 70 4e 61 6d 65 29 3b 0a 20 20  Token,pName);.  
17e0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
17f0: 70 4e 65 77 54 72 69 67 67 65 72 3d 3d 30 20 29  pNewTrigger==0 )
1800: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
1810: 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
1820: 65 72 3b 0a 0a 74 72 69 67 67 65 72 5f 63 6c 65  er;..trigger_cle
1830: 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 46 72  anup:.  sqliteFr
1840: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  ee(zName);.  sql
1850: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1860: 65 28 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  e(pTableName);. 
1870: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1880: 6c 65 74 65 28 70 43 6f 6c 75 6d 6e 73 29 3b 0a  lete(pColumns);.
1890: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
18a0: 65 74 65 28 70 57 68 65 6e 29 3b 0a 20 20 69 66  ete(pWhen);.  if
18b0: 28 20 21 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  ( !pParse->pNewT
18c0: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 73 71  rigger ){.    sq
18d0: 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67  lite3DeleteTrigg
18e0: 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20  er(pTrigger);.  
18f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1900: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
1910: 72 69 67 67 65 72 3d 3d 70 54 72 69 67 67 65 72  rigger==pTrigger
1920: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
1930: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1940: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c   called after al
1950: 6c 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72  l of the trigger
1960: 20 61 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65   actions have be
1970: 65 6e 20 70 61 72 73 65 64 0a 2a 2a 20 69 6e 20  en parsed.** in 
1980: 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
1990: 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  e the process of
19a0: 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 74 72   building the tr
19b0: 69 67 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  igger..*/.void s
19c0: 71 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67  qlite3FinishTrig
19d0: 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ger(.  Parse *pP
19e0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
19f0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
1a00: 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65   */.  TriggerSte
1a10: 70 20 2a 70 53 74 65 70 4c 69 73 74 2c 20 2f 2a  p *pStepList, /*
1a20: 20 54 68 65 20 74 72 69 67 67 65 72 65 64 20 70   The triggered p
1a30: 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 54 6f 6b 65  rogram */.  Toke
1a40: 6e 20 2a 70 41 6c 6c 20 20 20 20 20 20 20 20 20  n *pAll         
1a50: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 68 61      /* Token tha
1a60: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
1a70: 63 6f 6d 70 6c 65 74 65 20 43 52 45 41 54 45 20  complete CREATE 
1a80: 54 52 49 47 47 45 52 20 2a 2f 0a 29 7b 0a 20 20  TRIGGER */.){.  
1a90: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 20 3d  Trigger *pTrig =
1aa0: 20 30 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 74   0;     /* The t
1ab0: 72 69 67 67 65 72 20 77 68 6f 73 65 20 63 6f 6e  rigger whose con
1ac0: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 66 69 6e  struction is fin
1ad0: 69 73 68 69 6e 67 20 75 70 20 2a 2f 0a 20 20 73  ishing up */.  s
1ae0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1af0: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65  rse->db;  /* The
1b00: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 44   database */.  D
1b10: 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 69  bFixer sFix;.  i
1b20: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
1b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1b40: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1b50: 20 74 68 65 20 74 72 69 67 67 65 72 20 2a 2f 0a   the trigger */.
1b60: 0a 20 20 70 54 72 69 67 20 3d 20 70 50 61 72 73  .  pTrig = pPars
1b70: 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 3b 0a  e->pNewTrigger;.
1b80: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72    pParse->pNewTr
1b90: 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  igger = 0;.  if(
1ba0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
1bb0: 20 21 70 54 72 69 67 20 29 20 67 6f 74 6f 20 74   !pTrig ) goto t
1bc0: 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65  riggerfinish_cle
1bd0: 61 6e 75 70 3b 0a 20 20 69 44 62 20 3d 20 73 71  anup;.  iDb = sq
1be0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1bf0: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
1c00: 54 72 69 67 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  Trig->pSchema);.
1c10: 20 20 70 54 72 69 67 2d 3e 73 74 65 70 5f 6c 69    pTrig->step_li
1c20: 73 74 20 3d 20 70 53 74 65 70 4c 69 73 74 3b 0a  st = pStepList;.
1c30: 20 20 77 68 69 6c 65 28 20 70 53 74 65 70 4c 69    while( pStepLi
1c40: 73 74 20 29 7b 0a 20 20 20 20 70 53 74 65 70 4c  st ){.    pStepL
1c50: 69 73 74 2d 3e 70 54 72 69 67 20 3d 20 70 54 72  ist->pTrig = pTr
1c60: 69 67 3b 0a 20 20 20 20 70 53 74 65 70 4c 69 73  ig;.    pStepLis
1c70: 74 20 3d 20 70 53 74 65 70 4c 69 73 74 2d 3e 70  t = pStepList->p
1c80: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
1c90: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
1ca0: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
1cb0: 62 2c 20 22 74 72 69 67 67 65 72 22 2c 20 26 70  b, "trigger", &p
1cc0: 54 72 69 67 2d 3e 6e 61 6d 65 54 6f 6b 65 6e 29  Trig->nameToken)
1cd0: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73   .          && s
1ce0: 71 6c 69 74 65 33 46 69 78 54 72 69 67 67 65 72  qlite3FixTrigger
1cf0: 53 74 65 70 28 26 73 46 69 78 2c 20 70 54 72 69  Step(&sFix, pTri
1d00: 67 2d 3e 73 74 65 70 5f 6c 69 73 74 29 20 29 7b  g->step_list) ){
1d10: 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65  .    goto trigge
1d20: 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b  rfinish_cleanup;
1d30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 69 66 20 77 65  .  }..  /* if we
1d40: 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c   are not initial
1d50: 69 7a 69 6e 67 2c 20 61 6e 64 20 74 68 69 73 20  izing, and this 
1d60: 74 72 69 67 67 65 72 20 69 73 20 6e 6f 74 20 6f  trigger is not o
1d70: 6e 20 61 20 54 45 4d 50 20 74 61 62 6c 65 2c 20  n a TEMP table, 
1d80: 0a 20 20 2a 2a 20 62 75 69 6c 64 20 74 68 65 20  .  ** build the 
1d90: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 65 6e  sqlite_master en
1da0: 74 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  try.  */.  if( !
1db0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
1dc0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
1dd0: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 69 6e 73  t VdbeOpList ins
1de0: 65 72 74 54 72 69 67 5b 5d 20 3d 20 7b 0a 20 20  ertTrig[] = {.  
1df0: 20 20 20 20 7b 20 4f 50 5f 4e 65 77 52 6f 77 69      { OP_NewRowi
1e00: 64 2c 20 20 20 30 2c 20 30 2c 20 20 30 20 20 20  d,   0, 0,  0   
1e10: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
1e20: 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20  { OP_String8,   
1e30: 20 30 2c 20 30 2c 20 20 22 74 72 69 67 67 65 72   0, 0,  "trigger
1e40: 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  "  },.      { OP
1e50: 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20  _String8,    0, 
1e60: 30 2c 20 20 30 20 20 20 20 20 20 20 20 20 20 7d  0,  0          }
1e70: 2c 20 20 2f 2a 20 32 3a 20 74 72 69 67 67 65 72  ,  /* 2: trigger
1e80: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7b   name */.      {
1e90: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20   OP_String8,    
1ea0: 30 2c 20 30 2c 20 20 30 20 20 20 20 20 20 20 20  0, 0,  0        
1eb0: 20 20 7d 2c 20 20 2f 2a 20 33 3a 20 74 61 62 6c    },  /* 3: tabl
1ec0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
1ed0: 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20  { OP_Integer,   
1ee0: 20 30 2c 20 30 2c 20 20 30 20 20 20 20 20 20 20   0, 0,  0       
1ef0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50     },.      { OP
1f00: 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20  _String8,    0, 
1f10: 30 2c 20 20 22 43 52 45 41 54 45 20 54 52 49 47  0,  "CREATE TRIG
1f20: 47 45 52 20 22 7d 2c 0a 20 20 20 20 20 20 7b 20  GER "},.      { 
1f30: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30  OP_String8,    0
1f40: 2c 20 30 2c 20 20 30 20 20 20 20 20 20 20 20 20  , 0,  0         
1f50: 20 7d 2c 20 20 2f 2a 20 36 3a 20 53 51 4c 20 2a   },  /* 6: SQL *
1f60: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6e  /.      { OP_Con
1f70: 63 61 74 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  cat,     0, 0,  
1f80: 30 20 20 20 20 20 20 20 20 20 20 7d 2c 20 0a 20  0          }, . 
1f90: 20 20 20 20 20 7b 20 4f 50 5f 4d 61 6b 65 52 65       { OP_MakeRe
1fa0: 63 6f 72 64 2c 20 35 2c 20 30 2c 20 20 22 61 61  cord, 5, 0,  "aa
1fb0: 61 64 61 22 20 20 20 20 7d 2c 0a 20 20 20 20 20  ada"    },.     
1fc0: 20 7b 20 4f 50 5f 49 6e 73 65 72 74 2c 20 20 20   { OP_Insert,   
1fd0: 20 20 30 2c 20 30 2c 20 20 30 20 20 20 20 20 20    0, 0,  0      
1fe0: 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20      },.    };.  
1ff0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
2000: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20 2f 2a  Vdbe *v;..    /*
2010: 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 69   Make an entry i
2020: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
2030: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ter table */.   
2040: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
2050: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
2060: 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
2070: 20 74 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63   triggerfinish_c
2080: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 73 71 6c 69  leanup;.    sqli
2090: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
20a0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
20b0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
20c0: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
20d0: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
20e0: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
20f0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
2100: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 69 6e  (v, ArraySize(in
2110: 73 65 72 74 54 72 69 67 29 2c 20 69 6e 73 65 72  sertTrig), inser
2120: 74 54 72 69 67 29 3b 0a 20 20 20 20 73 71 6c 69  tTrig);.    sqli
2130: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
2140: 76 2c 20 61 64 64 72 2b 32 2c 20 70 54 72 69 67  v, addr+2, pTrig
2150: 2d 3e 6e 61 6d 65 2c 20 30 29 3b 20 0a 20 20 20  ->name, 0); .   
2160: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2170: 67 65 50 33 28 76 2c 20 61 64 64 72 2b 33 2c 20  geP3(v, addr+3, 
2180: 70 54 72 69 67 2d 3e 74 61 62 6c 65 2c 20 30 29  pTrig->table, 0)
2190: 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ; .    sqlite3Vd
21a0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
21b0: 64 72 2b 36 2c 20 28 63 68 61 72 2a 29 70 41 6c  dr+6, (char*)pAl
21c0: 6c 2d 3e 7a 2c 20 70 41 6c 6c 2d 3e 6e 29 3b 0a  l->z, pAll->n);.
21d0: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
21e0: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69  eCookie(db, v, i
21f0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
2200: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2210: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
2220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
2230: 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
2240: 6d 61 2c 20 69 44 62 2c 20 30 2c 20 0a 20 20 20  ma, iDb, 0, .   
2250: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
2260: 74 66 28 22 74 79 70 65 3d 27 74 72 69 67 67 65  tf("type='trigge
2270: 72 27 20 41 4e 44 20 6e 61 6d 65 3d 27 25 71 27  r' AND name='%q'
2280: 22 2c 20 70 54 72 69 67 2d 3e 6e 61 6d 65 29 2c  ", pTrig->name),
2290: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
22a0: 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  }..  if( db->ini
22b0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
22c0: 74 20 6e 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  t n;.    Table *
22d0: 70 54 61 62 3b 0a 20 20 20 20 54 72 69 67 67 65  pTab;.    Trigge
22e0: 72 20 2a 70 44 65 6c 3b 0a 20 20 20 20 70 44 65  r *pDel;.    pDe
22f0: 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  l = sqlite3HashI
2300: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69  nsert(&db->aDb[i
2310: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69  Db].pSchema->tri
2320: 67 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  gHash, .        
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 72               pTr
2340: 69 67 2d 3e 6e 61 6d 65 2c 20 73 74 72 6c 65 6e  ig->name, strlen
2350: 28 70 54 72 69 67 2d 3e 6e 61 6d 65 29 2b 31 2c  (pTrig->name)+1,
2360: 20 70 54 72 69 67 29 3b 0a 20 20 20 20 69 66 28   pTrig);.    if(
2370: 20 70 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 61   pDel ){.      a
2380: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d 61  ssert( sqlite3Ma
2390: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 26 26 20  llocFailed() && 
23a0: 70 44 65 6c 3d 3d 70 54 72 69 67 20 29 3b 0a 20  pDel==pTrig );. 
23b0: 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65       goto trigge
23c0: 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b  rfinish_cleanup;
23d0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 73  .    }.    n = s
23e0: 74 72 6c 65 6e 28 70 54 72 69 67 2d 3e 74 61 62  trlen(pTrig->tab
23f0: 6c 65 29 20 2b 20 31 3b 0a 20 20 20 20 70 54 61  le) + 1;.    pTa
2400: 62 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  b = sqlite3HashF
2410: 69 6e 64 28 26 70 54 72 69 67 2d 3e 70 54 61 62  ind(&pTrig->pTab
2420: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
2430: 20 70 54 72 69 67 2d 3e 74 61 62 6c 65 2c 20 6e   pTrig->table, n
2440: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2450: 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 54  Tab!=0 );.    pT
2460: 72 69 67 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  rig->pNext = pTa
2470: 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  b->pTrigger;.   
2480: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 20   pTab->pTrigger 
2490: 3d 20 70 54 72 69 67 3b 0a 20 20 20 20 70 54 72  = pTrig;.    pTr
24a0: 69 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 74 72 69  ig = 0;.  }..tri
24b0: 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e  ggerfinish_clean
24c0: 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  up:.  sqlite3Del
24d0: 65 74 65 54 72 69 67 67 65 72 28 70 54 72 69 67  eteTrigger(pTrig
24e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  );.  assert( !pP
24f0: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
2500: 72 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  r );.  sqlite3De
2510: 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28  leteTriggerStep(
2520: 70 53 74 65 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  pStepList);.}../
2530: 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79  *.** Make a copy
2540: 20 6f 66 20 61 6c 6c 20 63 6f 6d 70 6f 6e 65 6e   of all componen
2550: 74 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ts of the given 
2560: 74 72 69 67 67 65 72 20 73 74 65 70 2e 20 20 54  trigger step.  T
2570: 68 69 73 20 68 61 73 0a 2a 2a 20 74 68 65 20 65  his has.** the e
2580: 66 66 65 63 74 20 6f 66 20 63 6f 70 79 69 6e 67  ffect of copying
2590: 20 61 6c 6c 20 45 78 70 72 2e 74 6f 6b 65 6e 2e   all Expr.token.
25a0: 7a 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 6d 65  z values into me
25b0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  mory obtained.**
25c0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
25d0: 6f 63 28 29 2e 20 20 41 73 20 69 6e 69 74 69 61  oc().  As initia
25e0: 6c 6c 79 20 63 72 65 61 74 65 64 2c 20 74 68 65  lly created, the
25f0: 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
2600: 6c 75 65 73 0a 2a 2a 20 61 6c 6c 20 70 6f 69 6e  lues.** all poin
2610: 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
2620: 74 72 69 6e 67 20 74 68 61 74 20 77 61 73 20 66  tring that was f
2630: 65 64 20 74 6f 20 74 68 65 20 70 61 72 73 65 72  ed to the parser
2640: 2e 20 20 42 75 74 20 74 68 61 74 0a 2a 2a 20 73  .  But that.** s
2650: 74 72 69 6e 67 20 69 73 20 65 70 68 65 6d 65 72  tring is ephemer
2660: 61 6c 20 2d 20 69 74 20 77 69 6c 6c 20 67 6f 20  al - it will go 
2670: 61 77 61 79 20 61 73 20 73 6f 6f 6e 20 61 73 20  away as soon as 
2680: 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63  the sqlite3_exec
2690: 28 29 0a 2a 2a 20 63 61 6c 6c 20 74 68 61 74 20  ().** call that 
26a0: 73 74 61 72 74 65 64 20 74 68 65 20 70 61 72 73  started the pars
26b0: 65 72 20 65 78 69 74 73 2e 20 20 54 68 69 73 20  er exits.  This 
26c0: 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 61 20  routine makes a 
26d0: 70 65 72 73 69 73 74 65 6e 74 0a 2a 2a 20 63 6f  persistent.** co
26e0: 70 79 20 6f 66 20 61 6c 6c 20 74 68 65 20 45 78  py of all the Ex
26f0: 70 72 2e 74 6f 6b 65 6e 2e 7a 20 73 74 72 69 6e  pr.token.z strin
2700: 67 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 54  gs so that the T
2710: 72 69 67 67 65 72 53 74 65 70 20 73 74 72 75 63  riggerStep struc
2720: 74 75 72 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ture.** will be 
2730: 76 61 6c 69 64 20 65 76 65 6e 20 61 66 74 65 72  valid even after
2740: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65   the sqlite3_exe
2750: 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  c() call returns
2760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2770: 20 73 71 6c 69 74 65 50 65 72 73 69 73 74 54 72   sqlitePersistTr
2780: 69 67 67 65 72 53 74 65 70 28 54 72 69 67 67 65  iggerStep(Trigge
2790: 72 53 74 65 70 20 2a 70 29 7b 0a 20 20 69 66 28  rStep *p){.  if(
27a0: 20 70 2d 3e 74 61 72 67 65 74 2e 7a 20 29 7b 0a   p->target.z ){.
27b0: 20 20 20 20 70 2d 3e 74 61 72 67 65 74 2e 7a 20      p->target.z 
27c0: 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 53 74 72  = (u8*)sqliteStr
27d0: 4e 44 75 70 28 28 63 68 61 72 2a 29 70 2d 3e 74  NDup((char*)p->t
27e0: 61 72 67 65 74 2e 7a 2c 20 70 2d 3e 74 61 72 67  arget.z, p->targ
27f0: 65 74 2e 6e 29 3b 0a 20 20 20 20 70 2d 3e 74 61  et.n);.    p->ta
2800: 72 67 65 74 2e 64 79 6e 20 3d 20 31 3b 0a 20 20  rget.dyn = 1;.  
2810: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65  }.  if( p->pSele
2820: 63 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ct ){.    Select
2830: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
2840: 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 53 65  SelectDup(p->pSe
2850: 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
2860: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
2870: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
2880: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 4e 65  p->pSelect = pNe
2890: 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  w;.  }.  if( p->
28a0: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 45 78  pWhere ){.    Ex
28b0: 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
28c0: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 57 68  e3ExprDup(p->pWh
28d0: 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
28e0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
28f0: 57 68 65 72 65 29 3b 0a 20 20 20 20 70 2d 3e 70  Where);.    p->p
2900: 57 68 65 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Where = pNew;.  
2910: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 78 70 72  }.  if( p->pExpr
2920: 4c 69 73 74 20 29 7b 0a 20 20 20 20 45 78 70 72  List ){.    Expr
2930: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c  List *pNew = sql
2940: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2950: 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b 0a 20  p->pExprList);. 
2960: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2970: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45 78 70  stDelete(p->pExp
2980: 72 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  rList);.    p->p
2990: 45 78 70 72 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ExprList = pNew;
29a0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 49  .  }.  if( p->pI
29b0: 64 4c 69 73 74 20 29 7b 0a 20 20 20 20 49 64 4c  dList ){.    IdL
29c0: 69 73 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  ist *pNew = sqli
29d0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 70 2d 3e  te3IdListDup(p->
29e0: 70 49 64 4c 69 73 74 29 3b 0a 20 20 20 20 73 71  pIdList);.    sq
29f0: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
2a00: 65 28 70 2d 3e 70 49 64 4c 69 73 74 29 3b 0a 20  e(p->pIdList);. 
2a10: 20 20 20 70 2d 3e 70 49 64 4c 69 73 74 20 3d 20     p->pIdList = 
2a20: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
2a30: 2a 2a 20 54 75 72 6e 20 61 20 53 45 4c 45 43 54  ** Turn a SELECT
2a40: 20 73 74 61 74 65 6d 65 6e 74 20 28 74 68 61 74   statement (that
2a50: 20 74 68 65 20 70 53 65 6c 65 63 74 20 70 61 72   the pSelect par
2a60: 61 6d 65 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  ameter points to
2a70: 29 20 69 6e 74 6f 0a 2a 2a 20 61 20 74 72 69 67  ) into.** a trig
2a80: 67 65 72 20 73 74 65 70 2e 20 20 52 65 74 75 72  ger step.  Retur
2a90: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
2aa0: 20 54 72 69 67 67 65 72 53 74 65 70 20 73 74 72   TriggerStep str
2ab0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
2ac0: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
2ad0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
2ae0: 20 69 74 20 66 69 6e 64 73 20 61 20 53 45 4c 45   it finds a SELE
2af0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 0a  CT statement in.
2b00: 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  ** body of a TRI
2b10: 47 47 45 52 2e 20 20 0a 2a 2f 0a 54 72 69 67 67  GGER.  .*/.Trigg
2b20: 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33 54  erStep *sqlite3T
2b30: 72 69 67 67 65 72 53 65 6c 65 63 74 53 74 65 70  riggerSelectStep
2b40: 28 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74  (Select *pSelect
2b50: 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  ){.  TriggerStep
2b60: 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 20 3d   *pTriggerStep =
2b70: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69   sqliteMalloc(si
2b80: 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70  zeof(TriggerStep
2b90: 29 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67  ));.  if( pTrigg
2ba0: 65 72 53 74 65 70 3d 3d 30 20 29 20 7b 0a 20 20  erStep==0 ) {.  
2bb0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2bc0: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
2bd0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2be0: 7d 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  }..  pTriggerSte
2bf0: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  p->op = TK_SELEC
2c00: 54 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74 65  T;.  pTriggerSte
2c10: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65  p->pSelect = pSe
2c20: 6c 65 63 74 3b 0a 20 20 70 54 72 69 67 67 65 72  lect;.  pTrigger
2c30: 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 4f  Step->orconf = O
2c40: 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 73 71 6c  E_Default;.  sql
2c50: 69 74 65 50 65 72 73 69 73 74 54 72 69 67 67 65  itePersistTrigge
2c60: 72 53 74 65 70 28 70 54 72 69 67 67 65 72 53 74  rStep(pTriggerSt
2c70: 65 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  ep);..  return p
2c80: 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a  TriggerStep;.}..
2c90: 2f 2a 0a 2a 2a 20 42 75 69 6c 64 20 61 20 74 72  /*.** Build a tr
2ca0: 69 67 67 65 72 20 73 74 65 70 20 6f 75 74 20 6f  igger step out o
2cb0: 66 20 61 6e 20 49 4e 53 45 52 54 20 73 74 61 74  f an INSERT stat
2cc0: 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
2cd0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
2ce0: 68 65 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  he new trigger s
2cf0: 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  tep..**.** The p
2d00: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
2d10: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74   routine when it
2d20: 20 73 65 65 73 20 61 6e 20 49 4e 53 45 52 54 20   sees an INSERT 
2d30: 69 6e 73 69 64 65 20 74 68 65 0a 2a 2a 20 62 6f  inside the.** bo
2d40: 64 79 20 6f 66 20 61 20 74 72 69 67 67 65 72 2e  dy of a trigger.
2d50: 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20  .*/.TriggerStep 
2d60: 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 49  *sqlite3TriggerI
2d70: 6e 73 65 72 74 53 74 65 70 28 0a 20 20 54 6f 6b  nsertStep(.  Tok
2d80: 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20  en *pTableName, 
2d90: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2da0: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  table into which
2db0: 20 77 65 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   we insert */.  
2dc0: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c  IdList *pColumn,
2dd0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
2de0: 6f 6c 75 6d 6e 73 20 69 6e 20 70 54 61 62 6c 65  olumns in pTable
2df0: 4e 61 6d 65 20 74 6f 20 69 6e 73 65 72 74 20 69  Name to insert i
2e00: 6e 74 6f 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  nto */.  ExprLis
2e10: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 2f 2a 20  t *pEList,   /* 
2e20: 54 68 65 20 56 41 4c 55 45 20 63 6c 61 75 73 65  The VALUE clause
2e30: 3a 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75  : a list of valu
2e40: 65 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  es to be inserte
2e50: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  d */.  Select *p
2e60: 53 65 6c 65 63 74 2c 20 20 20 20 2f 2a 20 41 20  Select,    /* A 
2e70: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2e80: 20 74 68 61 74 20 73 75 70 70 6c 69 65 73 20 76   that supplies v
2e90: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6f  alues */.  int o
2ea0: 72 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20 2f  rconf          /
2eb0: 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61  * The conflict a
2ec0: 6c 67 6f 72 69 74 68 6d 20 28 4f 45 5f 41 62 6f  lgorithm (OE_Abo
2ed0: 72 74 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  rt, OE_Replace, 
2ee0: 65 74 63 2e 29 20 2a 2f 0a 29 7b 0a 20 20 54 72  etc.) */.){.  Tr
2ef0: 69 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67  iggerStep *pTrig
2f00: 67 65 72 53 74 65 70 20 3d 20 73 71 6c 69 74 65  gerStep = sqlite
2f10: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 72  Malloc(sizeof(Tr
2f20: 69 67 67 65 72 53 74 65 70 29 29 3b 0a 0a 20 20  iggerStep));..  
2f30: 61 73 73 65 72 74 28 70 45 4c 69 73 74 20 3d 3d  assert(pEList ==
2f40: 20 30 20 7c 7c 20 70 53 65 6c 65 63 74 20 3d 3d   0 || pSelect ==
2f50: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 45   0);.  assert(pE
2f60: 4c 69 73 74 20 21 3d 20 30 20 7c 7c 20 70 53 65  List != 0 || pSe
2f70: 6c 65 63 74 20 21 3d 20 30 29 3b 0a 0a 20 20 69  lect != 0);..  i
2f80: 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70 20  f( pTriggerStep 
2f90: 29 7b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53  ){.    pTriggerS
2fa0: 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 4e 53  tep->op = TK_INS
2fb0: 45 52 54 3b 0a 20 20 20 20 70 54 72 69 67 67 65  ERT;.    pTrigge
2fc0: 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d  rStep->pSelect =
2fd0: 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70 54   pSelect;.    pT
2fe0: 72 69 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67  riggerStep->targ
2ff0: 65 74 20 20 3d 20 2a 70 54 61 62 6c 65 4e 61 6d  et  = *pTableNam
3000: 65 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53  e;.    pTriggerS
3010: 74 65 70 2d 3e 70 49 64 4c 69 73 74 20 3d 20 70  tep->pIdList = p
3020: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 54 72 69  Column;.    pTri
3030: 67 67 65 72 53 74 65 70 2d 3e 70 45 78 70 72 4c  ggerStep->pExprL
3040: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
3050: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3060: 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b  orconf = orconf;
3070: 0a 20 20 20 20 73 71 6c 69 74 65 50 65 72 73 69  .    sqlitePersi
3080: 73 74 54 72 69 67 67 65 72 53 74 65 70 28 70 54  stTriggerStep(pT
3090: 72 69 67 67 65 72 53 74 65 70 29 3b 0a 20 20 7d  riggerStep);.  }
30a0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
30b0: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 43  3IdListDelete(pC
30c0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69  olumn);.    sqli
30d0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
30e0: 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  e(pEList);.    s
30f0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
3100: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 0a 20  pSelect);.  }.. 
3110: 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72   return pTrigger
3120: 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Step;.}../*.** C
3130: 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69 67 67  onstruct a trigg
3140: 65 72 20 73 74 65 70 20 74 68 61 74 20 69 6d 70  er step that imp
3150: 6c 65 6d 65 6e 74 73 20 61 6e 20 55 50 44 41 54  lements an UPDAT
3160: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  E statement and 
3170: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
3180: 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67  ter to that trig
3190: 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20 70  ger step.  The p
31a0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
31b0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74   routine when it
31c0: 0a 2a 2a 20 73 65 65 73 20 61 6e 20 55 50 44 41  .** sees an UPDA
31d0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73  TE statement ins
31e0: 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20  ide the body of 
31f0: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  a CREATE TRIGGER
3200: 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70  ..*/.TriggerStep
3210: 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72   *sqlite3Trigger
3220: 55 70 64 61 74 65 53 74 65 70 28 0a 20 20 54 6f  UpdateStep(.  To
3230: 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c  ken *pTableName,
3240: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3250: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 75 70  e table to be up
3260: 64 61 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  dated */.  ExprL
3270: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
3280: 2f 2a 20 54 68 65 20 53 45 54 20 63 6c 61 75 73  /* The SET claus
3290: 65 3a 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  e: list of colum
32a0: 6e 20 61 6e 64 20 6e 65 77 20 76 61 6c 75 65 73  n and new values
32b0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
32c0: 72 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  re,        /* Th
32d0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
32e0: 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20  /.  int orconf  
32f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3300: 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74  conflict algorit
3310: 68 6d 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f  hm. (OE_Abort, O
3320: 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29 20 2a  E_Ignore, etc) *
3330: 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74  /.){.  TriggerSt
3340: 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65 70  ep *pTriggerStep
3350: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
3360: 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74  sizeof(TriggerSt
3370: 65 70 29 29 3b 0a 20 20 69 66 28 20 70 54 72 69  ep));.  if( pTri
3380: 67 67 65 72 53 74 65 70 3d 3d 30 20 29 20 72 65  ggerStep==0 ) re
3390: 74 75 72 6e 20 30 3b 0a 0a 20 20 70 54 72 69 67  turn 0;..  pTrig
33a0: 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20 54 4b  gerStep->op = TK
33b0: 5f 55 50 44 41 54 45 3b 0a 20 20 70 54 72 69 67  _UPDATE;.  pTrig
33c0: 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74 20  gerStep->target 
33d0: 20 3d 20 2a 70 54 61 62 6c 65 4e 61 6d 65 3b 0a   = *pTableName;.
33e0: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
33f0: 70 45 78 70 72 4c 69 73 74 20 3d 20 70 45 4c 69  pExprList = pELi
3400: 73 74 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74  st;.  pTriggerSt
3410: 65 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  ep->pWhere = pWh
3420: 65 72 65 3b 0a 20 20 70 54 72 69 67 67 65 72 53  ere;.  pTriggerS
3430: 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72  tep->orconf = or
3440: 63 6f 6e 66 3b 0a 20 20 73 71 6c 69 74 65 50 65  conf;.  sqlitePe
3450: 72 73 69 73 74 54 72 69 67 67 65 72 53 74 65 70  rsistTriggerStep
3460: 28 70 54 72 69 67 67 65 72 53 74 65 70 29 3b 0a  (pTriggerStep);.
3470: 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67  .  return pTrigg
3480: 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erStep;.}../*.**
3490: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69   Construct a tri
34a0: 67 67 65 72 20 73 74 65 70 20 74 68 61 74 20 69  gger step that i
34b0: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 44 45 4c 45  mplements a DELE
34c0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  TE statement and
34d0: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   return.** a poi
34e0: 6e 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69  nter to that tri
34f0: 67 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20  gger step.  The 
3500: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
3510: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69  s routine when i
3520: 74 0a 2a 2a 20 73 65 65 73 20 61 20 44 45 4c 45  t.** sees a DELE
3530: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73  TE statement ins
3540: 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20  ide the body of 
3550: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  a CREATE TRIGGER
3560: 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70  ..*/.TriggerStep
3570: 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72   *sqlite3Trigger
3580: 44 65 6c 65 74 65 53 74 65 70 28 54 6f 6b 65 6e  DeleteStep(Token
3590: 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 45 78   *pTableName, Ex
35a0: 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 54  pr *pWhere){.  T
35b0: 72 69 67 67 65 72 53 74 65 70 20 2a 70 54 72 69  riggerStep *pTri
35c0: 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c 69 74  ggerStep = sqlit
35d0: 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54  eMalloc(sizeof(T
35e0: 72 69 67 67 65 72 53 74 65 70 29 29 3b 0a 20 20  riggerStep));.  
35f0: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70  if( pTriggerStep
3600: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3610: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
3620: 3e 6f 70 20 3d 20 54 4b 5f 44 45 4c 45 54 45 3b  >op = TK_DELETE;
3630: 0a 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d  .  pTriggerStep-
3640: 3e 74 61 72 67 65 74 20 20 3d 20 2a 70 54 61 62  >target  = *pTab
3650: 6c 65 4e 61 6d 65 3b 0a 20 20 70 54 72 69 67 67  leName;.  pTrigg
3660: 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65 20 3d  erStep->pWhere =
3670: 20 70 57 68 65 72 65 3b 0a 20 20 70 54 72 69 67   pWhere;.  pTrig
3680: 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20  gerStep->orconf 
3690: 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20  = OE_Default;.  
36a0: 73 71 6c 69 74 65 50 65 72 73 69 73 74 54 72 69  sqlitePersistTri
36b0: 67 67 65 72 53 74 65 70 28 70 54 72 69 67 67 65  ggerStep(pTrigge
36c0: 72 53 74 65 70 29 3b 0a 0a 20 20 72 65 74 75 72  rStep);..  retur
36d0: 6e 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a  n pTriggerStep;.
36e0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 63 75 72 73  }../* .** Recurs
36f0: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 20 54  ively delete a T
3700: 72 69 67 67 65 72 20 73 74 72 75 63 74 75 72 65  rigger structure
3710: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3720: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 54 72  DeleteTrigger(Tr
3730: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 29  igger *pTrigger)
3740: 7b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72  {.  if( pTrigger
3750: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3760: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69  sqlite3DeleteTri
3770: 67 67 65 72 53 74 65 70 28 70 54 72 69 67 67 65  ggerStep(pTrigge
3780: 72 2d 3e 73 74 65 70 5f 6c 69 73 74 29 3b 0a 20  r->step_list);. 
3790: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 72 69   sqliteFree(pTri
37a0: 67 67 65 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 73  gger->name);.  s
37b0: 71 6c 69 74 65 46 72 65 65 28 70 54 72 69 67 67  qliteFree(pTrigg
37c0: 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 73 71  er->table);.  sq
37d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
37e0: 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e 29  pTrigger->pWhen)
37f0: 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
3800: 74 44 65 6c 65 74 65 28 70 54 72 69 67 67 65 72  tDelete(pTrigger
3810: 2d 3e 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 69  ->pColumns);.  i
3820: 66 28 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d  f( pTrigger->nam
3830: 65 54 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c  eToken.dyn ) sql
3840: 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70  iteFree((char*)p
3850: 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65 54 6f 6b  Trigger->nameTok
3860: 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 46  en.z);.  sqliteF
3870: 72 65 65 28 70 54 72 69 67 67 65 72 29 3b 0a 7d  ree(pTrigger);.}
3880: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3890: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
38a0: 74 6f 20 64 72 6f 70 20 61 20 74 72 69 67 67 65  to drop a trigge
38b0: 72 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  r from the datab
38c0: 61 73 65 20 73 63 68 65 6d 61 2e 20 0a 2a 2a 0a  ase schema. .**.
38d0: 2a 2a 20 54 68 69 73 20 6d 61 79 20 62 65 20 63  ** This may be c
38e0: 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20 66  alled directly f
38f0: 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 20 61  rom the parser a
3900: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 69 64 65  nd therefore ide
3910: 6e 74 69 66 69 65 73 0a 2a 2a 20 74 68 65 20 74  ntifies.** the t
3920: 72 69 67 67 65 72 20 62 79 20 6e 61 6d 65 2e 20  rigger by name. 
3930: 20 54 68 65 20 73 71 6c 69 74 65 33 44 72 6f 70   The sqlite3Drop
3940: 54 72 69 67 67 65 72 50 74 72 28 29 20 72 6f 75  TriggerPtr() rou
3950: 74 69 6e 65 20 64 6f 65 73 20 74 68 65 0a 2a 2a  tine does the.**
3960: 20 73 61 6d 65 20 6a 6f 62 20 61 73 20 74 68 69   same job as thi
3970: 73 20 72 6f 75 74 69 6e 65 20 65 78 63 65 70 74  s routine except
3980: 20 69 74 20 74 61 6b 65 73 20 61 20 70 6f 69 6e   it takes a poin
3990: 74 65 72 20 74 6f 20 74 68 65 20 74 72 69 67 67  ter to the trigg
39a0: 65 72 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  er.** instead of
39b0: 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d   the trigger nam
39c0: 65 2e 0a 2a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  e..**/.void sqli
39d0: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 28 50  te3DropTrigger(P
39e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
39f0: 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20  cList *pName){. 
3a00: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
3a10: 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  er = 0;.  int i;
3a20: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3a30: 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db;.  const char
3a40: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e   *zName;.  int n
3a50: 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  Name;.  sqlite3 
3a60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
3a70: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
3a80: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
3a90: 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 67   goto drop_trigg
3aa0: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 66  er_cleanup;.  if
3ab0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
3ac0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
3ad0: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
3ae0: 74 6f 20 64 72 6f 70 5f 74 72 69 67 67 65 72 5f  to drop_trigger_
3af0: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20  cleanup;.  }..  
3b00: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
3b10: 53 72 63 3d 3d 31 20 29 3b 0a 20 20 7a 44 62 20  Src==1 );.  zDb 
3b20: 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  = pName->a[0].zD
3b30: 61 74 61 62 61 73 65 3b 0a 20 20 7a 4e 61 6d 65  atabase;.  zName
3b40: 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a   = pName->a[0].z
3b50: 4e 61 6d 65 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  Name;.  nName = 
3b60: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
3b70: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
3b80: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
3b90: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
3ba0: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
3bb0: 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d  ;  /* Search TEM
3bc0: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
3bd0: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20  .    if( zDb && 
3be0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64  sqlite3StrICmp(d
3bf0: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 2c  b->aDb[j].zName,
3c00: 20 7a 44 62 29 20 29 20 63 6f 6e 74 69 6e 75 65   zDb) ) continue
3c10: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  ;.    pTrigger =
3c20: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
3c30: 28 26 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53  (&(db->aDb[j].pS
3c40: 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 29  chema->trigHash)
3c50: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
3c60: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 72 69 67  );.    if( pTrig
3c70: 67 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ger ) break;.  }
3c80: 0a 20 20 69 66 28 20 21 70 54 72 69 67 67 65 72  .  if( !pTrigger
3c90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
3ca0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3cb0: 22 6e 6f 20 73 75 63 68 20 74 72 69 67 67 65 72  "no such trigger
3cc0: 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
3cd0: 3b 0a 20 20 20 20 67 6f 74 6f 20 64 72 6f 70 5f  ;.    goto drop_
3ce0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
3cf0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 72  .  }.  sqlite3Dr
3d00: 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
3d10: 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  rse, pTrigger);.
3d20: 0a 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c  .drop_trigger_cl
3d30: 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
3d40: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
3d50: 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ame);.}../*.** R
3d60: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
3d70: 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
3d80: 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 74  ucture for the t
3d90: 61 62 6c 65 20 74 68 61 74 20 61 20 74 72 69 67  able that a trig
3da0: 67 65 72 0a 2a 2a 20 69 73 20 73 65 74 20 6f 6e  ger.** is set on
3db0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c  ..*/.static Tabl
3dc0: 65 20 2a 74 61 62 6c 65 4f 66 54 72 69 67 67 65  e *tableOfTrigge
3dd0: 72 28 54 72 69 67 67 65 72 20 2a 70 54 72 69 67  r(Trigger *pTrig
3de0: 67 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  ger){.  int n = 
3df0: 73 74 72 6c 65 6e 28 70 54 72 69 67 67 65 72 2d  strlen(pTrigger-
3e00: 3e 74 61 62 6c 65 29 20 2b 20 31 3b 0a 20 20 72  >table) + 1;.  r
3e10: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 48 61 73  eturn sqlite3Has
3e20: 68 46 69 6e 64 28 26 70 54 72 69 67 67 65 72 2d  hFind(&pTrigger-
3e30: 3e 70 54 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c  >pTabSchema->tbl
3e40: 48 61 73 68 2c 20 70 54 72 69 67 67 65 72 2d 3e  Hash, pTrigger->
3e50: 74 61 62 6c 65 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f  table, n);.}.../
3e60: 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 74 72 69 67  *.** Drop a trig
3e70: 67 65 72 20 67 69 76 65 6e 20 61 20 70 6f 69 6e  ger given a poin
3e80: 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67  ter to that trig
3e90: 67 65 72 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ger. .*/.void sq
3ea0: 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
3eb0: 50 74 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  Ptr(Parse *pPars
3ec0: 65 2c 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  e, Trigger *pTri
3ed0: 67 67 65 72 29 7b 0a 20 20 54 61 62 6c 65 20 20  gger){.  Table  
3ee0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65   *pTable;.  Vdbe
3ef0: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
3f00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
3f10: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
3f20: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
3f30: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
3f40: 2d 3e 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e  ->db, pTrigger->
3f50: 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
3f60: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
3f70: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 70  b<db->nDb );.  p
3f80: 54 61 62 6c 65 20 3d 20 74 61 62 6c 65 4f 66 54  Table = tableOfT
3f90: 72 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29  rigger(pTrigger)
3fa0: 3b 0a 20 20 61 73 73 65 72 74 28 70 54 61 62 6c  ;.  assert(pTabl
3fb0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  e);.  assert( pT
3fc0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  able->pSchema==p
3fd0: 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
3fe0: 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 23 69   || iDb==1 );.#i
3ff0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4000: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
4010: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
4020: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
4030: 52 49 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e 73  RIGGER;.    cons
4040: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
4050: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
4060: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
4070: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
4080: 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
4090: 69 66 28 20 69 44 62 3d 3d 31 20 29 20 63 6f 64  if( iDb==1 ) cod
40a0: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
40b0: 54 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20 20  TEMP_TRIGGER;.  
40c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
40d0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
40e0: 6f 64 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e  ode, pTrigger->n
40f0: 61 6d 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ame, pTable->zNa
4100: 6d 65 2c 20 7a 44 62 29 20 7c 7c 0a 20 20 20 20  me, zDb) ||.    
4110: 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65    sqlite3AuthChe
4120: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
4130: 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
4140: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
4150: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
4160: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
4170: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
4180: 20 64 65 73 74 72 6f 79 20 74 68 65 20 64 61 74   destroy the dat
4190: 61 62 61 73 65 20 72 65 63 6f 72 64 20 6f 66 20  abase record of 
41a0: 74 68 65 20 74 72 69 67 67 65 72 2e 0a 20 20 2a  the trigger..  *
41b0: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 21 3d  /.  if( pTable!=
41c0: 30 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  0 && (v = sqlite
41d0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
41e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
41f0: 62 61 73 65 3b 0a 20 20 20 20 73 74 61 74 69 63  base;.    static
4200: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73   const VdbeOpLis
4210: 74 20 64 72 6f 70 54 72 69 67 67 65 72 5b 5d 20  t dropTrigger[] 
4220: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  = {.      { OP_R
4230: 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44  ewind,     0, AD
4240: 44 52 28 39 29 2c 20 20 30 7d 2c 0a 20 20 20 20  DR(9),  0},.    
4250: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20    { OP_String8, 
4260: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
4270: 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20  0}, /* 1 */.    
4280: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
4290: 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 20     0, 1,        
42a0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
42b0: 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44  e,         0, AD
42c0: 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20  DR(8),  0},.    
42d0: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20    { OP_String8, 
42e0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
42f0: 22 74 72 69 67 67 65 72 22 7d 2c 0a 20 20 20 20  "trigger"},.    
4300: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
4310: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
4320: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
4330: 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44  e,         0, AD
4340: 44 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20  DR(8),  0},.    
4350: 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20    { OP_Delete,  
4360: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
4370: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e  0},.      { OP_N
4380: 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44  ext,       0, AD
4390: 44 52 28 31 29 2c 20 20 30 7d 2c 20 2f 2a 20 38  DR(1),  0}, /* 8
43a0: 20 2a 2f 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20   */.    };..    
43b0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
43c0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
43d0: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
43e0: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
43f0: 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  rTable(pParse, i
4400: 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20  Db);.    base = 
4410: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4420: 4c 69 73 74 28 76 2c 20 20 41 72 72 61 79 53 69  List(v,  ArraySi
4430: 7a 65 28 64 72 6f 70 54 72 69 67 67 65 72 29 2c  ze(dropTrigger),
4440: 20 64 72 6f 70 54 72 69 67 67 65 72 29 3b 0a 20   dropTrigger);. 
4450: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
4460: 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31  angeP3(v, base+1
4470: 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65  , pTrigger->name
4480: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4490: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
44a0: 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , v, iDb);.    s
44b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
44c0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
44d0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
44e0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f  dbeOp3(v, OP_Dro
44f0: 70 54 72 69 67 67 65 72 2c 20 69 44 62 2c 20 30  pTrigger, iDb, 0
4500: 2c 20 70 54 72 69 67 67 65 72 2d 3e 6e 61 6d 65  , pTrigger->name
4510: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
4520: 2a 2a 20 52 65 6d 6f 76 65 20 61 20 74 72 69 67  ** Remove a trig
4530: 67 65 72 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ger from the has
4540: 68 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  h tables of the 
4550: 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 2e  sqlite* pointer.
4560: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4570: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
4580: 72 69 67 67 65 72 28 73 71 6c 69 74 65 33 20 2a  rigger(sqlite3 *
4590: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
45a0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
45b0: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
45c0: 67 67 65 72 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  gger;.  int nNam
45d0: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
45e0: 29 3b 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  );.  pTrigger = 
45f0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4600: 74 28 26 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  t(&(db->aDb[iDb]
4610: 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61  .pSchema->trigHa
4620: 73 68 29 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  sh), zName, nNam
4630: 65 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  e+1, 0);.  if( p
4640: 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 54  Trigger ){.    T
4650: 61 62 6c 65 20 2a 70 54 61 62 6c 65 20 3d 20 74  able *pTable = t
4660: 61 62 6c 65 4f 66 54 72 69 67 67 65 72 28 70 54  ableOfTrigger(pT
4670: 72 69 67 67 65 72 29 3b 0a 20 20 20 20 61 73 73  rigger);.    ass
4680: 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29  ert( pTable!=0 )
4690: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
46a0: 2d 3e 70 54 72 69 67 67 65 72 20 3d 3d 20 70 54  ->pTrigger == pT
46b0: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
46c0: 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72  pTable->pTrigger
46d0: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
46e0: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
46f0: 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 63 63       Trigger *cc
4700: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72 69 67   = pTable->pTrig
4710: 67 65 72 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ger;.      while
4720: 28 20 63 63 20 29 7b 20 0a 20 20 20 20 20 20 20  ( cc ){ .       
4730: 20 69 66 28 20 63 63 2d 3e 70 4e 65 78 74 20 3d   if( cc->pNext =
4740: 3d 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  = pTrigger ){.  
4750: 20 20 20 20 20 20 20 20 63 63 2d 3e 70 4e 65 78          cc->pNex
4760: 74 20 3d 20 63 63 2d 3e 70 4e 65 78 74 2d 3e 70  t = cc->pNext->p
4770: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
4780: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4790: 0a 20 20 20 20 20 20 20 20 63 63 20 3d 20 63 63  .        cc = cc
47a0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
47b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 63 63  .      assert(cc
47c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
47d0: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
47e0: 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  r(pTrigger);.   
47f0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
4800: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
4810: 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  es;.  }.}../*.**
4820: 20 70 45 4c 69 73 74 20 69 73 20 74 68 65 20 53   pEList is the S
4830: 45 54 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20  ET clause of an 
4840: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
4850: 2e 20 20 45 61 63 68 20 65 6e 74 72 79 0a 2a 2a  .  Each entry.**
4860: 20 69 6e 20 70 45 4c 69 73 74 20 69 73 20 6f 66   in pEList is of
4870: 20 74 68 65 20 66 6f 72 6d 61 74 20 3c 69 64 3e   the format <id>
4880: 3d 3c 65 78 70 72 3e 2e 20 20 49 66 20 61 6e 79  =<expr>.  If any
4890: 20 6f 66 20 74 68 65 20 65 6e 74 72 69 65 73 0a   of the entries.
48a0: 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 68 61 76  ** in pEList hav
48b0: 65 20 61 6e 20 3c 69 64 3e 20 77 68 69 63 68 20  e an <id> which 
48c0: 6d 61 74 63 68 65 73 20 61 6e 20 69 64 65 6e 74  matches an ident
48d0: 69 66 69 65 72 20 69 6e 20 70 49 64 4c 69 73 74  ifier in pIdList
48e0: 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  ,.** then return
48f0: 20 54 52 55 45 2e 20 20 49 66 20 70 49 64 4c 69   TRUE.  If pIdLi
4900: 73 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  st==NULL, then i
4910: 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  t is considered 
4920: 61 0a 2a 2a 20 77 69 6c 64 63 61 72 64 20 74 68  a.** wildcard th
4930: 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68  at matches anyth
4940: 69 6e 67 2e 20 20 4c 69 6b 65 77 69 73 65 20 69  ing.  Likewise i
4950: 66 20 70 45 4c 69 73 74 3d 3d 4e 55 4c 4c 20 74  f pEList==NULL t
4960: 68 65 6e 0a 2a 2a 20 69 74 20 6d 61 74 63 68 65  hen.** it matche
4970: 73 20 61 6e 79 74 68 69 6e 67 20 73 6f 20 61 6c  s anything so al
4980: 77 61 79 73 20 72 65 74 75 72 6e 20 74 72 75 65  ways return true
4990: 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
49a0: 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 65 72 65  only.** if there
49b0: 20 69 73 20 6e 6f 20 6d 61 74 63 68 2e 0a 2a 2f   is no match..*/
49c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
49d0: 6b 43 6f 6c 75 6d 6e 4f 76 65 72 4c 61 70 28 49  kColumnOverLap(I
49e0: 64 4c 69 73 74 20 2a 70 49 64 4c 69 73 74 2c 20  dList *pIdList, 
49f0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
4a00: 29 7b 0a 20 20 69 6e 74 20 65 3b 0a 20 20 69 66  ){.  int e;.  if
4a10: 28 20 21 70 49 64 4c 69 73 74 20 7c 7c 20 21 70  ( !pIdList || !p
4a20: 45 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20 31  EList ) return 1
4a30: 3b 0a 20 20 66 6f 72 28 65 3d 30 3b 20 65 3c 70  ;.  for(e=0; e<p
4a40: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 65 2b  EList->nExpr; e+
4a50: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
4a60: 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
4a70: 49 64 4c 69 73 74 2c 20 70 45 4c 69 73 74 2d 3e  IdList, pEList->
4a80: 61 5b 65 5d 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29  a[e].zName)>=0 )
4a90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
4aa0: 20 72 65 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f   return 0; .}../
4ab0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69  *.** Return a bi
4ac0: 74 20 76 65 63 74 6f 72 20 74 6f 20 69 6e 64 69  t vector to indi
4ad0: 63 61 74 65 20 77 68 61 74 20 6b 69 6e 64 20 6f  cate what kind o
4ae0: 66 20 74 72 69 67 67 65 72 73 20 65 78 69 73 74  f triggers exist
4af0: 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 0a 2a   for operation.*
4b00: 2a 20 22 6f 70 22 20 6f 6e 20 74 61 62 6c 65 20  * "op" on table 
4b10: 70 54 61 62 2e 20 20 49 66 20 70 43 68 61 6e 67  pTab.  If pChang
4b20: 65 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  es is not NULL t
4b30: 68 65 6e 20 69 74 20 69 73 20 61 20 6c 69 73 74  hen it is a list
4b40: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 74   of columns.** t
4b50: 68 61 74 20 61 72 65 20 62 65 69 6e 67 20 75 70  hat are being up
4b60: 64 61 74 65 64 2e 20 20 54 72 69 67 67 65 72 73  dated.  Triggers
4b70: 20 6f 6e 6c 79 20 6d 61 74 63 68 20 69 66 20 74   only match if t
4b80: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
4b90: 74 68 65 0a 2a 2a 20 74 72 69 67 67 65 72 20 64  the.** trigger d
4ba0: 65 66 69 6e 69 74 69 6f 6e 20 6f 76 65 72 6c 61  efinition overla
4bb0: 70 73 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  ps the set of co
4bc0: 6c 75 6d 6e 73 20 62 65 69 6e 67 20 75 70 64 61  lumns being upda
4bd0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ted..**.** The r
4be0: 65 74 75 72 6e 65 64 20 62 69 74 20 76 65 63 74  eturned bit vect
4bf0: 6f 72 20 69 73 20 73 6f 6d 65 20 63 6f 6d 62 69  or is some combi
4c00: 6e 61 74 69 6f 6e 20 6f 66 20 54 52 49 47 47 45  nation of TRIGGE
4c10: 52 5f 42 45 46 4f 52 45 20 61 6e 64 0a 2a 2a 20  R_BEFORE and.** 
4c20: 54 52 49 47 47 45 52 5f 41 46 54 45 52 2e 0a 2a  TRIGGER_AFTER..*
4c30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 72 69  /.int sqlite3Tri
4c40: 67 67 65 72 73 45 78 69 73 74 28 0a 20 20 50 61  ggersExist(.  Pa
4c50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4c60: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
4c70: 20 63 68 65 63 6b 20 66 6f 72 20 72 65 63 75 72   check for recur
4c80: 73 69 76 65 20 74 72 69 67 67 65 72 73 20 2a 2f  sive triggers */
4c90: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
4ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4cb0: 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6e 74  e table the cont
4cc0: 61 69 6e 73 20 74 68 65 20 74 72 69 67 67 65 72  ains the trigger
4cd0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  s */.  int op,  
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4cf0: 2a 20 6f 6e 65 20 6f 66 20 54 4b 5f 44 45 4c 45  * one of TK_DELE
4d00: 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54  TE, TK_INSERT, T
4d10: 4b 5f 55 50 44 41 54 45 20 2a 2f 0a 20 20 45 78  K_UPDATE */.  Ex
4d20: 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73  prList *pChanges
4d30: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73        /* Columns
4d40: 20 74 68 61 74 20 63 68 61 6e 67 65 20 69 6e 20   that change in 
4d50: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
4d60: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67  ent */.){.  Trig
4d70: 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20  ger *pTrigger = 
4d80: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
4d90: 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a    int mask = 0;.
4da0: 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67  .  while( pTrigg
4db0: 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  er ){.    if( pT
4dc0: 72 69 67 67 65 72 2d 3e 6f 70 3d 3d 6f 70 20 26  rigger->op==op &
4dd0: 26 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65  & checkColumnOve
4de0: 72 4c 61 70 28 70 54 72 69 67 67 65 72 2d 3e 70  rLap(pTrigger->p
4df0: 43 6f 6c 75 6d 6e 73 2c 20 70 43 68 61 6e 67 65  Columns, pChange
4e00: 73 29 20 29 7b 0a 20 20 20 20 20 20 54 72 69 67  s) ){.      Trig
4e10: 67 65 72 53 74 61 63 6b 20 2a 73 73 3b 0a 20 20  gerStack *ss;.  
4e20: 20 20 20 20 73 73 20 3d 20 70 50 61 72 73 65 2d      ss = pParse-
4e30: 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20  >trigStack;.    
4e40: 20 20 77 68 69 6c 65 28 20 73 73 20 26 26 20 73    while( ss && s
4e50: 73 2d 3e 70 54 72 69 67 67 65 72 21 3d 70 54 61  s->pTrigger!=pTa
4e60: 62 2d 3e 70 54 72 69 67 67 65 72 20 29 7b 0a 09  b->pTrigger ){..
4e70: 73 73 20 3d 20 73 73 2d 3e 70 4e 65 78 74 3b 0a  ss = ss->pNext;.
4e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4e90: 28 20 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( ss==0 ){.     
4ea0: 20 20 20 6d 61 73 6b 20 7c 3d 20 70 54 72 69 67     mask |= pTrig
4eb0: 67 65 72 2d 3e 74 72 5f 74 6d 3b 0a 20 20 20 20  ger->tr_tm;.    
4ec0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 54    }.    }.    pT
4ed0: 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
4ee0: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  r->pNext;.  }.  
4ef0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a  return mask;.}..
4f00: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68  /*.** Convert th
4f10: 65 20 70 53 74 65 70 2d 3e 74 61 72 67 65 74 20  e pStep->target 
4f20: 74 6f 6b 65 6e 20 69 6e 74 6f 20 61 20 53 72 63  token into a Src
4f30: 4c 69 73 74 20 61 6e 64 20 72 65 74 75 72 6e 20  List and return 
4f40: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
4f50: 74 68 61 74 20 53 72 63 4c 69 73 74 2e 0a 2a 2a  that SrcList..**
4f60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4f70: 20 61 64 64 73 20 61 20 73 70 65 63 69 66 69 63   adds a specific
4f80: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2c 20   database name, 
4f90: 69 66 20 6e 65 65 64 65 64 2c 20 74 6f 20 74 68  if needed, to th
4fa0: 65 20 74 61 72 67 65 74 20 77 68 65 6e 0a 2a 2a  e target when.**
4fb0: 20 66 6f 72 6d 69 6e 67 20 74 68 65 20 53 72 63   forming the Src
4fc0: 4c 69 73 74 2e 20 20 54 68 69 73 20 70 72 65 76  List.  This prev
4fd0: 65 6e 74 73 20 61 20 74 72 69 67 67 65 72 20 69  ents a trigger i
4fe0: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
4ff0: 72 6f 6d 0a 2a 2a 20 72 65 66 65 72 72 69 6e 67  rom.** referring
5000: 20 74 6f 20 61 20 74 61 72 67 65 74 20 69 6e 20   to a target in 
5010: 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
5020: 2e 20 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20  .  An exception 
5030: 69 73 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 74  is when the.** t
5040: 72 69 67 67 65 72 20 69 73 20 69 6e 20 54 45 4d  rigger is in TEM
5050: 50 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  P in which case 
5060: 69 74 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20  it can refer to 
5070: 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
5080: 73 65 20 69 74 0a 2a 2a 20 77 61 6e 74 73 2e 0a  se it.** wants..
5090: 2a 2f 0a 73 74 61 74 69 63 20 53 72 63 4c 69 73  */.static SrcLis
50a0: 74 20 2a 74 61 72 67 65 74 53 72 63 4c 69 73 74  t *targetSrcList
50b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
50c0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
50d0: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
50e0: 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  */.  TriggerStep
50f0: 20 2a 70 53 74 65 70 20 20 20 2f 2a 20 54 68 65   *pStep   /* The
5100: 20 74 72 69 67 67 65 72 20 63 6f 6e 74 61 69 6e   trigger contain
5110: 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 74  ing the target t
5120: 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 54 6f 6b  oken */.){.  Tok
5130: 65 6e 20 73 44 62 3b 20 20 20 20 20 20 20 20 20  en sDb;         
5140: 20 20 2f 2a 20 44 75 6d 6d 79 20 64 61 74 61 62    /* Dummy datab
5150: 61 73 65 20 6e 61 6d 65 20 74 6f 6b 65 6e 20 2a  ase name token *
5160: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
5180: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
5190: 65 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 53 72  e to use */.  Sr
51a0: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
51b0: 20 20 20 2f 2a 20 53 72 63 4c 69 73 74 20 74 6f     /* SrcList to
51c0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a   be returned */.
51d0: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
51e0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
51f0: 61 72 73 65 2d 3e 64 62 2c 20 70 53 74 65 70 2d  arse->db, pStep-
5200: 3e 70 54 72 69 67 2d 3e 70 53 63 68 65 6d 61 29  >pTrig->pSchema)
5210: 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c  ;.  if( iDb==0 |
5220: 7c 20 69 44 62 3e 3d 32 20 29 7b 0a 20 20 20 20  | iDb>=2 ){.    
5230: 61 73 73 65 72 74 28 20 69 44 62 3c 70 50 61 72  assert( iDb<pPar
5240: 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  se->db->nDb );. 
5250: 20 20 20 73 44 62 2e 7a 20 3d 20 28 75 38 2a 29     sDb.z = (u8*)
5260: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
5270: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
5280: 73 44 62 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 28  sDb.n = strlen((
5290: 63 68 61 72 2a 29 73 44 62 2e 7a 29 3b 0a 20 20  char*)sDb.z);.  
52a0: 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33    pSrc = sqlite3
52b0: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  SrcListAppend(0,
52c0: 20 26 73 44 62 2c 20 26 70 53 74 65 70 2d 3e 74   &sDb, &pStep->t
52d0: 61 72 67 65 74 29 3b 0a 20 20 7d 20 65 6c 73 65  arget);.  } else
52e0: 20 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 73 71   {.    pSrc = sq
52f0: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
5300: 6e 64 28 30 2c 20 26 70 53 74 65 70 2d 3e 74 61  nd(0, &pStep->ta
5310: 72 67 65 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  rget, 0);.  }.  
5320: 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a  return pSrc;.}..
5330: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
5340: 44 42 45 20 63 6f 64 65 20 66 6f 72 20 7a 65 72  DBE code for zer
5350: 6f 20 6f 72 20 6d 6f 72 65 20 73 74 61 74 65 6d  o or more statem
5360: 65 6e 74 73 20 69 6e 73 69 64 65 20 74 68 65 20  ents inside the 
5370: 62 6f 64 79 20 6f 66 20 61 0a 2a 2a 20 74 72 69  body of a.** tri
5380: 67 67 65 72 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  gger.  .*/.stati
5390: 63 20 69 6e 74 20 63 6f 64 65 54 72 69 67 67 65  c int codeTrigge
53a0: 72 50 72 6f 67 72 61 6d 28 0a 20 20 50 61 72 73  rProgram(.  Pars
53b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
53c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
53d0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
53e0: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 53   TriggerStep *pS
53f0: 74 65 70 4c 69 73 74 2c 20 20 20 2f 2a 20 4c 69  tepList,   /* Li
5400: 73 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73  st of statements
5410: 20 69 6e 73 69 64 65 20 74 68 65 20 74 72 69 67   inside the trig
5420: 67 65 72 20 62 6f 64 79 20 2a 2f 0a 20 20 69 6e  ger body */.  in
5430: 74 20 6f 72 63 6f 6e 66 69 6e 20 20 20 20 20 20  t orconfin      
5440: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
5450: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 2e 20 28  ict algorithm. (
5460: 4f 45 5f 41 62 6f 72 74 2c 20 65 74 63 29 20 2a  OE_Abort, etc) *
5470: 2f 20 20 0a 29 7b 0a 20 20 54 72 69 67 67 65 72  /  .){.  Trigger
5480: 53 74 65 70 20 2a 20 70 54 72 69 67 67 65 72 53  Step * pTriggerS
5490: 74 65 70 20 3d 20 70 53 74 65 70 4c 69 73 74 3b  tep = pStepList;
54a0: 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 3b 0a 20  .  int orconf;. 
54b0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
54c0: 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 61 73 73  e->pVdbe;..  ass
54d0: 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74 65  ert( pTriggerSte
54e0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
54f0: 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
5500: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5510: 4f 50 5f 43 6f 6e 74 65 78 74 50 75 73 68 2c 20  OP_ContextPush, 
5520: 30 2c 20 30 29 3b 0a 20 20 56 64 62 65 43 6f 6d  0, 0);.  VdbeCom
5530: 6d 65 6e 74 28 28 76 2c 20 22 23 20 62 65 67 69  ment((v, "# begi
5540: 6e 20 74 72 69 67 67 65 72 20 25 73 22 2c 20 70  n trigger %s", p
5550: 53 74 65 70 4c 69 73 74 2d 3e 70 54 72 69 67 2d  StepList->pTrig-
5560: 3e 6e 61 6d 65 29 29 3b 0a 20 20 77 68 69 6c 65  >name));.  while
5570: 28 20 70 54 72 69 67 67 65 72 53 74 65 70 20 29  ( pTriggerStep )
5580: 7b 0a 20 20 20 20 6f 72 63 6f 6e 66 20 3d 20 28  {.    orconf = (
5590: 6f 72 63 6f 6e 66 69 6e 20 3d 3d 20 4f 45 5f 44  orconfin == OE_D
55a0: 65 66 61 75 6c 74 29 3f 70 54 72 69 67 67 65 72  efault)?pTrigger
55b0: 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 3a 6f 72 63  Step->orconf:orc
55c0: 6f 6e 66 69 6e 3b 0a 20 20 20 20 70 50 61 72 73  onfin;.    pPars
55d0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 6f 72  e->trigStack->or
55e0: 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20  conf = orconf;. 
55f0: 20 20 20 73 77 69 74 63 68 28 20 70 54 72 69 67     switch( pTrig
5600: 67 65 72 53 74 65 70 2d 3e 6f 70 20 29 7b 0a 20  gerStep->op ){. 
5610: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c       case TK_SEL
5620: 45 43 54 3a 20 7b 0a 09 53 65 6c 65 63 74 20 2a  ECT: {..Select *
5630: 20 73 73 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   ss = sqlite3Sel
5640: 65 63 74 44 75 70 28 70 54 72 69 67 67 65 72 53  ectDup(pTriggerS
5650: 74 65 70 2d 3e 70 53 65 6c 65 63 74 29 3b 09 09  tep->pSelect);..
5660: 20 20 0a 09 61 73 73 65 72 74 28 73 73 29 3b 0a    ..assert(ss);.
5670: 09 61 73 73 65 72 74 28 73 73 2d 3e 70 53 72 63  .assert(ss->pSrc
5680: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5690: 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
56a0: 70 50 61 72 73 65 2c 20 73 73 2c 20 30 29 3b 0a  pParse, ss, 0);.
56b0: 09 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70  .sqlite3Select(p
56c0: 50 61 72 73 65 2c 20 73 73 2c 20 53 52 54 5f 44  Parse, ss, SRT_D
56d0: 69 73 63 61 72 64 2c 20 30 2c 20 30 2c 20 30 2c  iscard, 0, 0, 0,
56e0: 20 30 2c 20 30 29 3b 0a 09 73 71 6c 69 74 65 33   0, 0);..sqlite3
56f0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 73 29  SelectDelete(ss)
5700: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;..break;.      
5710: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
5720: 55 50 44 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  UPDATE: {.      
5730: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
5740: 0a 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20  .        pSrc = 
5750: 74 61 72 67 65 74 53 72 63 4c 69 73 74 28 70 50  targetSrcList(pP
5760: 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 53 74  arse, pTriggerSt
5770: 65 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ep);.        sql
5780: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5790: 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20   OP_ResetCount, 
57a0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
57b0: 71 6c 69 74 65 33 55 70 64 61 74 65 28 70 50 61  qlite3Update(pPa
57c0: 72 73 65 2c 20 70 53 72 63 2c 0a 09 09 73 71 6c  rse, pSrc,...sql
57d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
57e0: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 45  pTriggerStep->pE
57f0: 78 70 72 4c 69 73 74 29 2c 20 0a 09 09 73 71 6c  xprList), ...sql
5800: 69 74 65 33 45 78 70 72 44 75 70 28 70 54 72 69  ite3ExprDup(pTri
5810: 67 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65  ggerStep->pWhere
5820: 29 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 20 20  ), orconf);.    
5830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5840: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 73 65 74  ddOp(v, OP_Reset
5850: 43 6f 75 6e 74 2c 20 31 2c 20 30 29 3b 0a 20 20  Count, 1, 0);.  
5860: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5870: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5880: 54 4b 5f 49 4e 53 45 52 54 3a 20 7b 0a 20 20 20  TK_INSERT: {.   
5890: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53       SrcList *pS
58a0: 72 63 3b 0a 20 20 20 20 20 20 20 20 70 53 72 63  rc;.        pSrc
58b0: 20 3d 20 74 61 72 67 65 74 53 72 63 4c 69 73 74   = targetSrcList
58c0: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
58d0: 72 53 74 65 70 29 3b 0a 20 20 20 20 20 20 20 20  rStep);.        
58e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
58f0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e  (v, OP_ResetCoun
5900: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
5910: 20 20 73 71 6c 69 74 65 33 49 6e 73 65 72 74 28    sqlite3Insert(
5920: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 0a 20 20  pParse, pSrc,.  
5930: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5940: 78 70 72 4c 69 73 74 44 75 70 28 70 54 72 69 67  xprListDup(pTrig
5950: 67 65 72 53 74 65 70 2d 3e 70 45 78 70 72 4c 69  gerStep->pExprLi
5960: 73 74 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  st), .          
5970: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
5980: 28 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70  (pTriggerStep->p
5990: 53 65 6c 65 63 74 29 2c 20 0a 20 20 20 20 20 20  Select), .      
59a0: 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
59b0: 74 44 75 70 28 70 54 72 69 67 67 65 72 53 74 65  tDup(pTriggerSte
59c0: 70 2d 3e 70 49 64 4c 69 73 74 29 2c 20 6f 72 63  p->pIdList), orc
59d0: 6f 6e 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71  onf);.        sq
59e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
59f0: 2c 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 2c  , OP_ResetCount,
5a00: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
5a10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5a20: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 44 45 4c       case TK_DEL
5a30: 45 54 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 53  ETE: {.        S
5a40: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
5a50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5a60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 73  eAddOp(v, OP_Res
5a70: 65 74 43 6f 75 6e 74 2c 20 30 2c 20 30 29 3b 0a  etCount, 0, 0);.
5a80: 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20 74          pSrc = t
5a90: 61 72 67 65 74 53 72 63 4c 69 73 74 28 70 50 61  argetSrcList(pPa
5aa0: 72 73 65 2c 20 70 54 72 69 67 67 65 72 53 74 65  rse, pTriggerSte
5ab0: 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
5ac0: 74 65 33 44 65 6c 65 74 65 46 72 6f 6d 28 70 50  te3DeleteFrom(pP
5ad0: 61 72 73 65 2c 20 70 53 72 63 2c 20 73 71 6c 69  arse, pSrc, sqli
5ae0: 74 65 33 45 78 70 72 44 75 70 28 70 54 72 69 67  te3ExprDup(pTrig
5af0: 67 65 72 53 74 65 70 2d 3e 70 57 68 65 72 65 29  gerStep->pWhere)
5b00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5b10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5b20: 50 5f 52 65 73 65 74 43 6f 75 6e 74 2c 20 31 2c  P_ResetCount, 1,
5b30: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
5b40: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5b50: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
5b60: 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
5b70: 20 20 7d 20 0a 20 20 20 20 70 54 72 69 67 67 65    } .    pTrigge
5b80: 72 53 74 65 70 20 3d 20 70 54 72 69 67 67 65 72  rStep = pTrigger
5b90: 53 74 65 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  Step->pNext;.  }
5ba0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5bb0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78  dOp(v, OP_Contex
5bc0: 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 56  tPop, 0, 0);.  V
5bd0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
5be0: 23 20 65 6e 64 20 74 72 69 67 67 65 72 20 25 73  # end trigger %s
5bf0: 22 2c 20 70 53 74 65 70 4c 69 73 74 2d 3e 70 54  ", pStepList->pT
5c00: 72 69 67 2d 3e 6e 61 6d 65 29 29 3b 0a 0a 20 20  rig->name));..  
5c10: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
5c20: 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
5c30: 64 20 74 6f 20 63 6f 64 65 20 46 4f 52 20 45 41  d to code FOR EA
5c40: 43 48 20 52 4f 57 20 74 72 69 67 67 65 72 73 2e  CH ROW triggers.
5c50: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
5c60: 63 6f 64 65 20 74 68 61 74 20 74 68 69 73 20 66  code that this f
5c70: 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65  unction generate
5c80: 73 20 69 73 20 65 78 65 63 75 74 65 64 2c 20 74  s is executed, t
5c90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  he following .**
5ca0: 20 6d 75 73 74 20 62 65 20 74 72 75 65 3a 0a 2a   must be true:.*
5cb0: 2a 0a 2a 2a 20 31 2e 20 4e 6f 20 63 75 72 73 6f  *.** 1. No curso
5cc0: 72 73 20 6d 61 79 20 62 65 20 6f 70 65 6e 20 69  rs may be open i
5cd0: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
5ce0: 61 73 65 2e 20 20 28 42 75 74 20 6e 65 77 49 64  ase.  (But newId
5cf0: 78 20 61 6e 64 20 6f 6c 64 49 64 78 0a 2a 2a 20  x and oldIdx.** 
5d00: 20 20 20 63 61 6e 20 62 65 20 69 6e 64 69 63 65     can be indice
5d10: 73 20 6f 66 20 63 75 72 73 6f 72 73 20 69 6e 20  s of cursors in 
5d20: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
5d30: 2e 20 20 53 65 65 20 62 65 6c 6f 77 2e 29 0a 2a  .  See below.).*
5d40: 2a 0a 2a 2a 20 32 2e 20 49 66 20 74 68 65 20 74  *.** 2. If the t
5d50: 72 69 67 67 65 72 73 20 62 65 69 6e 67 20 63 6f  riggers being co
5d60: 64 65 64 20 61 72 65 20 4f 4e 20 49 4e 53 45 52  ded are ON INSER
5d70: 54 20 6f 72 20 4f 4e 20 55 50 44 41 54 45 20 74  T or ON UPDATE t
5d80: 72 69 67 67 65 72 73 2c 20 74 68 65 6e 0a 2a 2a  riggers, then.**
5d90: 20 20 20 20 61 20 74 65 6d 70 6f 72 61 72 79 20      a temporary 
5da0: 76 64 62 65 20 63 75 72 73 6f 72 20 28 69 6e 64  vdbe cursor (ind
5db0: 65 78 20 6e 65 77 49 64 78 29 20 6d 75 73 74 20  ex newIdx) must 
5dc0: 62 65 20 6f 70 65 6e 20 61 6e 64 20 70 6f 69 6e  be open and poin
5dd0: 74 69 6e 67 20 61 74 0a 2a 2a 20 20 20 20 61 20  ting at.**    a 
5de0: 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  row containing v
5df0: 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62 73  alues to be subs
5e00: 74 69 74 75 74 65 64 20 66 6f 72 20 6e 65 77 2e  tituted for new.
5e10: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
5e20: 20 74 68 65 0a 2a 2a 20 20 20 20 74 72 69 67 67   the.**    trigg
5e30: 65 72 20 70 72 6f 67 72 61 6d 28 73 29 2e 0a 2a  er program(s)..*
5e40: 2a 0a 2a 2a 20 33 2e 20 49 66 20 74 68 65 20 74  *.** 3. If the t
5e50: 72 69 67 67 65 72 73 20 62 65 69 6e 67 20 63 6f  riggers being co
5e60: 64 65 64 20 61 72 65 20 4f 4e 20 44 45 4c 45 54  ded are ON DELET
5e70: 45 20 6f 72 20 4f 4e 20 55 50 44 41 54 45 20 74  E or ON UPDATE t
5e80: 72 69 67 67 65 72 73 2c 20 74 68 65 6e 0a 2a 2a  riggers, then.**
5e90: 20 20 20 20 61 20 74 65 6d 70 6f 72 61 72 79 20      a temporary 
5ea0: 76 64 62 65 20 63 75 72 73 6f 72 20 28 69 6e 64  vdbe cursor (ind
5eb0: 65 78 20 6f 6c 64 49 64 78 29 20 6d 75 73 74 20  ex oldIdx) must 
5ec0: 62 65 20 6f 70 65 6e 20 61 6e 64 20 70 6f 69 6e  be open and poin
5ed0: 74 69 6e 67 20 61 74 0a 2a 2a 20 20 20 20 61 20  ting at.**    a 
5ee0: 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76  row containing v
5ef0: 61 6c 75 65 73 20 74 6f 20 62 65 20 73 75 62 73  alues to be subs
5f00: 74 69 74 75 74 65 64 20 66 6f 72 20 6f 6c 64 2e  tituted for old.
5f10: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
5f20: 20 74 68 65 0a 2a 2a 20 20 20 20 74 72 69 67 67   the.**    trigg
5f30: 65 72 20 70 72 6f 67 72 61 6d 28 73 29 2e 0a 2a  er program(s)..*
5f40: 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
5f50: 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 0a  CodeRowTrigger(.
5f60: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5f70: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
5f80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
5f90: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
5fa0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55    /* One of TK_U
5fb0: 50 44 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54  PDATE, TK_INSERT
5fc0: 2c 20 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20  , TK_DELETE */. 
5fd0: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e   ExprList *pChan
5fe0: 67 65 73 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73  ges,  /* Changes
5ff0: 20 6c 69 73 74 20 66 6f 72 20 61 6e 79 20 55 50   list for any UP
6000: 44 41 54 45 20 4f 46 20 74 72 69 67 67 65 72 73  DATE OF triggers
6010: 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c   */.  int tr_tm,
6020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
6030: 65 20 6f 66 20 54 52 49 47 47 45 52 5f 42 45 46  e of TRIGGER_BEF
6040: 4f 52 45 2c 20 54 52 49 47 47 45 52 5f 41 46 54  ORE, TRIGGER_AFT
6050: 45 52 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ER */.  Table *p
6060: 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab,         /* 
6070: 54 68 65 20 74 61 62 6c 65 20 74 6f 20 63 6f 64  The table to cod
6080: 65 20 74 72 69 67 67 65 72 73 20 66 72 6f 6d 20  e triggers from 
6090: 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 49 64 78 2c  */.  int newIdx,
60a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
60b0: 20 69 6e 64 69 63 65 20 6f 66 20 74 68 65 20 22   indice of the "
60c0: 6e 65 77 22 20 72 6f 77 20 74 6f 20 61 63 63 65  new" row to acce
60d0: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 6c 64 49  ss */.  int oldI
60e0: 64 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx,          /* 
60f0: 54 68 65 20 69 6e 64 69 63 65 20 6f 66 20 74 68  The indice of th
6100: 65 20 22 6f 6c 64 22 20 72 6f 77 20 74 6f 20 61  e "old" row to a
6110: 63 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6f  ccess */.  int o
6120: 72 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20  rconf,          
6130: 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70  /* ON CONFLICT p
6140: 6f 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69  olicy */.  int i
6150: 67 6e 6f 72 65 4a 75 6d 70 20 20 20 20 20 20 20  gnoreJump       
6160: 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 74  /* Instruction t
6170: 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52 41  o jump to for RA
6180: 49 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a 29  ISE(IGNORE) */.)
6190: 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 3b 0a  {.  Trigger *p;.
61a0: 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20 74    TriggerStack t
61b0: 72 69 67 53 74 61 63 6b 45 6e 74 72 79 3b 0a 0a  rigStackEntry;..
61c0: 20 20 61 73 73 65 72 74 28 6f 70 20 3d 3d 20 54    assert(op == T
61d0: 4b 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 20 3d  K_UPDATE || op =
61e0: 3d 20 54 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  = TK_INSERT || o
61f0: 70 20 3d 3d 20 54 4b 5f 44 45 4c 45 54 45 29 3b  p == TK_DELETE);
6200: 0a 20 20 61 73 73 65 72 74 28 74 72 5f 74 6d 20  .  assert(tr_tm 
6210: 3d 3d 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52  == TRIGGER_BEFOR
6220: 45 20 7c 7c 20 74 72 5f 74 6d 20 3d 3d 20 54 52  E || tr_tm == TR
6230: 49 47 47 45 52 5f 41 46 54 45 52 20 29 3b 0a 0a  IGGER_AFTER );..
6240: 20 20 61 73 73 65 72 74 28 6e 65 77 49 64 78 20    assert(newIdx 
6250: 21 3d 20 2d 31 20 7c 7c 20 6f 6c 64 49 64 78 20  != -1 || oldIdx 
6260: 21 3d 20 2d 31 29 3b 0a 0a 20 20 66 6f 72 28 70  != -1);..  for(p
6270: 3d 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b  =pTab->pTrigger;
6280: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
6290: 0a 20 20 20 20 69 6e 74 20 66 69 72 65 5f 74 68  .    int fire_th
62a0: 69 73 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  is = 0;..    /* 
62b0: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
62c0: 72 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 64 65  r we should code
62d0: 20 74 68 69 73 20 74 72 69 67 67 65 72 20 2a 2f   this trigger */
62e0: 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20  .    if( .      
62f0: 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 0a 20 20  p->op==op && .  
6300: 20 20 20 20 70 2d 3e 74 72 5f 74 6d 3d 3d 74 72      p->tr_tm==tr
6310: 5f 74 6d 20 26 26 20 0a 20 20 20 20 20 20 28 70  _tm && .      (p
6320: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 2d 3e 70 54  ->pSchema==p->pT
6330: 61 62 53 63 68 65 6d 61 20 7c 7c 20 70 2d 3e 70  abSchema || p->p
6340: 53 63 68 65 6d 61 3d 3d 70 50 61 72 73 65 2d 3e  Schema==pParse->
6350: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
6360: 6d 61 29 20 26 26 0a 20 20 20 20 20 20 28 6f 70  ma) &&.      (op
6370: 21 3d 54 4b 5f 55 50 44 41 54 45 7c 7c 21 70 2d  !=TK_UPDATE||!p-
6380: 3e 70 43 6f 6c 75 6d 6e 73 7c 7c 63 68 65 63 6b  >pColumns||check
6390: 43 6f 6c 75 6d 6e 4f 76 65 72 4c 61 70 28 70 2d  ColumnOverLap(p-
63a0: 3e 70 43 6f 6c 75 6d 6e 73 2c 70 43 68 61 6e 67  >pColumns,pChang
63b0: 65 73 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  es)).    ){.    
63c0: 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a    TriggerStack *
63d0: 70 53 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  pS;      /* Poin
63e0: 74 65 72 20 74 6f 20 74 72 69 67 67 65 72 2d 73  ter to trigger-s
63f0: 74 61 63 6b 20 65 6e 74 72 79 20 2a 2f 0a 20 20  tack entry */.  
6400: 20 20 20 20 66 6f 72 28 70 53 3d 70 50 61 72 73      for(pS=pPars
6410: 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 20 70 53  e->trigStack; pS
6420: 20 26 26 20 70 21 3d 70 53 2d 3e 70 54 72 69 67   && p!=pS->pTrig
6430: 67 65 72 3b 20 70 53 3d 70 53 2d 3e 70 4e 65 78  ger; pS=pS->pNex
6440: 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 21  t){}.      if( !
6450: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 66 69  pS ){.        fi
6460: 72 65 5f 74 68 69 73 20 3d 20 31 3b 0a 20 20 20  re_this = 1;.   
6470: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20 20     }.    }. .   
6480: 20 69 66 28 20 66 69 72 65 5f 74 68 69 73 20 29   if( fire_this )
6490: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 54  {.      int endT
64a0: 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 45 78  rigger;.      Ex
64b0: 70 72 20 2a 20 77 68 65 6e 45 78 70 72 3b 0a 20  pr * whenExpr;. 
64c0: 20 20 20 20 20 41 75 74 68 43 6f 6e 74 65 78 74       AuthContext
64d0: 20 73 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20   sContext;.     
64e0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
64f0: 3b 0a 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ;..      memset(
6500: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
6510: 73 4e 43 29 29 3b 0a 20 20 20 20 20 20 73 4e 43  sNC));.      sNC
6520: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
6530: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 50 75 73 68  ;..      /* Push
6540: 20 61 6e 20 65 6e 74 72 79 20 6f 6e 20 74 6f 20   an entry on to 
6550: 74 68 65 20 74 72 69 67 67 65 72 20 73 74 61 63  the trigger stac
6560: 6b 20 2a 2f 0a 20 20 20 20 20 20 74 72 69 67 53  k */.      trigS
6570: 74 61 63 6b 45 6e 74 72 79 2e 70 54 72 69 67 67  tackEntry.pTrigg
6580: 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 74 72  er = p;.      tr
6590: 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 6e 65 77  igStackEntry.new
65a0: 49 64 78 20 3d 20 6e 65 77 49 64 78 3b 0a 20 20  Idx = newIdx;.  
65b0: 20 20 20 20 74 72 69 67 53 74 61 63 6b 45 6e 74      trigStackEnt
65c0: 72 79 2e 6f 6c 64 49 64 78 20 3d 20 6f 6c 64 49  ry.oldIdx = oldI
65d0: 64 78 3b 0a 20 20 20 20 20 20 74 72 69 67 53 74  dx;.      trigSt
65e0: 61 63 6b 45 6e 74 72 79 2e 70 54 61 62 20 3d 20  ackEntry.pTab = 
65f0: 70 54 61 62 3b 0a 20 20 20 20 20 20 74 72 69 67  pTab;.      trig
6600: 53 74 61 63 6b 45 6e 74 72 79 2e 70 4e 65 78 74  StackEntry.pNext
6610: 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53   = pParse->trigS
6620: 74 61 63 6b 3b 0a 20 20 20 20 20 20 74 72 69 67  tack;.      trig
6630: 53 74 61 63 6b 45 6e 74 72 79 2e 69 67 6e 6f 72  StackEntry.ignor
6640: 65 4a 75 6d 70 20 3d 20 69 67 6e 6f 72 65 4a 75  eJump = ignoreJu
6650: 6d 70 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  mp;.      pParse
6660: 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 26 74  ->trigStack = &t
6670: 72 69 67 53 74 61 63 6b 45 6e 74 72 79 3b 0a 20  rigStackEntry;. 
6680: 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68       sqlite3Auth
6690: 43 6f 6e 74 65 78 74 50 75 73 68 28 70 50 61 72  ContextPush(pPar
66a0: 73 65 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20 70  se, &sContext, p
66b0: 2d 3e 6e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20  ->name);..      
66c0: 2f 2a 20 63 6f 64 65 20 74 68 65 20 57 48 45 4e  /* code the WHEN
66d0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
66e0: 20 65 6e 64 54 72 69 67 67 65 72 20 3d 20 73 71   endTrigger = sq
66f0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
6700: 65 6c 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  el(pParse->pVdbe
6710: 29 3b 0a 20 20 20 20 20 20 77 68 65 6e 45 78 70  );.      whenExp
6720: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
6730: 75 70 28 70 2d 3e 70 57 68 65 6e 29 3b 0a 20 20  up(p->pWhen);.  
6740: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
6750: 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
6760: 26 73 4e 43 2c 20 77 68 65 6e 45 78 70 72 29 20  &sNC, whenExpr) 
6770: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
6780: 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 3d 20 74  e->trigStack = t
6790: 72 69 67 53 74 61 63 6b 45 6e 74 72 79 2e 70 4e  rigStackEntry.pN
67a0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ext;.        sql
67b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 77  ite3ExprDelete(w
67c0: 68 65 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  henExpr);.      
67d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
67e0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
67f0: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
6800: 72 73 65 2c 20 77 68 65 6e 45 78 70 72 2c 20 65  rse, whenExpr, e
6810: 6e 64 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20  ndTrigger, 1);. 
6820: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6830: 44 65 6c 65 74 65 28 77 68 65 6e 45 78 70 72 29  Delete(whenExpr)
6840: 3b 0a 0a 20 20 20 20 20 20 63 6f 64 65 54 72 69  ;..      codeTri
6850: 67 67 65 72 50 72 6f 67 72 61 6d 28 70 50 61 72  ggerProgram(pPar
6860: 73 65 2c 20 70 2d 3e 73 74 65 70 5f 6c 69 73 74  se, p->step_list
6870: 2c 20 6f 72 63 6f 6e 66 29 3b 20 0a 0a 20 20 20  , orconf); ..   
6880: 20 20 20 2f 2a 20 50 6f 70 20 74 68 65 20 65 6e     /* Pop the en
6890: 74 72 79 20 6f 66 66 20 74 68 65 20 74 72 69 67  try off the trig
68a0: 67 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20  ger stack */.   
68b0: 20 20 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53     pParse->trigS
68c0: 74 61 63 6b 20 3d 20 74 72 69 67 53 74 61 63 6b  tack = trigStack
68d0: 45 6e 74 72 79 2e 70 4e 65 78 74 3b 0a 20 20 20  Entry.pNext;.   
68e0: 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 6f     sqlite3AuthCo
68f0: 6e 74 65 78 74 50 6f 70 28 26 73 43 6f 6e 74 65  ntextPop(&sConte
6900: 78 74 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  xt);..      sqli
6910: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
6920: 62 65 6c 28 70 50 61 72 73 65 2d 3e 70 56 64 62  bel(pParse->pVdb
6930: 65 2c 20 65 6e 64 54 72 69 67 67 65 72 29 3b 0a  e, endTrigger);.
6940: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6950: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
6960: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
6970: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
6980: 2a 2f 0a                                         */.