/ Hex Artifact Content
Login

Artifact 2b0bdab4807cc0795afd8b7c88b503674994a43d:


0000: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  /*.**.** The aut
0010: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0020: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0030: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0040: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0050: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0060: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0070: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0080: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
0090: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00a0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00b0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00c0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00d0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00e0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
00f0: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0100: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0110: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  *.**.**.** $Id: 
0170: 74 72 69 67 67 65 72 2e 63 2c 76 20 31 2e 31 34  trigger.c,v 1.14
0180: 33 20 32 30 30 39 2f 30 38 2f 31 30 20 30 33 3a  3 2009/08/10 03:
0190: 35 37 3a 35 38 20 73 68 61 6e 65 20 45 78 70 20  57:58 shane Exp 
01a0: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
01b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66  qliteInt.h"..#if
01c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
01d0: 5f 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 44  _TRIGGER./*.** D
01e0: 65 6c 65 74 65 20 61 20 6c 69 6e 6b 65 64 20 6c  elete a linked l
01f0: 69 73 74 20 6f 66 20 54 72 69 67 67 65 72 53 74  ist of TriggerSt
0200: 65 70 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ep structures..*
0210: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
0220: 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28  leteTriggerStep(
0230: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 72 69  sqlite3 *db, Tri
0240: 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67  ggerStep *pTrigg
0250: 65 72 53 74 65 70 29 7b 0a 20 20 77 68 69 6c 65  erStep){.  while
0260: 28 20 70 54 72 69 67 67 65 72 53 74 65 70 20 29  ( pTriggerStep )
0270: 7b 0a 20 20 20 20 54 72 69 67 67 65 72 53 74 65  {.    TriggerSte
0280: 70 20 2a 20 70 54 6d 70 20 3d 20 70 54 72 69 67  p * pTmp = pTrig
0290: 67 65 72 53 74 65 70 3b 0a 20 20 20 20 70 54 72  gerStep;.    pTr
02a0: 69 67 67 65 72 53 74 65 70 20 3d 20 70 54 72 69  iggerStep = pTri
02b0: 67 67 65 72 53 74 65 70 2d 3e 70 4e 65 78 74 3b  ggerStep->pNext;
02c0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ..    sqlite3Exp
02d0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6d 70  rDelete(db, pTmp
02e0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73  ->pWhere);.    s
02f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
0300: 6c 65 74 65 28 64 62 2c 20 70 54 6d 70 2d 3e 70  lete(db, pTmp->p
0310: 45 78 70 72 4c 69 73 74 29 3b 0a 20 20 20 20 73  ExprList);.    s
0320: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
0330: 74 65 28 64 62 2c 20 70 54 6d 70 2d 3e 70 53 65  te(db, pTmp->pSe
0340: 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
0350: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
0360: 62 2c 20 70 54 6d 70 2d 3e 70 49 64 4c 69 73 74  b, pTmp->pIdList
0370: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 44  );..    sqlite3D
0380: 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b  bFree(db, pTmp);
0390: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
03a0: 76 65 6e 20 74 61 62 6c 65 20 70 54 61 62 2c 20  ven table pTab, 
03b0: 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66  return a list of
03c0: 20 61 6c 6c 20 74 68 65 20 74 72 69 67 67 65 72   all the trigger
03d0: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 0a 2a  s attached to .*
03e0: 2a 20 74 68 65 20 74 61 62 6c 65 2e 20 54 68 65  * the table. The
03f0: 20 6c 69 73 74 20 69 73 20 63 6f 6e 6e 65 63 74   list is connect
0400: 65 64 20 62 79 20 54 72 69 67 67 65 72 2e 70 4e  ed by Trigger.pN
0410: 65 78 74 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2a  ext pointers..**
0420: 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 74  .** All of the t
0430: 72 69 67 67 65 72 73 20 6f 6e 20 70 54 61 62 20  riggers on pTab 
0440: 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20  that are in the 
0450: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 61 73  same database as
0460: 20 70 54 61 62 0a 2a 2a 20 61 72 65 20 61 6c 72   pTab.** are alr
0470: 65 61 64 79 20 61 74 74 61 63 68 65 64 20 74 6f  eady attached to
0480: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 2e   pTab->pTrigger.
0490: 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68    But there migh
04a0: 74 20 62 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a  t be additional.
04b0: 2a 2a 20 74 72 69 67 67 65 72 73 20 6f 6e 20 70  ** triggers on p
04c0: 54 61 62 20 69 6e 20 74 68 65 20 54 45 4d 50 20  Tab in the TEMP 
04d0: 73 63 68 65 6d 61 2e 20 20 54 68 69 73 20 72 6f  schema.  This ro
04e0: 75 74 69 6e 65 20 70 72 65 70 65 6e 64 73 20 61  utine prepends a
04f0: 6c 6c 0a 2a 2a 20 54 45 4d 50 20 74 72 69 67 67  ll.** TEMP trigg
0500: 65 72 73 20 6f 6e 20 70 54 61 62 20 74 6f 20 74  ers on pTab to t
0510: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
0520: 74 68 65 20 70 54 61 62 2d 3e 70 54 72 69 67 67  the pTab->pTrigg
0530: 65 72 20 6c 69 73 74 0a 2a 2a 20 61 6e 64 20 72  er list.** and r
0540: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6d 62 69  eturns the combi
0550: 6e 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ned list..**.** 
0560: 54 6f 20 73 74 61 74 65 20 69 74 20 61 6e 6f 74  To state it anot
0570: 68 65 72 20 77 61 79 3a 20 20 54 68 69 73 20 72  her way:  This r
0580: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
0590: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 72 69   list of all tri
05a0: 67 67 65 72 73 0a 2a 2a 20 74 68 61 74 20 66 69  ggers.** that fi
05b0: 72 65 20 6f 66 66 20 6f 66 20 70 54 61 62 2e 20  re off of pTab. 
05c0: 20 54 68 65 20 6c 69 73 74 20 77 69 6c 6c 20 69   The list will i
05d0: 6e 63 6c 75 64 65 20 61 6e 79 20 54 45 4d 50 20  nclude any TEMP 
05e0: 74 72 69 67 67 65 72 73 20 6f 6e 0a 2a 2a 20 70  triggers on.** p
05f0: 54 61 62 20 61 73 20 77 65 6c 6c 20 61 73 20 74  Tab as well as t
0600: 68 65 20 74 72 69 67 67 65 72 73 20 6c 69 73 65  he triggers lise
0610: 64 20 69 6e 20 70 54 61 62 2d 3e 70 54 72 69 67  d in pTab->pTrig
0620: 67 65 72 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 20  ger..*/.Trigger 
0630: 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c  *sqlite3TriggerL
0640: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
0650: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
0660: 0a 20 20 53 63 68 65 6d 61 20 2a 20 63 6f 6e 73  .  Schema * cons
0670: 74 20 70 54 6d 70 53 63 68 65 6d 61 20 3d 20 70  t pTmpSchema = p
0680: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31  Parse->db->aDb[1
0690: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 54 72 69  ].pSchema;.  Tri
06a0: 67 67 65 72 20 2a 70 4c 69 73 74 20 3d 20 30 3b  gger *pList = 0;
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 72 69    /* List of tri
06d0: 67 67 65 72 73 20 74 6f 20 72 65 74 75 72 6e 20  ggers to return 
06e0: 2a 2f 0a 0a 20 20 69 66 28 20 70 54 6d 70 53 63  */..  if( pTmpSc
06f0: 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68  hema!=pTab->pSch
0700: 65 6d 61 20 29 7b 0a 20 20 20 20 48 61 73 68 45  ema ){.    HashE
0710: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
0720: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
0730: 74 28 26 70 54 6d 70 53 63 68 65 6d 61 2d 3e 74  t(&pTmpSchema->t
0740: 72 69 67 48 61 73 68 29 3b 20 70 3b 20 70 3d 73  rigHash); p; p=s
0750: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
0760: 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72  ){.      Trigger
0770: 20 2a 70 54 72 69 67 20 3d 20 28 54 72 69 67 67   *pTrig = (Trigg
0780: 65 72 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  er *)sqliteHashD
0790: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
07a0: 28 20 70 54 72 69 67 2d 3e 70 54 61 62 53 63 68  ( pTrig->pTabSch
07b0: 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
07c0: 6d 61 0a 20 20 20 20 20 20 20 26 26 20 30 3d 3d  ma.       && 0==
07d0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
07e0: 54 72 69 67 2d 3e 74 61 62 6c 65 2c 20 70 54 61  Trig->table, pTa
07f0: 62 2d 3e 7a 4e 61 6d 65 29 20 0a 20 20 20 20 20  b->zName) .     
0800: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69   ){.        pTri
0810: 67 2d 3e 70 4e 65 78 74 20 3d 20 28 70 4c 69 73  g->pNext = (pLis
0820: 74 20 3f 20 70 4c 69 73 74 20 3a 20 70 54 61 62  t ? pList : pTab
0830: 2d 3e 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  ->pTrigger);.   
0840: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 54 72       pList = pTr
0850: 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ig;.      }.    
0860: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
0870: 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 20 3a  (pList ? pList :
0880: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 29   pTab->pTrigger)
0890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
08a0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
08b0: 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20   parser when it 
08c0: 73 65 65 73 20 61 20 43 52 45 41 54 45 20 54 52  sees a CREATE TR
08d0: 49 47 47 45 52 20 73 74 61 74 65 6d 65 6e 74 0a  IGGER statement.
08e0: 2a 2a 20 75 70 20 74 6f 20 74 68 65 20 70 6f 69  ** up to the poi
08f0: 6e 74 20 6f 66 20 74 68 65 20 42 45 47 49 4e 20  nt of the BEGIN 
0900: 62 65 66 6f 72 65 20 74 68 65 20 74 72 69 67 67  before the trigg
0910: 65 72 20 61 63 74 69 6f 6e 73 2e 20 20 41 20 54  er actions.  A T
0920: 72 69 67 67 65 72 0a 2a 2a 20 73 74 72 75 63 74  rigger.** struct
0930: 75 72 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ure is generated
0940: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 69 6e   based on the in
0950: 66 6f 72 6d 61 74 69 6f 6e 20 61 76 61 69 6c 61  formation availa
0960: 62 6c 65 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a  ble and stored.*
0970: 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  * in pParse->pNe
0980: 77 54 72 69 67 67 65 72 2e 20 20 41 66 74 65 72  wTrigger.  After
0990: 20 74 68 65 20 74 72 69 67 67 65 72 20 61 63 74   the trigger act
09a0: 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 70  ions have been p
09b0: 61 72 73 65 64 2c 20 74 68 65 0a 2a 2a 20 73 71  arsed, the.** sq
09c0: 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67 67  lite3FinishTrigg
09d0: 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  er() function is
09e0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
09f0: 65 74 65 20 74 68 65 20 74 72 69 67 67 65 72 0a  ete the trigger.
0a00: 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  ** construction 
0a10: 70 72 6f 63 65 73 73 2e 0a 2a 2f 0a 76 6f 69 64  process..*/.void
0a20: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 69   sqlite3BeginTri
0a30: 67 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  gger(.  Parse *p
0a40: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
0a50: 68 65 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74  he parse context
0a60: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
0a70: 52 49 47 47 45 52 20 73 74 61 74 65 6d 65 6e 74  RIGGER statement
0a80: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
0a90: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
0aa0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 72 69   name of the tri
0ab0: 67 67 65 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  gger */.  Token 
0ac0: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a  *pName2,      /*
0ad0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
0ae0: 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 69 6e   trigger */.  in
0af0: 74 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20 20  t tr_tm,        
0b00: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 42    /* One of TK_B
0b10: 45 46 4f 52 45 2c 20 54 4b 5f 41 46 54 45 52 2c  EFORE, TK_AFTER,
0b20: 20 54 4b 5f 49 4e 53 54 45 41 44 20 2a 2f 0a 20   TK_INSTEAD */. 
0b30: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
0b40: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
0b50: 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 55 50 44  K_INSERT, TK_UPD
0b60: 41 54 45 2c 20 54 4b 5f 44 45 4c 45 54 45 20 2a  ATE, TK_DELETE *
0b70: 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c  /.  IdList *pCol
0b80: 75 6d 6e 73 2c 20 20 20 2f 2a 20 63 6f 6c 75 6d  umns,   /* colum
0b90: 6e 20 6c 69 73 74 20 69 66 20 74 68 69 73 20 69  n list if this i
0ba0: 73 20 61 6e 20 55 50 44 41 54 45 20 4f 46 20 74  s an UPDATE OF t
0bb0: 72 69 67 67 65 72 20 2a 2f 0a 20 20 53 72 63 4c  rigger */.  SrcL
0bc0: 69 73 74 20 2a 70 54 61 62 6c 65 4e 61 6d 65 2c  ist *pTableName,
0bd0: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  /* The name of t
0be0: 68 65 20 74 61 62 6c 65 2f 76 69 65 77 20 74 68  he table/view th
0bf0: 65 20 74 72 69 67 67 65 72 20 61 70 70 6c 69 65  e trigger applie
0c00: 73 20 74 6f 20 2a 2f 0a 20 20 45 78 70 72 20 2a  s to */.  Expr *
0c10: 70 57 68 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a  pWhen,        /*
0c20: 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
0c30: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
0c40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0c50: 20 74 68 65 20 54 45 4d 50 4f 52 41 52 59 20 6b   the TEMPORARY k
0c60: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
0c70: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  t */.  int noErr
0c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
0c90: 70 70 72 65 73 73 20 65 72 72 6f 72 73 20 69 66  ppress errors if
0ca0: 20 74 68 65 20 74 72 69 67 67 65 72 20 61 6c 72   the trigger alr
0cb0: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
0cc0: 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  {.  Trigger *pTr
0cd0: 69 67 67 65 72 20 3d 20 30 3b 20 20 2f 2a 20 54  igger = 0;  /* T
0ce0: 68 65 20 6e 65 77 20 74 72 69 67 67 65 72 20 2a  he new trigger *
0cf0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0d10: 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 74 72  able that the tr
0d20: 69 67 67 65 72 20 66 69 72 65 73 20 6f 66 66 20  igger fires off 
0d30: 6f 66 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  of */.  char *zN
0d40: 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ame = 0;        
0d50: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0d60: 72 69 67 67 65 72 20 2a 2f 0a 20 20 73 71 6c 69  rigger */.  sqli
0d70: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0d80: 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61  ->db;  /* The da
0d90: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
0da0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  n */.  int iDb; 
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0dc0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 74  * The database t
0dd0: 6f 20 73 74 6f 72 65 20 74 68 65 20 74 72 69 67  o store the trig
0de0: 67 65 72 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ger in */.  Toke
0df0: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 20 20 20  n *pName;       
0e00: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 71 75 61      /* The unqua
0e10: 6c 69 66 69 65 64 20 64 62 20 6e 61 6d 65 20 2a  lified db name *
0e20: 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
0e30: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
0e40: 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f 72 20  tate vector for 
0e50: 74 68 65 20 44 42 20 66 69 78 65 72 20 2a 2f 0a  the DB fixer */.
0e60: 20 20 69 6e 74 20 69 54 61 62 44 62 3b 20 20 20    int iTabDb;   
0e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0e80: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0e90: 73 65 20 68 6f 6c 64 69 6e 67 20 70 54 61 62 20  se holding pTab 
0ea0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  */..  assert( pN
0eb0: 61 6d 65 31 21 3d 30 20 29 3b 20 20 20 2f 2a 20  ame1!=0 );   /* 
0ec0: 70 4e 61 6d 65 31 2d 3e 7a 20 6d 69 67 68 74 20  pName1->z might 
0ed0: 62 65 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 6f 74  be NULL, but not
0ee0: 20 70 4e 61 6d 65 31 20 69 74 73 65 6c 66 20 2a   pName1 itself *
0ef0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  /.  assert( pNam
0f00: 65 32 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  e2!=0 );.  asser
0f10: 74 28 20 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54  t( op==TK_INSERT
0f20: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 44 41 54   || op==TK_UPDAT
0f30: 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45  E || op==TK_DELE
0f40: 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
0f50: 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78 66 66 20  op>0 && op<0xff 
0f60: 29 3b 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20  );.  if( isTemp 
0f70: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 54 45 4d  ){.    /* If TEM
0f80: 50 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c  P was specified,
0f90: 20 74 68 65 6e 20 74 68 65 20 74 72 69 67 67 65   then the trigge
0fa0: 72 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62  r name may not b
0fb0: 65 20 71 75 61 6c 69 66 69 65 64 2e 20 2a 2f 0a  e qualified. */.
0fc0: 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e      if( pName2->
0fd0: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  n>0 ){.      sql
0fe0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
0ff0: 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20  rse, "temporary 
1000: 74 72 69 67 67 65 72 20 6d 61 79 20 6e 6f 74 20  trigger may not 
1010: 68 61 76 65 20 71 75 61 6c 69 66 69 65 64 20 6e  have qualified n
1020: 61 6d 65 22 29 3b 0a 20 20 20 20 20 20 67 6f 74  ame");.      got
1030: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
1040: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 44 62  p;.    }.    iDb
1050: 20 3d 20 31 3b 0a 20 20 20 20 70 4e 61 6d 65 20   = 1;.    pName 
1060: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73  = pName1;.  }els
1070: 65 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  e{.    /* Figure
1080: 20 6f 75 74 20 74 68 65 20 64 62 20 74 68 61 74   out the db that
1090: 20 74 68 65 20 74 68 65 20 74 72 69 67 67 65 72   the the trigger
10a0: 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64   will be created
10b0: 20 69 6e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d   in */.    iDb =
10c0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
10d0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
10e0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
10f0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
1100: 3c 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  <0 ){.      goto
1110: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
1120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1130: 2a 20 49 66 20 74 68 65 20 74 72 69 67 67 65 72  * If the trigger
1140: 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
1150: 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 74  ified, and the t
1160: 61 62 6c 65 20 69 73 20 61 20 74 65 6d 70 20 74  able is a temp t
1170: 61 62 6c 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  able,.  ** then 
1180: 73 65 74 20 69 44 62 20 74 6f 20 31 20 74 6f 20  set iDb to 1 to 
1190: 63 72 65 61 74 65 20 74 68 65 20 74 72 69 67 67  create the trigg
11a0: 65 72 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  er in the tempor
11b0: 61 72 79 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ary database..  
11c0: 2a 2a 20 49 66 20 73 71 6c 69 74 65 33 53 72 63  ** If sqlite3Src
11d0: 4c 69 73 74 4c 6f 6f 6b 75 70 28 29 20 72 65 74  ListLookup() ret
11e0: 75 72 6e 73 20 30 2c 20 69 6e 64 69 63 61 74 69  urns 0, indicati
11f0: 6e 67 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65  ng the table doe
1200: 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 78 69 73 74  s not.  ** exist
1210: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 63  , the error is c
1220: 61 75 67 68 74 20 62 79 20 74 68 65 20 62 6c 6f  aught by the blo
1230: 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  ck below..  */. 
1240: 20 69 66 28 20 21 70 54 61 62 6c 65 4e 61 6d 65   if( !pTableName
1250: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1260: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1270: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
1280: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73  ;.  }.  pTab = s
1290: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
12a0: 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62  kup(pParse, pTab
12b0: 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  leName);.  if( p
12c0: 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
12d0: 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
12e0: 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
12f0: 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
1300: 69 44 62 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  iDb = 1;.  }..  
1310: 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 74 61  /* Ensure the ta
1320: 62 6c 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 73  ble name matches
1330: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 61   database name a
1340: 6e 64 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  nd that the tabl
1350: 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66  e exists */.  if
1360: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1370: 65 64 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65  ed ) goto trigge
1380: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 61 73 73  r_cleanup;.  ass
1390: 65 72 74 28 20 70 54 61 62 6c 65 4e 61 6d 65 2d  ert( pTableName-
13a0: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
13b0: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
13c0: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
13d0: 69 44 62 2c 20 22 74 72 69 67 67 65 72 22 2c 20  iDb, "trigger", 
13e0: 70 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20  pName) && .     
13f0: 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
1400: 73 74 28 26 73 46 69 78 2c 20 70 54 61 62 6c 65  st(&sFix, pTable
1410: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  Name) ){.    got
1420: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
1430: 70 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  p;.  }.  pTab = 
1440: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
1450: 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61  okup(pParse, pTa
1460: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  bleName);.  if( 
1470: 21 70 54 61 62 20 29 7b 0a 20 20 20 20 2f 2a 20  !pTab ){.    /* 
1480: 54 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e  The table does n
1490: 6f 74 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20  ot exist. */.   
14a0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44   if( db->init.iD
14b0: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b==1 ){.      /*
14c0: 20 54 69 63 6b 65 74 20 23 33 38 31 30 2e 0a 20   Ticket #3810.. 
14d0: 20 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79       ** Normally
14e0: 2c 20 77 68 65 6e 65 76 65 72 20 61 20 74 61 62  , whenever a tab
14f0: 6c 65 20 69 73 20 64 72 6f 70 70 65 64 2c 20 61  le is dropped, a
1500: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 74 72  ll associated tr
1510: 69 67 67 65 72 73 20 61 72 65 0a 20 20 20 20 20  iggers are.     
1520: 20 2a 2a 20 64 72 6f 70 70 65 64 20 74 6f 6f 2e   ** dropped too.
1530: 20 20 42 75 74 20 69 66 20 61 20 54 45 4d 50 20    But if a TEMP 
1540: 74 72 69 67 67 65 72 20 69 73 20 63 72 65 61 74  trigger is creat
1550: 65 64 20 6f 6e 20 61 20 6e 6f 6e 2d 54 45 4d 50  ed on a non-TEMP
1560: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
1570: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69 73  and the table is
1580: 20 64 72 6f 70 70 65 64 20 62 79 20 61 20 64 69   dropped by a di
1590: 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73 65  fferent database
15a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 74 68 65   connection, the
15b0: 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65  .      ** trigge
15c0: 72 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65  r is not visible
15d0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74   connection that
15f0: 20 64 6f 65 73 20 74 68 65 0a 20 20 20 20 20 20   does the.      
1600: 2a 2a 20 64 72 6f 70 20 73 6f 20 74 68 65 20 74  ** drop so the t
1610: 72 69 67 67 65 72 20 63 61 6e 6e 6f 74 20 62 65  rigger cannot be
1620: 20 64 72 6f 70 70 65 64 2e 20 20 54 68 69 73 20   dropped.  This 
1630: 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 20 20  results in an.  
1640: 20 20 20 20 2a 2a 20 22 6f 72 70 68 61 6e 65 64      ** "orphaned
1650: 20 74 72 69 67 67 65 72 22 20 2d 20 61 20 74 72   trigger" - a tr
1660: 69 67 67 65 72 20 77 68 6f 73 65 20 61 73 73 6f  igger whose asso
1670: 63 69 61 74 65 64 20 74 61 62 6c 65 20 69 73 20  ciated table is 
1680: 6d 69 73 73 69 6e 67 2e 0a 20 20 20 20 20 20 2a  missing..      *
1690: 2f 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74  /.      db->init
16a0: 2e 6f 72 70 68 61 6e 54 72 69 67 67 65 72 20 3d  .orphanTrigger =
16b0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f   1;.    }.    go
16c0: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
16d0: 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73  up;.  }.  if( Is
16e0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
16f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1700: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
1710: 6e 6e 6f 74 20 63 72 65 61 74 65 20 74 72 69 67  nnot create trig
1720: 67 65 72 73 20 6f 6e 20 76 69 72 74 75 61 6c 20  gers on virtual 
1730: 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 67 6f  tables");.    go
1740: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
1750: 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  up;.  }..  /* Ch
1760: 65 63 6b 20 74 68 61 74 20 74 68 65 20 74 72 69  eck that the tri
1770: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 6e 6f 74  gger name is not
1780: 20 72 65 73 65 72 76 65 64 20 61 6e 64 20 74 68   reserved and th
1790: 61 74 20 6e 6f 20 74 72 69 67 67 65 72 20 6f 66  at no trigger of
17a0: 20 74 68 65 0a 20 20 2a 2a 20 73 70 65 63 69 66   the.  ** specif
17b0: 69 65 64 20 6e 61 6d 65 20 65 78 69 73 74 73 20  ied name exists 
17c0: 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
17d0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
17e0: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
17f0: 69 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 53 51  if( !zName || SQ
1800: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1810: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
1820: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
1830: 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  {.    goto trigg
1840: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
1850: 20 20 69 66 28 20 73 71 6c 69 74 65 33 48 61 73    if( sqlite3Has
1860: 68 46 69 6e 64 28 26 28 64 62 2d 3e 61 44 62 5b  hFind(&(db->aDb[
1870: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72  iDb].pSchema->tr
1880: 69 67 48 61 73 68 29 2c 0a 20 20 20 20 20 20 20  igHash),.       
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
18a0: 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
18b0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 29 20 29 7b  len30(zName)) ){
18c0: 0a 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20  .    if( !noErr 
18d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18f0: 20 22 74 72 69 67 67 65 72 20 25 54 20 61 6c 72   "trigger %T alr
1900: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
1910: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
1920: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
1930: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  anup;.  }..  /* 
1940: 44 6f 20 6e 6f 74 20 63 72 65 61 74 65 20 61 20  Do not create a 
1950: 74 72 69 67 67 65 72 20 6f 6e 20 61 20 73 79 73  trigger on a sys
1960: 74 65 6d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  tem table */.  i
1970: 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
1980: 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
1990: 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
19a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
19b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
19c0: 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74  "cannot create t
19d0: 72 69 67 67 65 72 20 6f 6e 20 73 79 73 74 65 6d  rigger on system
19e0: 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 70 50   table");.    pP
19f0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
1a00: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
1a10: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  leanup;.  }..  /
1a20: 2a 20 49 4e 53 54 45 41 44 20 6f 66 20 74 72 69  * INSTEAD of tri
1a30: 67 67 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 66  ggers are only f
1a40: 6f 72 20 76 69 65 77 73 20 61 6e 64 20 76 69 65  or views and vie
1a50: 77 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  ws only support 
1a60: 49 4e 53 54 45 41 44 0a 20 20 2a 2a 20 6f 66 20  INSTEAD.  ** of 
1a70: 74 72 69 67 67 65 72 73 2e 0a 20 20 2a 2f 0a 20  triggers..  */. 
1a80: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
1a90: 63 74 20 26 26 20 74 72 5f 74 6d 21 3d 54 4b 5f  ct && tr_tm!=TK_
1aa0: 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73  INSTEAD ){.    s
1ab0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ac0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63  Parse, "cannot c
1ad0: 72 65 61 74 65 20 25 73 20 74 72 69 67 67 65 72  reate %s trigger
1ae0: 20 6f 6e 20 76 69 65 77 3a 20 25 53 22 2c 20 0a   on view: %S", .
1af0: 20 20 20 20 20 20 20 20 28 74 72 5f 74 6d 20 3d          (tr_tm =
1b00: 3d 20 54 4b 5f 42 45 46 4f 52 45 29 3f 22 42 45  = TK_BEFORE)?"BE
1b10: 46 4f 52 45 22 3a 22 41 46 54 45 52 22 2c 20 70  FORE":"AFTER", p
1b20: 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a 20  TableName, 0);. 
1b30: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
1b40: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69  cleanup;.  }.  i
1b50: 66 28 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63  f( !pTab->pSelec
1b60: 74 20 26 26 20 74 72 5f 74 6d 3d 3d 54 4b 5f 49  t && tr_tm==TK_I
1b70: 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73 71  NSTEAD ){.    sq
1b80: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b90: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72  arse, "cannot cr
1ba0: 65 61 74 65 20 49 4e 53 54 45 41 44 20 4f 46 22  eate INSTEAD OF"
1bb0: 0a 20 20 20 20 20 20 20 20 22 20 74 72 69 67 67  .        " trigg
1bc0: 65 72 20 6f 6e 20 74 61 62 6c 65 3a 20 25 53 22  er on table: %S"
1bd0: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29  , pTableName, 0)
1be0: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  ;.    goto trigg
1bf0: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
1c00: 20 20 69 54 61 62 44 62 20 3d 20 73 71 6c 69 74    iTabDb = sqlit
1c10: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
1c20: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1c30: 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
1c40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1c50: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
1c60: 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
1c70: 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 3b  _CREATE_TRIGGER;
1c80: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1c90: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
1ca0: 54 61 62 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  TabDb].zName;.  
1cb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1cc0: 62 54 72 69 67 20 3d 20 69 73 54 65 6d 70 20 3f  bTrig = isTemp ?
1cd0: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d   db->aDb[1].zNam
1ce0: 65 20 3a 20 7a 44 62 3b 0a 20 20 20 20 69 66 28  e : zDb;.    if(
1cf0: 20 69 54 61 62 44 62 3d 3d 31 20 7c 7c 20 69 73   iTabDb==1 || is
1d00: 54 65 6d 70 20 29 20 63 6f 64 65 20 3d 20 53 51  Temp ) code = SQ
1d10: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
1d20: 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 69 66  _TRIGGER;.    if
1d30: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1d40: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
1d50: 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
1d60: 61 6d 65 2c 20 7a 44 62 54 72 69 67 29 20 29 7b  ame, zDbTrig) ){
1d70: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67  .      goto trig
1d80: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ger_cleanup;.   
1d90: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
1da0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1db0: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
1dc0: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
1dd0: 69 54 61 62 44 62 29 2c 30 2c 7a 44 62 29 29 7b  iTabDb),0,zDb)){
1de0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67  .      goto trig
1df0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ger_cleanup;.   
1e00: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1e10: 20 2f 2a 20 49 4e 53 54 45 41 44 20 4f 46 20 74   /* INSTEAD OF t
1e20: 72 69 67 67 65 72 73 20 63 61 6e 20 6f 6e 6c 79  riggers can only
1e30: 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65 77 73   appear on views
1e40: 20 61 6e 64 20 42 45 46 4f 52 45 20 74 72 69 67   and BEFORE trig
1e50: 67 65 72 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74  gers.  ** cannot
1e60: 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65 77 73   appear on views
1e70: 2e 20 20 53 6f 20 77 65 20 6d 69 67 68 74 20 61  .  So we might a
1e80: 73 20 77 65 6c 6c 20 74 72 61 6e 73 6c 61 74 65  s well translate
1e90: 20 65 76 65 72 79 0a 20 20 2a 2a 20 49 4e 53 54   every.  ** INST
1ea0: 45 41 44 20 4f 46 20 74 72 69 67 67 65 72 20 69  EAD OF trigger i
1eb0: 6e 74 6f 20 61 20 42 45 46 4f 52 45 20 74 72 69  nto a BEFORE tri
1ec0: 67 67 65 72 2e 20 20 49 74 20 73 69 6d 70 6c 69  gger.  It simpli
1ed0: 66 69 65 73 20 63 6f 64 65 0a 20 20 2a 2a 20 65  fies code.  ** e
1ee0: 6c 73 65 77 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  lsewhere..  */. 
1ef0: 20 69 66 20 28 74 72 5f 74 6d 20 3d 3d 20 54 4b   if (tr_tm == TK
1f00: 5f 49 4e 53 54 45 41 44 29 7b 0a 20 20 20 20 74  _INSTEAD){.    t
1f10: 72 5f 74 6d 20 3d 20 54 4b 5f 42 45 46 4f 52 45  r_tm = TK_BEFORE
1f20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c  ;.  }..  /* Buil
1f30: 64 20 74 68 65 20 54 72 69 67 67 65 72 20 6f 62  d the Trigger ob
1f40: 6a 65 63 74 20 2a 2f 0a 20 20 70 54 72 69 67 67  ject */.  pTrigg
1f50: 65 72 20 3d 20 28 54 72 69 67 67 65 72 2a 29 73  er = (Trigger*)s
1f60: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1f70: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72  ro(db, sizeof(Tr
1f80: 69 67 67 65 72 29 29 3b 0a 20 20 69 66 28 20 70  igger));.  if( p
1f90: 54 72 69 67 67 65 72 3d 3d 30 20 29 20 67 6f 74  Trigger==0 ) got
1fa0: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
1fb0: 70 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 7a  p;.  pTrigger->z
1fc0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
1fd0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 72  zName = 0;.  pTr
1fe0: 69 67 67 65 72 2d 3e 74 61 62 6c 65 20 3d 20 73  igger->table = s
1ff0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
2000: 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 61  b, pTableName->a
2010: 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 70 54  [0].zName);.  pT
2020: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 20  rigger->pSchema 
2030: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
2040: 53 63 68 65 6d 61 3b 0a 20 20 70 54 72 69 67 67  Schema;.  pTrigg
2050: 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 3d  er->pTabSchema =
2060: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a   pTab->pSchema;.
2070: 20 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 20 3d    pTrigger->op =
2080: 20 28 75 38 29 6f 70 3b 0a 20 20 70 54 72 69 67   (u8)op;.  pTrig
2090: 67 65 72 2d 3e 74 72 5f 74 6d 20 3d 20 74 72 5f  ger->tr_tm = tr_
20a0: 74 6d 3d 3d 54 4b 5f 42 45 46 4f 52 45 20 3f 20  tm==TK_BEFORE ? 
20b0: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 3a  TRIGGER_BEFORE :
20c0: 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 3b 0a   TRIGGER_AFTER;.
20d0: 20 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65    pTrigger->pWhe
20e0: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
20f0: 75 70 28 64 62 2c 20 70 57 68 65 6e 2c 20 45 58  up(db, pWhen, EX
2100: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
2110: 20 70 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75   pTrigger->pColu
2120: 6d 6e 73 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  mns = sqlite3IdL
2130: 69 73 74 44 75 70 28 64 62 2c 20 70 43 6f 6c 75  istDup(db, pColu
2140: 6d 6e 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mns);.  assert( 
2150: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
2160: 67 65 72 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72  ger==0 );.  pPar
2170: 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20  se->pNewTrigger 
2180: 3d 20 70 54 72 69 67 67 65 72 3b 0a 0a 74 72 69  = pTrigger;..tri
2190: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  gger_cleanup:.  
21a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
21b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
21c0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
21d0: 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29  (db, pTableName)
21e0: 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
21f0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  tDelete(db, pCol
2200: 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  umns);.  sqlite3
2210: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
2220: 57 68 65 6e 29 3b 0a 20 20 69 66 28 20 21 70 50  When);.  if( !pP
2230: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
2240: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
2250: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62  DeleteTrigger(db
2260: 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 7d  , pTrigger);.  }
2270: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2280: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72  ( pParse->pNewTr
2290: 69 67 67 65 72 3d 3d 70 54 72 69 67 67 65 72 20  igger==pTrigger 
22a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
22b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
22c0: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c  called after all
22d0: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
22e0: 61 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65  actions have bee
22f0: 6e 20 70 61 72 73 65 64 0a 2a 2a 20 69 6e 20 6f  n parsed.** in o
2300: 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
2310: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
2320: 62 75 69 6c 64 69 6e 67 20 74 68 65 20 74 72 69  building the tri
2330: 67 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gger..*/.void sq
2340: 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67 67  lite3FinishTrigg
2350: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
2360: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
2370: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
2380: 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  */.  TriggerStep
2390: 20 2a 70 53 74 65 70 4c 69 73 74 2c 20 2f 2a 20   *pStepList, /* 
23a0: 54 68 65 20 74 72 69 67 67 65 72 65 64 20 70 72  The triggered pr
23b0: 6f 67 72 61 6d 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ogram */.  Token
23c0: 20 2a 70 41 6c 6c 20 20 20 20 20 20 20 20 20 20   *pAll          
23d0: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 68 61 74     /* Token that
23e0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63   describes the c
23f0: 6f 6d 70 6c 65 74 65 20 43 52 45 41 54 45 20 54  omplete CREATE T
2400: 52 49 47 47 45 52 20 2a 2f 0a 29 7b 0a 20 20 54  RIGGER */.){.  T
2410: 72 69 67 67 65 72 20 2a 70 54 72 69 67 20 3d 20  rigger *pTrig = 
2420: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
2430: 67 65 72 3b 20 20 20 20 2f 2a 20 54 72 69 67 67  ger;    /* Trigg
2440: 65 72 20 62 65 69 6e 67 20 66 69 6e 69 73 68 65  er being finishe
2450: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
2460: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67  /* Name of trigg
2490: 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
24a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
24b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24c0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
24d0: 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46   */.  DbFixer sF
24e0: 69 78 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  ix;.  int iDb;  
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2510: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * Database conta
2520: 69 6e 69 6e 67 20 74 68 65 20 74 72 69 67 67 65  ining the trigge
2530: 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 6e 61 6d  r */.  Token nam
2540: 65 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20  eToken;         
2550: 20 20 2f 2a 20 54 72 69 67 67 65 72 20 6e 61 6d    /* Trigger nam
2560: 65 20 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f  e for error repo
2570: 72 74 69 6e 67 20 2a 2f 0a 0a 20 20 70 54 72 69  rting */..  pTri
2580: 67 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  g = pParse->pNew
2590: 54 72 69 67 67 65 72 3b 0a 20 20 70 50 61 72 73  Trigger;.  pPars
25a0: 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20 3d  e->pNewTrigger =
25b0: 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   0;.  if( NEVER(
25c0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 29 20 7c 7c  pParse->nErr) ||
25d0: 20 21 70 54 72 69 67 20 29 20 67 6f 74 6f 20 74   !pTrig ) goto t
25e0: 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65  riggerfinish_cle
25f0: 61 6e 75 70 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  anup;.  zName = 
2600: 70 54 72 69 67 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTrig->zName;.  
2610: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2620: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
2630: 65 2d 3e 64 62 2c 20 70 54 72 69 67 2d 3e 70 53  e->db, pTrig->pS
2640: 63 68 65 6d 61 29 3b 0a 20 20 70 54 72 69 67 2d  chema);.  pTrig-
2650: 3e 73 74 65 70 5f 6c 69 73 74 20 3d 20 70 53 74  >step_list = pSt
2660: 65 70 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  epList;.  while(
2670: 20 70 53 74 65 70 4c 69 73 74 20 29 7b 0a 20 20   pStepList ){.  
2680: 20 20 70 53 74 65 70 4c 69 73 74 2d 3e 70 54 72    pStepList->pTr
2690: 69 67 20 3d 20 70 54 72 69 67 3b 0a 20 20 20 20  ig = pTrig;.    
26a0: 70 53 74 65 70 4c 69 73 74 20 3d 20 70 53 74 65  pStepList = pSte
26b0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
26c0: 7d 0a 20 20 6e 61 6d 65 54 6f 6b 65 6e 2e 7a 20  }.  nameToken.z 
26d0: 3d 20 70 54 72 69 67 2d 3e 7a 4e 61 6d 65 3b 0a  = pTrig->zName;.
26e0: 20 20 6e 61 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20    nameToken.n = 
26f0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2700: 6e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  nameToken.z);.  
2710: 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
2720: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
2730: 2c 20 69 44 62 2c 20 22 74 72 69 67 67 65 72 22  , iDb, "trigger"
2740: 2c 20 26 6e 61 6d 65 54 6f 6b 65 6e 29 20 0a 20  , &nameToken) . 
2750: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
2760: 74 65 33 46 69 78 54 72 69 67 67 65 72 53 74 65  te3FixTriggerSte
2770: 70 28 26 73 46 69 78 2c 20 70 54 72 69 67 2d 3e  p(&sFix, pTrig->
2780: 73 74 65 70 5f 6c 69 73 74 29 20 29 7b 0a 20 20  step_list) ){.  
2790: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69    goto triggerfi
27a0: 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  nish_cleanup;.  
27b0: 7d 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 72  }..  /* if we ar
27c0: 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  e not initializi
27d0: 6e 67 2c 20 61 6e 64 20 74 68 69 73 20 74 72 69  ng, and this tri
27e0: 67 67 65 72 20 69 73 20 6e 6f 74 20 6f 6e 20 61  gger is not on a
27f0: 20 54 45 4d 50 20 74 61 62 6c 65 2c 20 0a 20 20   TEMP table, .  
2800: 2a 2a 20 62 75 69 6c 64 20 74 68 65 20 73 71 6c  ** build the sql
2810: 69 74 65 5f 6d 61 73 74 65 72 20 65 6e 74 72 79  ite_master entry
2820: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
2830: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
2840: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
2850: 68 61 72 20 2a 7a 3b 0a 0a 20 20 20 20 2f 2a 20  har *z;..    /* 
2860: 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  Make an entry in
2870: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
2880: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
2890: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
28a0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
28b0: 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
28c0: 74 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c  triggerfinish_cl
28d0: 65 61 6e 75 70 3b 0a 20 20 20 20 73 71 6c 69 74  eanup;.    sqlit
28e0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
28f0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
2900: 20 69 44 62 29 3b 0a 20 20 20 20 7a 20 3d 20 73   iDb);.    z = s
2910: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
2920: 64 62 2c 20 28 63 68 61 72 2a 29 70 41 6c 6c 2d  db, (char*)pAll-
2930: 3e 7a 2c 20 70 41 6c 6c 2d 3e 6e 29 3b 0a 20 20  >z, pAll->n);.  
2940: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
2950: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
2960: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
2970: 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 74   %Q.%s VALUES('t
2980: 72 69 67 67 65 72 27 2c 25 51 2c 25 51 2c 30 2c  rigger',%Q,%Q,0,
2990: 27 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20  'CREATE TRIGGER 
29a0: 25 71 27 29 22 2c 0a 20 20 20 20 20 20 20 64 62  %q')",.       db
29b0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
29c0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
29d0: 44 62 29 2c 20 7a 4e 61 6d 65 2c 0a 20 20 20 20  Db), zName,.    
29e0: 20 20 20 70 54 72 69 67 2d 3e 74 61 62 6c 65 2c     pTrig->table,
29f0: 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
2a00: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
2a10: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
2a20: 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
2a30: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
2a40: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2a50: 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
2a60: 62 2c 20 30 2c 20 30 2c 20 73 71 6c 69 74 65 33  b, 0, 0, sqlite3
2a70: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
2a80: 20 64 62 2c 20 22 74 79 70 65 3d 27 74 72 69 67   db, "type='trig
2a90: 67 65 72 27 20 41 4e 44 20 6e 61 6d 65 3d 27 25  ger' AND name='%
2aa0: 71 27 22 2c 20 7a 4e 61 6d 65 29 2c 20 50 34 5f  q'", zName), P4_
2ab0: 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20  DYNAMIC.    );. 
2ac0: 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   }..  if( db->in
2ad0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54  it.busy ){.    T
2ae0: 72 69 67 67 65 72 20 2a 70 4c 69 6e 6b 20 3d 20  rigger *pLink = 
2af0: 70 54 72 69 67 3b 0a 20 20 20 20 48 61 73 68 20  pTrig;.    Hash 
2b00: 2a 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44  *pHash = &db->aD
2b10: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
2b20: 74 72 69 67 48 61 73 68 3b 0a 20 20 20 20 70 54  trigHash;.    pT
2b30: 72 69 67 20 3d 20 73 71 6c 69 74 65 33 48 61 73  rig = sqlite3Has
2b40: 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a  hInsert(pHash, z
2b50: 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
2b60: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 70 54  len30(zName), pT
2b70: 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 70 54  rig);.    if( pT
2b80: 72 69 67 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  rig ){.      db-
2b90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
2ba0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
2bb0: 20 70 4c 69 6e 6b 2d 3e 70 53 63 68 65 6d 61 3d   pLink->pSchema=
2bc0: 3d 70 4c 69 6e 6b 2d 3e 70 54 61 62 53 63 68 65  =pLink->pTabSche
2bd0: 6d 61 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  ma ){.      Tabl
2be0: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
2bf0: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
2c00: 72 6c 65 6e 33 30 28 70 4c 69 6e 6b 2d 3e 74 61  rlen30(pLink->ta
2c10: 62 6c 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  ble);.      pTab
2c20: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
2c30: 6e 64 28 26 70 4c 69 6e 6b 2d 3e 70 54 61 62 53  nd(&pLink->pTabS
2c40: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
2c50: 70 4c 69 6e 6b 2d 3e 74 61 62 6c 65 2c 20 6e 29  pLink->table, n)
2c60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2c70: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
2c80: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLink->pNext = 
2c90: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
2ca0: 20 20 20 20 20 20 70 54 61 62 2d 3e 70 54 72 69        pTab->pTri
2cb0: 67 67 65 72 20 3d 20 70 4c 69 6e 6b 3b 0a 20 20  gger = pLink;.  
2cc0: 20 20 7d 0a 20 20 7d 0a 0a 74 72 69 67 67 65 72    }.  }..trigger
2cd0: 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3a 0a  finish_cleanup:.
2ce0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
2cf0: 72 69 67 67 65 72 28 64 62 2c 20 70 54 72 69 67  rigger(db, pTrig
2d00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  );.  assert( !pP
2d10: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
2d20: 72 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  r );.  sqlite3De
2d30: 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28  leteTriggerStep(
2d40: 64 62 2c 20 70 53 74 65 70 4c 69 73 74 29 3b 0a  db, pStepList);.
2d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  }../*.** Turn a 
2d60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2d70: 20 28 74 68 61 74 20 74 68 65 20 70 53 65 6c 65   (that the pSele
2d80: 63 74 20 70 61 72 61 6d 65 74 65 72 20 70 6f 69  ct parameter poi
2d90: 6e 74 73 20 74 6f 29 20 69 6e 74 6f 0a 2a 2a 20  nts to) into.** 
2da0: 61 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20  a trigger step. 
2db0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
2dc0: 72 20 74 6f 20 61 20 54 72 69 67 67 65 72 53 74  r to a TriggerSt
2dd0: 65 70 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ep structure..**
2de0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
2df0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
2e00: 65 20 77 68 65 6e 20 69 74 20 66 69 6e 64 73 20  e when it finds 
2e10: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2e20: 6e 74 20 69 6e 0a 2a 2a 20 62 6f 64 79 20 6f 66  nt in.** body of
2e30: 20 61 20 54 52 49 47 47 45 52 2e 20 20 0a 2a 2f   a TRIGGER.  .*/
2e40: 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a 73 71  .TriggerStep *sq
2e50: 6c 69 74 65 33 54 72 69 67 67 65 72 53 65 6c 65  lite3TriggerSele
2e60: 63 74 53 74 65 70 28 73 71 6c 69 74 65 33 20 2a  ctStep(sqlite3 *
2e70: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  db, Select *pSel
2e80: 65 63 74 29 7b 0a 20 20 54 72 69 67 67 65 72 53  ect){.  TriggerS
2e90: 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65  tep *pTriggerSte
2ea0: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
2eb0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
2ec0: 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29 29  of(TriggerStep))
2ed0: 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72  ;.  if( pTrigger
2ee0: 53 74 65 70 3d 3d 30 20 29 20 7b 0a 20 20 20 20  Step==0 ) {.    
2ef0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
2f00: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
2f10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2f20: 20 20 7d 0a 20 20 70 54 72 69 67 67 65 72 53 74    }.  pTriggerSt
2f30: 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45  ep->op = TK_SELE
2f40: 43 54 3b 0a 20 20 70 54 72 69 67 67 65 72 53 74  CT;.  pTriggerSt
2f50: 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53  ep->pSelect = pS
2f60: 65 6c 65 63 74 3b 0a 20 20 70 54 72 69 67 67 65  elect;.  pTrigge
2f70: 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20  rStep->orconf = 
2f80: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 72 65  OE_Default;.  re
2f90: 74 75 72 6e 20 70 54 72 69 67 67 65 72 53 74 65  turn pTriggerSte
2fa0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  p;.}../*.** Allo
2fb0: 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 68 6f  cate space to ho
2fc0: 6c 64 20 61 20 6e 65 77 20 74 72 69 67 67 65 72  ld a new trigger
2fd0: 20 73 74 65 70 2e 20 20 54 68 65 20 61 6c 6c 6f   step.  The allo
2fe0: 63 61 74 65 64 20 73 70 61 63 65 0a 2a 2a 20 68  cated space.** h
2ff0: 6f 6c 64 73 20 62 6f 74 68 20 74 68 65 20 54 72  olds both the Tr
3000: 69 67 67 65 72 53 74 65 70 20 6f 62 6a 65 63 74  iggerStep object
3010: 20 61 6e 64 20 74 68 65 20 54 72 69 67 67 65 72   and the Trigger
3020: 53 74 65 70 2e 74 61 72 67 65 74 2e 7a 20 73 74  Step.target.z st
3030: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ring..**.** If a
3040: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
3050: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
3060: 72 6e 65 64 20 61 6e 64 20 64 62 2d 3e 6d 61 6c  rned and db->mal
3070: 6c 6f 63 46 61 69 6c 65 64 20 69 73 20 73 65 74  locFailed is set
3080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 67  ..*/.static Trig
3090: 67 65 72 53 74 65 70 20 2a 74 72 69 67 67 65 72  gerStep *trigger
30a0: 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 0a 20 20  StepAllocate(.  
30b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
30d0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
30e0: 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20 20  on */.  u8 op,  
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 6f      /* Trigger o
3110: 70 63 6f 64 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  pcode */.  Token
3120: 20 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20   *pName         
3130: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
3140: 72 67 65 74 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a  rget name */.){.
3150: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70    TriggerStep *p
3160: 54 72 69 67 67 65 72 53 74 65 70 3b 0a 0a 20 20  TriggerStep;..  
3170: 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 73  pTriggerStep = s
3180: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
3190: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72  ro(db, sizeof(Tr
31a0: 69 67 67 65 72 53 74 65 70 29 20 2b 20 70 4e 61  iggerStep) + pNa
31b0: 6d 65 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70 54  me->n);.  if( pT
31c0: 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20  riggerStep ){.  
31d0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61    char *z = (cha
31e0: 72 2a 29 26 70 54 72 69 67 67 65 72 53 74 65 70  r*)&pTriggerStep
31f0: 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
3200: 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  z, pName->z, pNa
3210: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 72 69  me->n);.    pTri
3220: 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74  ggerStep->target
3230: 2e 7a 20 3d 20 7a 3b 0a 20 20 20 20 70 54 72 69  .z = z;.    pTri
3240: 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65 74  ggerStep->target
3250: 2e 6e 20 3d 20 70 4e 61 6d 65 2d 3e 6e 3b 0a 20  .n = pName->n;. 
3260: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
3270: 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 7d 0a 20 20  >op = op;.  }.  
3280: 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53  return pTriggerS
3290: 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75  tep;.}../*.** Bu
32a0: 69 6c 64 20 61 20 74 72 69 67 67 65 72 20 73 74  ild a trigger st
32b0: 65 70 20 6f 75 74 20 6f 66 20 61 6e 20 49 4e 53  ep out of an INS
32c0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ERT statement.  
32d0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
32e0: 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 77 20 74  .** to the new t
32f0: 72 69 67 67 65 72 20 73 74 65 70 2e 0a 2a 2a 0a  rigger step..**.
3300: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
3310: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
3320: 20 77 68 65 6e 20 69 74 20 73 65 65 73 20 61 6e   when it sees an
3330: 20 49 4e 53 45 52 54 20 69 6e 73 69 64 65 20 74   INSERT inside t
3340: 68 65 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 61 20  he.** body of a 
3350: 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72 69 67  trigger..*/.Trig
3360: 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33  gerStep *sqlite3
3370: 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74 65  TriggerInsertSte
3380: 70 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p(.  sqlite3 *db
3390: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
33a0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
33b0: 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
33c0: 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 2f 2a 20  pTableName,  /* 
33d0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
33e0: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
33f0: 69 6e 73 65 72 74 20 2a 2f 0a 20 20 49 64 4c 69  insert */.  IdLi
3400: 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20 20  st *pColumn,    
3410: 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
3420: 6e 73 20 69 6e 20 70 54 61 62 6c 65 4e 61 6d 65  ns in pTableName
3430: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3440: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3450: 45 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20  EList,   /* The 
3460: 56 41 4c 55 45 20 63 6c 61 75 73 65 3a 20 61 20  VALUE clause: a 
3470: 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74  list of values t
3480: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f  o be inserted */
3490: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
34a0: 63 74 2c 20 20 20 20 2f 2a 20 41 20 53 45 4c 45  ct,    /* A SELE
34b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
34c0: 74 20 73 75 70 70 6c 69 65 73 20 76 61 6c 75 65  t supplies value
34d0: 73 20 2a 2f 0a 20 20 75 38 20 6f 72 63 6f 6e 66  s */.  u8 orconf
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
34f0: 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72  e conflict algor
3500: 69 74 68 6d 20 28 4f 45 5f 41 62 6f 72 74 2c 20  ithm (OE_Abort, 
3510: 4f 45 5f 52 65 70 6c 61 63 65 2c 20 65 74 63 2e  OE_Replace, etc.
3520: 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65  ) */.){.  Trigge
3530: 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53  rStep *pTriggerS
3540: 74 65 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 70  tep;..  assert(p
3550: 45 4c 69 73 74 20 3d 3d 20 30 20 7c 7c 20 70 53  EList == 0 || pS
3560: 65 6c 65 63 74 20 3d 3d 20 30 29 3b 0a 20 20 61  elect == 0);.  a
3570: 73 73 65 72 74 28 70 45 4c 69 73 74 20 21 3d 20  ssert(pEList != 
3580: 30 20 7c 7c 20 70 53 65 6c 65 63 74 20 21 3d 20  0 || pSelect != 
3590: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
35a0: 61 69 6c 65 64 29 3b 0a 0a 20 20 70 54 72 69 67  ailed);..  pTrig
35b0: 67 65 72 53 74 65 70 20 3d 20 74 72 69 67 67 65  gerStep = trigge
35c0: 72 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62  rStepAllocate(db
35d0: 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 70 54 61  , TK_INSERT, pTa
35e0: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  bleName);.  if( 
35f0: 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a  pTriggerStep ){.
3600: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
3610: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
3620: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
3630: 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55   pSelect, EXPRDU
3640: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 70  P_REDUCE);.    p
3650: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 49 64  TriggerStep->pId
3660: 4c 69 73 74 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a  List = pColumn;.
3670: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
3680: 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 73 71  ->pExprList = sq
3690: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
36a0: 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 45 58 50  (db, pEList, EXP
36b0: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
36c0: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
36d0: 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b  orconf = orconf;
36e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
36f0: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
3700: 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b 0a  e(db, pColumn);.
3710: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
3720: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
3730: 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
3740: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
3750: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 0a 20 20  b, pSelect);..  
3760: 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53  return pTriggerS
3770: 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  tep;.}../*.** Co
3780: 6e 73 74 72 75 63 74 20 61 20 74 72 69 67 67 65  nstruct a trigge
3790: 72 20 73 74 65 70 20 74 68 61 74 20 69 6d 70 6c  r step that impl
37a0: 65 6d 65 6e 74 73 20 61 6e 20 55 50 44 41 54 45  ements an UPDATE
37b0: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
37c0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
37d0: 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67 67  er to that trigg
37e0: 65 72 20 73 74 65 70 2e 20 20 54 68 65 20 70 61  er step.  The pa
37f0: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
3800: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 0a  routine when it.
3810: 2a 2a 20 73 65 65 73 20 61 6e 20 55 50 44 41 54  ** sees an UPDAT
3820: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 69  E statement insi
3830: 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  de the body of a
3840: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 2e   CREATE TRIGGER.
3850: 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20  .*/.TriggerStep 
3860: 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 55  *sqlite3TriggerU
3870: 70 64 61 74 65 53 74 65 70 28 0a 20 20 73 71 6c  pdateStep(.  sql
3880: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3890: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
38a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
38b0: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e    Token *pTableN
38c0: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
38d0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
38e0: 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 45  e updated */.  E
38f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
3900: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 54 20 63      /* The SET c
3910: 6c 61 75 73 65 3a 20 6c 69 73 74 20 6f 66 20 63  lause: list of c
3920: 6f 6c 75 6d 6e 20 61 6e 64 20 6e 65 77 20 76 61  olumn and new va
3930: 6c 75 65 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a  lues */.  Expr *
3940: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 2f  pWhere,        /
3950: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
3960: 73 65 20 2a 2f 0a 20 20 75 38 20 6f 72 63 6f 6e  se */.  u8 orcon
3970: 66 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f            /* 
3980: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67  The conflict alg
3990: 6f 72 69 74 68 6d 2e 20 28 4f 45 5f 41 62 6f 72  orithm. (OE_Abor
39a0: 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74  t, OE_Ignore, et
39b0: 63 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  c) */.){.  Trigg
39c0: 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72  erStep *pTrigger
39d0: 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67 67 65  Step;..  pTrigge
39e0: 72 53 74 65 70 20 3d 20 74 72 69 67 67 65 72 53  rStep = triggerS
39f0: 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62 2c 20  tepAllocate(db, 
3a00: 54 4b 5f 55 50 44 41 54 45 2c 20 70 54 61 62 6c  TK_UPDATE, pTabl
3a10: 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54  eName);.  if( pT
3a20: 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20  riggerStep ){.  
3a30: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3a40: 70 45 78 70 72 4c 69 73 74 20 3d 20 73 71 6c 69  pExprList = sqli
3a50: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
3a60: 62 2c 20 70 45 4c 69 73 74 2c 20 45 58 50 52 44  b, pEList, EXPRD
3a70: 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20  UP_REDUCE);.    
3a80: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 57  pTriggerStep->pW
3a90: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
3aa0: 70 72 44 75 70 28 64 62 2c 20 70 57 68 65 72 65  prDup(db, pWhere
3ab0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
3ac0: 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53  );.    pTriggerS
3ad0: 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72  tep->orconf = or
3ae0: 63 6f 6e 66 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  conf;.  }.  sqli
3af0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
3b00: 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
3b10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3b20: 74 65 28 64 62 2c 20 70 57 68 65 72 65 29 3b 0a  te(db, pWhere);.
3b30: 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65    return pTrigge
3b40: 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rStep;.}../*.** 
3b50: 43 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69 67  Construct a trig
3b60: 67 65 72 20 73 74 65 70 20 74 68 61 74 20 69 6d  ger step that im
3b70: 70 6c 65 6d 65 6e 74 73 20 61 20 44 45 4c 45 54  plements a DELET
3b80: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  E statement and 
3b90: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
3ba0: 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67  ter to that trig
3bb0: 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20 70  ger step.  The p
3bc0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
3bd0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74   routine when it
3be0: 0a 2a 2a 20 73 65 65 73 20 61 20 44 45 4c 45 54  .** sees a DELET
3bf0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 69  E statement insi
3c00: 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  de the body of a
3c10: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 2e   CREATE TRIGGER.
3c20: 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20  .*/.TriggerStep 
3c30: 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 44  *sqlite3TriggerD
3c40: 65 6c 65 74 65 53 74 65 70 28 0a 20 20 73 71 6c  eleteStep(.  sql
3c50: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3c60: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
3c80: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61   Token *pTableNa
3c90: 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  me,      /* The 
3ca0: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
3cb0: 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65   rows are delete
3cc0: 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
3cd0: 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  ere            /
3ce0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
3cf0: 73 65 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  se */.){.  Trigg
3d00: 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72  erStep *pTrigger
3d10: 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67 67 65  Step;..  pTrigge
3d20: 72 53 74 65 70 20 3d 20 74 72 69 67 67 65 72 53  rStep = triggerS
3d30: 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62 2c 20  tepAllocate(db, 
3d40: 54 4b 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 6c  TK_DELETE, pTabl
3d50: 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54  eName);.  if( pT
3d60: 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20 20  riggerStep ){.  
3d70: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3d80: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
3d90: 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65  ExprDup(db, pWhe
3da0: 72 65 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  re, EXPRDUP_REDU
3db0: 43 45 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65  CE);.    pTrigge
3dc0: 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20  rStep->orconf = 
3dd0: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 7d 0a  OE_Default;.  }.
3de0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3df0: 65 74 65 28 64 62 2c 20 70 57 68 65 72 65 29 3b  ete(db, pWhere);
3e00: 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67  .  return pTrigg
3e10: 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  erStep;.}../* .*
3e20: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
3e30: 6c 65 74 65 20 61 20 54 72 69 67 67 65 72 20 73  lete a Trigger s
3e40: 74 72 75 63 74 75 72 65 0a 2a 2f 0a 76 6f 69 64  tructure.*/.void
3e50: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72   sqlite3DeleteTr
3e60: 69 67 67 65 72 28 73 71 6c 69 74 65 33 20 2a 64  igger(sqlite3 *d
3e70: 62 2c 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  b, Trigger *pTri
3e80: 67 67 65 72 29 7b 0a 20 20 69 66 28 20 70 54 72  gger){.  if( pTr
3e90: 69 67 67 65 72 3d 3d 30 20 29 20 72 65 74 75 72  igger==0 ) retur
3ea0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  n;.  sqlite3Dele
3eb0: 74 65 54 72 69 67 67 65 72 53 74 65 70 28 64 62  teTriggerStep(db
3ec0: 2c 20 70 54 72 69 67 67 65 72 2d 3e 73 74 65 70  , pTrigger->step
3ed0: 5f 6c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  _list);.  sqlite
3ee0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 72 69  3DbFree(db, pTri
3ef0: 67 67 65 72 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  gger->zName);.  
3f00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3f10: 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c  , pTrigger->tabl
3f20: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
3f30: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 54 72 69  rDelete(db, pTri
3f40: 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b 0a 20 20  gger->pWhen);.  
3f50: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
3f60: 65 74 65 28 64 62 2c 20 70 54 72 69 67 67 65 72  ete(db, pTrigger
3f70: 2d 3e 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73  ->pColumns);.  s
3f80: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3f90: 20 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a 2f   pTrigger);.}../
3fa0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3fb0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
3fc0: 64 72 6f 70 20 61 20 74 72 69 67 67 65 72 20 66  drop a trigger f
3fd0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
3fe0: 20 73 63 68 65 6d 61 2e 20 0a 2a 2a 0a 2a 2a 20   schema. .**.** 
3ff0: 54 68 69 73 20 6d 61 79 20 62 65 20 63 61 6c 6c  This may be call
4000: 65 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ed directly from
4010: 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20   the parser and 
4020: 74 68 65 72 65 66 6f 72 65 20 69 64 65 6e 74 69  therefore identi
4030: 66 69 65 73 0a 2a 2a 20 74 68 65 20 74 72 69 67  fies.** the trig
4040: 67 65 72 20 62 79 20 6e 61 6d 65 2e 20 20 54 68  ger by name.  Th
4050: 65 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69  e sqlite3DropTri
4060: 67 67 65 72 50 74 72 28 29 20 72 6f 75 74 69 6e  ggerPtr() routin
4070: 65 20 64 6f 65 73 20 74 68 65 0a 2a 2a 20 73 61  e does the.** sa
4080: 6d 65 20 6a 6f 62 20 61 73 20 74 68 69 73 20 72  me job as this r
4090: 6f 75 74 69 6e 65 20 65 78 63 65 70 74 20 69 74  outine except it
40a0: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
40b0: 20 74 6f 20 74 68 65 20 74 72 69 67 67 65 72 0a   to the trigger.
40c0: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ** instead of th
40d0: 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 2e 0a  e trigger name..
40e0: 2a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  **/.void sqlite3
40f0: 44 72 6f 70 54 72 69 67 67 65 72 28 50 61 72 73  DropTrigger(Pars
4100: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
4110: 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 6e  st *pName, int n
4120: 6f 45 72 72 29 7b 0a 20 20 54 72 69 67 67 65 72  oErr){.  Trigger
4130: 20 2a 70 54 72 69 67 67 65 72 20 3d 20 30 3b 0a   *pTrigger = 0;.
4140: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
4150: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f   char *zDb;.  co
4160: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
4170: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20  .  int nName;.  
4180: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
4190: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
41a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
41b0: 64 20 29 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72  d ) goto drop_tr
41c0: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
41d0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
41e0: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
41f0: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
4200: 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67 67   goto drop_trigg
4210: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
4220: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
4230: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 7a  ->nSrc==1 );.  z
4240: 44 62 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  Db = pName->a[0]
4250: 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7a 4e  .zDatabase;.  zN
4260: 61 6d 65 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30  ame = pName->a[0
4270: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 6e 4e 61 6d 65  ].zName;.  nName
4280: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
4290: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  30(zName);.  for
42a0: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
42b0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
42c0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
42d0: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
42e0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
42f0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
4300: 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69   if( zDb && sqli
4310: 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61  te3StrICmp(db->a
4320: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62  Db[j].zName, zDb
4330: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
4340: 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
4350: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 28 64  ite3HashFind(&(d
4360: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d  b->aDb[j].pSchem
4370: 61 2d 3e 74 72 69 67 48 61 73 68 29 2c 20 7a 4e  a->trigHash), zN
4380: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
4390: 20 69 66 28 20 70 54 72 69 67 67 65 72 20 29 20   if( pTrigger ) 
43a0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
43b0: 20 21 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20   !pTrigger ){.  
43c0: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
43d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
43e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
43f0: 6f 20 73 75 63 68 20 74 72 69 67 67 65 72 3a 20  o such trigger: 
4400: 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
4410: 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 64      }.    goto d
4420: 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 61  rop_trigger_clea
4430: 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nup;.  }.  sqlit
4440: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
4450: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
4460: 72 29 3b 0a 0a 64 72 6f 70 5f 74 72 69 67 67 65  r);..drop_trigge
4470: 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  r_cleanup:.  sql
4480: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
4490: 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
44a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
44b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
44c0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  able structure f
44d0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  or the table tha
44e0: 74 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 69  t a trigger.** i
44f0: 73 20 73 65 74 20 6f 6e 2e 0a 2a 2f 0a 73 74 61  s set on..*/.sta
4500: 74 69 63 20 54 61 62 6c 65 20 2a 74 61 62 6c 65  tic Table *table
4510: 4f 66 54 72 69 67 67 65 72 28 54 72 69 67 67 65  OfTrigger(Trigge
4520: 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20 20  r *pTrigger){.  
4530: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
4540: 74 72 6c 65 6e 33 30 28 70 54 72 69 67 67 65 72  trlen30(pTrigger
4550: 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 72 65 74 75  ->table);.  retu
4560: 72 6e 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  rn sqlite3HashFi
4570: 6e 64 28 26 70 54 72 69 67 67 65 72 2d 3e 70 54  nd(&pTrigger->pT
4580: 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  abSchema->tblHas
4590: 68 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61 62  h, pTrigger->tab
45a0: 6c 65 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  le, n);.}.../*.*
45b0: 2a 20 44 72 6f 70 20 61 20 74 72 69 67 67 65 72  * Drop a trigger
45c0: 20 67 69 76 65 6e 20 61 20 70 6f 69 6e 74 65 72   given a pointer
45d0: 20 74 6f 20 74 68 61 74 20 74 72 69 67 67 65 72   to that trigger
45e0: 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
45f0: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
4600: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4610: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
4620: 72 29 7b 0a 20 20 54 61 62 6c 65 20 20 20 2a 70  r){.  Table   *p
4630: 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a 76  Table;.  Vdbe *v
4640: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
4650: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
4660: 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 44 62 20  int iDb;..  iDb 
4670: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
4680: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
4690: 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  b, pTrigger->pSc
46a0: 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
46b0: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
46c0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 70 54 61 62  b->nDb );.  pTab
46d0: 6c 65 20 3d 20 74 61 62 6c 65 4f 66 54 72 69 67  le = tableOfTrig
46e0: 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20  ger(pTrigger);. 
46f0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
4700: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
4710: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ble->pSchema==pT
4720: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 20  rigger->pSchema 
4730: 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 23 69 66  || iDb==1 );.#if
4740: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4750: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
4760: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
4770: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52  = SQLITE_DROP_TR
4780: 49 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e 73 74  IGGER;.    const
4790: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
47a0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
47b0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
47c0: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
47d0: 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69  ABLE(iDb);.    i
47e0: 66 28 20 69 44 62 3d 3d 31 20 29 20 63 6f 64 65  f( iDb==1 ) code
47f0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
4800: 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20 20 20  EMP_TRIGGER;.   
4810: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
4820: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
4830: 64 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e  de, pTrigger->zN
4840: 61 6d 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ame, pTable->zNa
4850: 6d 65 2c 20 7a 44 62 29 20 7c 7c 0a 20 20 20 20  me, zDb) ||.    
4860: 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65    sqlite3AuthChe
4870: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
4880: 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
4890: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
48a0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
48b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
48c0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
48d0: 20 64 65 73 74 72 6f 79 20 74 68 65 20 64 61 74   destroy the dat
48e0: 61 62 61 73 65 20 72 65 63 6f 72 64 20 6f 66 20  abase record of 
48f0: 74 68 65 20 74 72 69 67 67 65 72 2e 0a 20 20 2a  the trigger..  *
4900: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
4910: 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  le!=0 );.  if( (
4920: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
4930: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
4940: 7b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a  {.    int base;.
4950: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
4960: 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70   VdbeOpList drop
4970: 54 72 69 67 67 65 72 5b 5d 20 3d 20 7b 0a 20 20  Trigger[] = {.  
4980: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
4990: 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c       0, ADDR(9),
49a0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
49b0: 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20  _String8,    0, 
49c0: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  1,        0}, /*
49d0: 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
49e0: 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20  _Column,     0, 
49f0: 31 2c 20 20 20 20 20 20 20 20 32 7d 2c 0a 20 20  1,        2},.  
4a00: 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20      { OP_Ne,    
4a10: 20 20 20 20 20 32 2c 20 41 44 44 52 28 38 29 2c       2, ADDR(8),
4a20: 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    1},.      { OP
4a30: 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20  _String8,    0, 
4a40: 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  1,        0}, /*
4a50: 20 34 3a 20 22 74 72 69 67 67 65 72 22 20 2a 2f   4: "trigger" */
4a60: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
4a70: 6d 6e 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  mn,     0, 0,   
4a80: 20 20 20 20 20 32 7d 2c 0a 20 20 20 20 20 20 7b       2},.      {
4a90: 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20   OP_Ne,         
4aa0: 32 2c 20 41 44 44 52 28 38 29 2c 20 20 31 7d 2c  2, ADDR(8),  1},
4ab0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
4ac0: 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
4ad0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
4ae0: 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
4af0: 30 2c 20 41 44 44 52 28 31 29 2c 20 20 30 7d 2c  0, ADDR(1),  0},
4b00: 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a   /* 8 */.    };.
4b10: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
4b20: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
4b30: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
4b40: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
4b50: 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72  MasterTable(pPar
4b60: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 62 61  se, iDb);.    ba
4b70: 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
4b80: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 20 41 72  AddOpList(v,  Ar
4b90: 72 61 79 53 69 7a 65 28 64 72 6f 70 54 72 69 67  raySize(dropTrig
4ba0: 67 65 72 29 2c 20 64 72 6f 70 54 72 69 67 67 65  ger), dropTrigge
4bb0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
4bc0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 62  dbeChangeP4(v, b
4bd0: 61 73 65 2b 31 2c 20 70 54 72 69 67 67 65 72 2d  ase+1, pTrigger-
4be0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
4bf0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4c00: 65 50 34 28 76 2c 20 62 61 73 65 2b 34 2c 20 22  eP4(v, base+4, "
4c10: 74 72 69 67 67 65 72 22 2c 20 50 34 5f 53 54 41  trigger", P4_STA
4c20: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
4c30: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
4c40: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
4c50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c60: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  2(v, OP_Close, 0
4c70: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4c80: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
4c90: 50 5f 44 72 6f 70 54 72 69 67 67 65 72 2c 20 69  P_DropTrigger, i
4ca0: 44 62 2c 20 30 2c 20 30 2c 20 70 54 72 69 67 67  Db, 0, 0, pTrigg
4cb0: 65 72 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  er->zName, 0);. 
4cc0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
4cd0: 4d 65 6d 3c 33 20 29 7b 0a 20 20 20 20 20 20 70  Mem<3 ){.      p
4ce0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b  Parse->nMem = 3;
4cf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4d00: 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 20 74 72 69  .** Remove a tri
4d10: 67 67 65 72 20 66 72 6f 6d 20 74 68 65 20 68 61  gger from the ha
4d20: 73 68 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  sh tables of the
4d30: 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72   sqlite* pointer
4d40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4d50: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
4d60: 54 72 69 67 67 65 72 28 73 71 6c 69 74 65 33 20  Trigger(sqlite3 
4d70: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
4d80: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
4d90: 7b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 20  {.  Hash *pHash 
4da0: 3d 20 26 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  = &(db->aDb[iDb]
4db0: 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61  .pSchema->trigHa
4dc0: 73 68 29 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  sh);.  Trigger *
4dd0: 70 54 72 69 67 67 65 72 3b 0a 20 20 70 54 72 69  pTrigger;.  pTri
4de0: 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 48 61  gger = sqlite3Ha
4df0: 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20  shInsert(pHash, 
4e00: 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74  zName, sqlite3St
4e10: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30  rlen30(zName), 0
4e20: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
4e30: 70 54 72 69 67 67 65 72 29 20 29 7b 0a 20 20 20  pTrigger) ){.   
4e40: 20 69 66 28 20 70 54 72 69 67 67 65 72 2d 3e 70   if( pTrigger->p
4e50: 53 63 68 65 6d 61 3d 3d 70 54 72 69 67 67 65 72  Schema==pTrigger
4e60: 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 29 7b 0a  ->pTabSchema ){.
4e70: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
4e80: 62 20 3d 20 74 61 62 6c 65 4f 66 54 72 69 67 67  b = tableOfTrigg
4e90: 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20  er(pTrigger);.  
4ea0: 20 20 20 20 54 72 69 67 67 65 72 20 2a 2a 70 70      Trigger **pp
4eb0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26  ;.      for(pp=&
4ec0: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 20  pTab->pTrigger; 
4ed0: 2a 70 70 21 3d 70 54 72 69 67 67 65 72 3b 20 70  *pp!=pTrigger; p
4ee0: 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
4ef0: 29 29 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20  ));.      *pp = 
4f00: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 3b 0a 20 20  (*pp)->pNext;.  
4f10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
4f20: 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62 2c  eleteTrigger(db,
4f30: 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
4f40: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
4f50: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
4f60: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
4f70: 70 45 4c 69 73 74 20 69 73 20 74 68 65 20 53 45  pEList is the SE
4f80: 54 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20 55  T clause of an U
4f90: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  PDATE statement.
4fa0: 20 20 45 61 63 68 20 65 6e 74 72 79 0a 2a 2a 20    Each entry.** 
4fb0: 69 6e 20 70 45 4c 69 73 74 20 69 73 20 6f 66 20  in pEList is of 
4fc0: 74 68 65 20 66 6f 72 6d 61 74 20 3c 69 64 3e 3d  the format <id>=
4fd0: 3c 65 78 70 72 3e 2e 20 20 49 66 20 61 6e 79 20  <expr>.  If any 
4fe0: 6f 66 20 74 68 65 20 65 6e 74 72 69 65 73 0a 2a  of the entries.*
4ff0: 2a 20 69 6e 20 70 45 4c 69 73 74 20 68 61 76 65  * in pEList have
5000: 20 61 6e 20 3c 69 64 3e 20 77 68 69 63 68 20 6d   an <id> which m
5010: 61 74 63 68 65 73 20 61 6e 20 69 64 65 6e 74 69  atches an identi
5020: 66 69 65 72 20 69 6e 20 70 49 64 4c 69 73 74 2c  fier in pIdList,
5030: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
5040: 54 52 55 45 2e 20 20 49 66 20 70 49 64 4c 69 73  TRUE.  If pIdLis
5050: 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  t==NULL, then it
5060: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
5070: 0a 2a 2a 20 77 69 6c 64 63 61 72 64 20 74 68 61  .** wildcard tha
5080: 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68 69  t matches anythi
5090: 6e 67 2e 20 20 4c 69 6b 65 77 69 73 65 20 69 66  ng.  Likewise if
50a0: 20 70 45 4c 69 73 74 3d 3d 4e 55 4c 4c 20 74 68   pEList==NULL th
50b0: 65 6e 0a 2a 2a 20 69 74 20 6d 61 74 63 68 65 73  en.** it matches
50c0: 20 61 6e 79 74 68 69 6e 67 20 73 6f 20 61 6c 77   anything so alw
50d0: 61 79 73 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ays return true.
50e0: 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 6f    Return false o
50f0: 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  nly.** if there 
5100: 69 73 20 6e 6f 20 6d 61 74 63 68 2e 0a 2a 2f 0a  is no match..*/.
5110: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
5120: 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70 28 49 64  ColumnOverlap(Id
5130: 4c 69 73 74 20 2a 70 49 64 4c 69 73 74 2c 20 45  List *pIdList, E
5140: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
5150: 7b 0a 20 20 69 6e 74 20 65 3b 0a 20 20 69 66 28  {.  int e;.  if(
5160: 20 70 49 64 4c 69 73 74 3d 3d 30 20 7c 7c 20 4e   pIdList==0 || N
5170: 45 56 45 52 28 70 45 4c 69 73 74 3d 3d 30 29 20  EVER(pEList==0) 
5180: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f  ) return 1;.  fo
5190: 72 28 65 3d 30 3b 20 65 3c 70 45 4c 69 73 74 2d  r(e=0; e<pEList-
51a0: 3e 6e 45 78 70 72 3b 20 65 2b 2b 29 7b 0a 20 20  >nExpr; e++){.  
51b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
51c0: 69 73 74 49 6e 64 65 78 28 70 49 64 4c 69 73 74  istIndex(pIdList
51d0: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 65 5d 2e 7a  , pEList->a[e].z
51e0: 4e 61 6d 65 29 3e 3d 30 20 29 20 72 65 74 75 72  Name)>=0 ) retur
51f0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
5200: 6e 20 30 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n 0; .}../*.** R
5210: 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
5220: 61 6c 6c 20 74 72 69 67 67 65 72 73 20 6f 6e 20  all triggers on 
5230: 74 61 62 6c 65 20 70 54 61 62 20 69 66 20 74 68  table pTab if th
5240: 65 72 65 20 65 78 69 73 74 73 20 61 74 20 6c 65  ere exists at le
5250: 61 73 74 0a 2a 2a 20 6f 6e 65 20 74 72 69 67 67  ast.** one trigg
5260: 65 72 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  er that must be 
5270: 66 69 72 65 64 20 77 68 65 6e 20 61 6e 20 6f 70  fired when an op
5280: 65 72 61 74 69 6f 6e 20 6f 66 20 74 79 70 65 20  eration of type 
5290: 27 6f 70 27 20 69 73 20 0a 2a 2a 20 70 65 72 66  'op' is .** perf
52a0: 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 74 61 62  ormed on the tab
52b0: 6c 65 2c 20 61 6e 64 2c 20 69 66 20 74 68 61 74  le, and, if that
52c0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
52d0: 20 55 50 44 41 54 45 2c 20 69 66 20 61 74 0a 2a   UPDATE, if at.*
52e0: 2a 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  * least one of t
52f0: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 43  he columns in pC
5300: 68 61 6e 67 65 73 20 69 73 20 62 65 69 6e 67 20  hanges is being 
5310: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 54 72 69  modified..*/.Tri
5320: 67 67 65 72 20 2a 73 71 6c 69 74 65 33 54 72 69  gger *sqlite3Tri
5330: 67 67 65 72 73 45 78 69 73 74 28 0a 20 20 50 61  ggersExist(.  Pa
5340: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5350: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
5360: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
5370: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
5380: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
5390: 20 74 68 65 20 63 6f 6e 74 61 69 6e 73 20 74 68   the contains th
53a0: 65 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20  e triggers */.  
53b0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
53c0: 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 65 20 6f          /* one o
53d0: 66 20 54 4b 5f 44 45 4c 45 54 45 2c 20 54 4b 5f  f TK_DELETE, TK_
53e0: 49 4e 53 45 52 54 2c 20 54 4b 5f 55 50 44 41 54  INSERT, TK_UPDAT
53f0: 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  E */.  ExprList 
5400: 2a 70 43 68 61 6e 67 65 73 2c 20 20 20 20 20 2f  *pChanges,     /
5410: 2a 20 43 6f 6c 75 6d 6e 73 20 74 68 61 74 20 63  * Columns that c
5420: 68 61 6e 67 65 20 69 6e 20 61 6e 20 55 50 44 41  hange in an UPDA
5430: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
5440: 20 20 69 6e 74 20 2a 70 4d 61 73 6b 20 20 20 20    int *pMask    
5450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
5460: 3a 20 4d 61 73 6b 20 6f 66 20 54 52 49 47 47 45  : Mask of TRIGGE
5470: 52 5f 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52  R_BEFORE|TRIGGER
5480: 5f 41 46 54 45 52 20 2a 2f 0a 29 7b 0a 20 20 69  _AFTER */.){.  i
5490: 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 54  nt mask = 0;.  T
54a0: 72 69 67 67 65 72 20 2a 70 4c 69 73 74 20 3d 20  rigger *pList = 
54b0: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69  sqlite3TriggerLi
54c0: 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  st(pParse, pTab)
54d0: 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 3b 0a  ;.  Trigger *p;.
54e0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 3d    assert( pList=
54f0: 3d 30 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  =0 || IsVirtual(
5500: 70 54 61 62 29 3d 3d 30 20 29 3b 0a 20 20 66 6f  pTab)==0 );.  fo
5510: 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
5520: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
5530: 66 28 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20  f( p->op==op && 
5540: 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c  checkColumnOverl
5550: 61 70 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20  ap(p->pColumns, 
5560: 70 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20  pChanges) ){.   
5570: 20 20 20 6d 61 73 6b 20 7c 3d 20 70 2d 3e 74 72     mask |= p->tr
5580: 5f 74 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _tm;.    }.  }. 
5590: 20 69 66 28 20 70 4d 61 73 6b 20 29 7b 0a 20 20   if( pMask ){.  
55a0: 20 20 2a 70 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b    *pMask = mask;
55b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 6d  .  }.  return (m
55c0: 61 73 6b 20 3f 20 70 4c 69 73 74 20 3a 20 30 29  ask ? pList : 0)
55d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
55e0: 72 74 20 74 68 65 20 70 53 74 65 70 2d 3e 74 61  rt the pStep->ta
55f0: 72 67 65 74 20 74 6f 6b 65 6e 20 69 6e 74 6f 20  rget token into 
5600: 61 20 53 72 63 4c 69 73 74 20 61 6e 64 20 72 65  a SrcList and re
5610: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
5620: 2a 20 74 6f 20 74 68 61 74 20 53 72 63 4c 69 73  * to that SrcLis
5630: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
5640: 75 74 69 6e 65 20 61 64 64 73 20 61 20 73 70 65  utine adds a spe
5650: 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20 6e  cific database n
5660: 61 6d 65 2c 20 69 66 20 6e 65 65 64 65 64 2c 20  ame, if needed, 
5670: 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 77 68  to the target wh
5680: 65 6e 0a 2a 2a 20 66 6f 72 6d 69 6e 67 20 74 68  en.** forming th
5690: 65 20 53 72 63 4c 69 73 74 2e 20 20 54 68 69 73  e SrcList.  This
56a0: 20 70 72 65 76 65 6e 74 73 20 61 20 74 72 69 67   prevents a trig
56b0: 67 65 72 20 69 6e 20 6f 6e 65 20 64 61 74 61 62  ger in one datab
56c0: 61 73 65 20 66 72 6f 6d 0a 2a 2a 20 72 65 66 65  ase from.** refe
56d0: 72 72 69 6e 67 20 74 6f 20 61 20 74 61 72 67 65  rring to a targe
56e0: 74 20 69 6e 20 61 6e 6f 74 68 65 72 20 64 61 74  t in another dat
56f0: 61 62 61 73 65 2e 20 20 41 6e 20 65 78 63 65 70  abase.  An excep
5700: 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 74 68 65  tion is when the
5710: 0a 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20 69  .** trigger is i
5720: 6e 20 54 45 4d 50 20 69 6e 20 77 68 69 63 68 20  n TEMP in which 
5730: 63 61 73 65 20 69 74 20 63 61 6e 20 72 65 66 65  case it can refe
5740: 72 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 64  r to any other d
5750: 61 74 61 62 61 73 65 20 69 74 0a 2a 2a 20 77 61  atabase it.** wa
5760: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  nts..*/.static S
5770: 72 63 4c 69 73 74 20 2a 74 61 72 67 65 74 53 72  rcList *targetSr
5780: 63 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  cList(.  Parse *
5790: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
57a0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
57b0: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
57c0: 72 53 74 65 70 20 2a 70 53 74 65 70 20 20 20 2f  rStep *pStep   /
57d0: 2a 20 54 68 65 20 74 72 69 67 67 65 72 20 63 6f  * The trigger co
57e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 72  ntaining the tar
57f0: 67 65 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  get token */.){.
5800: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
5810: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
5820: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
5830: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 53 72 63 4c  to use */.  SrcL
5840: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
5850: 20 2f 2a 20 53 72 63 4c 69 73 74 20 74 6f 20 62   /* SrcList to b
5860: 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 0a 20  e returned */.. 
5870: 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
5880: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  rcListAppend(pPa
5890: 72 73 65 2d 3e 64 62 2c 20 30 2c 20 26 70 53 74  rse->db, 0, &pSt
58a0: 65 70 2d 3e 74 61 72 67 65 74 2c 20 30 29 3b 0a  ep->target, 0);.
58b0: 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20    if( pSrc ){.  
58c0: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
58d0: 6e 53 72 63 3e 30 20 29 3b 0a 20 20 20 20 61 73  nSrc>0 );.    as
58e0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 21 3d 30  sert( pSrc->a!=0
58f0: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
5900: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
5910: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
5920: 53 74 65 70 2d 3e 70 54 72 69 67 2d 3e 70 53 63  Step->pTrig->pSc
5930: 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 69  hema);.    if( i
5940: 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 3d 32 20  Db==0 || iDb>=2 
5950: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5960: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5970: 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  b;.      assert(
5980: 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d   iDb<pParse->db-
5990: 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 70 53  >nDb );.      pS
59a0: 72 63 2d 3e 61 5b 70 53 72 63 2d 3e 6e 53 72 63  rc->a[pSrc->nSrc
59b0: 2d 31 5d 2e 7a 44 61 74 61 62 61 73 65 20 3d 20  -1].zDatabase = 
59c0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
59d0: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  db, db->aDb[iDb]
59e0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
59f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63   }.  return pSrc
5a00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
5a10: 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f  ate VDBE code fo
5a20: 72 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 73  r zero or more s
5a30: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
5a40: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 0a 2a   the body of a.*
5a50: 2a 20 74 72 69 67 67 65 72 2e 20 20 0a 2a 2f 0a  * trigger.  .*/.
5a60: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 54  static int codeT
5a70: 72 69 67 67 65 72 50 72 6f 67 72 61 6d 28 0a 20  riggerProgram(. 
5a80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5aa0: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
5ab0: 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65   */.  TriggerSte
5ac0: 70 20 2a 70 53 74 65 70 4c 69 73 74 2c 20 20 20  p *pStepList,   
5ad0: 2f 2a 20 4c 69 73 74 20 6f 66 20 73 74 61 74 65  /* List of state
5ae0: 6d 65 6e 74 73 20 69 6e 73 69 64 65 20 74 68 65  ments inside the
5af0: 20 74 72 69 67 67 65 72 20 62 6f 64 79 20 2a 2f   trigger body */
5b00: 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 69 6e 20  .  int orconfin 
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5b20: 43 6f 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74  Conflict algorit
5b30: 68 6d 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20 65  hm. (OE_Abort, e
5b40: 74 63 29 20 2a 2f 20 20 0a 29 7b 0a 20 20 54 72  tc) */  .){.  Tr
5b50: 69 67 67 65 72 53 74 65 70 20 2a 20 70 53 74 65  iggerStep * pSte
5b60: 70 20 3d 20 70 53 74 65 70 4c 69 73 74 3b 0a 20  p = pStepList;. 
5b70: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
5b80: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69  e->pVdbe;.  sqli
5b90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5ba0: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
5bb0: 20 70 50 61 72 73 65 2d 3e 70 52 6f 6f 74 20 29   pParse->pRoot )
5bc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 74 65  ;.  assert( pSte
5bd0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
5be0: 28 20 76 21 3d 30 20 29 3b 0a 2f 2a 20 73 71 6c  ( v!=0 );./* sql
5bf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5c00: 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 75 73 68  , OP_ContextPush
5c10: 2c 20 30 2c 20 30 29 3b 20 2a 2f 0a 20 20 77 68  , 0, 0); */.  wh
5c20: 69 6c 65 28 20 70 53 74 65 70 20 29 7b 0a 20 20  ile( pStep ){.  
5c30: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
5c40: 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
5c50: 70 6f 6c 69 63 79 20 74 68 61 74 20 77 69 6c 6c  policy that will
5c60: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 69   be used for thi
5c70: 73 20 73 74 65 70 0a 20 20 20 20 2a 2a 20 6f 66  s step.    ** of
5c80: 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f   the trigger pro
5c90: 67 72 61 6d 2e 20 49 66 20 74 68 65 20 73 74 61  gram. If the sta
5ca0: 74 65 6d 65 6e 74 20 74 68 61 74 20 63 61 75 73  tement that caus
5cb0: 65 64 20 74 68 69 73 20 74 72 69 67 67 65 72 0a  ed this trigger.
5cc0: 20 20 20 20 2a 2a 20 74 6f 20 66 69 72 65 20 68      ** to fire h
5cd0: 61 64 20 61 6e 20 65 78 70 6c 69 63 69 74 20 4f  ad an explicit O
5ce0: 4e 20 43 4f 4e 46 4c 49 43 54 2c 20 74 68 65 6e  N CONFLICT, then
5cf0: 20 75 73 65 20 69 74 2e 20 4f 74 68 65 72 77 69   use it. Otherwi
5d00: 73 65 2c 20 75 73 65 0a 20 20 20 20 2a 2a 20 74  se, use.    ** t
5d10: 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70  he ON CONFLICT p
5d20: 6f 6c 69 63 79 20 74 68 61 74 20 77 61 73 20 73  olicy that was s
5d30: 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74  pecified as part
5d40: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 0a   of the trigger.
5d50: 20 20 20 20 2a 2a 20 73 74 65 70 20 73 74 61 74      ** step stat
5d60: 65 6d 65 6e 74 2e 20 45 78 61 6d 70 6c 65 3a 0a  ement. Example:.
5d70: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
5d80: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 41  CREATE TRIGGER A
5d90: 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74  FTER INSERT ON t
5da0: 31 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20  1 BEGIN;.    ** 
5db0: 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20 52 45      INSERT OR RE
5dc0: 50 4c 41 43 45 20 49 4e 54 4f 20 74 32 20 56 41  PLACE INTO t2 VA
5dd0: 4c 55 45 53 28 6e 65 77 2e 61 2c 20 6e 65 77 2e  LUES(new.a, new.
5de0: 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 45 4e 44  b);.    **   END
5df0: 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
5e00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
5e10: 20 2e 2e 2e 20 3b 20 20 20 20 20 20 20 20 20 20   ... ;          
5e20: 20 20 2d 2d 20 69 6e 73 65 72 74 20 69 6e 74 6f    -- insert into
5e30: 20 74 32 20 75 73 65 73 20 52 45 50 4c 41 43 45   t2 uses REPLACE
5e40: 20 70 6f 6c 69 63 79 0a 20 20 20 20 2a 2a 20 20   policy.    **  
5e50: 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52   INSERT OR IGNOR
5e60: 45 20 49 4e 54 4f 20 74 31 20 2e 2e 2e 20 3b 20  E INTO t1 ... ; 
5e70: 20 2d 2d 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   -- insert into 
5e80: 74 32 20 75 73 65 73 20 49 47 4e 4f 52 45 20 70  t2 uses IGNORE p
5e90: 6f 6c 69 63 79 0a 20 20 20 20 2a 2f 0a 20 20 20  olicy.    */.   
5ea0: 20 70 50 61 72 73 65 2d 3e 6f 72 63 6f 6e 66 20   pParse->orconf 
5eb0: 3d 20 28 6f 72 63 6f 6e 66 69 6e 3d 3d 4f 45 5f  = (orconfin==OE_
5ec0: 44 65 66 61 75 6c 74 29 3f 70 53 74 65 70 2d 3e  Default)?pStep->
5ed0: 6f 72 63 6f 6e 66 3a 6f 72 63 6f 6e 66 69 6e 3b  orconf:orconfin;
5ee0: 0a 0a 20 20 20 20 69 66 28 20 70 53 74 65 70 2d  ..    if( pStep-
5ef0: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op!=TK_SELECT )
5f00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5f10: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
5f20: 52 65 73 65 74 43 6f 75 6e 74 2c 20 30 29 3b 0a  ResetCount, 0);.
5f30: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
5f40: 68 28 20 70 53 74 65 70 2d 3e 6f 70 20 29 7b 0a  h( pStep->op ){.
5f50: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50        case TK_UP
5f60: 44 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  DATE: {.        
5f70: 73 71 6c 69 74 65 33 55 70 64 61 74 65 28 70 50  sqlite3Update(pP
5f80: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
5f90: 20 74 61 72 67 65 74 53 72 63 4c 69 73 74 28 70   targetSrcList(p
5fa0: 50 61 72 73 65 2c 20 70 53 74 65 70 29 2c 0a 20  Parse, pStep),. 
5fb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5fc0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
5fd0: 70 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74  pStep->pExprList
5fe0: 2c 20 30 29 2c 20 0a 20 20 20 20 20 20 20 20 20  , 0), .         
5ff0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
6000: 64 62 2c 20 70 53 74 65 70 2d 3e 70 57 68 65 72  db, pStep->pWher
6010: 65 2c 20 30 29 2c 20 0a 20 20 20 20 20 20 20 20  e, 0), .        
6020: 20 20 70 50 61 72 73 65 2d 3e 6f 72 63 6f 6e 66    pParse->orconf
6030: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
6040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6050: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b   }.      case TK
6060: 5f 49 4e 53 45 52 54 3a 20 7b 0a 20 20 20 20 20  _INSERT: {.     
6070: 20 20 20 73 71 6c 69 74 65 33 49 6e 73 65 72 74     sqlite3Insert
6080: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
6090: 20 20 20 20 74 61 72 67 65 74 53 72 63 4c 69 73      targetSrcLis
60a0: 74 28 70 50 61 72 73 65 2c 20 70 53 74 65 70 29  t(pParse, pStep)
60b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,.          sqli
60c0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
60d0: 62 2c 20 70 53 74 65 70 2d 3e 70 45 78 70 72 4c  b, pStep->pExprL
60e0: 69 73 74 2c 20 30 29 2c 20 0a 20 20 20 20 20 20  ist, 0), .      
60f0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
6100: 74 44 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e  tDup(db, pStep->
6110: 70 53 65 6c 65 63 74 2c 20 30 29 2c 20 0a 20 20  pSelect, 0), .  
6120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49          sqlite3I
6130: 64 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 74  dListDup(db, pSt
6140: 65 70 2d 3e 70 49 64 4c 69 73 74 29 2c 20 0a 20  ep->pIdList), . 
6150: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
6160: 3e 6f 72 63 6f 6e 66 0a 20 20 20 20 20 20 20 20  >orconf.        
6170: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
6180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6190: 63 61 73 65 20 54 4b 5f 44 45 4c 45 54 45 3a 20  case TK_DELETE: 
61a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
61b0: 33 44 65 6c 65 74 65 46 72 6f 6d 28 70 50 61 72  3DeleteFrom(pPar
61c0: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 74  se, .          t
61d0: 61 72 67 65 74 53 72 63 4c 69 73 74 28 70 50 61  argetSrcList(pPa
61e0: 72 73 65 2c 20 70 53 74 65 70 29 2c 0a 20 20 20  rse, pStep),.   
61f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6200: 70 72 44 75 70 28 64 62 2c 20 70 53 74 65 70 2d  prDup(db, pStep-
6210: 3e 70 57 68 65 72 65 2c 20 30 29 0a 20 20 20 20  >pWhere, 0).    
6220: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 62      );.        b
6230: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
6240: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
6250: 65 72 74 28 20 70 53 74 65 70 2d 3e 6f 70 3d 3d  ert( pStep->op==
6260: 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 7b 0a 20  TK_SELECT ); {. 
6270: 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73         SelectDes
6280: 74 20 73 44 65 73 74 3b 0a 20 20 20 20 20 20 20  t sDest;.       
6290: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
62a0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
62b0: 44 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70  Dup(db, pStep->p
62c0: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
62d0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
62e0: 74 44 65 73 74 49 6e 69 74 28 26 73 44 65 73 74  tDestInit(&sDest
62f0: 2c 20 53 52 54 5f 44 69 73 63 61 72 64 2c 20 30  , SRT_Discard, 0
6300: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6310: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
6320: 20 70 53 65 6c 65 63 74 2c 20 26 73 44 65 73 74   pSelect, &sDest
6330: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6340: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
6350: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b, pSelect);.   
6360: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6370: 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20 20 20 69    }.    } .    i
6380: 66 28 20 70 53 74 65 70 2d 3e 6f 70 21 3d 54 4b  f( pStep->op!=TK
6390: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
63a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
63b0: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 43 6f  p1(v, OP_ResetCo
63c0: 75 6e 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  unt, 1);.    }. 
63d0: 20 20 20 70 53 74 65 70 20 3d 20 70 53 74 65 70     pStep = pStep
63e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 2f 2a 20  ->pNext;.  }./* 
63f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6400: 32 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50  2(v, OP_ContextP
6410: 6f 70 2c 20 30 2c 20 30 29 3b 20 2a 2f 0a 0a 20  op, 0, 0); */.. 
6420: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69   return 0;.}..#i
6430: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
6440: 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
6450: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
6460: 20 61 64 64 20 56 64 62 65 43 6f 6d 6d 65 6e 74   add VdbeComment
6470: 28 29 20 61 6e 6e 6f 74 61 74 69 6f 6e 73 20 74  () annotations t
6480: 6f 20 61 20 56 44 42 45 0a 2a 2a 20 70 72 6f 67  o a VDBE.** prog
6490: 72 61 6d 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ram. It is not u
64a0: 73 65 64 20 69 6e 20 70 72 6f 64 75 63 74 69 6f  sed in productio
64b0: 6e 20 63 6f 64 65 2c 20 6f 6e 6c 79 20 66 6f 72  n code, only for
64c0: 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 73   debugging..*/.s
64d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
64e0: 20 2a 6f 6e 45 72 72 6f 72 54 65 78 74 28 69 6e   *onErrorText(in
64f0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 73 77  t onError){.  sw
6500: 69 74 63 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b  itch( onError ){
6510: 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f  .    case OE_Abo
6520: 72 74 3a 20 20 20 20 72 65 74 75 72 6e 20 22 61  rt:    return "a
6530: 62 6f 72 74 22 3b 0a 20 20 20 20 63 61 73 65 20  bort";.    case 
6540: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 72 65 74  OE_Rollback: ret
6550: 75 72 6e 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 0a  urn "rollback";.
6560: 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c      case OE_Fail
6570: 3a 20 20 20 20 20 72 65 74 75 72 6e 20 22 66 61  :     return "fa
6580: 69 6c 22 3b 0a 20 20 20 20 63 61 73 65 20 4f 45  il";.    case OE
6590: 5f 52 65 70 6c 61 63 65 3a 20 20 72 65 74 75 72  _Replace:  retur
65a0: 6e 20 22 72 65 70 6c 61 63 65 22 3b 0a 20 20 20  n "replace";.   
65b0: 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a   case OE_Ignore:
65c0: 20 20 20 72 65 74 75 72 6e 20 22 69 67 6e 6f 72     return "ignor
65d0: 65 22 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f  e";.    case OE_
65e0: 44 65 66 61 75 6c 74 3a 20 20 72 65 74 75 72 6e  Default:  return
65f0: 20 22 64 65 66 61 75 6c 74 22 3b 0a 20 20 7d 0a   "default";.  }.
6600: 20 20 72 65 74 75 72 6e 20 22 6e 2f 61 22 3b 0a    return "n/a";.
6610: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
6620: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 73 74  Parse context st
6630: 72 75 63 74 75 72 65 20 70 46 72 6f 6d 20 68 61  ructure pFrom ha
6640: 73 20 6a 75 73 74 20 62 65 65 6e 20 75 73 65 64  s just been used
6650: 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 75 62   to create a sub
6660: 2d 76 64 62 65 0a 2a 2a 20 28 74 72 69 67 67 65  -vdbe.** (trigge
6670: 72 20 70 72 6f 67 72 61 6d 29 2e 20 49 66 20 61  r program). If a
6680: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
6690: 72 72 65 64 2c 20 74 72 61 6e 73 66 65 72 20 65  rred, transfer e
66a0: 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rror information
66b0: 0a 2a 2a 20 66 72 6f 6d 20 70 46 72 6f 6d 20 74  .** from pFrom t
66c0: 6f 20 70 54 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  o pTo..*/.static
66d0: 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 50 61   void transferPa
66e0: 72 73 65 45 72 72 6f 72 28 50 61 72 73 65 20 2a  rseError(Parse *
66f0: 70 54 6f 2c 20 50 61 72 73 65 20 2a 70 46 72 6f  pTo, Parse *pFro
6700: 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46  m){.  assert( pF
6710: 72 6f 6d 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30 20  rom->zErrMsg==0 
6720: 7c 7c 20 70 46 72 6f 6d 2d 3e 6e 45 72 72 20 29  || pFrom->nErr )
6730: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 2d  ;.  assert( pTo-
6740: 3e 7a 45 72 72 4d 73 67 3d 3d 30 20 7c 7c 20 70  >zErrMsg==0 || p
6750: 54 6f 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 69 66  To->nErr );.  if
6760: 28 20 70 54 6f 2d 3e 6e 45 72 72 3d 3d 30 20 29  ( pTo->nErr==0 )
6770: 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 45 72 72 4d  {.    pTo->zErrM
6780: 73 67 20 3d 20 70 46 72 6f 6d 2d 3e 7a 45 72 72  sg = pFrom->zErr
6790: 4d 73 67 3b 0a 20 20 20 20 70 54 6f 2d 3e 6e 45  Msg;.    pTo->nE
67a0: 72 72 20 3d 20 70 46 72 6f 6d 2d 3e 6e 45 72 72  rr = pFrom->nErr
67b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
67c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 46 72  qlite3DbFree(pFr
67d0: 6f 6d 2d 3e 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a  om->db, pFrom->z
67e0: 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 0a  ErrMsg);.  }.}..
67f0: 73 74 61 74 69 63 20 43 6f 64 65 64 54 72 69 67  static CodedTrig
6800: 67 65 72 20 2a 63 6f 64 65 52 6f 77 54 72 69 67  ger *codeRowTrig
6810: 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 52  ger(.  Parse *pR
6820: 6f 6f 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 52  oot,        /* R
6830: 6f 6f 74 20 70 61 72 73 65 20 63 6f 6e 74 65 78  oot parse contex
6840: 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
6850: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 43  arse,       /* C
6860: 75 72 72 65 6e 74 20 70 61 72 73 65 20 63 6f 6e  urrent parse con
6870: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
6880: 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20 20 2f  r *pTrigger,   /
6890: 2a 20 54 72 69 67 67 65 72 20 74 6f 20 63 6f 64  * Trigger to cod
68a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  e */.  int op,  
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
68c0: 6e 65 20 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c  ne of TK_UPDATE,
68d0: 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 44   TK_INSERT, TK_D
68e0: 45 4c 45 54 45 20 2a 2f 0a 20 20 54 61 62 6c 65  ELETE */.  Table
68f0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
6900: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20  /* The table to 
6910: 63 6f 64 65 20 74 72 69 67 67 65 72 73 20 66 72  code triggers fr
6920: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f  om */.  int orco
6930: 6e 66 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  nf.){.  sqlite3 
6940: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6950: 3b 0a 20 20 43 6f 64 65 64 54 72 69 67 67 65 72  ;.  CodedTrigger
6960: 20 2a 70 43 3b 0a 20 20 45 78 70 72 20 2a 70 57   *pC;.  Expr *pW
6970: 68 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  hen = 0;        
6980: 20 20 20 20 2f 2a 20 44 75 70 6c 69 63 61 74 65      /* Duplicate
6990: 20 6f 66 20 74 72 69 67 67 65 72 20 57 48 45 4e   of trigger WHEN
69a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
69b0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
69d0: 54 65 6d 70 6f 72 61 72 79 20 56 4d 20 2a 2f 0a  Temporary VM */.
69e0: 20 20 41 75 74 68 43 6f 6e 74 65 78 74 20 73 43    AuthContext sC
69f0: 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 2f 2a  ontext;       /*
6a00: 20 41 75 74 68 20 63 6f 6e 74 65 78 74 20 66 6f   Auth context fo
6a10: 72 20 73 75 62 2d 76 64 62 65 20 2a 2f 0a 20 20  r sub-vdbe */.  
6a20: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6a40: 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
6a50: 73 75 62 2d 76 64 62 65 20 2a 2f 0a 20 20 53 75  sub-vdbe */.  Su
6a60: 62 50 72 6f 67 72 61 6d 20 2a 70 50 72 6f 67 72  bProgram *pProgr
6a70: 61 6d 20 3d 20 30 3b 20 20 20 2f 2a 20 53 75 62  am = 0;   /* Sub
6a80: 2d 76 64 62 65 20 66 6f 72 20 74 72 69 67 67 65  -vdbe for trigge
6a90: 72 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 50  r program */.  P
6aa0: 61 72 73 65 20 2a 70 53 75 62 50 61 72 73 65 3b  arse *pSubParse;
6ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
6ac0: 72 73 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  rse context for 
6ad0: 73 75 62 2d 76 64 62 65 20 2a 2f 0a 20 20 69 6e  sub-vdbe */.  in
6ae0: 74 20 69 45 6e 64 54 72 69 67 67 65 72 20 3d 20  t iEndTrigger = 
6af0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  0;        /* Lab
6b00: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66  el to jump to if
6b10: 20 57 48 45 4e 20 69 73 20 66 61 6c 73 65 20 2a   WHEN is false *
6b20: 2f 0a 0a 20 20 70 43 20 3d 20 73 71 6c 69 74 65  /..  pC = sqlite
6b30: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
6b40: 2c 20 73 69 7a 65 6f 66 28 43 6f 64 65 64 54 72  , sizeof(CodedTr
6b50: 69 67 67 65 72 29 29 3b 0a 20 20 69 66 28 20 21  igger));.  if( !
6b60: 70 43 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  pC ) return 0;. 
6b70: 20 70 43 2d 3e 70 4e 65 78 74 20 3d 20 70 52 6f   pC->pNext = pRo
6b80: 6f 74 2d 3e 70 43 6f 64 65 64 54 72 69 67 67 65  ot->pCodedTrigge
6b90: 72 3b 0a 20 20 70 52 6f 6f 74 2d 3e 70 43 6f 64  r;.  pRoot->pCod
6ba0: 65 64 54 72 69 67 67 65 72 20 3d 20 70 43 3b 0a  edTrigger = pC;.
6bb0: 20 20 70 43 2d 3e 70 50 72 6f 67 72 61 6d 20 3d    pC->pProgram =
6bc0: 20 70 50 72 6f 67 72 61 6d 20 3d 20 73 71 6c 69   pProgram = sqli
6bd0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
6be0: 64 62 2c 20 73 69 7a 65 6f 66 28 53 75 62 50 72  db, sizeof(SubPr
6bf0: 6f 67 72 61 6d 29 29 3b 0a 20 20 69 66 28 20 21  ogram));.  if( !
6c00: 70 50 72 6f 67 72 61 6d 20 29 20 72 65 74 75 72  pProgram ) retur
6c10: 6e 20 30 3b 0a 20 20 70 50 72 6f 67 72 61 6d 2d  n 0;.  pProgram-
6c20: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 53 75  >nRef = 1;.  pSu
6c30: 62 50 61 72 73 65 20 3d 20 73 71 6c 69 74 65 33  bParse = sqlite3
6c40: 53 74 61 63 6b 41 6c 6c 6f 63 5a 65 72 6f 28 64  StackAllocZero(d
6c50: 62 2c 20 73 69 7a 65 6f 66 28 50 61 72 73 65 29  b, sizeof(Parse)
6c60: 29 3b 0a 20 20 69 66 28 20 21 70 53 75 62 50 61  );.  if( !pSubPa
6c70: 72 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  rse ) return 0;.
6c80: 0a 20 20 70 43 2d 3e 70 50 72 6f 67 72 61 6d 20  .  pC->pProgram 
6c90: 3d 20 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 43  = pProgram;.  pC
6ca0: 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70 54 72  ->pTrigger = pTr
6cb0: 69 67 67 65 72 3b 0a 20 20 70 43 2d 3e 6f 72 63  igger;.  pC->orc
6cc0: 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 0a 20  onf = orconf;.. 
6cd0: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
6ce0: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
6cf0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 53   sNC.pParse = pS
6d00: 75 62 50 61 72 73 65 3b 0a 20 20 70 53 75 62 50  ubParse;.  pSubP
6d10: 61 72 73 65 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  arse->db = db;. 
6d20: 20 70 53 75 62 50 61 72 73 65 2d 3e 70 54 72 69   pSubParse->pTri
6d30: 67 67 65 72 54 61 62 20 3d 20 70 54 61 62 3b 0a  ggerTab = pTab;.
6d40: 20 20 70 53 75 62 50 61 72 73 65 2d 3e 70 52 6f    pSubParse->pRo
6d50: 6f 74 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 70 53  ot = pRoot;.  pS
6d60: 75 62 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f  ubParse->zAuthCo
6d70: 6e 74 65 78 74 20 3d 20 70 54 72 69 67 67 65 72  ntext = pTrigger
6d80: 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 76 20 3d 20  ->zName;..  v = 
6d90: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
6da0: 53 75 62 50 61 72 73 65 29 3b 0a 20 20 69 66 28  SubParse);.  if(
6db0: 20 76 20 29 7b 0a 20 20 20 20 56 64 62 65 43 6f   v ){.    VdbeCo
6dc0: 6d 6d 65 6e 74 28 28 76 2c 20 22 53 74 61 72 74  mment((v, "Start
6dd0: 3a 20 25 73 2e 25 73 20 28 25 73 20 25 73 25 73  : %s.%s (%s %s%s
6de0: 25 73 20 4f 4e 20 25 73 29 22 2c 20 0a 20 20 20  %s ON %s)", .   
6df0: 20 20 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61     pTrigger->zNa
6e00: 6d 65 2c 20 6f 6e 45 72 72 6f 72 54 65 78 74 28  me, onErrorText(
6e10: 6f 72 63 6f 6e 66 29 2c 0a 20 20 20 20 20 20 28  orconf),.      (
6e20: 70 54 72 69 67 67 65 72 2d 3e 74 72 5f 74 6d 3d  pTrigger->tr_tm=
6e30: 3d 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20  =TRIGGER_BEFORE 
6e40: 3f 20 22 42 45 46 4f 52 45 22 20 3a 20 22 41 46  ? "BEFORE" : "AF
6e50: 54 45 52 22 29 2c 0a 20 20 20 20 20 20 20 20 28  TER"),.        (
6e60: 6f 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 3f 20  op==TK_UPDATE ? 
6e70: 22 55 50 44 41 54 45 22 20 3a 20 22 22 29 2c 0a  "UPDATE" : ""),.
6e80: 20 20 20 20 20 20 20 20 28 6f 70 3d 3d 54 4b 5f          (op==TK_
6e90: 49 4e 53 45 52 54 20 3f 20 22 49 4e 53 45 52 54  INSERT ? "INSERT
6ea0: 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 20  " : ""),.       
6eb0: 20 28 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20   (op==TK_DELETE 
6ec0: 3f 20 22 44 45 4c 45 54 45 22 20 3a 20 22 22 29  ? "DELETE" : "")
6ed0: 2c 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ,.      pTab->zN
6ee0: 61 6d 65 0a 20 20 20 20 29 29 3b 0a 23 69 66 6e  ame.    ));.#ifn
6ef0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6f00: 54 52 41 43 45 0a 20 20 20 20 73 71 6c 69 74 65  TRACE.    sqlite
6f10: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
6f20: 20 2d 31 2c 20 0a 20 20 20 20 20 20 73 71 6c 69   -1, .      sqli
6f30: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
6f40: 2d 2d 20 54 52 49 47 47 45 52 20 25 73 22 2c 20  -- TRIGGER %s", 
6f50: 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 29  pTrigger->zName)
6f60: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20  , P4_DYNAMIC.   
6f70: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   );.#endif..    
6f80: 69 66 28 20 70 54 72 69 67 67 65 72 2d 3e 70 57  if( pTrigger->pW
6f90: 68 65 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  hen ){.      /* 
6fa0: 43 6f 64 65 20 74 68 65 20 57 48 45 4e 20 63 6c  Code the WHEN cl
6fb0: 61 75 73 65 2e 20 49 66 20 69 74 20 65 76 61 6c  ause. If it eval
6fc0: 75 61 74 65 73 20 74 6f 20 66 61 6c 73 65 20 28  uates to false (
6fd0: 6f 72 20 4e 55 4c 4c 29 20 74 68 65 20 0a 20 20  or NULL) the .  
6fe0: 20 20 20 20 2a 2a 20 73 75 62 2d 76 64 62 65 20      ** sub-vdbe 
6ff0: 69 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 68  is immediately h
7000: 61 6c 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  alted.  */.     
7010: 20 70 57 68 65 6e 20 3d 20 73 71 6c 69 74 65 33   pWhen = sqlite3
7020: 45 78 70 72 44 75 70 28 64 62 2c 20 70 54 72 69  ExprDup(db, pTri
7030: 67 67 65 72 2d 3e 70 57 68 65 6e 2c 20 30 29 3b  gger->pWhen, 0);
7040: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
7050: 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 52 65 73  E_OK==sqlite3Res
7060: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
7070: 4e 43 2c 20 70 57 68 65 6e 29 20 0a 20 20 20 20  NC, pWhen) .    
7080: 20 20 20 26 26 20 64 62 2d 3e 6d 61 6c 6c 6f 63     && db->malloc
7090: 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20  Failed==0 .     
70a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64   ){.        iEnd
70b0: 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
70c0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
70d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
70e0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 53  e3ExprIfFalse(pS
70f0: 75 62 50 61 72 73 65 2c 20 70 57 68 65 6e 2c 20  ubParse, pWhen, 
7100: 69 45 6e 64 54 72 69 67 67 65 72 2c 20 53 51 4c  iEndTrigger, SQL
7110: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
7120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
7130: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7140: 28 64 62 2c 20 70 57 68 65 6e 29 3b 0a 20 20 20  (db, pWhen);.   
7150: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20   }..    /* Code 
7160: 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  the trigger prog
7170: 72 61 6d 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ram into the sub
7180: 2d 76 64 62 65 2e 20 2a 2f 0a 20 20 20 20 63 6f  -vdbe. */.    co
7190: 64 65 54 72 69 67 67 65 72 50 72 6f 67 72 61 6d  deTriggerProgram
71a0: 28 70 53 75 62 50 61 72 73 65 2c 20 70 54 72 69  (pSubParse, pTri
71b0: 67 67 65 72 2d 3e 73 74 65 70 5f 6c 69 73 74 2c  gger->step_list,
71c0: 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 20 20 69 66   orconf);.    if
71d0: 28 20 69 45 6e 64 54 72 69 67 67 65 72 20 29 7b  ( iEndTrigger ){
71e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
71f0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
7200: 2c 20 69 45 6e 64 54 72 69 67 67 65 72 29 3b 0a  , iEndTrigger);.
7210: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7220: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
7230: 50 5f 48 61 6c 74 29 3b 0a 20 20 20 20 56 64 62  P_Halt);.    Vdb
7240: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  eComment((v, "En
7250: 64 3a 20 25 73 2e 25 73 22 2c 20 70 54 72 69 67  d: %s.%s", pTrig
7260: 67 65 72 2d 3e 7a 4e 61 6d 65 2c 20 6f 6e 45 72  ger->zName, onEr
7270: 72 6f 72 54 65 78 74 28 6f 72 63 6f 6e 66 29 29  rorText(orconf))
7280: 29 3b 0a 0a 20 20 20 20 74 72 61 6e 73 66 65 72  );..    transfer
7290: 50 61 72 73 65 45 72 72 6f 72 28 70 50 61 72 73  ParseError(pPars
72a0: 65 2c 20 70 53 75 62 50 61 72 73 65 29 3b 0a 20  e, pSubParse);. 
72b0: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
72c0: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
72d0: 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e 61 4f      pProgram->aO
72e0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 54  p = sqlite3VdbeT
72f0: 61 6b 65 4f 70 41 72 72 61 79 28 76 2c 20 26 70  akeOpArray(v, &p
7300: 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 2c 20 26 70  Program->nOp, &p
7310: 50 61 72 73 65 2d 3e 6e 41 72 67 29 3b 0a 20 20  Parse->nArg);.  
7320: 20 20 7d 0a 20 20 20 20 70 50 72 6f 67 72 61 6d    }.    pProgram
7330: 2d 3e 6e 4d 65 6d 20 3d 20 70 53 75 62 50 61 72  ->nMem = pSubPar
7340: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 50  se->nMem;.    pP
7350: 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 20 3d 20 70  rogram->nCsr = p
7360: 53 75 62 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  SubParse->nTab;.
7370: 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f      pProgram->to
7380: 6b 65 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 54  ken = (void *)pT
7390: 72 69 67 67 65 72 3b 0a 20 20 20 20 70 43 2d 3e  rigger;.    pC->
73a0: 6f 6c 64 6d 61 73 6b 20 3d 20 70 53 75 62 50 61  oldmask = pSubPa
73b0: 72 73 65 2d 3e 6f 6c 64 6d 61 73 6b 3b 0a 20 20  rse->oldmask;.  
73c0: 20 20 70 43 2d 3e 6e 65 77 6d 61 73 6b 20 3d 20    pC->newmask = 
73d0: 70 53 75 62 50 61 72 73 65 2d 3e 6e 65 77 6d 61  pSubParse->newma
73e0: 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  sk;.    sqlite3V
73f0: 64 62 65 44 65 6c 65 74 65 28 76 29 3b 0a 0a 20  dbeDelete(v);.. 
7400: 20 20 20 77 68 69 6c 65 28 20 70 53 75 62 50 61     while( pSubPa
7410: 72 73 65 2d 3e 70 41 69 6e 63 20 29 7b 0a 20 20  rse->pAinc ){.  
7420: 20 20 20 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20      AutoincInfo 
7430: 2a 70 20 3d 20 70 53 75 62 50 61 72 73 65 2d 3e  *p = pSubParse->
7440: 70 41 69 6e 63 3b 0a 20 20 20 20 20 20 70 53 75  pAinc;.      pSu
7450: 62 50 61 72 73 65 2d 3e 70 41 69 6e 63 20 3d 20  bParse->pAinc = 
7460: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
7470: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7480: 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , p);.    }.  }.
7490: 20 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72    sqlite3StackFr
74a0: 65 65 28 64 62 2c 20 70 53 75 62 50 61 72 73 65  ee(db, pSubParse
74b0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 3b  );..  return pC;
74c0: 0a 7d 0a 20 20 20 20 0a 73 74 61 74 69 63 20 43  .}.    .static C
74d0: 6f 64 65 64 54 72 69 67 67 65 72 20 2a 67 65 74  odedTrigger *get
74e0: 52 6f 77 54 72 69 67 67 65 72 28 0a 20 20 50 61  RowTrigger(.  Pa
74f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 54  rse *pParse,.  T
7500: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
7510: 2c 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 74  ,   /* Trigger t
7520: 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  o code */.  int 
7530: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
7540: 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 50   /* One of TK_UP
7550: 44 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c  DATE, TK_INSERT,
7560: 20 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20   TK_DELETE */.  
7570: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
7580: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
7590: 65 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65  e to code trigge
75a0: 72 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  rs from */.  int
75b0: 20 6f 72 63 6f 6e 66 0a 29 7b 0a 20 20 43 6f 64   orconf.){.  Cod
75c0: 65 64 54 72 69 67 67 65 72 20 2a 70 43 3b 0a 20  edTrigger *pC;. 
75d0: 20 50 61 72 73 65 20 2a 70 52 6f 6f 74 20 3d 20   Parse *pRoot = 
75e0: 70 50 61 72 73 65 3b 0a 0a 20 20 2f 2a 20 49 74  pParse;..  /* It
75f0: 20 6d 61 79 20 62 65 20 74 68 61 74 20 74 68 69   may be that thi
7600: 73 20 74 72 69 67 67 65 72 20 68 61 73 20 61 6c  s trigger has al
7610: 72 65 61 64 79 20 62 65 65 6e 20 63 6f 64 65 64  ready been coded
7620: 20 28 6f 72 20 69 73 20 69 6e 20 74 68 65 0a 20   (or is in the. 
7630: 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62   ** process of b
7640: 65 69 6e 67 20 63 6f 64 65 64 29 2e 20 49 66 20  eing coded). If 
7650: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
7660: 2c 20 74 68 65 6e 20 61 6e 20 65 6e 74 72 79 20  , then an entry 
7670: 77 69 74 68 0a 20 20 2a 2a 20 61 20 6d 61 74 63  with.  ** a matc
7680: 68 69 6e 67 20 43 6f 64 65 64 54 72 69 67 67 65  hing CodedTrigge
7690: 72 2e 70 54 72 69 67 67 65 72 20 66 69 65 6c 64  r.pTrigger field
76a0: 20 77 69 6c 6c 20 62 65 20 70 72 65 73 65 6e 74   will be present
76b0: 20 73 6f 6d 65 77 68 65 72 65 0a 20 20 2a 2a 20   somewhere.  ** 
76c0: 69 6e 20 74 68 65 20 50 61 72 73 65 2e 70 43 6f  in the Parse.pCo
76d0: 64 65 64 54 72 69 67 67 65 72 20 6c 69 73 74 2e  dedTrigger list.
76e0: 20 53 65 61 72 63 68 20 66 6f 72 20 73 75 63 68   Search for such
76f0: 20 61 6e 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20   an entry.  */. 
7700: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 52 6f   if( pParse->pRo
7710: 6f 74 20 29 7b 0a 20 20 20 20 70 52 6f 6f 74 20  ot ){.    pRoot 
7720: 3d 20 70 50 61 72 73 65 2d 3e 70 52 6f 6f 74 3b  = pParse->pRoot;
7730: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 43 3d 70 52  .  }.  for(pC=pR
7740: 6f 6f 74 2d 3e 70 43 6f 64 65 64 54 72 69 67 67  oot->pCodedTrigg
7750: 65 72 3b 20 0a 20 20 20 20 20 20 70 43 20 26 26  er; .      pC &&
7760: 20 28 70 43 2d 3e 70 54 72 69 67 67 65 72 21 3d   (pC->pTrigger!=
7770: 70 54 72 69 67 67 65 72 20 7c 7c 20 70 43 2d 3e  pTrigger || pC->
7780: 6f 72 63 6f 6e 66 21 3d 6f 72 63 6f 6e 66 29 3b  orconf!=orconf);
7790: 20 0a 20 20 20 20 20 20 70 43 3d 70 43 2d 3e 70   .      pC=pC->p
77a0: 4e 65 78 74 0a 20 20 29 3b 0a 0a 20 20 69 66 28  Next.  );..  if(
77b0: 20 21 70 43 20 29 7b 0a 20 20 20 20 70 43 20 3d   !pC ){.    pC =
77c0: 20 63 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28   codeRowTrigger(
77d0: 70 52 6f 6f 74 2c 20 70 50 61 72 73 65 2c 20 70  pRoot, pParse, p
77e0: 54 72 69 67 67 65 72 2c 20 6f 70 2c 20 70 54 61  Trigger, op, pTa
77f0: 62 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 7d 0a  b, orconf);.  }.
7800: 0a 20 20 72 65 74 75 72 6e 20 70 43 3b 0a 7d 0a  .  return pC;.}.
7810: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
7820: 61 6c 6c 65 64 20 74 6f 20 63 6f 64 65 20 46 4f  alled to code FO
7830: 52 20 45 41 43 48 20 52 4f 57 20 74 72 69 67 67  R EACH ROW trigg
7840: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ers..**.** When 
7850: 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 74 68  the code that th
7860: 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65  is function gene
7870: 72 61 74 65 73 20 69 73 20 65 78 65 63 75 74 65  rates is execute
7880: 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  d, the following
7890: 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 74 72 75   .** must be tru
78a0: 65 3a 0a 2a 2a 0a 2a 2a 20 31 2e 20 4e 6f 20 63  e:.**.** 1. No c
78b0: 75 72 73 6f 72 73 20 6d 61 79 20 62 65 20 6f 70  ursors may be op
78c0: 65 6e 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  en in the main d
78d0: 61 74 61 62 61 73 65 2e 20 20 28 42 75 74 20 6e  atabase.  (But n
78e0: 65 77 49 64 78 20 61 6e 64 20 6f 6c 64 49 64 78  ewIdx and oldIdx
78f0: 0a 2a 2a 20 20 20 20 63 61 6e 20 62 65 20 69 6e  .**    can be in
7900: 64 69 63 65 73 20 6f 66 20 63 75 72 73 6f 72 73  dices of cursors
7910: 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
7920: 62 6c 65 73 2e 20 20 53 65 65 20 62 65 6c 6f 77  bles.  See below
7930: 2e 29 0a 2a 2a 0a 2a 2a 20 32 2e 20 49 66 20 74  .).**.** 2. If t
7940: 68 65 20 74 72 69 67 67 65 72 73 20 62 65 69 6e  he triggers bein
7950: 67 20 63 6f 64 65 64 20 61 72 65 20 4f 4e 20 49  g coded are ON I
7960: 4e 53 45 52 54 20 6f 72 20 4f 4e 20 55 50 44 41  NSERT or ON UPDA
7970: 54 45 20 74 72 69 67 67 65 72 73 2c 20 74 68 65  TE triggers, the
7980: 6e 0a 2a 2a 20 20 20 20 61 20 74 65 6d 70 6f 72  n.**    a tempor
7990: 61 72 79 20 76 64 62 65 20 63 75 72 73 6f 72 20  ary vdbe cursor 
79a0: 28 69 6e 64 65 78 20 6e 65 77 49 64 78 29 20 6d  (index newIdx) m
79b0: 75 73 74 20 62 65 20 6f 70 65 6e 20 61 6e 64 20  ust be open and 
79c0: 70 6f 69 6e 74 69 6e 67 20 61 74 0a 2a 2a 20 20  pointing at.**  
79d0: 20 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69    a row containi
79e0: 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  ng values to be 
79f0: 73 75 62 73 74 69 74 75 74 65 64 20 66 6f 72 20  substituted for 
7a00: 6e 65 77 2e 2a 20 65 78 70 72 65 73 73 69 6f 6e  new.* expression
7a10: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 74  s in the.**    t
7a20: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 28 73  rigger program(s
7a30: 29 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 49 66 20 74  )..**.** 3. If t
7a40: 68 65 20 74 72 69 67 67 65 72 73 20 62 65 69 6e  he triggers bein
7a50: 67 20 63 6f 64 65 64 20 61 72 65 20 4f 4e 20 44  g coded are ON D
7a60: 45 4c 45 54 45 20 6f 72 20 4f 4e 20 55 50 44 41  ELETE or ON UPDA
7a70: 54 45 20 74 72 69 67 67 65 72 73 2c 20 74 68 65  TE triggers, the
7a80: 6e 0a 2a 2a 20 20 20 20 61 20 74 65 6d 70 6f 72  n.**    a tempor
7a90: 61 72 79 20 76 64 62 65 20 63 75 72 73 6f 72 20  ary vdbe cursor 
7aa0: 28 69 6e 64 65 78 20 6f 6c 64 49 64 78 29 20 6d  (index oldIdx) m
7ab0: 75 73 74 20 62 65 20 6f 70 65 6e 20 61 6e 64 20  ust be open and 
7ac0: 70 6f 69 6e 74 69 6e 67 20 61 74 0a 2a 2a 20 20  pointing at.**  
7ad0: 20 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69    a row containi
7ae0: 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  ng values to be 
7af0: 73 75 62 73 74 69 74 75 74 65 64 20 66 6f 72 20  substituted for 
7b00: 6f 6c 64 2e 2a 20 65 78 70 72 65 73 73 69 6f 6e  old.* expression
7b10: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 74  s in the.**    t
7b20: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 28 73  rigger program(s
7b30: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 79  )..**.** If they
7b40: 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74   are not NULL, t
7b50: 68 65 20 70 69 4f 6c 64 43 6f 6c 4d 61 73 6b 20  he piOldColMask 
7b60: 61 6e 64 20 70 69 4e 65 77 43 6f 6c 4d 61 73 6b  and piNewColMask
7b70: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
7b80: 73 0a 2a 2a 20 61 72 65 20 73 65 74 20 74 6f 20  s.** are set to 
7b90: 76 61 6c 75 65 73 20 74 68 61 74 20 64 65 73 63  values that desc
7ba0: 72 69 62 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73  ribe the columns
7bb0: 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72 69   used by the tri
7bc0: 67 67 65 72 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  gger program.** 
7bd0: 69 6e 20 74 68 65 20 4f 4c 44 2e 2a 20 61 6e 64  in the OLD.* and
7be0: 20 4e 45 57 2e 2a 20 74 61 62 6c 65 73 20 72 65   NEW.* tables re
7bf0: 73 70 65 63 74 69 76 65 6c 79 2e 20 49 66 20 63  spectively. If c
7c00: 6f 6c 75 6d 6e 20 4e 20 6f 66 20 74 68 65 20 0a  olumn N of the .
7c10: 2a 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20  ** pseudo-table 
7c20: 69 73 20 72 65 61 64 20 61 74 20 6c 65 61 73 74  is read at least
7c30: 20 6f 6e 63 65 2c 20 74 68 65 20 63 6f 72 72 65   once, the corre
7c40: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 6f 66 20  sponding bit of 
7c50: 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 6d 61  the output.** ma
7c60: 73 6b 20 69 73 20 73 65 74 2e 20 49 66 20 61 20  sk is set. If a 
7c70: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 6e 20 69  column with an i
7c80: 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
7c90: 6e 20 33 32 20 69 73 20 72 65 61 64 2c 20 74 68  n 32 is read, th
7ca0: 65 0a 2a 2a 20 6f 75 74 70 75 74 20 6d 61 73 6b  e.** output mask
7cb0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
7cc0: 70 65 63 69 61 6c 20 76 61 6c 75 65 20 30 78 66  pecial value 0xf
7cd0: 66 66 66 66 66 66 66 2e 0a 2a 2a 0a 2a 2f 0a 76  fffffff..**.*/.v
7ce0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 52  oid sqlite3CodeR
7cf0: 6f 77 54 72 69 67 67 65 72 28 0a 20 20 50 61 72  owTrigger(.  Par
7d00: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7d10: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
7d20: 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20  xt */.  Trigger 
7d30: 2a 70 54 72 69 67 67 65 72 2c 20 20 20 2f 2a 20  *pTrigger,   /* 
7d40: 4c 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73  List of triggers
7d50: 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 20 2a   on table pTab *
7d60: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
7d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
7d80: 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b  of TK_UPDATE, TK
7d90: 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 44 45 4c 45  _INSERT, TK_DELE
7da0: 54 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  TE */.  ExprList
7db0: 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f 2a 20   *pChanges,  /* 
7dc0: 43 68 61 6e 67 65 73 20 6c 69 73 74 20 66 6f 72  Changes list for
7dd0: 20 61 6e 79 20 55 50 44 41 54 45 20 4f 46 20 74   any UPDATE OF t
7de0: 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74  riggers */.  int
7df0: 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20 20 20   tr_tm,         
7e00: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 52 49 47    /* One of TRIG
7e10: 47 45 52 5f 42 45 46 4f 52 45 2c 20 54 52 49 47  GER_BEFORE, TRIG
7e20: 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 20 20 54  GER_AFTER */.  T
7e30: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
7e40: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
7e50: 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72   to code trigger
7e60: 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
7e70: 6e 65 77 49 64 78 2c 20 20 20 20 20 20 20 20 20  newIdx,         
7e80: 20 2f 2a 20 54 68 65 20 69 6e 64 69 63 65 20 6f   /* The indice o
7e90: 66 20 74 68 65 20 22 6e 65 77 22 20 72 6f 77 20  f the "new" row 
7ea0: 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 69  to access */.  i
7eb0: 6e 74 20 6f 6c 64 49 64 78 2c 20 20 20 20 20 20  nt oldIdx,      
7ec0: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 69 63      /* The indic
7ed0: 65 20 6f 66 20 74 68 65 20 22 6f 6c 64 22 20 72  e of the "old" r
7ee0: 6f 77 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a  ow to access */.
7ef0: 20 20 69 6e 74 20 6f 72 63 6f 6e 66 2c 20 20 20    int orconf,   
7f00: 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e         /* ON CON
7f10: 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 2a 2f 0a  FLICT policy */.
7f20: 20 20 69 6e 74 20 69 67 6e 6f 72 65 4a 75 6d 70    int ignoreJump
7f30: 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75         /* Instru
7f40: 63 74 69 6f 6e 20 74 6f 20 6a 75 6d 70 20 74 6f  ction to jump to
7f50: 20 66 6f 72 20 52 41 49 53 45 28 49 47 4e 4f 52   for RAISE(IGNOR
7f60: 45 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  E) */.){.  Trigg
7f70: 65 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74  er *p;..  assert
7f80: 28 6f 70 20 3d 3d 20 54 4b 5f 55 50 44 41 54 45  (op == TK_UPDATE
7f90: 20 7c 7c 20 6f 70 20 3d 3d 20 54 4b 5f 49 4e 53   || op == TK_INS
7fa0: 45 52 54 20 7c 7c 20 6f 70 20 3d 3d 20 54 4b 5f  ERT || op == TK_
7fb0: 44 45 4c 45 54 45 29 3b 0a 20 20 61 73 73 65 72  DELETE);.  asser
7fc0: 74 28 74 72 5f 74 6d 20 3d 3d 20 54 52 49 47 47  t(tr_tm == TRIGG
7fd0: 45 52 5f 42 45 46 4f 52 45 20 7c 7c 20 74 72 5f  ER_BEFORE || tr_
7fe0: 74 6d 20 3d 3d 20 54 52 49 47 47 45 52 5f 41 46  tm == TRIGGER_AF
7ff0: 54 45 52 20 29 3b 0a 0a 20 20 66 6f 72 28 70 3d  TER );..  for(p=
8000: 70 54 72 69 67 67 65 72 3b 20 70 3b 20 70 3d 70  pTrigger; p; p=p
8010: 2d 3e 70 4e 65 78 74 29 7b 0a 0a 20 20 20 20 2f  ->pNext){..    /
8020: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
8030: 67 3a 20 20 54 68 65 20 73 63 68 65 6d 61 20 66  g:  The schema f
8040: 6f 72 20 74 68 65 20 74 72 69 67 67 65 72 20 61  or the trigger a
8050: 6e 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  nd for the table
8060: 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 77 61   are.    ** alwa
8070: 79 73 20 64 65 66 69 6e 65 64 2e 20 20 54 68 65  ys defined.  The
8080: 20 74 72 69 67 67 65 72 20 6d 75 73 74 20 62 65   trigger must be
8090: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 73 63 68   in the same sch
80a0: 65 6d 61 20 61 73 20 74 68 65 20 74 61 62 6c 65  ema as the table
80b0: 0a 20 20 20 20 2a 2a 20 6f 72 20 65 6c 73 65 20  .    ** or else 
80c0: 69 74 20 6d 75 73 74 20 62 65 20 61 20 54 45 4d  it must be a TEM
80d0: 50 20 74 72 69 67 67 65 72 2e 20 2a 2f 0a 20 20  P trigger. */.  
80e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63    assert( p->pSc
80f0: 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20 20 61  hema!=0 );.    a
8100: 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62 53 63  ssert( p->pTabSc
8110: 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20 20 61  hema!=0 );.    a
8120: 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d  ssert( p->pSchem
8130: 61 3d 3d 70 2d 3e 70 54 61 62 53 63 68 65 6d 61  a==p->pTabSchema
8140: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d   .         || p-
8150: 3e 70 53 63 68 65 6d 61 3d 3d 70 50 61 72 73 65  >pSchema==pParse
8160: 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ->db->aDb[1].pSc
8170: 68 65 6d 61 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  hema );..    /* 
8180: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
8190: 72 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 64 65  r we should code
81a0: 20 74 68 69 73 20 74 72 69 67 67 65 72 20 2a 2f   this trigger */
81b0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
81c0: 6f 70 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 74  op .     && p->t
81d0: 72 5f 74 6d 3d 3d 74 72 5f 74 6d 20 0a 20 20 20  r_tm==tr_tm .   
81e0: 20 20 26 26 20 63 68 65 63 6b 43 6f 6c 75 6d 6e    && checkColumn
81f0: 4f 76 65 72 6c 61 70 28 70 2d 3e 70 43 6f 6c 75  Overlap(p->pColu
8200: 6d 6e 73 2c 70 43 68 61 6e 67 65 73 29 0a 20 20  mns,pChanges).  
8210: 20 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 20    ){.      Vdbe 
8220: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
8230: 64 62 65 28 70 50 61 72 73 65 29 3b 20 2f 2a 20  dbe(pParse); /* 
8240: 4d 61 69 6e 20 56 4d 20 2a 2f 0a 20 20 20 20 20  Main VM */.     
8250: 20 43 6f 64 65 64 54 72 69 67 67 65 72 20 2a 70   CodedTrigger *p
8260: 43 3b 0a 20 20 20 20 20 20 70 43 20 3d 20 67 65  C;.      pC = ge
8270: 74 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72  tRowTrigger(pPar
8280: 73 65 2c 20 70 2c 20 6f 70 2c 20 70 54 61 62 2c  se, p, op, pTab,
8290: 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 20 20 20 20   orconf);.      
82a0: 61 73 73 65 72 74 28 20 70 43 20 7c 7c 20 70 50  assert( pC || pP
82b0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
82c0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
82d0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20  Failed );..     
82e0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f   /* Code the OP_
82f0: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
8300: 6e 20 74 68 65 20 70 61 72 65 6e 74 20 56 44 42  n the parent VDB
8310: 45 2e 20 50 34 20 6f 66 20 74 68 65 20 4f 50 5f  E. P4 of the OP_
8320: 50 72 6f 67 72 61 6d 20 0a 20 20 20 20 20 20 2a  Program .      *
8330: 2a 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  * is a pointer t
8340: 6f 20 74 68 65 20 73 75 62 2d 76 64 62 65 20 63  o the sub-vdbe c
8350: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 72  ontaining the tr
8360: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 20 20  igger program.  
8370: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 20  */.      if( pC 
8380: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8390: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
83a0: 4f 50 5f 50 72 6f 67 72 61 6d 2c 20 6f 6c 64 49  OP_Program, oldI
83b0: 64 78 2c 20 69 67 6e 6f 72 65 4a 75 6d 70 2c 20  dx, ignoreJump, 
83c0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b  ++pParse->nMem);
83d0: 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 70 50 72  .        pC->pPr
83e0: 6f 67 72 61 6d 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  ogram->nRef++;. 
83f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8400: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
8410: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
8420: 70 43 2d 3e 70 50 72 6f 67 72 61 6d 2c 20 50 34  pC->pProgram, P4
8430: 5f 53 55 42 50 52 4f 47 52 41 4d 29 3b 0a 20 20  _SUBPROGRAM);.  
8440: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
8450: 74 28 28 76 2c 20 22 43 61 6c 6c 3a 20 25 73 2e  t((v, "Call: %s.
8460: 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6f  %s", p->zName, o
8470: 6e 45 72 72 6f 72 54 65 78 74 28 6f 72 63 6f 6e  nErrorText(orcon
8480: 66 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  f)));.      }.  
8490: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20    }.  }.}..void 
84a0: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 55 73  sqlite3TriggerUs
84b0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
84c0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
84d0: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
84e0: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
84f0: 65 72 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  er,   /* List of
8500: 20 74 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62   triggers on tab
8510: 6c 65 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  le pTab */.  int
8520: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
8530: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55    /* One of TK_U
8540: 50 44 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54  PDATE, TK_INSERT
8550: 2c 20 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20  , TK_DELETE */. 
8560: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e   ExprList *pChan
8570: 67 65 73 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73  ges,  /* Changes
8580: 20 6c 69 73 74 20 66 6f 72 20 61 6e 79 20 55 50   list for any UP
8590: 44 41 54 45 20 4f 46 20 74 72 69 67 67 65 72 73  DATE OF triggers
85a0: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
85b0: 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  b,         /* Th
85c0: 65 20 74 61 62 6c 65 20 74 6f 20 63 6f 64 65 20  e table to code 
85d0: 74 72 69 67 67 65 72 73 20 66 72 6f 6d 20 2a 2f  triggers from */
85e0: 0a 20 20 69 6e 74 20 6f 72 63 6f 6e 66 2c 20 20  .  int orconf,  
85f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75          /* Defau
8600: 6c 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70  lt ON CONFLICT p
8610: 6f 6c 69 63 79 20 66 6f 72 20 74 72 69 67 67 65  olicy for trigge
8620: 72 20 73 74 65 70 73 20 2a 2f 0a 20 20 75 33 32  r steps */.  u32
8630: 20 2a 70 69 4f 6c 64 43 6f 6c 4d 61 73 6b 2c 20   *piOldColMask, 
8640: 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f    /* OUT: Mask o
8650: 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66  f columns used f
8660: 72 6f 6d 20 74 68 65 20 4f 4c 44 2e 2a 20 74 61  rom the OLD.* ta
8670: 62 6c 65 20 2a 2f 0a 20 20 75 33 32 20 2a 70 69  ble */.  u32 *pi
8680: 4e 65 77 43 6f 6c 4d 61 73 6b 20 20 20 20 2f 2a  NewColMask    /*
8690: 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 63 6f   OUT: Mask of co
86a0: 6c 75 6d 6e 73 20 75 73 65 64 20 66 72 6f 6d 20  lumns used from 
86b0: 74 68 65 20 4e 45 57 2e 2a 20 74 61 62 6c 65 20  the NEW.* table 
86c0: 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 20  */.){.  Trigger 
86d0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 6f 70 3d  *p;.  assert(op=
86e0: 3d 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70  =TK_UPDATE || op
86f0: 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  ==TK_INSERT || o
8700: 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 29 3b 0a 0a  p==TK_DELETE);..
8710: 20 20 66 6f 72 28 70 3d 70 54 72 69 67 67 65 72    for(p=pTrigger
8720: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
8730: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d  {.    if( p->op=
8740: 3d 6f 70 20 26 26 20 63 68 65 63 6b 43 6f 6c 75  =op && checkColu
8750: 6d 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70 43 6f  mnOverlap(p->pCo
8760: 6c 75 6d 6e 73 2c 70 43 68 61 6e 67 65 73 29 20  lumns,pChanges) 
8770: 29 7b 0a 20 20 20 20 20 20 43 6f 64 65 64 54 72  ){.      CodedTr
8780: 69 67 67 65 72 20 2a 70 43 3b 0a 20 20 20 20 20  igger *pC;.     
8790: 20 70 43 20 3d 20 67 65 74 52 6f 77 54 72 69 67   pC = getRowTrig
87a0: 67 65 72 28 70 50 61 72 73 65 2c 20 70 2c 20 6f  ger(pParse, p, o
87b0: 70 2c 20 70 54 61 62 2c 20 6f 72 63 6f 6e 66 29  p, pTab, orconf)
87c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29  ;.      if( pC )
87d0: 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 4f 6c 64  {.        *piOld
87e0: 43 6f 6c 4d 61 73 6b 20 7c 3d 20 70 43 2d 3e 6f  ColMask |= pC->o
87f0: 6c 64 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ldmask;.        
8800: 2a 70 69 4e 65 77 43 6f 6c 4d 61 73 6b 20 7c 3d  *piNewColMask |=
8810: 20 70 43 2d 3e 6e 65 77 6d 61 73 6b 3b 0a 20 20   pC->newmask;.  
8820: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8830: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  }..#endif /* !de
8840: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8850: 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a        T_TRIGGER) */.