/ Hex Artifact Content
Login

Artifact bb68c3d1feff3e1335c55a7acf195b9c96ae91ec:


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 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0170: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c  ontains the impl
0180: 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 54  ementation for T
0190: 52 49 47 47 45 52 73 0a 2a 2f 0a 23 69 6e 63 6c  RIGGERs.*/.#incl
01a0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
01b0: 22 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  "..#ifndef SQLIT
01c0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f  E_OMIT_TRIGGER./
01d0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 6c 69  *.** Delete a li
01e0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 54 72 69  nked list of Tri
01f0: 67 67 65 72 53 74 65 70 20 73 74 72 75 63 74 75  ggerStep structu
0200: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
0210: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
0220: 72 53 74 65 70 28 73 71 6c 69 74 65 33 20 2a 64  rStep(sqlite3 *d
0230: 62 2c 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  b, TriggerStep *
0240: 70 54 72 69 67 67 65 72 53 74 65 70 29 7b 0a 20  pTriggerStep){. 
0250: 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
0260: 53 74 65 70 20 29 7b 0a 20 20 20 20 54 72 69 67  Step ){.    Trig
0270: 67 65 72 53 74 65 70 20 2a 20 70 54 6d 70 20 3d  gerStep * pTmp =
0280: 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 20   pTriggerStep;. 
0290: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 20     pTriggerStep 
02a0: 3d 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  = pTriggerStep->
02b0: 70 4e 65 78 74 3b 0a 0a 20 20 20 20 73 71 6c 69  pNext;..    sqli
02c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
02d0: 2c 20 70 54 6d 70 2d 3e 70 57 68 65 72 65 29 3b  , pTmp->pWhere);
02e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
02f0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0300: 54 6d 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b  Tmp->pExprList);
0310: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
0320: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6d  ctDelete(db, pTm
0330: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  p->pSelect);.   
0340: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
0350: 6c 65 74 65 28 64 62 2c 20 70 54 6d 70 2d 3e 70  lete(db, pTmp->p
0360: 49 64 4c 69 73 74 29 3b 0a 0a 20 20 20 20 73 71  IdList);..    sq
0370: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0380: 70 54 6d 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pTmp);.  }.}../*
0390: 0a 2a 2a 20 47 69 76 65 6e 20 74 61 62 6c 65 20  .** Given table 
03a0: 70 54 61 62 2c 20 72 65 74 75 72 6e 20 61 20 6c  pTab, return a l
03b0: 69 73 74 20 6f 66 20 61 6c 6c 20 74 68 65 20 74  ist of all the t
03c0: 72 69 67 67 65 72 73 20 61 74 74 61 63 68 65 64  riggers attached
03d0: 20 74 6f 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   to .** the tabl
03e0: 65 2e 20 54 68 65 20 6c 69 73 74 20 69 73 20 63  e. The list is c
03f0: 6f 6e 6e 65 63 74 65 64 20 62 79 20 54 72 69 67  onnected by Trig
0400: 67 65 72 2e 70 4e 65 78 74 20 70 6f 69 6e 74 65  ger.pNext pointe
0410: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  rs..**.** All of
0420: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 6f 6e   the triggers on
0430: 20 70 54 61 62 20 74 68 61 74 20 61 72 65 20 69   pTab that are i
0440: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
0450: 61 73 65 20 61 73 20 70 54 61 62 0a 2a 2a 20 61  ase as pTab.** a
0460: 72 65 20 61 6c 72 65 61 64 79 20 61 74 74 61 63  re already attac
0470: 68 65 64 20 74 6f 20 70 54 61 62 2d 3e 70 54 72  hed to pTab->pTr
0480: 69 67 67 65 72 2e 20 20 42 75 74 20 74 68 65 72  igger.  But ther
0490: 65 20 6d 69 67 68 74 20 62 65 20 61 64 64 69 74  e might be addit
04a0: 69 6f 6e 61 6c 0a 2a 2a 20 74 72 69 67 67 65 72  ional.** trigger
04b0: 73 20 6f 6e 20 70 54 61 62 20 69 6e 20 74 68 65  s on pTab in the
04c0: 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 20 20 54   TEMP schema.  T
04d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 65 70  his routine prep
04e0: 65 6e 64 73 20 61 6c 6c 0a 2a 2a 20 54 45 4d 50  ends all.** TEMP
04f0: 20 74 72 69 67 67 65 72 73 20 6f 6e 20 70 54 61   triggers on pTa
0500: 62 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  b to the beginni
0510: 6e 67 20 6f 66 20 74 68 65 20 70 54 61 62 2d 3e  ng of the pTab->
0520: 70 54 72 69 67 67 65 72 20 6c 69 73 74 0a 2a 2a  pTrigger list.**
0530: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
0540: 20 63 6f 6d 62 69 6e 65 64 20 6c 69 73 74 2e 0a   combined list..
0550: 2a 2a 0a 2a 2a 20 54 6f 20 73 74 61 74 65 20 69  **.** To state i
0560: 74 20 61 6e 6f 74 68 65 72 20 77 61 79 3a 20 20  t another way:  
0570: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
0580: 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 61  urns a list of a
0590: 6c 6c 20 74 72 69 67 67 65 72 73 0a 2a 2a 20 74  ll triggers.** t
05a0: 68 61 74 20 66 69 72 65 20 6f 66 66 20 6f 66 20  hat fire off of 
05b0: 70 54 61 62 2e 20 20 54 68 65 20 6c 69 73 74 20  pTab.  The list 
05c0: 77 69 6c 6c 20 69 6e 63 6c 75 64 65 20 61 6e 79  will include any
05d0: 20 54 45 4d 50 20 74 72 69 67 67 65 72 73 20 6f   TEMP triggers o
05e0: 6e 0a 2a 2a 20 70 54 61 62 20 61 73 20 77 65 6c  n.** pTab as wel
05f0: 6c 20 61 73 20 74 68 65 20 74 72 69 67 67 65 72  l as the trigger
0600: 73 20 6c 69 73 65 64 20 69 6e 20 70 54 61 62 2d  s lised in pTab-
0610: 3e 70 54 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72  >pTrigger..*/.Tr
0620: 69 67 67 65 72 20 2a 73 71 6c 69 74 65 33 54 72  igger *sqlite3Tr
0630: 69 67 67 65 72 4c 69 73 74 28 50 61 72 73 65 20  iggerList(Parse 
0640: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
0650: 70 54 61 62 29 7b 0a 20 20 53 63 68 65 6d 61 20  pTab){.  Schema 
0660: 2a 20 63 6f 6e 73 74 20 70 54 6d 70 53 63 68 65  * const pTmpSche
0670: 6d 61 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ma = pParse->db-
0680: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[1].pSchema;
0690: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 73  .  Trigger *pLis
06a0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
06b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
06c0: 6f 66 20 74 72 69 67 67 65 72 73 20 74 6f 20 72  of triggers to r
06d0: 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  eturn */..  if( 
06e0: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 54  pParse->disableT
06f0: 72 69 67 67 65 72 73 20 29 7b 0a 20 20 20 20 72  riggers ){.    r
0700: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
0710: 69 66 28 20 70 54 6d 70 53 63 68 65 6d 61 21 3d  if( pTmpSchema!=
0720: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
0730: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
0740: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
0750: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
0760: 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  Held(pParse->db,
0770: 20 30 2c 20 70 54 6d 70 53 63 68 65 6d 61 29 20   0, pTmpSchema) 
0780: 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  );.    for(p=sql
0790: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 54  iteHashFirst(&pT
07a0: 6d 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61  mpSchema->trigHa
07b0: 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65  sh); p; p=sqlite
07c0: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20  HashNext(p)){.  
07d0: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
07e0: 69 67 20 3d 20 28 54 72 69 67 67 65 72 20 2a 29  ig = (Trigger *)
07f0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
0800: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 72  );.      if( pTr
0810: 69 67 2d 3e 70 54 61 62 53 63 68 65 6d 61 3d 3d  ig->pTabSchema==
0820: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 0a 20 20  pTab->pSchema.  
0830: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
0840: 65 33 53 74 72 49 43 6d 70 28 70 54 72 69 67 2d  e3StrICmp(pTrig-
0850: 3e 74 61 62 6c 65 2c 20 70 54 61 62 2d 3e 7a 4e  >table, pTab->zN
0860: 61 6d 65 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  ame) .      ){. 
0870: 20 20 20 20 20 20 20 70 54 72 69 67 2d 3e 70 4e         pTrig->pN
0880: 65 78 74 20 3d 20 28 70 4c 69 73 74 20 3f 20 70  ext = (pList ? p
0890: 4c 69 73 74 20 3a 20 70 54 61 62 2d 3e 70 54 72  List : pTab->pTr
08a0: 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  igger);.        
08b0: 70 4c 69 73 74 20 3d 20 70 54 72 69 67 3b 0a 20  pList = pTrig;. 
08c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
08d0: 0a 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73  ..  return (pLis
08e0: 74 20 3f 20 70 4c 69 73 74 20 3a 20 70 54 61 62  t ? pList : pTab
08f0: 2d 3e 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a  ->pTrigger);.}..
0900: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61  /*.** This is ca
0910: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
0920: 65 72 20 77 68 65 6e 20 69 74 20 73 65 65 73 20  er when it sees 
0930: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  a CREATE TRIGGER
0940: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 75 70   statement.** up
0950: 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 20 6f 66   to the point of
0960: 20 74 68 65 20 42 45 47 49 4e 20 62 65 66 6f 72   the BEGIN befor
0970: 65 20 74 68 65 20 74 72 69 67 67 65 72 20 61 63  e the trigger ac
0980: 74 69 6f 6e 73 2e 20 20 41 20 54 72 69 67 67 65  tions.  A Trigge
0990: 72 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69  r.** structure i
09a0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 61 73 65  s generated base
09b0: 64 20 6f 6e 20 74 68 65 20 69 6e 66 6f 72 6d 61  d on the informa
09c0: 74 69 6f 6e 20 61 76 61 69 6c 61 62 6c 65 20 61  tion available a
09d0: 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  nd stored.** in 
09e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
09f0: 67 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ger.  After the 
0a00: 74 72 69 67 67 65 72 20 61 63 74 69 6f 6e 73 20  trigger actions 
0a10: 68 61 76 65 20 62 65 65 6e 20 70 61 72 73 65 64  have been parsed
0a20: 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  , the.** sqlite3
0a30: 46 69 6e 69 73 68 54 72 69 67 67 65 72 28 29 20  FinishTrigger() 
0a40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
0a50: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
0a60: 68 65 20 74 72 69 67 67 65 72 0a 2a 2a 20 63 6f  he trigger.** co
0a70: 6e 73 74 72 75 63 74 69 6f 6e 20 70 72 6f 63 65  nstruction proce
0a80: 73 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ss..*/.void sqli
0a90: 74 65 33 42 65 67 69 6e 54 72 69 67 67 65 72 28  te3BeginTrigger(
0aa0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0ab0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
0ac0: 72 73 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  rse context of t
0ad0: 68 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45  he CREATE TRIGGE
0ae0: 52 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  R statement */. 
0af0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
0b00: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65       /* The name
0b10: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
0b20: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
0b30: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
0b40: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67  name of the trig
0b50: 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f  ger */.  int tr_
0b60: 74 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tm,          /* 
0b70: 4f 6e 65 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45  One of TK_BEFORE
0b80: 2c 20 54 4b 5f 41 46 54 45 52 2c 20 54 4b 5f 49  , TK_AFTER, TK_I
0b90: 4e 53 54 45 41 44 20 2a 2f 0a 20 20 69 6e 74 20  NSTEAD */.  int 
0ba0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
0bb0: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 49 4e 53  /* One of TK_INS
0bc0: 45 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20  ERT, TK_UPDATE, 
0bd0: 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 49  TK_DELETE */.  I
0be0: 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c  dList *pColumns,
0bf0: 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73     /* column lis
0c00: 74 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  t if this is an 
0c10: 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67 65  UPDATE OF trigge
0c20: 72 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  r */.  SrcList *
0c30: 70 54 61 62 6c 65 4e 61 6d 65 2c 2f 2a 20 54 68  pTableName,/* Th
0c40: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
0c50: 62 6c 65 2f 76 69 65 77 20 74 68 65 20 74 72 69  ble/view the tri
0c60: 67 67 65 72 20 61 70 70 6c 69 65 73 20 74 6f 20  gger applies to 
0c70: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 6e  */.  Expr *pWhen
0c80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 4e  ,        /* WHEN
0c90: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
0ca0: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20   isTemp,        
0cb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
0cc0: 54 45 4d 50 4f 52 41 52 59 20 6b 65 79 77 6f 72  TEMPORARY keywor
0cd0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0ce0: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
0cf0: 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73        /* Suppres
0d00: 73 20 65 72 72 6f 72 73 20 69 66 20 74 68 65 20  s errors if the 
0d10: 74 72 69 67 67 65 72 20 61 6c 72 65 61 64 79 20  trigger already 
0d20: 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
0d30: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
0d40: 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6e 65   = 0;  /* The ne
0d50: 77 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 54  w trigger */.  T
0d60: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
0d70: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
0d80: 74 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72  that the trigger
0d90: 20 66 69 72 65 73 20 6f 66 66 20 6f 66 20 2a 2f   fires off of */
0da0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
0db0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61   0;        /* Na
0dc0: 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  me of the trigge
0dd0: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
0de0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0df0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
0e00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
0e10: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
0e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0e30: 20 64 61 74 61 62 61 73 65 20 74 6f 20 73 74 6f   database to sto
0e40: 72 65 20 74 68 65 20 74 72 69 67 67 65 72 20 69  re the trigger i
0e50: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
0e60: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
0e70: 2a 20 54 68 65 20 75 6e 71 75 61 6c 69 66 69 65  * The unqualifie
0e80: 64 20 64 62 20 6e 61 6d 65 20 2a 2f 0a 20 20 44  d db name */.  D
0e90: 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
0ea0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20         /* State 
0eb0: 76 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 44  vector for the D
0ec0: 42 20 66 69 78 65 72 20 2a 2f 0a 20 20 69 6e 74  B fixer */.  int
0ed0: 20 69 54 61 62 44 62 3b 20 20 20 20 20 20 20 20   iTabDb;        
0ee0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
0ef0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
0f00: 6c 64 69 6e 67 20 70 54 61 62 20 2a 2f 0a 0a 20  lding pTab */.. 
0f10: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 21   assert( pName1!
0f20: 3d 30 20 29 3b 20 20 20 2f 2a 20 70 4e 61 6d 65  =0 );   /* pName
0f30: 31 2d 3e 7a 20 6d 69 67 68 74 20 62 65 20 4e 55  1->z might be NU
0f40: 4c 4c 2c 20 62 75 74 20 6e 6f 74 20 70 4e 61 6d  LL, but not pNam
0f50: 65 31 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 61  e1 itself */.  a
0f60: 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30  ssert( pName2!=0
0f70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
0f80: 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  ==TK_INSERT || o
0f90: 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20  p==TK_UPDATE || 
0fa0: 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20 29 3b  op==TK_DELETE );
0fb0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0fc0: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0fd0: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
0fe0: 20 20 2f 2a 20 49 66 20 54 45 4d 50 20 77 61 73    /* If TEMP was
0ff0: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
1000: 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d   the trigger nam
1010: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
1020: 6c 69 66 69 65 64 2e 20 2a 2f 0a 20 20 20 20 69  lified. */.    i
1030: 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29  f( pName2->n>0 )
1040: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1050: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1060: 22 74 65 6d 70 6f 72 61 72 79 20 74 72 69 67 67  "temporary trigg
1070: 65 72 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  er may not have 
1080: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 22 29  qualified name")
1090: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69  ;.      goto tri
10a0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
10b0: 20 20 7d 0a 20 20 20 20 69 44 62 20 3d 20 31 3b    }.    iDb = 1;
10c0: 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61  .    pName = pNa
10d0: 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me1;.  }else{.  
10e0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
10f0: 74 68 65 20 64 62 20 74 68 61 74 20 74 68 65 20  the db that the 
1100: 74 68 65 20 74 72 69 67 67 65 72 20 77 69 6c 6c  the trigger will
1110: 20 62 65 20 63 72 65 61 74 65 64 20 69 6e 20 2a   be created in *
1120: 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
1130: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
1140: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
1150: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
1160: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
1170: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67  .      goto trig
1180: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ger_cleanup;.   
1190: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
11a0: 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65  the trigger name
11b0: 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64   was unqualified
11c0: 2c 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  , and the table 
11d0: 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  is a temp table,
11e0: 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 69  .  ** then set i
11f0: 44 62 20 74 6f 20 31 20 74 6f 20 63 72 65 61 74  Db to 1 to creat
1200: 65 20 74 68 65 20 74 72 69 67 67 65 72 20 69 6e  e the trigger in
1210: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
1220: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20 49 66  atabase..  ** If
1230: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
1240: 6f 6f 6b 75 70 28 29 20 72 65 74 75 72 6e 73 20  ookup() returns 
1250: 30 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  0, indicating th
1260: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
1270: 0a 20 20 2a 2a 20 65 78 69 73 74 2c 20 74 68 65  .  ** exist, the
1280: 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74   error is caught
1290: 20 62 79 20 74 68 65 20 62 6c 6f 63 6b 20 62 65   by the block be
12a0: 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  low..  */.  if( 
12b0: 21 70 54 61 62 6c 65 4e 61 6d 65 20 7c 7c 20 64  !pTableName || d
12c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12d0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67  ){.    goto trig
12e0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ger_cleanup;.  }
12f0: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
1300: 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
1310: 50 61 72 73 65 2c 20 70 54 61 62 6c 65 4e 61 6d  Parse, pTableNam
1320: 65 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e  e);.  if( db->in
1330: 69 74 2e 62 75 73 79 3d 3d 30 20 26 26 20 70 4e  it.busy==0 && pN
1340: 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54  ame2->n==0 && pT
1350: 61 62 0a 20 20 20 20 20 20 20 20 26 26 20 70 54  ab.        && pT
1360: 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  ab->pSchema==db-
1370: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
1380: 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 31 3b 0a  ){.    iDb = 1;.
1390: 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65    }..  /* Ensure
13a0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
13b0: 6d 61 74 63 68 65 73 20 64 61 74 61 62 61 73 65  matches database
13c0: 20 6e 61 6d 65 20 61 6e 64 20 74 68 61 74 20 74   name and that t
13d0: 68 65 20 74 61 62 6c 65 20 65 78 69 73 74 73 20  he table exists 
13e0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
13f0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
1400: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
1410: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
1420: 6c 65 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20  leName->nSrc==1 
1430: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1440: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
1450: 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 72 69  Parse, iDb, "tri
1460: 67 67 65 72 22 2c 20 70 4e 61 6d 65 29 20 26 26  gger", pName) &&
1470: 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46   .      sqlite3F
1480: 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
1490: 20 70 54 61 62 6c 65 4e 61 6d 65 29 20 29 7b 0a   pTableName) ){.
14a0: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
14b0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
14c0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
14d0: 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
14e0: 73 65 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b  se, pTableName);
14f0: 0a 20 20 69 66 28 20 21 70 54 61 62 20 29 7b 0a  .  if( !pTab ){.
1500: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1510: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
1520: 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   */.    if( db->
1530: 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 7b 0a 20  init.iDb==1 ){. 
1540: 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 23       /* Ticket #
1550: 33 38 31 30 2e 0a 20 20 20 20 20 20 2a 2a 20 4e  3810..      ** N
1560: 6f 72 6d 61 6c 6c 79 2c 20 77 68 65 6e 65 76 65  ormally, wheneve
1570: 72 20 61 20 74 61 62 6c 65 20 69 73 20 64 72 6f  r a table is dro
1580: 70 70 65 64 2c 20 61 6c 6c 20 61 73 73 6f 63 69  pped, all associ
1590: 61 74 65 64 20 74 72 69 67 67 65 72 73 20 61 72  ated triggers ar
15a0: 65 0a 20 20 20 20 20 20 2a 2a 20 64 72 6f 70 70  e.      ** dropp
15b0: 65 64 20 74 6f 6f 2e 20 20 42 75 74 20 69 66 20  ed too.  But if 
15c0: 61 20 54 45 4d 50 20 74 72 69 67 67 65 72 20 69  a TEMP trigger i
15d0: 73 20 63 72 65 61 74 65 64 20 6f 6e 20 61 20 6e  s created on a n
15e0: 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 0a 20 20  on-TEMP table.  
15f0: 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 74      ** and the t
1600: 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 20  able is dropped 
1610: 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 64  by a different d
1620: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1630: 6f 6e 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  on, the.      **
1640: 20 74 72 69 67 67 65 72 20 69 73 20 6e 6f 74 20   trigger is not 
1650: 76 69 73 69 62 6c 65 20 74 6f 20 74 68 65 20 64  visible to the d
1660: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1670: 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 74 68 65  on that does the
1680: 0a 20 20 20 20 20 20 2a 2a 20 64 72 6f 70 20 73  .      ** drop s
1690: 6f 20 74 68 65 20 74 72 69 67 67 65 72 20 63 61  o the trigger ca
16a0: 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 2e  nnot be dropped.
16b0: 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
16c0: 6e 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 22 6f  n an.      ** "o
16d0: 72 70 68 61 6e 65 64 20 74 72 69 67 67 65 72 22  rphaned trigger"
16e0: 20 2d 20 61 20 74 72 69 67 67 65 72 20 77 68 6f   - a trigger who
16f0: 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 74 61  se associated ta
1700: 62 6c 65 20 69 73 20 6d 69 73 73 69 6e 67 2e 0a  ble is missing..
1710: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
1720: 62 2d 3e 69 6e 69 74 2e 6f 72 70 68 61 6e 54 72  b->init.orphanTr
1730: 69 67 67 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d  igger = 1;.    }
1740: 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65  .    goto trigge
1750: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  r_cleanup;.  }. 
1760: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
1770: 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
1780: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1790: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61  se, "cannot crea
17a0: 74 65 20 74 72 69 67 67 65 72 73 20 6f 6e 20 76  te triggers on v
17b0: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 22 29 3b  irtual tables");
17c0: 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65  .    goto trigge
17d0: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  r_cleanup;.  }..
17e0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
17f0: 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65  the trigger name
1800: 20 69 73 20 6e 6f 74 20 72 65 73 65 72 76 65 64   is not reserved
1810: 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 74 72 69   and that no tri
1820: 67 67 65 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a  gger of the.  **
1830: 20 73 70 65 63 69 66 69 65 64 20 6e 61 6d 65 20   specified name 
1840: 65 78 69 73 74 73 20 2a 2f 0a 20 20 7a 4e 61 6d  exists */.  zNam
1850: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1860: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
1870: 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a 4e 61 6d  me);.  if( !zNam
1880: 65 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  e || SQLITE_OK!=
1890: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
18a0: 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
18b0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  Name) ){.    got
18c0: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
18d0: 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  p;.  }.  assert(
18e0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
18f0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
1900: 20 30 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c   0) );.  if( sql
1910: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 28 64  ite3HashFind(&(d
1920: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
1930: 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 29 2c 0a  ema->trigHash),.
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 73 71 6c        zName, sql
1960: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
1970: 6d 65 29 29 20 29 7b 0a 20 20 20 20 69 66 28 20  me)) ){.    if( 
1980: 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20  !noErr ){.      
1990: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19a0: 70 50 61 72 73 65 2c 20 22 74 72 69 67 67 65 72  pParse, "trigger
19b0: 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73   %T already exis
19c0: 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ts", pName);.   
19d0: 20 7d 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67   }.    goto trig
19e0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ger_cleanup;.  }
19f0: 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 63 72  ..  /* Do not cr
1a00: 65 61 74 65 20 61 20 74 72 69 67 67 65 72 20 6f  eate a trigger o
1a10: 6e 20 61 20 73 79 73 74 65 6d 20 74 61 62 6c 65  n a system table
1a20: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
1a30: 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
1a40: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
1a50: 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , 7)==0 ){.    s
1a60: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a70: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63  Parse, "cannot c
1a80: 72 65 61 74 65 20 74 72 69 67 67 65 72 20 6f 6e  reate trigger on
1a90: 20 73 79 73 74 65 6d 20 74 61 62 6c 65 22 29 3b   system table");
1aa0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
1ab0: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  r++;.    goto tr
1ac0: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
1ad0: 20 7d 0a 0a 20 20 2f 2a 20 49 4e 53 54 45 41 44   }..  /* INSTEAD
1ae0: 20 6f 66 20 74 72 69 67 67 65 72 73 20 61 72 65   of triggers are
1af0: 20 6f 6e 6c 79 20 66 6f 72 20 76 69 65 77 73 20   only for views 
1b00: 61 6e 64 20 76 69 65 77 73 20 6f 6e 6c 79 20 73  and views only s
1b10: 75 70 70 6f 72 74 20 49 4e 53 54 45 41 44 0a 20  upport INSTEAD. 
1b20: 20 2a 2a 20 6f 66 20 74 72 69 67 67 65 72 73 2e   ** of triggers.
1b30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
1b40: 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 74 72 5f  ->pSelect && tr_
1b50: 74 6d 21 3d 54 4b 5f 49 4e 53 54 45 41 44 20 29  tm!=TK_INSTEAD )
1b60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1b70: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
1b80: 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 25 73 20  annot create %s 
1b90: 74 72 69 67 67 65 72 20 6f 6e 20 76 69 65 77 3a  trigger on view:
1ba0: 20 25 53 22 2c 20 0a 20 20 20 20 20 20 20 20 28   %S", .        (
1bb0: 74 72 5f 74 6d 20 3d 3d 20 54 4b 5f 42 45 46 4f  tr_tm == TK_BEFO
1bc0: 52 45 29 3f 22 42 45 46 4f 52 45 22 3a 22 41 46  RE)?"BEFORE":"AF
1bd0: 54 45 52 22 2c 20 70 54 61 62 6c 65 4e 61 6d 65  TER", pTableName
1be0: 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74  , 0);.    goto t
1bf0: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
1c00: 20 20 7d 0a 20 20 69 66 28 20 21 70 54 61 62 2d    }.  if( !pTab-
1c10: 3e 70 53 65 6c 65 63 74 20 26 26 20 74 72 5f 74  >pSelect && tr_t
1c20: 6d 3d 3d 54 4b 5f 49 4e 53 54 45 41 44 20 29 7b  m==TK_INSTEAD ){
1c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1c40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
1c50: 6e 6e 6f 74 20 63 72 65 61 74 65 20 49 4e 53 54  nnot create INST
1c60: 45 41 44 20 4f 46 22 0a 20 20 20 20 20 20 20 20  EAD OF".        
1c70: 22 20 74 72 69 67 67 65 72 20 6f 6e 20 74 61 62  " trigger on tab
1c80: 6c 65 3a 20 25 53 22 2c 20 70 54 61 62 6c 65 4e  le: %S", pTableN
1c90: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ame, 0);.    got
1ca0: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
1cb0: 70 3b 0a 20 20 7d 0a 20 20 69 54 61 62 44 62 20  p;.  }.  iTabDb 
1cc0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
1cd0: 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
1ce0: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
1cf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d00: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
1d10: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d  {.    int code =
1d20: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
1d30: 52 49 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e 73  RIGGER;.    cons
1d40: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
1d50: 2d 3e 61 44 62 5b 69 54 61 62 44 62 5d 2e 7a 4e  ->aDb[iTabDb].zN
1d60: 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
1d70: 68 61 72 20 2a 7a 44 62 54 72 69 67 20 3d 20 69  har *zDbTrig = i
1d80: 73 54 65 6d 70 20 3f 20 64 62 2d 3e 61 44 62 5b  sTemp ? db->aDb[
1d90: 31 5d 2e 7a 4e 61 6d 65 20 3a 20 7a 44 62 3b 0a  1].zName : zDb;.
1da0: 20 20 20 20 69 66 28 20 69 54 61 62 44 62 3d 3d      if( iTabDb==
1db0: 31 20 7c 7c 20 69 73 54 65 6d 70 20 29 20 63 6f  1 || isTemp ) co
1dc0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
1dd0: 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3b  TE_TEMP_TRIGGER;
1de0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1df0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1e00: 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 70  , code, zName, p
1e10: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 54  Tab->zName, zDbT
1e20: 72 69 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rig) ){.      go
1e30: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
1e40: 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  up;.    }.    if
1e50: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1e60: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1e70: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
1e80: 5f 54 41 42 4c 45 28 69 54 61 62 44 62 29 2c 30  _TABLE(iTabDb),0
1e90: 2c 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f  ,zDb)){.      go
1ea0: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
1eb0: 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  up;.    }.  }.#e
1ec0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 4e 53 54 45  ndif..  /* INSTE
1ed0: 41 44 20 4f 46 20 74 72 69 67 67 65 72 73 20 63  AD OF triggers c
1ee0: 61 6e 20 6f 6e 6c 79 20 61 70 70 65 61 72 20 6f  an only appear o
1ef0: 6e 20 76 69 65 77 73 20 61 6e 64 20 42 45 46 4f  n views and BEFO
1f00: 52 45 20 74 72 69 67 67 65 72 73 0a 20 20 2a 2a  RE triggers.  **
1f10: 20 63 61 6e 6e 6f 74 20 61 70 70 65 61 72 20 6f   cannot appear o
1f20: 6e 20 76 69 65 77 73 2e 20 20 53 6f 20 77 65 20  n views.  So we 
1f30: 6d 69 67 68 74 20 61 73 20 77 65 6c 6c 20 74 72  might as well tr
1f40: 61 6e 73 6c 61 74 65 20 65 76 65 72 79 0a 20 20  anslate every.  
1f50: 2a 2a 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72  ** INSTEAD OF tr
1f60: 69 67 67 65 72 20 69 6e 74 6f 20 61 20 42 45 46  igger into a BEF
1f70: 4f 52 45 20 74 72 69 67 67 65 72 2e 20 20 49 74  ORE trigger.  It
1f80: 20 73 69 6d 70 6c 69 66 69 65 73 20 63 6f 64 65   simplifies code
1f90: 0a 20 20 2a 2a 20 65 6c 73 65 77 68 65 72 65 2e  .  ** elsewhere.
1fa0: 0a 20 20 2a 2f 0a 20 20 69 66 20 28 74 72 5f 74  .  */.  if (tr_t
1fb0: 6d 20 3d 3d 20 54 4b 5f 49 4e 53 54 45 41 44 29  m == TK_INSTEAD)
1fc0: 7b 0a 20 20 20 20 74 72 5f 74 6d 20 3d 20 54 4b  {.    tr_tm = TK
1fd0: 5f 42 45 46 4f 52 45 3b 0a 20 20 7d 0a 0a 20 20  _BEFORE;.  }..  
1fe0: 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 54 72 69  /* Build the Tri
1ff0: 67 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  gger object */. 
2000: 20 70 54 72 69 67 67 65 72 20 3d 20 28 54 72 69   pTrigger = (Tri
2010: 67 67 65 72 2a 29 73 71 6c 69 74 65 33 44 62 4d  gger*)sqlite3DbM
2020: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
2030: 7a 65 6f 66 28 54 72 69 67 67 65 72 29 29 3b 0a  zeof(Trigger));.
2040: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 3d 3d    if( pTrigger==
2050: 30 20 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72  0 ) goto trigger
2060: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 72 69  _cleanup;.  pTri
2070: 67 67 65 72 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  gger->zName = zN
2080: 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 30  ame;.  zName = 0
2090: 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 74 61  ;.  pTrigger->ta
20a0: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ble = sqlite3DbS
20b0: 74 72 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65  trDup(db, pTable
20c0: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
20d0: 29 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 70  );.  pTrigger->p
20e0: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
20f0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
2100: 20 70 54 72 69 67 67 65 72 2d 3e 70 54 61 62 53   pTrigger->pTabS
2110: 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53  chema = pTab->pS
2120: 63 68 65 6d 61 3b 0a 20 20 70 54 72 69 67 67 65  chema;.  pTrigge
2130: 72 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a  r->op = (u8)op;.
2140: 20 20 70 54 72 69 67 67 65 72 2d 3e 74 72 5f 74    pTrigger->tr_t
2150: 6d 20 3d 20 74 72 5f 74 6d 3d 3d 54 4b 5f 42 45  m = tr_tm==TK_BE
2160: 46 4f 52 45 20 3f 20 54 52 49 47 47 45 52 5f 42  FORE ? TRIGGER_B
2170: 45 46 4f 52 45 20 3a 20 54 52 49 47 47 45 52 5f  EFORE : TRIGGER_
2180: 41 46 54 45 52 3b 0a 20 20 70 54 72 69 67 67 65  AFTER;.  pTrigge
2190: 72 2d 3e 70 57 68 65 6e 20 3d 20 73 71 6c 69 74  r->pWhen = sqlit
21a0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57  e3ExprDup(db, pW
21b0: 68 65 6e 2c 20 45 58 50 52 44 55 50 5f 52 45 44  hen, EXPRDUP_RED
21c0: 55 43 45 29 3b 0a 20 20 70 54 72 69 67 67 65 72  UCE);.  pTrigger
21d0: 2d 3e 70 43 6f 6c 75 6d 6e 73 20 3d 20 73 71 6c  ->pColumns = sql
21e0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64 62  ite3IdListDup(db
21f0: 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 61  , pColumns);.  a
2200: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
2210: 4e 65 77 54 72 69 67 67 65 72 3d 3d 30 20 29 3b  NewTrigger==0 );
2220: 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
2230: 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
2240: 72 3b 0a 0a 74 72 69 67 67 65 72 5f 63 6c 65 61  r;..trigger_clea
2250: 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  nup:.  sqlite3Db
2260: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
2270: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
2280: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  tDelete(db, pTab
2290: 6c 65 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  leName);.  sqlit
22a0: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
22b0: 62 2c 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20  b, pColumns);.  
22c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
22d0: 65 28 64 62 2c 20 70 57 68 65 6e 29 3b 0a 20 20  e(db, pWhen);.  
22e0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 4e 65  if( !pParse->pNe
22f0: 77 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  wTrigger ){.    
2300: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69  sqlite3DeleteTri
2310: 67 67 65 72 28 64 62 2c 20 70 54 72 69 67 67 65  gger(db, pTrigge
2320: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
2330: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
2340: 3e 70 4e 65 77 54 72 69 67 67 65 72 3d 3d 70 54  >pNewTrigger==pT
2350: 72 69 67 67 65 72 20 29 3b 0a 20 20 7d 0a 7d 0a  rigger );.  }.}.
2360: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2370: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
2380: 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 74  ter all of the t
2390: 72 69 67 67 65 72 20 61 63 74 69 6f 6e 73 20 68  rigger actions h
23a0: 61 76 65 20 62 65 65 6e 20 70 61 72 73 65 64 0a  ave been parsed.
23b0: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
23c0: 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 63  omplete the proc
23d0: 65 73 73 20 6f 66 20 62 75 69 6c 64 69 6e 67 20  ess of building 
23e0: 74 68 65 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a  the trigger..*/.
23f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69  void sqlite3Fini
2400: 73 68 54 72 69 67 67 65 72 28 0a 20 20 50 61 72  shTrigger(.  Par
2410: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2420: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
2430: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67  ontext */.  Trig
2440: 67 65 72 53 74 65 70 20 2a 70 53 74 65 70 4c 69  gerStep *pStepLi
2450: 73 74 2c 20 2f 2a 20 54 68 65 20 74 72 69 67 67  st, /* The trigg
2460: 65 72 65 64 20 70 72 6f 67 72 61 6d 20 2a 2f 0a  ered program */.
2470: 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 6c 20 20 20    Token *pAll   
2480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b            /* Tok
2490: 65 6e 20 74 68 61 74 20 64 65 73 63 72 69 62 65  en that describe
24a0: 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 43  s the complete C
24b0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 2a 2f  REATE TRIGGER */
24c0: 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 70  .){.  Trigger *p
24d0: 54 72 69 67 20 3d 20 70 50 61 72 73 65 2d 3e 70  Trig = pParse->p
24e0: 4e 65 77 54 72 69 67 67 65 72 3b 20 20 20 2f 2a  NewTrigger;   /*
24f0: 20 54 72 69 67 67 65 72 20 62 65 69 6e 67 20 66   Trigger being f
2500: 69 6e 69 73 68 65 64 20 2a 2f 0a 20 20 63 68 61  inished */.  cha
2510: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2530: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2540: 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 73 71 6c  trigger */.  sql
2550: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
2560: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
2570: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
2580: 62 61 73 65 20 2a 2f 0a 20 20 44 62 46 69 78 65  base */.  DbFixe
2590: 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 20  r sFix;         
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 2f 2a 20 46 69 78 65 72 20 6f 62 6a 65 63    /* Fixer objec
25c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  t */.  int iDb; 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25f0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * Database conta
2600: 69 6e 69 6e 67 20 74 68 65 20 74 72 69 67 67 65  ining the trigge
2610: 72 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 6e 61 6d  r */.  Token nam
2620: 65 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20  eToken;         
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2640: 2a 20 54 72 69 67 67 65 72 20 6e 61 6d 65 20 66  * Trigger name f
2650: 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69  or error reporti
2660: 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 2d  ng */..  pParse-
2670: 3e 70 4e 65 77 54 72 69 67 67 65 72 20 3d 20 30  >pNewTrigger = 0
2680: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  ;.  if( NEVER(pP
2690: 61 72 73 65 2d 3e 6e 45 72 72 29 20 7c 7c 20 21  arse->nErr) || !
26a0: 70 54 72 69 67 20 29 20 67 6f 74 6f 20 74 72 69  pTrig ) goto tri
26b0: 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e  ggerfinish_clean
26c0: 75 70 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 54  up;.  zName = pT
26d0: 72 69 67 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 44  rig->zName;.  iD
26e0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
26f0: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
2700: 3e 64 62 2c 20 70 54 72 69 67 2d 3e 70 53 63 68  >db, pTrig->pSch
2710: 65 6d 61 29 3b 0a 20 20 70 54 72 69 67 2d 3e 73  ema);.  pTrig->s
2720: 74 65 70 5f 6c 69 73 74 20 3d 20 70 53 74 65 70  tep_list = pStep
2730: 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  List;.  while( p
2740: 53 74 65 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  StepList ){.    
2750: 70 53 74 65 70 4c 69 73 74 2d 3e 70 54 72 69 67  pStepList->pTrig
2760: 20 3d 20 70 54 72 69 67 3b 0a 20 20 20 20 70 53   = pTrig;.    pS
2770: 74 65 70 4c 69 73 74 20 3d 20 70 53 74 65 70 4c  tepList = pStepL
2780: 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ist->pNext;.  }.
2790: 20 20 6e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 3d 20    nameToken.z = 
27a0: 70 54 72 69 67 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTrig->zName;.  
27b0: 6e 61 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20 73 71  nameToken.n = sq
27c0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 6e 61  lite3Strlen30(na
27d0: 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 69 66  meToken.z);.  if
27e0: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
27f0: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
2800: 69 44 62 2c 20 22 74 72 69 67 67 65 72 22 2c 20  iDb, "trigger", 
2810: 26 6e 61 6d 65 54 6f 6b 65 6e 29 20 0a 20 20 20  &nameToken) .   
2820: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
2830: 33 46 69 78 54 72 69 67 67 65 72 53 74 65 70 28  3FixTriggerStep(
2840: 26 73 46 69 78 2c 20 70 54 72 69 67 2d 3e 73 74  &sFix, pTrig->st
2850: 65 70 5f 6c 69 73 74 29 20 29 7b 0a 20 20 20 20  ep_list) ){.    
2860: 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e 69  goto triggerfini
2870: 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  sh_cleanup;.  }.
2880: 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 72 65 20  .  /* if we are 
2890: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
28a0: 2c 0a 20 20 2a 2a 20 62 75 69 6c 64 20 74 68 65  ,.  ** build the
28b0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 65   sqlite_master e
28c0: 6e 74 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ntry.  */.  if( 
28d0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
28e0: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  {.    Vdbe *v;. 
28f0: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 20     char *z;..   
2900: 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72   /* Make an entr
2910: 79 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  y in the sqlite_
2920: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
2930: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
2940: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
2950: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
2960: 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e 69 73  oto triggerfinis
2970: 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 73  h_cleanup;.    s
2980: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
2990: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
29a0: 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 7a  , 0, iDb);.    z
29b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
29c0: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
29d0: 41 6c 6c 2d 3e 7a 2c 20 70 41 6c 6c 2d 3e 6e 29  All->z, pAll->n)
29e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  ;.    sqlite3Nes
29f0: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
2a00: 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20  .       "INSERT 
2a10: 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45  INTO %Q.%s VALUE
2a20: 53 28 27 74 72 69 67 67 65 72 27 2c 25 51 2c 25  S('trigger',%Q,%
2a30: 51 2c 30 2c 27 43 52 45 41 54 45 20 54 52 49 47  Q,0,'CREATE TRIG
2a40: 47 45 52 20 25 71 27 29 22 2c 0a 20 20 20 20 20  GER %q')",.     
2a50: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
2a60: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
2a70: 4c 45 28 69 44 62 29 2c 20 7a 4e 61 6d 65 2c 0a  LE(iDb), zName,.
2a80: 20 20 20 20 20 20 20 70 54 72 69 67 2d 3e 74 61         pTrig->ta
2a90: 62 6c 65 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  ble, z);.    sql
2aa0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2ab0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
2ac0: 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
2ad0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
2ae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2af0: 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  , OP_ParseSchema
2b00: 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 73 71 6c  , iDb, 0, 0, sql
2b10: 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20  ite3MPrintf(.   
2b20: 20 20 20 20 20 64 62 2c 20 22 74 79 70 65 3d 27       db, "type='
2b30: 74 72 69 67 67 65 72 27 20 41 4e 44 20 6e 61 6d  trigger' AND nam
2b40: 65 3d 27 25 71 27 22 2c 20 7a 4e 61 6d 65 29 2c  e='%q'", zName),
2b50: 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20   P4_DYNAMIC.    
2b60: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 64 62  );.  }..  if( db
2b70: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
2b80: 20 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 6e     Trigger *pLin
2b90: 6b 20 3d 20 70 54 72 69 67 3b 0a 20 20 20 20 48  k = pTrig;.    H
2ba0: 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 64 62  ash *pHash = &db
2bb0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
2bc0: 6d 61 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20 20  ma->trigHash;.  
2bd0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2be0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
2bf0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
2c00: 20 20 20 20 70 54 72 69 67 20 3d 20 73 71 6c 69      pTrig = sqli
2c10: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
2c20: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69  ash, zName, sqli
2c30: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
2c40: 65 29 2c 20 70 54 72 69 67 29 3b 0a 20 20 20 20  e), pTrig);.    
2c50: 69 66 28 20 70 54 72 69 67 20 29 7b 0a 20 20 20  if( pTrig ){.   
2c60: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
2c70: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  led = 1;.    }el
2c80: 73 65 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 53  se if( pLink->pS
2c90: 63 68 65 6d 61 3d 3d 70 4c 69 6e 6b 2d 3e 70 54  chema==pLink->pT
2ca0: 61 62 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  abSchema ){.    
2cb0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
2cc0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
2cd0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 69  ite3Strlen30(pLi
2ce0: 6e 6b 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 20 20  nk->table);.    
2cf0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
2d00: 48 61 73 68 46 69 6e 64 28 26 70 4c 69 6e 6b 2d  HashFind(&pLink-
2d10: 3e 70 54 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c  >pTabSchema->tbl
2d20: 48 61 73 68 2c 20 70 4c 69 6e 6b 2d 3e 74 61 62  Hash, pLink->tab
2d30: 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 61 73  le, n);.      as
2d40: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
2d50: 0a 20 20 20 20 20 20 70 4c 69 6e 6b 2d 3e 70 4e  .      pLink->pN
2d60: 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 54 72 69  ext = pTab->pTri
2d70: 67 67 65 72 3b 0a 20 20 20 20 20 20 70 54 61 62  gger;.      pTab
2d80: 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70 4c 69  ->pTrigger = pLi
2d90: 6e 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 74  nk;.    }.  }..t
2da0: 72 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65  riggerfinish_cle
2db0: 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 44  anup:.  sqlite3D
2dc0: 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62 2c  eleteTrigger(db,
2dd0: 20 70 54 72 69 67 29 3b 0a 20 20 61 73 73 65 72   pTrig);.  asser
2de0: 74 28 20 21 70 50 61 72 73 65 2d 3e 70 4e 65 77  t( !pParse->pNew
2df0: 54 72 69 67 67 65 72 20 29 3b 0a 20 20 73 71 6c  Trigger );.  sql
2e00: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
2e10: 72 53 74 65 70 28 64 62 2c 20 70 53 74 65 70 4c  rStep(db, pStepL
2e20: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ist);.}../*.** T
2e30: 75 72 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  urn a SELECT sta
2e40: 74 65 6d 65 6e 74 20 28 74 68 61 74 20 74 68 65  tement (that the
2e50: 20 70 53 65 6c 65 63 74 20 70 61 72 61 6d 65 74   pSelect paramet
2e60: 65 72 20 70 6f 69 6e 74 73 20 74 6f 29 20 69 6e  er points to) in
2e70: 74 6f 0a 2a 2a 20 61 20 74 72 69 67 67 65 72 20  to.** a trigger 
2e80: 73 74 65 70 2e 20 20 52 65 74 75 72 6e 20 61 20  step.  Return a 
2e90: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 72 69  pointer to a Tri
2ea0: 67 67 65 72 53 74 65 70 20 73 74 72 75 63 74 75  ggerStep structu
2eb0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  re..**.** The pa
2ec0: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
2ed0: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 20  routine when it 
2ee0: 66 69 6e 64 73 20 61 20 53 45 4c 45 43 54 20 73  finds a SELECT s
2ef0: 74 61 74 65 6d 65 6e 74 20 69 6e 0a 2a 2a 20 62  tatement in.** b
2f00: 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52  ody of a TRIGGER
2f10: 2e 20 20 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74  .  .*/.TriggerSt
2f20: 65 70 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67  ep *sqlite3Trigg
2f30: 65 72 53 65 6c 65 63 74 53 74 65 70 28 73 71 6c  erSelectStep(sql
2f40: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
2f50: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 72   *pSelect){.  Tr
2f60: 69 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67  iggerStep *pTrig
2f70: 67 65 72 53 74 65 70 20 3d 20 73 71 6c 69 74 65  gerStep = sqlite
2f80: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
2f90: 2c 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72  , sizeof(Trigger
2fa0: 53 74 65 70 29 29 3b 0a 20 20 69 66 28 20 70 54  Step));.  if( pT
2fb0: 72 69 67 67 65 72 53 74 65 70 3d 3d 30 20 29 20  riggerStep==0 ) 
2fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
2fd0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
2fe0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
2ff0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 72 69  rn 0;.  }.  pTri
3000: 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20 54  ggerStep->op = T
3010: 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 54 72 69  K_SELECT;.  pTri
3020: 67 67 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63  ggerStep->pSelec
3030: 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 70  t = pSelect;.  p
3040: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63  TriggerStep->orc
3050: 6f 6e 66 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74  onf = OE_Default
3060: 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67  ;.  return pTrig
3070: 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  gerStep;.}../*.*
3080: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
3090: 20 74 6f 20 68 6f 6c 64 20 61 20 6e 65 77 20 74   to hold a new t
30a0: 72 69 67 67 65 72 20 73 74 65 70 2e 20 20 54 68  rigger step.  Th
30b0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  e allocated spac
30c0: 65 0a 2a 2a 20 68 6f 6c 64 73 20 62 6f 74 68 20  e.** holds both 
30d0: 74 68 65 20 54 72 69 67 67 65 72 53 74 65 70 20  the TriggerStep 
30e0: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 65 20 54  object and the T
30f0: 72 69 67 67 65 72 53 74 65 70 2e 74 61 72 67 65  riggerStep.targe
3100: 74 2e 7a 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  t.z string..**.*
3110: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
3120: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
3130: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 64  s returned and d
3140: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3150: 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  is set..*/.stati
3160: 63 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 74  c TriggerStep *t
3170: 72 69 67 67 65 72 53 74 65 70 41 6c 6c 6f 63 61  riggerStepAlloca
3180: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
3190: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
31a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
31b0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  nnection */.  u8
31c0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
31d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 69            /* Tri
31e0: 67 67 65 72 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  gger opcode */. 
31f0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 20 20   Token *pName   
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3210: 54 68 65 20 74 61 72 67 65 74 20 6e 61 6d 65 20  The target name 
3220: 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72 53  */.){.  TriggerS
3230: 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74 65  tep *pTriggerSte
3240: 70 3b 0a 0a 20 20 70 54 72 69 67 67 65 72 53 74  p;..  pTriggerSt
3250: 65 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ep = sqlite3DbMa
3260: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
3270: 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29  eof(TriggerStep)
3280: 20 2b 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20   + pName->n);.  
3290: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70  if( pTriggerStep
32a0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
32b0: 3d 20 28 63 68 61 72 2a 29 26 70 54 72 69 67 67  = (char*)&pTrigg
32c0: 65 72 53 74 65 70 5b 31 5d 3b 0a 20 20 20 20 6d  erStep[1];.    m
32d0: 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e  emcpy(z, pName->
32e0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
32f0: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3300: 74 61 72 67 65 74 2e 7a 20 3d 20 7a 3b 0a 20 20  target.z = z;.  
3310: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3320: 74 61 72 67 65 74 2e 6e 20 3d 20 70 4e 61 6d 65  target.n = pName
3330: 2d 3e 6e 3b 0a 20 20 20 20 70 54 72 69 67 67 65  ->n;.    pTrigge
3340: 72 53 74 65 70 2d 3e 6f 70 20 3d 20 6f 70 3b 0a  rStep->op = op;.
3350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 72    }.  return pTr
3360: 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a  iggerStep;.}../*
3370: 0a 2a 2a 20 42 75 69 6c 64 20 61 20 74 72 69 67  .** Build a trig
3380: 67 65 72 20 73 74 65 70 20 6f 75 74 20 6f 66 20  ger step out of 
3390: 61 6e 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  an INSERT statem
33a0: 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ent.  Return a p
33b0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
33c0: 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 74 65   new trigger ste
33d0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  p..**.** The par
33e0: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
33f0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74 20 73  outine when it s
3400: 65 65 73 20 61 6e 20 49 4e 53 45 52 54 20 69 6e  ees an INSERT in
3410: 73 69 64 65 20 74 68 65 0a 2a 2a 20 62 6f 64 79  side the.** body
3420: 20 6f 66 20 61 20 74 72 69 67 67 65 72 2e 0a 2a   of a trigger..*
3430: 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a 73  /.TriggerStep *s
3440: 71 6c 69 74 65 33 54 72 69 67 67 65 72 49 6e 73  qlite3TriggerIns
3450: 65 72 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74  ertStep(.  sqlit
3460: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
3470: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
3480: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
3490: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e 61 6d 65  oken *pTableName
34a0: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
34b0: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  e table into whi
34c0: 63 68 20 77 65 20 69 6e 73 65 72 74 20 2a 2f 0a  ch we insert */.
34d0: 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d    IdList *pColum
34e0: 6e 2c 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  n,    /* List of
34f0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 54 61 62   columns in pTab
3500: 6c 65 4e 61 6d 65 20 74 6f 20 69 6e 73 65 72 74  leName to insert
3510: 20 69 6e 74 6f 20 2a 2f 0a 20 20 45 78 70 72 4c   into */.  ExprL
3520: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 2f  ist *pEList,   /
3530: 2a 20 54 68 65 20 56 41 4c 55 45 20 63 6c 61 75  * The VALUE clau
3540: 73 65 3a 20 61 20 6c 69 73 74 20 6f 66 20 76 61  se: a list of va
3550: 6c 75 65 73 20 74 6f 20 62 65 20 69 6e 73 65 72  lues to be inser
3560: 74 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ted */.  Select 
3570: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 2f 2a 20  *pSelect,    /* 
3580: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
3590: 6e 74 20 74 68 61 74 20 73 75 70 70 6c 69 65 73  nt that supplies
35a0: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20   values */.  u8 
35b0: 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20  orconf          
35c0: 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74   /* The conflict
35d0: 20 61 6c 67 6f 72 69 74 68 6d 20 28 4f 45 5f 41   algorithm (OE_A
35e0: 62 6f 72 74 2c 20 4f 45 5f 52 65 70 6c 61 63 65  bort, OE_Replace
35f0: 2c 20 65 74 63 2e 29 20 2a 2f 0a 29 7b 0a 20 20  , etc.) */.){.  
3600: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54 72  TriggerStep *pTr
3610: 69 67 67 65 72 53 74 65 70 3b 0a 0a 20 20 61 73  iggerStep;..  as
3620: 73 65 72 74 28 70 45 4c 69 73 74 20 3d 3d 20 30  sert(pEList == 0
3630: 20 7c 7c 20 70 53 65 6c 65 63 74 20 3d 3d 20 30   || pSelect == 0
3640: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 45 4c 69  );.  assert(pELi
3650: 73 74 20 21 3d 20 30 20 7c 7c 20 70 53 65 6c 65  st != 0 || pSele
3660: 63 74 20 21 3d 20 30 20 7c 7c 20 64 62 2d 3e 6d  ct != 0 || db->m
3670: 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 0a 20  allocFailed);.. 
3680: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20   pTriggerStep = 
3690: 74 72 69 67 67 65 72 53 74 65 70 41 6c 6c 6f 63  triggerStepAlloc
36a0: 61 74 65 28 64 62 2c 20 54 4b 5f 49 4e 53 45 52  ate(db, TK_INSER
36b0: 54 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  T, pTableName);.
36c0: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
36d0: 65 70 20 29 7b 0a 20 20 20 20 70 54 72 69 67 67  ep ){.    pTrigg
36e0: 65 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 20  erStep->pSelect 
36f0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
3700: 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20  up(db, pSelect, 
3710: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
3720: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
3730: 70 2d 3e 70 49 64 4c 69 73 74 20 3d 20 70 43 6f  p->pIdList = pCo
3740: 6c 75 6d 6e 3b 0a 20 20 20 20 70 54 72 69 67 67  lumn;.    pTrigg
3750: 65 72 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73  erStep->pExprLis
3760: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
3770: 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73  istDup(db, pELis
3780: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
3790: 45 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  E);.    pTrigger
37a0: 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f  Step->orconf = o
37b0: 72 63 6f 6e 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rconf;.  }else{.
37c0: 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
37d0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  tDelete(db, pCol
37e0: 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  umn);.  }.  sqli
37f0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
3800: 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
3810: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
3820: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
3830: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 72  );..  return pTr
3840: 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a  iggerStep;.}../*
3850: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
3860: 74 72 69 67 67 65 72 20 73 74 65 70 20 74 68 61  trigger step tha
3870: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20  t implements an 
3880: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
3890: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61   and return.** a
38a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74   pointer to that
38b0: 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20 20   trigger step.  
38c0: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
38d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
38e0: 65 6e 20 69 74 0a 2a 2a 20 73 65 65 73 20 61 6e  en it.** sees an
38f0: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
3900: 74 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64  t inside the bod
3910: 79 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 52  y of a CREATE TR
3920: 49 47 47 45 52 2e 0a 2a 2f 0a 54 72 69 67 67 65  IGGER..*/.Trigge
3930: 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72  rStep *sqlite3Tr
3940: 69 67 67 65 72 55 70 64 61 74 65 53 74 65 70 28  iggerUpdateStep(
3950: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3960: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
3970: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3980: 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
3990: 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20  TableName,   /* 
39a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
39b0: 65 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  e to be updated 
39c0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
39d0: 45 4c 69 73 74 2c 20 20 20 20 2f 2a 20 54 68 65  EList,    /* The
39e0: 20 53 45 54 20 63 6c 61 75 73 65 3a 20 6c 69 73   SET clause: lis
39f0: 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 61 6e 64 20  t of column and 
3a00: 6e 65 77 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  new values */.  
3a10: 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
3a20: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
3a30: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 38  E clause */.  u8
3a40: 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20 20   orconf         
3a50: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 6c 69     /* The confli
3a60: 63 74 20 61 6c 67 6f 72 69 74 68 6d 2e 20 28 4f  ct algorithm. (O
3a70: 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
3a80: 72 65 2c 20 65 74 63 29 20 2a 2f 0a 29 7b 0a 20  re, etc) */.){. 
3a90: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54   TriggerStep *pT
3aa0: 72 69 67 67 65 72 53 74 65 70 3b 0a 0a 20 20 70  riggerStep;..  p
3ab0: 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 74 72  TriggerStep = tr
3ac0: 69 67 67 65 72 53 74 65 70 41 6c 6c 6f 63 61 74  iggerStepAllocat
3ad0: 65 28 64 62 2c 20 54 4b 5f 55 50 44 41 54 45 2c  e(db, TK_UPDATE,
3ae0: 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20   pTableName);.  
3af0: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70  if( pTriggerStep
3b00: 20 29 7b 0a 20 20 20 20 70 54 72 69 67 67 65 72   ){.    pTrigger
3b10: 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 20  Step->pExprList 
3b20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
3b30: 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c  tDup(db, pEList,
3b40: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
3b50: 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74  ;.    pTriggerSt
3b60: 65 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ep->pWhere = sql
3b70: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
3b80: 70 57 68 65 72 65 2c 20 45 58 50 52 44 55 50 5f  pWhere, EXPRDUP_
3b90: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 70 54 72  REDUCE);.    pTr
3ba0: 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e  iggerStep->orcon
3bb0: 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 7d 0a  f = orconf;.  }.
3bc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
3bd0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69  tDelete(db, pELi
3be0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  st);.  sqlite3Ex
3bf0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 68  prDelete(db, pWh
3c00: 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ere);.  return p
3c10: 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a  TriggerStep;.}..
3c20: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
3c30: 61 20 74 72 69 67 67 65 72 20 73 74 65 70 20 74  a trigger step t
3c40: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  hat implements a
3c50: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
3c60: 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  t and return.** 
3c70: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61  a pointer to tha
3c80: 74 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20  t trigger step. 
3c90: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
3ca0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
3cb0: 68 65 6e 20 69 74 0a 2a 2a 20 73 65 65 73 20 61  hen it.** sees a
3cc0: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
3cd0: 74 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64  t inside the bod
3ce0: 79 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 52  y of a CREATE TR
3cf0: 49 47 47 45 52 2e 0a 2a 2f 0a 54 72 69 67 67 65  IGGER..*/.Trigge
3d00: 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72  rStep *sqlite3Tr
3d10: 69 67 67 65 72 44 65 6c 65 74 65 53 74 65 70 28  iggerDeleteStep(
3d20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
3d40: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
3d50: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  n */.  Token *pT
3d60: 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 20 2f  ableName,      /
3d70: 2a 20 54 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  * The table from
3d80: 20 77 68 69 63 68 20 72 6f 77 73 20 61 72 65 20   which rows are 
3d90: 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 45 78 70  deleted */.  Exp
3da0: 72 20 2a 70 57 68 65 72 65 20 20 20 20 20 20 20  r *pWhere       
3db0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
3dc0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20  E clause */.){. 
3dd0: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54   TriggerStep *pT
3de0: 72 69 67 67 65 72 53 74 65 70 3b 0a 0a 20 20 70  riggerStep;..  p
3df0: 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 74 72  TriggerStep = tr
3e00: 69 67 67 65 72 53 74 65 70 41 6c 6c 6f 63 61 74  iggerStepAllocat
3e10: 65 28 64 62 2c 20 54 4b 5f 44 45 4c 45 54 45 2c  e(db, TK_DELETE,
3e20: 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20   pTableName);.  
3e30: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65 70  if( pTriggerStep
3e40: 20 29 7b 0a 20 20 20 20 70 54 72 69 67 67 65 72   ){.    pTrigger
3e50: 53 74 65 70 2d 3e 70 57 68 65 72 65 20 3d 20 73  Step->pWhere = s
3e60: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
3e70: 2c 20 70 57 68 65 72 65 2c 20 45 58 50 52 44 55  , pWhere, EXPRDU
3e80: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 70  P_REDUCE);.    p
3e90: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 72 63  TriggerStep->orc
3ea0: 6f 6e 66 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74  onf = OE_Default
3eb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
3ec0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57  xprDelete(db, pW
3ed0: 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  here);.  return 
3ee0: 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a  pTriggerStep;.}.
3ef0: 0a 2f 2a 20 0a 2a 2a 20 52 65 63 75 72 73 69 76  ./* .** Recursiv
3f00: 65 6c 79 20 64 65 6c 65 74 65 20 61 20 54 72 69  ely delete a Tri
3f10: 67 67 65 72 20 73 74 72 75 63 74 75 72 65 0a 2a  gger structure.*
3f20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
3f30: 6c 65 74 65 54 72 69 67 67 65 72 28 73 71 6c 69  leteTrigger(sqli
3f40: 74 65 33 20 2a 64 62 2c 20 54 72 69 67 67 65 72  te3 *db, Trigger
3f50: 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20 20 69   *pTrigger){.  i
3f60: 66 28 20 70 54 72 69 67 67 65 72 3d 3d 30 20 29  f( pTrigger==0 )
3f70: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
3f80: 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 53  e3DeleteTriggerS
3f90: 74 65 70 28 64 62 2c 20 70 54 72 69 67 67 65 72  tep(db, pTrigger
3fa0: 2d 3e 73 74 65 70 5f 6c 69 73 74 29 3b 0a 20 20  ->step_list);.  
3fb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3fc0: 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d  , pTrigger->zNam
3fd0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
3fe0: 72 65 65 28 64 62 2c 20 70 54 72 69 67 67 65 72  ree(db, pTrigger
3ff0: 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69  ->table);.  sqli
4000: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
4010: 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65  , pTrigger->pWhe
4020: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  n);.  sqlite3IdL
4030: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
4040: 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73  rigger->pColumns
4050: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
4060: 65 65 28 64 62 2c 20 70 54 72 69 67 67 65 72 29  ee(db, pTrigger)
4070: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4080: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4090: 65 64 20 74 6f 20 64 72 6f 70 20 61 20 74 72 69  ed to drop a tri
40a0: 67 67 65 72 20 66 72 6f 6d 20 74 68 65 20 64 61  gger from the da
40b0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 0a  tabase schema. .
40c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 79 20 62  **.** This may b
40d0: 65 20 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c  e called directl
40e0: 79 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65  y from the parse
40f0: 72 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  r and therefore 
4100: 69 64 65 6e 74 69 66 69 65 73 0a 2a 2a 20 74 68  identifies.** th
4110: 65 20 74 72 69 67 67 65 72 20 62 79 20 6e 61 6d  e trigger by nam
4120: 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 44  e.  The sqlite3D
4130: 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 29 20  ropTriggerPtr() 
4140: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
4150: 0a 2a 2a 20 73 61 6d 65 20 6a 6f 62 20 61 73 20  .** same job as 
4160: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78 63  this routine exc
4170: 65 70 74 20 69 74 20 74 61 6b 65 73 20 61 20 70  ept it takes a p
4180: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 72  ointer to the tr
4190: 69 67 67 65 72 0a 2a 2a 20 69 6e 73 74 65 61 64  igger.** instead
41a0: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
41b0: 6e 61 6d 65 2e 0a 2a 2a 2f 0a 76 6f 69 64 20 73  name..**/.void s
41c0: 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
41d0: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
41e0: 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
41f0: 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54   int noErr){.  T
4200: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
4210: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
4220: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
4230: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4240: 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 4e 61  zName;.  int nNa
4250: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  me;.  sqlite3 *d
4260: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4270: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
4280: 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 64  cFailed ) goto d
4290: 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 61  rop_trigger_clea
42a0: 6e 75 70 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  nup;.  if( SQLIT
42b0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
42c0: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
42d0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 64 72 6f 70  ){.    goto drop
42e0: 5f 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70  _trigger_cleanup
42f0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
4300: 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
4310: 29 3b 0a 20 20 7a 44 62 20 3d 20 70 4e 61 6d 65  );.  zDb = pName
4320: 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
4330: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 4e 61 6d  ;.  zName = pNam
4340: 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 3b 0a 20  e->a[0].zName;. 
4350: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
4360: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
4370: 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d  .  assert( zDb!=
4380: 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
4390: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
43a0: 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  (db) );.  for(i=
43b0: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
43c0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
43d0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
43e0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
43f0: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
4400: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
4410: 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33  ( zDb && sqlite3
4420: 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b  StrICmp(db->aDb[
4430: 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  j].zName, zDb) )
4440: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
4450: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
4460: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
4470: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  , j, 0) );.    p
4480: 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
4490: 33 48 61 73 68 46 69 6e 64 28 26 28 64 62 2d 3e  3HashFind(&(db->
44a0: 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e  aDb[j].pSchema->
44b0: 74 72 69 67 48 61 73 68 29 2c 20 7a 4e 61 6d 65  trigHash), zName
44c0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , nName);.    if
44d0: 28 20 70 54 72 69 67 67 65 72 20 29 20 62 72 65  ( pTrigger ) bre
44e0: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  ak;.  }.  if( !p
44f0: 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 69  Trigger ){.    i
4500: 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20  f( !noErr ){.   
4510: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4520: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
4530: 75 63 68 20 74 72 69 67 67 65 72 3a 20 25 53 22  uch trigger: %S"
4540: 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , pName, 0);.   
4550: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
4560: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
4570: 20 20 20 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72      goto drop_tr
4580: 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20  igger_cleanup;. 
4590: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 72 6f 70   }.  sqlite3Drop
45a0: 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73  TriggerPtr(pPars
45b0: 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 0a 64  e, pTrigger);..d
45c0: 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65 61  rop_trigger_clea
45d0: 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  nup:.  sqlite3Sr
45e0: 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
45f0: 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
4600: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
4610: 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  r to the Table s
4620: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
4630: 20 74 61 62 6c 65 20 74 68 61 74 20 61 20 74 72   table that a tr
4640: 69 67 67 65 72 0a 2a 2a 20 69 73 20 73 65 74 20  igger.** is set 
4650: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  on..*/.static Ta
4660: 62 6c 65 20 2a 74 61 62 6c 65 4f 66 54 72 69 67  ble *tableOfTrig
4670: 67 65 72 28 54 72 69 67 67 65 72 20 2a 70 54 72  ger(Trigger *pTr
4680: 69 67 67 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  igger){.  int n 
4690: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
46a0: 30 28 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c  0(pTrigger->tabl
46b0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e);.  return sql
46c0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 54  ite3HashFind(&pT
46d0: 72 69 67 67 65 72 2d 3e 70 54 61 62 53 63 68 65  rigger->pTabSche
46e0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 54 72  ma->tblHash, pTr
46f0: 69 67 67 65 72 2d 3e 74 61 62 6c 65 2c 20 6e 29  igger->table, n)
4700: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70  ;.}.../*.** Drop
4710: 20 61 20 74 72 69 67 67 65 72 20 67 69 76 65 6e   a trigger given
4720: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4730: 61 74 20 74 72 69 67 67 65 72 2e 20 0a 2a 2f 0a  at trigger. .*/.
4740: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
4750: 54 72 69 67 67 65 72 50 74 72 28 50 61 72 73 65  TriggerPtr(Parse
4760: 20 2a 70 50 61 72 73 65 2c 20 54 72 69 67 67 65   *pParse, Trigge
4770: 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20 20  r *pTrigger){.  
4780: 54 61 62 6c 65 20 20 20 2a 70 54 61 62 6c 65 3b  Table   *pTable;
4790: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
47a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
47b0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
47c0: 62 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  b;..  iDb = sqli
47d0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
47e0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 72  (pParse->db, pTr
47f0: 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 29 3b  igger->pSchema);
4800: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
4810: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
4820: 20 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 74   );.  pTable = t
4830: 61 62 6c 65 4f 66 54 72 69 67 67 65 72 28 70 54  ableOfTrigger(pT
4840: 72 69 67 67 65 72 29 3b 0a 20 20 61 73 73 65 72  rigger);.  asser
4850: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 20 20 61  t( pTable );.  a
4860: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
4870: 53 63 68 65 6d 61 3d 3d 70 54 72 69 67 67 65 72  Schema==pTrigger
4880: 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 69 44 62  ->pSchema || iDb
4890: 3d 3d 31 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==1 );.#ifndef S
48a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
48b0: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
48c0: 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
48d0: 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45 52 3b  TE_DROP_TRIGGER;
48e0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
48f0: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
4900: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
4910: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
4920: 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
4930: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  Db);.    if( iDb
4940: 3d 3d 31 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  ==1 ) code = SQL
4950: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 52  ITE_DROP_TEMP_TR
4960: 49 47 47 45 52 3b 0a 20 20 20 20 69 66 28 20 73  IGGER;.    if( s
4970: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
4980: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
4990: 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 2c 20 70  rigger->zName, p
49a0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 7a 44  Table->zName, zD
49b0: 62 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69  b) ||.      sqli
49c0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
49d0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
49e0: 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
49f0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
4a00: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  n;.    }.  }.#en
4a10: 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
4a20: 74 65 20 63 6f 64 65 20 74 6f 20 64 65 73 74 72  te code to destr
4a30: 6f 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  oy the database 
4a40: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 74 72  record of the tr
4a50: 69 67 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 61 73  igger..  */.  as
4a60: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
4a70: 29 3b 0a 20 20 69 66 28 20 28 76 20 3d 20 73 71  );.  if( (v = sq
4a80: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
4a90: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
4aa0: 69 6e 74 20 62 61 73 65 3b 0a 20 20 20 20 73 74  int base;.    st
4ab0: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
4ac0: 70 4c 69 73 74 20 64 72 6f 70 54 72 69 67 67 65  pList dropTrigge
4ad0: 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  r[] = {.      { 
4ae0: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
4af0: 2c 20 41 44 44 52 28 39 29 2c 20 20 30 7d 2c 0a  , ADDR(9),  0},.
4b00: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
4b10: 67 38 2c 20 20 20 20 30 2c 20 31 2c 20 20 20 20  g8,    0, 1,    
4b20: 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a      0}, /* 1 */.
4b30: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
4b40: 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20  n,     0, 1,    
4b50: 20 20 20 20 32 7d 2c 0a 20 20 20 20 20 20 7b 20      2},.      { 
4b60: 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 32  OP_Ne,         2
4b70: 2c 20 41 44 44 52 28 38 29 2c 20 20 31 7d 2c 0a  , ADDR(8),  1},.
4b80: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
4b90: 67 38 2c 20 20 20 20 30 2c 20 31 2c 20 20 20 20  g8,    0, 1,    
4ba0: 20 20 20 20 30 7d 2c 20 2f 2a 20 34 3a 20 22 74      0}, /* 4: "t
4bb0: 72 69 67 67 65 72 22 20 2a 2f 0a 20 20 20 20 20  rigger" */.     
4bc0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
4bd0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 32    0, 0,        2
4be0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
4bf0: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 41 44 44  ,         2, ADD
4c00: 52 28 38 29 2c 20 20 31 7d 2c 0a 20 20 20 20 20  R(8),  1},.     
4c10: 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20   { OP_Delete,   
4c20: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
4c30: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
4c40: 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  xt,       0, ADD
4c50: 52 28 31 29 2c 20 20 30 7d 2c 20 2f 2a 20 38 20  R(1),  0}, /* 8 
4c60: 2a 2f 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 73  */.    };..    s
4c70: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
4c80: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
4c90: 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 0, iDb);.    s
4ca0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
4cb0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
4cc0: 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73  b);.    base = s
4cd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
4ce0: 69 73 74 28 76 2c 20 20 41 72 72 61 79 53 69 7a  ist(v,  ArraySiz
4cf0: 65 28 64 72 6f 70 54 72 69 67 67 65 72 29 2c 20  e(dropTrigger), 
4d00: 64 72 6f 70 54 72 69 67 67 65 72 29 3b 0a 20 20  dropTrigger);.  
4d10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
4d20: 6e 67 65 50 34 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP4(v, base+1,
4d30: 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65   pTrigger->zName
4d40: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4d50: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
4d60: 20 62 61 73 65 2b 34 2c 20 22 74 72 69 67 67 65   base+4, "trigge
4d70: 72 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  r", P4_STATIC);.
4d80: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
4d90: 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
4da0: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
4db0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4dc0: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
4dd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4de0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
4df0: 54 72 69 67 67 65 72 2c 20 69 44 62 2c 20 30 2c  Trigger, iDb, 0,
4e00: 20 30 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e   0, pTrigger->zN
4e10: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ame, 0);.    if(
4e20: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c 33 20   pParse->nMem<3 
4e30: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
4e40: 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 7d  >nMem = 3;.    }
4e50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
4e60: 6d 6f 76 65 20 61 20 74 72 69 67 67 65 72 20 66  move a trigger f
4e70: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
4e80: 6c 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  les of the sqlit
4e90: 65 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 76  e* pointer..*/.v
4ea0: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
4eb0: 6b 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67 65  kAndDeleteTrigge
4ec0: 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  r(sqlite3 *db, i
4ed0: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
4ee0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 72  ar *zName){.  Tr
4ef0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
4f00: 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a  .  Hash *pHash;.
4f10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4f20: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
4f30: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
4f40: 0a 20 20 70 48 61 73 68 20 3d 20 26 28 64 62 2d  .  pHash = &(db-
4f50: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
4f60: 61 2d 3e 74 72 69 67 48 61 73 68 29 3b 0a 20 20  a->trigHash);.  
4f70: 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
4f80: 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61  e3HashInsert(pHa
4f90: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  sh, zName, sqlit
4fa0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
4fb0: 29 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57  ), 0);.  if( ALW
4fc0: 41 59 53 28 70 54 72 69 67 67 65 72 29 20 29 7b  AYS(pTrigger) ){
4fd0: 0a 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65  .    if( pTrigge
4fe0: 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 72 69  r->pSchema==pTri
4ff0: 67 67 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61  gger->pTabSchema
5000: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
5010: 2a 70 54 61 62 20 3d 20 74 61 62 6c 65 4f 66 54  *pTab = tableOfT
5020: 72 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29  rigger(pTrigger)
5030: 3b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 20  ;.      Trigger 
5040: 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  **pp;.      for(
5050: 70 70 3d 26 70 54 61 62 2d 3e 70 54 72 69 67 67  pp=&pTab->pTrigg
5060: 65 72 3b 20 2a 70 70 21 3d 70 54 72 69 67 67 65  er; *pp!=pTrigge
5070: 72 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70  r; pp=&((*pp)->p
5080: 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 2a 70  Next));.      *p
5090: 70 20 3d 20 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p = (*pp)->pNext
50a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
50b0: 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72  te3DeleteTrigger
50c0: 28 64 62 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  (db, pTrigger);.
50d0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
50e0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
50f0: 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  anges;.  }.}../*
5100: 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 74 68  .** pEList is th
5110: 65 20 53 45 54 20 63 6c 61 75 73 65 20 6f 66 20  e SET clause of 
5120: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
5130: 65 6e 74 2e 20 20 45 61 63 68 20 65 6e 74 72 79  ent.  Each entry
5140: 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 69 73  .** in pEList is
5150: 20 6f 66 20 74 68 65 20 66 6f 72 6d 61 74 20 3c   of the format <
5160: 69 64 3e 3d 3c 65 78 70 72 3e 2e 20 20 49 66 20  id>=<expr>.  If 
5170: 61 6e 79 20 6f 66 20 74 68 65 20 65 6e 74 72 69  any of the entri
5180: 65 73 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20  es.** in pEList 
5190: 68 61 76 65 20 61 6e 20 3c 69 64 3e 20 77 68 69  have an <id> whi
51a0: 63 68 20 6d 61 74 63 68 65 73 20 61 6e 20 69 64  ch matches an id
51b0: 65 6e 74 69 66 69 65 72 20 69 6e 20 70 49 64 4c  entifier in pIdL
51c0: 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  ist,.** then ret
51d0: 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 70 49  urn TRUE.  If pI
51e0: 64 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65  dList==NULL, the
51f0: 6e 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72  n it is consider
5200: 65 64 20 61 0a 2a 2a 20 77 69 6c 64 63 61 72 64  ed a.** wildcard
5210: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 6e   that matches an
5220: 79 74 68 69 6e 67 2e 20 20 4c 69 6b 65 77 69 73  ything.  Likewis
5230: 65 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e 55 4c  e if pEList==NUL
5240: 4c 20 74 68 65 6e 0a 2a 2a 20 69 74 20 6d 61 74  L then.** it mat
5250: 63 68 65 73 20 61 6e 79 74 68 69 6e 67 20 73 6f  ches anything so
5260: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   always return t
5270: 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c  rue.  Return fal
5280: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  se only.** if th
5290: 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 2e  ere is no match.
52a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
52b0: 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61  heckColumnOverla
52c0: 70 28 49 64 4c 69 73 74 20 2a 70 49 64 4c 69 73  p(IdList *pIdLis
52d0: 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  t, ExprList *pEL
52e0: 69 73 74 29 7b 0a 20 20 69 6e 74 20 65 3b 0a 20  ist){.  int e;. 
52f0: 20 69 66 28 20 70 49 64 4c 69 73 74 3d 3d 30 20   if( pIdList==0 
5300: 7c 7c 20 4e 45 56 45 52 28 70 45 4c 69 73 74 3d  || NEVER(pEList=
5310: 3d 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  =0) ) return 1;.
5320: 20 20 66 6f 72 28 65 3d 30 3b 20 65 3c 70 45 4c    for(e=0; e<pEL
5330: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 65 2b 2b 29  ist->nExpr; e++)
5340: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
5350: 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 49 64  3IdListIndex(pId
5360: 4c 69 73 74 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  List, pEList->a[
5370: 65 5d 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29 20 72  e].zName)>=0 ) r
5380: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
5390: 65 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f 2a 0a  eturn 0; .}../*.
53a0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74  ** Return a list
53b0: 20 6f 66 20 61 6c 6c 20 74 72 69 67 67 65 72 73   of all triggers
53c0: 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 20 69   on table pTab i
53d0: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  f there exists a
53e0: 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 74  t least.** one t
53f0: 72 69 67 67 65 72 20 74 68 61 74 20 6d 75 73 74  rigger that must
5400: 20 62 65 20 66 69 72 65 64 20 77 68 65 6e 20 61   be fired when a
5410: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  n operation of t
5420: 79 70 65 20 27 6f 70 27 20 69 73 20 0a 2a 2a 20  ype 'op' is .** 
5430: 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65  performed on the
5440: 20 74 61 62 6c 65 2c 20 61 6e 64 2c 20 69 66 20   table, and, if 
5450: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 69  that operation i
5460: 73 20 61 6e 20 55 50 44 41 54 45 2c 20 69 66 20  s an UPDATE, if 
5470: 61 74 0a 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20  at.** least one 
5480: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
5490: 6e 20 70 43 68 61 6e 67 65 73 20 69 73 20 62 65  n pChanges is be
54a0: 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  ing modified..*/
54b0: 0a 54 72 69 67 67 65 72 20 2a 73 71 6c 69 74 65  .Trigger *sqlite
54c0: 33 54 72 69 67 67 65 72 73 45 78 69 73 74 28 0a  3TriggersExist(.
54d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
54e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
54f0: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
5500: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
5510: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
5520: 61 62 6c 65 20 74 68 65 20 63 6f 6e 74 61 69 6e  able the contain
5530: 73 20 74 68 65 20 74 72 69 67 67 65 72 73 20 2a  s the triggers *
5540: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
5550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
5560: 6e 65 20 6f 66 20 54 4b 5f 44 45 4c 45 54 45 2c  ne of TK_DELETE,
5570: 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 55   TK_INSERT, TK_U
5580: 50 44 41 54 45 20 2a 2f 0a 20 20 45 78 70 72 4c  PDATE */.  ExprL
5590: 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20  ist *pChanges,  
55a0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 74 68     /* Columns th
55b0: 61 74 20 63 68 61 6e 67 65 20 69 6e 20 61 6e 20  at change in an 
55c0: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
55d0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4d 61 73 6b   */.  int *pMask
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
55f0: 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 54 52   OUT: Mask of TR
5600: 49 47 47 45 52 5f 42 45 46 4f 52 45 7c 54 52 49  IGGER_BEFORE|TRI
5610: 47 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 29 7b  GGER_AFTER */.){
5620: 0a 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b  .  int mask = 0;
5630: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 73  .  Trigger *pLis
5640: 74 20 3d 20 30 3b 0a 20 20 54 72 69 67 67 65 72  t = 0;.  Trigger
5650: 20 2a 70 3b 0a 0a 20 20 69 66 28 20 28 70 50 61   *p;..  if( (pPa
5660: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
5670: 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72   SQLITE_EnableTr
5680: 69 67 67 65 72 29 21 3d 30 20 29 7b 0a 20 20 20  igger)!=0 ){.   
5690: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
56a0: 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72  TriggerList(pPar
56b0: 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 20  se, pTab);.  }. 
56c0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 3d 3d   assert( pList==
56d0: 30 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70  0 || IsVirtual(p
56e0: 54 61 62 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  Tab)==0 );.  for
56f0: 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
5700: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5710: 28 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 63  ( p->op==op && c
5720: 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61  heckColumnOverla
5730: 70 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70  p(p->pColumns, p
5740: 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20 20  Changes) ){.    
5750: 20 20 6d 61 73 6b 20 7c 3d 20 70 2d 3e 74 72 5f    mask |= p->tr_
5760: 74 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  tm;.    }.  }.  
5770: 69 66 28 20 70 4d 61 73 6b 20 29 7b 0a 20 20 20  if( pMask ){.   
5780: 20 2a 70 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a   *pMask = mask;.
5790: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 6d 61    }.  return (ma
57a0: 73 6b 20 3f 20 70 4c 69 73 74 20 3a 20 30 29 3b  sk ? pList : 0);
57b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
57c0: 74 20 74 68 65 20 70 53 74 65 70 2d 3e 74 61 72  t the pStep->tar
57d0: 67 65 74 20 74 6f 6b 65 6e 20 69 6e 74 6f 20 61  get token into a
57e0: 20 53 72 63 4c 69 73 74 20 61 6e 64 20 72 65 74   SrcList and ret
57f0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
5800: 20 74 6f 20 74 68 61 74 20 53 72 63 4c 69 73 74   to that SrcList
5810: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5820: 74 69 6e 65 20 61 64 64 73 20 61 20 73 70 65 63  tine adds a spec
5830: 69 66 69 63 20 64 61 74 61 62 61 73 65 20 6e 61  ific database na
5840: 6d 65 2c 20 69 66 20 6e 65 65 64 65 64 2c 20 74  me, if needed, t
5850: 6f 20 74 68 65 20 74 61 72 67 65 74 20 77 68 65  o the target whe
5860: 6e 0a 2a 2a 20 66 6f 72 6d 69 6e 67 20 74 68 65  n.** forming the
5870: 20 53 72 63 4c 69 73 74 2e 20 20 54 68 69 73 20   SrcList.  This 
5880: 70 72 65 76 65 6e 74 73 20 61 20 74 72 69 67 67  prevents a trigg
5890: 65 72 20 69 6e 20 6f 6e 65 20 64 61 74 61 62 61  er in one databa
58a0: 73 65 20 66 72 6f 6d 0a 2a 2a 20 72 65 66 65 72  se from.** refer
58b0: 72 69 6e 67 20 74 6f 20 61 20 74 61 72 67 65 74  ring to a target
58c0: 20 69 6e 20 61 6e 6f 74 68 65 72 20 64 61 74 61   in another data
58d0: 62 61 73 65 2e 20 20 41 6e 20 65 78 63 65 70 74  base.  An except
58e0: 69 6f 6e 20 69 73 20 77 68 65 6e 20 74 68 65 0a  ion is when the.
58f0: 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20 69 6e  ** trigger is in
5900: 20 54 45 4d 50 20 69 6e 20 77 68 69 63 68 20 63   TEMP in which c
5910: 61 73 65 20 69 74 20 63 61 6e 20 72 65 66 65 72  ase it can refer
5920: 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 64 61   to any other da
5930: 74 61 62 61 73 65 20 69 74 0a 2a 2a 20 77 61 6e  tabase it.** wan
5940: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 72  ts..*/.static Sr
5950: 63 4c 69 73 74 20 2a 74 61 72 67 65 74 53 72 63  cList *targetSrc
5960: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
5970: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
5980: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
5990: 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72  ext */.  Trigger
59a0: 53 74 65 70 20 2a 70 53 74 65 70 20 20 20 2f 2a  Step *pStep   /*
59b0: 20 54 68 65 20 74 72 69 67 67 65 72 20 63 6f 6e   The trigger con
59c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 72 67  taining the targ
59d0: 65 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20  et token */.){. 
59e0: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
59f0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
5a00: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
5a10: 6f 20 75 73 65 20 2a 2f 0a 20 20 53 72 63 4c 69  o use */.  SrcLi
5a20: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20  st *pSrc;       
5a30: 2f 2a 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65  /* SrcList to be
5a40: 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 0a 20 20   returned */..  
5a50: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
5a60: 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  cListAppend(pPar
5a70: 73 65 2d 3e 64 62 2c 20 30 2c 20 26 70 53 74 65  se->db, 0, &pSte
5a80: 70 2d 3e 74 61 72 67 65 74 2c 20 30 29 3b 0a 20  p->target, 0);. 
5a90: 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20   if( pSrc ){.   
5aa0: 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e   assert( pSrc->n
5ab0: 53 72 63 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  Src>0 );.    ass
5ac0: 65 72 74 28 20 70 53 72 63 2d 3e 61 21 3d 30 20  ert( pSrc->a!=0 
5ad0: 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  );.    iDb = sql
5ae0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
5af0: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  x(pParse->db, pS
5b00: 74 65 70 2d 3e 70 54 72 69 67 2d 3e 70 53 63 68  tep->pTrig->pSch
5b10: 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ema);.    if( iD
5b20: 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 3d 32 20 29  b==0 || iDb>=2 )
5b30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
5b40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
5b50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5b60: 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e  iDb<pParse->db->
5b70: 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 70 53 72  nDb );.      pSr
5b80: 63 2d 3e 61 5b 70 53 72 63 2d 3e 6e 53 72 63 2d  c->a[pSrc->nSrc-
5b90: 31 5d 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  1].zDatabase = s
5ba0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
5bb0: 62 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  b, db->aDb[iDb].
5bc0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
5bd0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b  }.  return pSrc;
5be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
5bf0: 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72  te VDBE code for
5c00: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73 20   the statements 
5c10: 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79 20  inside the body 
5c20: 6f 66 20 61 20 73 69 6e 67 6c 65 20 0a 2a 2a 20  of a single .** 
5c30: 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  trigger..*/.stat
5c40: 69 63 20 69 6e 74 20 63 6f 64 65 54 72 69 67 67  ic int codeTrigg
5c50: 65 72 50 72 6f 67 72 61 6d 28 0a 20 20 50 61 72  erProgram(.  Par
5c60: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5c70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
5c80: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
5c90: 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70    TriggerStep *p
5ca0: 53 74 65 70 4c 69 73 74 2c 20 20 20 2f 2a 20 4c  StepList,   /* L
5cb0: 69 73 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  ist of statement
5cc0: 73 20 69 6e 73 69 64 65 20 74 68 65 20 74 72 69  s inside the tri
5cd0: 67 67 65 72 20 62 6f 64 79 20 2a 2f 0a 20 20 69  gger body */.  i
5ce0: 6e 74 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20  nt orconf       
5cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
5d00: 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 2e 20  lict algorithm. 
5d10: 28 4f 45 5f 41 62 6f 72 74 2c 20 65 74 63 29 20  (OE_Abort, etc) 
5d20: 2a 2f 20 20 0a 29 7b 0a 20 20 54 72 69 67 67 65  */  .){.  Trigge
5d30: 72 53 74 65 70 20 2a 70 53 74 65 70 3b 0a 20 20  rStep *pStep;.  
5d40: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
5d50: 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74  ->pVdbe;.  sqlit
5d60: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5d70: 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  >db;..  assert( 
5d80: 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
5d90: 54 61 62 20 26 26 20 70 50 61 72 73 65 2d 3e 70  Tab && pParse->p
5da0: 54 6f 70 6c 65 76 65 6c 20 29 3b 0a 20 20 61 73  Toplevel );.  as
5db0: 73 65 72 74 28 20 70 53 74 65 70 4c 69 73 74 20  sert( pStepList 
5dc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
5dd0: 30 20 29 3b 0a 20 20 66 6f 72 28 70 53 74 65 70  0 );.  for(pStep
5de0: 3d 70 53 74 65 70 4c 69 73 74 3b 20 70 53 74 65  =pStepList; pSte
5df0: 70 3b 20 70 53 74 65 70 3d 70 53 74 65 70 2d 3e  p; pStep=pStep->
5e00: 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 46  pNext){.    /* F
5e10: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 4f 4e  igure out the ON
5e20: 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79   CONFLICT policy
5e30: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
5e40: 65 64 20 66 6f 72 20 74 68 69 73 20 73 74 65 70  ed for this step
5e50: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  .    ** of the t
5e60: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 20  rigger program. 
5e70: 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
5e80: 20 74 68 61 74 20 63 61 75 73 65 64 20 74 68 69   that caused thi
5e90: 73 20 74 72 69 67 67 65 72 0a 20 20 20 20 2a 2a  s trigger.    **
5ea0: 20 74 6f 20 66 69 72 65 20 68 61 64 20 61 6e 20   to fire had an 
5eb0: 65 78 70 6c 69 63 69 74 20 4f 4e 20 43 4f 4e 46  explicit ON CONF
5ec0: 4c 49 43 54 2c 20 74 68 65 6e 20 75 73 65 20 69  LICT, then use i
5ed0: 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  t. Otherwise, us
5ee0: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 4e 20  e.    ** the ON 
5ef0: 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79 20  CONFLICT policy 
5f00: 74 68 61 74 20 77 61 73 20 73 70 65 63 69 66 69  that was specifi
5f10: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
5f20: 65 20 74 72 69 67 67 65 72 0a 20 20 20 20 2a 2a  e trigger.    **
5f30: 20 73 74 65 70 20 73 74 61 74 65 6d 65 6e 74 2e   step statement.
5f40: 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
5f50: 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
5f60: 20 54 52 49 47 47 45 52 20 41 46 54 45 52 20 49   TRIGGER AFTER I
5f70: 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49  NSERT ON t1 BEGI
5f80: 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 49 4e  N;.    **     IN
5f90: 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
5fa0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 6e  INTO t2 VALUES(n
5fb0: 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20  ew.a, new.b);.  
5fc0: 20 20 2a 2a 20 20 20 45 4e 44 3b 0a 20 20 20 20    **   END;.    
5fd0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 49 4e 53 45  **.    **   INSE
5fe0: 52 54 20 49 4e 54 4f 20 74 31 20 2e 2e 2e 20 3b  RT INTO t1 ... ;
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 69              -- i
6000: 6e 73 65 72 74 20 69 6e 74 6f 20 74 32 20 75 73  nsert into t2 us
6010: 65 73 20 52 45 50 4c 41 43 45 20 70 6f 6c 69 63  es REPLACE polic
6020: 79 0a 20 20 20 20 2a 2a 20 20 20 49 4e 53 45 52  y.    **   INSER
6030: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f  T OR IGNORE INTO
6040: 20 74 31 20 2e 2e 2e 20 3b 20 20 2d 2d 20 69 6e   t1 ... ;  -- in
6050: 73 65 72 74 20 69 6e 74 6f 20 74 32 20 75 73 65  sert into t2 use
6060: 73 20 49 47 4e 4f 52 45 20 70 6f 6c 69 63 79 0a  s IGNORE policy.
6070: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
6080: 65 2d 3e 65 4f 72 63 6f 6e 66 20 3d 20 28 6f 72  e->eOrconf = (or
6090: 63 6f 6e 66 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  conf==OE_Default
60a0: 29 3f 70 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 3a  )?pStep->orconf:
60b0: 28 75 38 29 6f 72 63 6f 6e 66 3b 0a 0a 20 20 20  (u8)orconf;..   
60c0: 20 73 77 69 74 63 68 28 20 70 53 74 65 70 2d 3e   switch( pStep->
60d0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  op ){.      case
60e0: 20 54 4b 5f 55 50 44 41 54 45 3a 20 7b 0a 20 20   TK_UPDATE: {.  
60f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 55 70 64        sqlite3Upd
6100: 61 74 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  ate(pParse, .   
6110: 20 20 20 20 20 20 20 74 61 72 67 65 74 53 72 63         targetSrc
6120: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 74  List(pParse, pSt
6130: 65 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ep),.          s
6140: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
6150: 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 45 78  p(db, pStep->pEx
6160: 70 72 4c 69 73 74 2c 20 30 29 2c 20 0a 20 20 20  prList, 0), .   
6170: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6180: 70 72 44 75 70 28 64 62 2c 20 70 53 74 65 70 2d  prDup(db, pStep-
6190: 3e 70 57 68 65 72 65 2c 20 30 29 2c 20 0a 20 20  >pWhere, 0), .  
61a0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
61b0: 65 4f 72 63 6f 6e 66 0a 20 20 20 20 20 20 20 20  eOrconf.        
61c0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
61d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
61e0: 63 61 73 65 20 54 4b 5f 49 4e 53 45 52 54 3a 20  case TK_INSERT: 
61f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6200: 33 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c 20  3Insert(pParse, 
6210: 0a 20 20 20 20 20 20 20 20 20 20 74 61 72 67 65  .          targe
6220: 74 53 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c  tSrcList(pParse,
6230: 20 70 53 74 65 70 29 2c 0a 20 20 20 20 20 20 20   pStep),.       
6240: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
6250: 73 74 44 75 70 28 64 62 2c 20 70 53 74 65 70 2d  stDup(db, pStep-
6260: 3e 70 45 78 70 72 4c 69 73 74 2c 20 30 29 2c 20  >pExprList, 0), 
6270: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6280: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
6290: 70 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 2c 20  pStep->pSelect, 
62a0: 30 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  0), .          s
62b0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
62c0: 64 62 2c 20 70 53 74 65 70 2d 3e 70 49 64 4c 69  db, pStep->pIdLi
62d0: 73 74 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  st), .          
62e0: 70 50 61 72 73 65 2d 3e 65 4f 72 63 6f 6e 66 0a  pParse->eOrconf.
62f0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
6300: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6310: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
6320: 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20 20 20  DELETE: {.      
6330: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 46    sqlite3DeleteF
6340: 72 6f 6d 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rom(pParse, .   
6350: 20 20 20 20 20 20 20 74 61 72 67 65 74 53 72 63         targetSrc
6360: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 74  List(pParse, pSt
6370: 65 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ep),.          s
6380: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
6390: 2c 20 70 53 74 65 70 2d 3e 70 57 68 65 72 65 2c  , pStep->pWhere,
63a0: 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20   0).        );. 
63b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
63c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
63d0: 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 53 74  ult: assert( pSt
63e0: 65 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  ep->op==TK_SELEC
63f0: 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 20 20 53  T ); {.        S
6400: 65 6c 65 63 74 44 65 73 74 20 73 44 65 73 74 3b  electDest sDest;
6410: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
6420: 2a 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  *pSelect = sqlit
6430: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
6440: 70 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 2c 20  pStep->pSelect, 
6450: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
6460: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
6470: 74 28 26 73 44 65 73 74 2c 20 53 52 54 5f 44 69  t(&sDest, SRT_Di
6480: 73 63 61 72 64 2c 20 30 29 3b 0a 20 20 20 20 20  scard, 0);.     
6490: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
64a0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
64b0: 2c 20 26 73 44 65 73 74 29 3b 0a 20 20 20 20 20  , &sDest);.     
64c0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
64d0: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
64e0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ct);.        bre
64f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6500: 7d 20 0a 20 20 20 20 69 66 28 20 70 53 74 65 70  } .    if( pStep
6510: 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op!=TK_SELECT 
6520: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6530: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
6540: 5f 52 65 73 65 74 43 6f 75 6e 74 29 3b 0a 20 20  _ResetCount);.  
6550: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
6560: 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n 0;.}..#ifdef S
6570: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
6580: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6590: 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 56  is used to add V
65a0: 64 62 65 43 6f 6d 6d 65 6e 74 28 29 20 61 6e 6e  dbeComment() ann
65b0: 6f 74 61 74 69 6f 6e 73 20 74 6f 20 61 20 56 44  otations to a VD
65c0: 42 45 0a 2a 2a 20 70 72 6f 67 72 61 6d 2e 20 49  BE.** program. I
65d0: 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  t is not used in
65e0: 20 70 72 6f 64 75 63 74 69 6f 6e 20 63 6f 64 65   production code
65f0: 2c 20 6f 6e 6c 79 20 66 6f 72 20 64 65 62 75 67  , only for debug
6600: 67 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ging..*/.static 
6610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 6e 45 72  const char *onEr
6620: 72 6f 72 54 65 78 74 28 69 6e 74 20 6f 6e 45 72  rorText(int onEr
6630: 72 6f 72 29 7b 0a 20 20 73 77 69 74 63 68 28 20  ror){.  switch( 
6640: 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 63  onError ){.    c
6650: 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20 20  ase OE_Abort:   
6660: 20 72 65 74 75 72 6e 20 22 61 62 6f 72 74 22 3b   return "abort";
6670: 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c  .    case OE_Rol
6680: 6c 62 61 63 6b 3a 20 72 65 74 75 72 6e 20 22 72  lback: return "r
6690: 6f 6c 6c 62 61 63 6b 22 3b 0a 20 20 20 20 63 61  ollback";.    ca
66a0: 73 65 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20 20  se OE_Fail:     
66b0: 72 65 74 75 72 6e 20 22 66 61 69 6c 22 3b 0a 20  return "fail";. 
66c0: 20 20 20 63 61 73 65 20 4f 45 5f 52 65 70 6c 61     case OE_Repla
66d0: 63 65 3a 20 20 72 65 74 75 72 6e 20 22 72 65 70  ce:  return "rep
66e0: 6c 61 63 65 22 3b 0a 20 20 20 20 63 61 73 65 20  lace";.    case 
66f0: 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 72 65 74  OE_Ignore:   ret
6700: 75 72 6e 20 22 69 67 6e 6f 72 65 22 3b 0a 20 20  urn "ignore";.  
6710: 20 20 63 61 73 65 20 4f 45 5f 44 65 66 61 75 6c    case OE_Defaul
6720: 74 3a 20 20 72 65 74 75 72 6e 20 22 64 65 66 61  t:  return "defa
6730: 75 6c 74 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ult";.  }.  retu
6740: 72 6e 20 22 6e 2f 61 22 3b 0a 7d 0a 23 65 6e 64  rn "n/a";.}.#end
6750: 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20  if../*.** Parse 
6760: 63 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  context structur
6770: 65 20 70 46 72 6f 6d 20 68 61 73 20 6a 75 73 74  e pFrom has just
6780: 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20 63 72   been used to cr
6790: 65 61 74 65 20 61 20 73 75 62 2d 76 64 62 65 0a  eate a sub-vdbe.
67a0: 2a 2a 20 28 74 72 69 67 67 65 72 20 70 72 6f 67  ** (trigger prog
67b0: 72 61 6d 29 2e 20 49 66 20 61 6e 20 65 72 72 6f  ram). If an erro
67c0: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
67d0: 74 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 69  transfer error i
67e0: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 72  nformation.** fr
67f0: 6f 6d 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f 2e  om pFrom to pTo.
6800: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6810: 74 72 61 6e 73 66 65 72 50 61 72 73 65 45 72 72  transferParseErr
6820: 6f 72 28 50 61 72 73 65 20 2a 70 54 6f 2c 20 50  or(Parse *pTo, P
6830: 61 72 73 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  arse *pFrom){.  
6840: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 7a  assert( pFrom->z
6850: 45 72 72 4d 73 67 3d 3d 30 20 7c 7c 20 70 46 72  ErrMsg==0 || pFr
6860: 6f 6d 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 61 73  om->nErr );.  as
6870: 73 65 72 74 28 20 70 54 6f 2d 3e 7a 45 72 72 4d  sert( pTo->zErrM
6880: 73 67 3d 3d 30 20 7c 7c 20 70 54 6f 2d 3e 6e 45  sg==0 || pTo->nE
6890: 72 72 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 2d  rr );.  if( pTo-
68a0: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
68b0: 70 54 6f 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 70  pTo->zErrMsg = p
68c0: 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20  From->zErrMsg;. 
68d0: 20 20 20 70 54 6f 2d 3e 6e 45 72 72 20 3d 20 70     pTo->nErr = p
68e0: 46 72 6f 6d 2d 3e 6e 45 72 72 3b 0a 20 20 7d 65  From->nErr;.  }e
68f0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
6900: 44 62 46 72 65 65 28 70 46 72 6f 6d 2d 3e 64 62  DbFree(pFrom->db
6910: 2c 20 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73 67  , pFrom->zErrMsg
6920: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6930: 43 72 65 61 74 65 20 61 6e 64 20 70 6f 70 75 6c  Create and popul
6940: 61 74 65 20 61 20 6e 65 77 20 54 72 69 67 67 65  ate a new Trigge
6950: 72 50 72 67 20 6f 62 6a 65 63 74 20 77 69 74 68  rPrg object with
6960: 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 0a   a sub-program .
6970: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  ** implementing 
6980: 74 72 69 67 67 65 72 20 70 54 72 69 67 67 65 72  trigger pTrigger
6990: 20 77 69 74 68 20 4f 4e 20 43 4f 4e 46 4c 49 43   with ON CONFLIC
69a0: 54 20 70 6f 6c 69 63 79 20 6f 72 63 6f 6e 66 2e  T policy orconf.
69b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 67 67  .*/.static Trigg
69c0: 65 72 50 72 67 20 2a 63 6f 64 65 52 6f 77 54 72  erPrg *codeRowTr
69d0: 69 67 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a  igger(.  Parse *
69e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
69f0: 20 43 75 72 72 65 6e 74 20 70 61 72 73 65 20 63   Current parse c
6a00: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67  ontext */.  Trig
6a10: 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20  ger *pTrigger,  
6a20: 20 2f 2a 20 54 72 69 67 67 65 72 20 74 6f 20 63   /* Trigger to c
6a30: 6f 64 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ode */.  Table *
6a40: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  pTab,         /*
6a50: 20 54 68 65 20 74 61 62 6c 65 20 70 54 72 69 67   The table pTrig
6a60: 67 65 72 20 69 73 20 61 74 74 61 63 68 65 64 20  ger is attached 
6a70: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f  to */.  int orco
6a80: 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nf           /* 
6a90: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69  ON CONFLICT poli
6aa0: 63 79 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67  cy to code trigg
6ab0: 65 72 20 70 72 6f 67 72 61 6d 20 77 69 74 68 20  er program with 
6ac0: 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  */.){.  Parse *p
6ad0: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 50 61 72  Top = sqlite3Par
6ae0: 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
6af0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e);.  sqlite3 *d
6b00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
6b10: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
6b20: 6e 64 6c 65 20 2a 2f 0a 20 20 54 72 69 67 67 65  ndle */.  Trigge
6b30: 72 50 72 67 20 2a 70 50 72 67 3b 20 20 20 20 20  rPrg *pPrg;     
6b40: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
6b50: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 45 78  o return */.  Ex
6b60: 70 72 20 2a 70 57 68 65 6e 20 3d 20 30 3b 20 20  pr *pWhen = 0;  
6b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75 70            /* Dup
6b80: 6c 69 63 61 74 65 20 6f 66 20 74 72 69 67 67 65  licate of trigge
6b90: 72 20 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f  r WHEN expressio
6ba0: 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  n */.  Vdbe *v; 
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bc0: 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
6bd0: 56 4d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  VM */.  NameCont
6be0: 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
6bf0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
6c00: 65 78 74 20 66 6f 72 20 73 75 62 2d 76 64 62 65  ext for sub-vdbe
6c10: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
6c20: 20 2a 70 50 72 6f 67 72 61 6d 20 3d 20 30 3b 20   *pProgram = 0; 
6c30: 20 20 2f 2a 20 53 75 62 2d 76 64 62 65 20 66 6f    /* Sub-vdbe fo
6c40: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
6c50: 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 53  m */.  Parse *pS
6c60: 75 62 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  ubParse;        
6c70: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
6c80: 65 78 74 20 66 6f 72 20 73 75 62 2d 76 64 62 65  ext for sub-vdbe
6c90: 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 54 72   */.  int iEndTr
6ca0: 69 67 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  igger = 0;      
6cb0: 20 20 2f 2a 20 4c 61 62 65 6c 20 74 6f 20 6a 75    /* Label to ju
6cc0: 6d 70 20 74 6f 20 69 66 20 57 48 45 4e 20 69 73  mp to if WHEN is
6cd0: 20 66 61 6c 73 65 20 2a 2f 0a 0a 20 20 61 73 73   false */..  ass
6ce0: 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 7a  ert( pTrigger->z
6cf0: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 54 61 62 3d  Name==0 || pTab=
6d00: 3d 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72 28  =tableOfTrigger(
6d10: 70 54 72 69 67 67 65 72 29 20 29 3b 0a 20 20 61  pTrigger) );.  a
6d20: 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 70 56 64  ssert( pTop->pVd
6d30: 62 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  be );..  /* Allo
6d40: 63 61 74 65 20 74 68 65 20 54 72 69 67 67 65 72  cate the Trigger
6d50: 50 72 67 20 61 6e 64 20 53 75 62 50 72 6f 67 72  Prg and SubProgr
6d60: 61 6d 20 6f 62 6a 65 63 74 73 2e 20 54 6f 20 65  am objects. To e
6d70: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 79 0a  nsure that they.
6d80: 20 20 2a 2a 20 61 72 65 20 66 72 65 65 64 20 69    ** are freed i
6d90: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6da0: 73 2c 20 6c 69 6e 6b 20 74 68 65 6d 20 69 6e 74  s, link them int
6db0: 6f 20 74 68 65 20 50 61 72 73 65 2e 70 54 72 69  o the Parse.pTri
6dc0: 67 67 65 72 50 72 67 20 0a 20 20 2a 2a 20 6c 69  ggerPrg .  ** li
6dd0: 73 74 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65  st of the top-le
6de0: 76 65 6c 20 50 61 72 73 65 20 6f 62 6a 65 63 74  vel Parse object
6df0: 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
6e00: 68 61 6e 20 6c 61 74 65 72 2e 20 20 2a 2f 0a 20  han later.  */. 
6e10: 20 70 50 72 67 20 3d 20 73 71 6c 69 74 65 33 44   pPrg = sqlite3D
6e20: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
6e30: 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 50 72  sizeof(TriggerPr
6e40: 67 29 29 3b 0a 20 20 69 66 28 20 21 70 50 72 67  g));.  if( !pPrg
6e50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
6e60: 50 72 67 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6f  Prg->pNext = pTo
6e70: 70 2d 3e 70 54 72 69 67 67 65 72 50 72 67 3b 0a  p->pTriggerPrg;.
6e80: 20 20 70 54 6f 70 2d 3e 70 54 72 69 67 67 65 72    pTop->pTrigger
6e90: 50 72 67 20 3d 20 70 50 72 67 3b 0a 20 20 70 50  Prg = pPrg;.  pP
6ea0: 72 67 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70  rg->pProgram = p
6eb0: 50 72 6f 67 72 61 6d 20 3d 20 73 71 6c 69 74 65  Program = sqlite
6ec0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
6ed0: 2c 20 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  , sizeof(SubProg
6ee0: 72 61 6d 29 29 3b 0a 20 20 69 66 28 20 21 70 50  ram));.  if( !pP
6ef0: 72 6f 67 72 61 6d 20 29 20 72 65 74 75 72 6e 20  rogram ) return 
6f00: 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
6f10: 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 70  LinkSubProgram(p
6f20: 54 6f 70 2d 3e 70 56 64 62 65 2c 20 70 50 72 6f  Top->pVdbe, pPro
6f30: 67 72 61 6d 29 3b 0a 20 20 70 50 72 67 2d 3e 70  gram);.  pPrg->p
6f40: 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
6f50: 65 72 3b 0a 20 20 70 50 72 67 2d 3e 6f 72 63 6f  er;.  pPrg->orco
6f60: 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20 70  nf = orconf;.  p
6f70: 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b 30 5d  Prg->aColmask[0]
6f80: 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   = 0xffffffff;. 
6f90: 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b   pPrg->aColmask[
6fa0: 31 5d 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  1] = 0xffffffff;
6fb0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
6fc0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 20 6e  and populate a n
6fd0: 65 77 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  ew Parse context
6fe0: 20 74 6f 20 75 73 65 20 66 6f 72 20 63 6f 64 69   to use for codi
6ff0: 6e 67 20 74 68 65 20 0a 20 20 2a 2a 20 74 72 69  ng the .  ** tri
7000: 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d  gger sub-program
7010: 2e 20 20 2a 2f 0a 20 20 70 53 75 62 50 61 72 73  .  */.  pSubPars
7020: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b  e = sqlite3Stack
7030: 41 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  AllocZero(db, si
7040: 7a 65 6f 66 28 50 61 72 73 65 29 29 3b 0a 20 20  zeof(Parse));.  
7050: 69 66 28 20 21 70 53 75 62 50 61 72 73 65 20 29  if( !pSubParse )
7060: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d   return 0;.  mem
7070: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
7080: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
7090: 2e 70 50 61 72 73 65 20 3d 20 70 53 75 62 50 61  .pParse = pSubPa
70a0: 72 73 65 3b 0a 20 20 70 53 75 62 50 61 72 73 65  rse;.  pSubParse
70b0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70 53 75  ->db = db;.  pSu
70c0: 62 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  bParse->pTrigger
70d0: 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 70 53  Tab = pTab;.  pS
70e0: 75 62 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76  ubParse->pToplev
70f0: 65 6c 20 3d 20 70 54 6f 70 3b 0a 20 20 70 53 75  el = pTop;.  pSu
7100: 62 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  bParse->zAuthCon
7110: 74 65 78 74 20 3d 20 70 54 72 69 67 67 65 72 2d  text = pTrigger-
7120: 3e 7a 4e 61 6d 65 3b 0a 20 20 70 53 75 62 50 61  >zName;.  pSubPa
7130: 72 73 65 2d 3e 65 54 72 69 67 67 65 72 4f 70 20  rse->eTriggerOp 
7140: 3d 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 3b 0a  = pTrigger->op;.
7150: 20 20 70 53 75 62 50 61 72 73 65 2d 3e 6e 51 75    pSubParse->nQu
7160: 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
7170: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 0a 20  ->nQueryLoop;.. 
7180: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
7190: 64 62 65 28 70 53 75 62 50 61 72 73 65 29 3b 0a  dbe(pSubParse);.
71a0: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 56    if( v ){.    V
71b0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
71c0: 53 74 61 72 74 3a 20 25 73 2e 25 73 20 28 25 73  Start: %s.%s (%s
71d0: 20 25 73 25 73 25 73 20 4f 4e 20 25 73 29 22 2c   %s%s%s ON %s)",
71e0: 20 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72   .      pTrigger
71f0: 2d 3e 7a 4e 61 6d 65 2c 20 6f 6e 45 72 72 6f 72  ->zName, onError
7200: 54 65 78 74 28 6f 72 63 6f 6e 66 29 2c 0a 20 20  Text(orconf),.  
7210: 20 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e 74      (pTrigger->t
7220: 72 5f 74 6d 3d 3d 54 52 49 47 47 45 52 5f 42 45  r_tm==TRIGGER_BE
7230: 46 4f 52 45 20 3f 20 22 42 45 46 4f 52 45 22 20  FORE ? "BEFORE" 
7240: 3a 20 22 41 46 54 45 52 22 29 2c 0a 20 20 20 20  : "AFTER"),.    
7250: 20 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e 6f      (pTrigger->o
7260: 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 3f 20 22  p==TK_UPDATE ? "
7270: 55 50 44 41 54 45 22 20 3a 20 22 22 29 2c 0a 20  UPDATE" : ""),. 
7280: 20 20 20 20 20 20 20 28 70 54 72 69 67 67 65 72         (pTrigger
7290: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54 20  ->op==TK_INSERT 
72a0: 3f 20 22 49 4e 53 45 52 54 22 20 3a 20 22 22 29  ? "INSERT" : "")
72b0: 2c 0a 20 20 20 20 20 20 20 20 28 70 54 72 69 67  ,.        (pTrig
72c0: 67 65 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 45 4c 45  ger->op==TK_DELE
72d0: 54 45 20 3f 20 22 44 45 4c 45 54 45 22 20 3a 20  TE ? "DELETE" : 
72e0: 22 22 29 2c 0a 20 20 20 20 20 20 70 54 61 62 2d  ""),.      pTab-
72f0: 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 23  >zName.    ));.#
7300: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7310: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 73 71 6c  IT_TRACE.    sql
7320: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
7330: 28 76 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 73  (v, -1, .      s
7340: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
7350: 2c 20 22 2d 2d 20 54 52 49 47 47 45 52 20 25 73  , "-- TRIGGER %s
7360: 22 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61  ", pTrigger->zNa
7370: 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a  me), P4_DYNAMIC.
7380: 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20      );.#endif.. 
7390: 20 20 20 2f 2a 20 49 66 20 6f 6e 65 20 77 61 73     /* If one was
73a0: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 64 65   specified, code
73b0: 20 74 68 65 20 57 48 45 4e 20 63 6c 61 75 73 65   the WHEN clause
73c0: 2e 20 49 66 20 69 74 20 65 76 61 6c 75 61 74 65  . If it evaluate
73d0: 73 20 74 6f 20 66 61 6c 73 65 0a 20 20 20 20 2a  s to false.    *
73e0: 2a 20 28 6f 72 20 4e 55 4c 4c 29 20 74 68 65 20  * (or NULL) the 
73f0: 73 75 62 2d 76 64 62 65 20 69 73 20 69 6d 6d 65  sub-vdbe is imme
7400: 64 69 61 74 65 6c 79 20 68 61 6c 74 65 64 20 62  diately halted b
7410: 79 20 6a 75 6d 70 69 6e 67 20 74 6f 20 74 68 65  y jumping to the
7420: 20 0a 20 20 20 20 2a 2a 20 4f 50 5f 48 61 6c 74   .    ** OP_Halt
7430: 20 69 6e 73 65 72 74 65 64 20 61 74 20 74 68 65   inserted at the
7440: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67   end of the prog
7450: 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ram.  */.    if(
7460: 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65 6e   pTrigger->pWhen
7470: 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 6e 20   ){.      pWhen 
7480: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7490: 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70  (db, pTrigger->p
74a0: 57 68 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  When, 0);.      
74b0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73  if( SQLITE_OK==s
74c0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
74d0: 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 57 68  rNames(&sNC, pWh
74e0: 65 6e 29 20 0a 20 20 20 20 20 20 20 26 26 20 64  en) .       && d
74f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
7500: 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =0 .      ){.   
7510: 20 20 20 20 20 69 45 6e 64 54 72 69 67 67 65 72       iEndTrigger
7520: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
7530: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
7540: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
7550: 66 46 61 6c 73 65 28 70 53 75 62 50 61 72 73 65  fFalse(pSubParse
7560: 2c 20 70 57 68 65 6e 2c 20 69 45 6e 64 54 72 69  , pWhen, iEndTri
7570: 67 67 65 72 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  gger, SQLITE_JUM
7580: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
7590: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
75a0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57  xprDelete(db, pW
75b0: 68 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  hen);.    }..   
75c0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 74 72 69   /* Code the tri
75d0: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 69 6e 74  gger program int
75e0: 6f 20 74 68 65 20 73 75 62 2d 76 64 62 65 2e 20  o the sub-vdbe. 
75f0: 2a 2f 0a 20 20 20 20 63 6f 64 65 54 72 69 67 67  */.    codeTrigg
7600: 65 72 50 72 6f 67 72 61 6d 28 70 53 75 62 50 61  erProgram(pSubPa
7610: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 73  rse, pTrigger->s
7620: 74 65 70 5f 6c 69 73 74 2c 20 6f 72 63 6f 6e 66  tep_list, orconf
7630: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
7640: 74 20 61 6e 20 4f 50 5f 48 61 6c 74 20 61 74 20  t an OP_Halt at 
7650: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
7660: 75 62 2d 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20  ub-program. */. 
7670: 20 20 20 69 66 28 20 69 45 6e 64 54 72 69 67 67     if( iEndTrigg
7680: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
7690: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
76a0: 62 65 6c 28 76 2c 20 69 45 6e 64 54 72 69 67 67  bel(v, iEndTrigg
76b0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
76c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
76d0: 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 20 20  (v, OP_Halt);.  
76e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
76f0: 2c 20 22 45 6e 64 3a 20 25 73 2e 25 73 22 2c 20  , "End: %s.%s", 
7700: 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 2c  pTrigger->zName,
7710: 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f 72 63   onErrorText(orc
7720: 6f 6e 66 29 29 29 3b 0a 0a 20 20 20 20 74 72 61  onf)));..    tra
7730: 6e 73 66 65 72 50 61 72 73 65 45 72 72 6f 72 28  nsferParseError(
7740: 70 50 61 72 73 65 2c 20 70 53 75 62 50 61 72 73  pParse, pSubPars
7750: 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  e);.    if( db->
7760: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
7770: 29 7b 0a 20 20 20 20 20 20 70 50 72 6f 67 72 61  ){.      pProgra
7780: 6d 2d 3e 61 4f 70 20 3d 20 73 71 6c 69 74 65 33  m->aOp = sqlite3
7790: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
77a0: 76 2c 20 26 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f  v, &pProgram->nO
77b0: 70 2c 20 26 70 54 6f 70 2d 3e 6e 4d 61 78 41 72  p, &pTop->nMaxAr
77c0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  g);.    }.    pP
77d0: 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 3d 20 70  rogram->nMem = p
77e0: 53 75 62 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  SubParse->nMem;.
77f0: 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43      pProgram->nC
7800: 73 72 20 3d 20 70 53 75 62 50 61 72 73 65 2d 3e  sr = pSubParse->
7810: 6e 54 61 62 3b 0a 20 20 20 20 70 50 72 6f 67 72  nTab;.    pProgr
7820: 61 6d 2d 3e 74 6f 6b 65 6e 20 3d 20 28 76 6f 69  am->token = (voi
7830: 64 20 2a 29 70 54 72 69 67 67 65 72 3b 0a 20 20  d *)pTrigger;.  
7840: 20 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b    pPrg->aColmask
7850: 5b 30 5d 20 3d 20 70 53 75 62 50 61 72 73 65 2d  [0] = pSubParse-
7860: 3e 6f 6c 64 6d 61 73 6b 3b 0a 20 20 20 20 70 50  >oldmask;.    pP
7870: 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b 31 5d 20  rg->aColmask[1] 
7880: 3d 20 70 53 75 62 50 61 72 73 65 2d 3e 6e 65 77  = pSubParse->new
7890: 6d 61 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  mask;.    sqlite
78a0: 33 56 64 62 65 44 65 6c 65 74 65 28 76 29 3b 0a  3VdbeDelete(v);.
78b0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21    }..  assert( !
78c0: 70 53 75 62 50 61 72 73 65 2d 3e 70 41 69 6e 63  pSubParse->pAinc
78d0: 20 20 20 20 20 20 20 26 26 20 21 70 53 75 62 50         && !pSubP
78e0: 61 72 73 65 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  arse->pZombieTab
78f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
7900: 53 75 62 50 61 72 73 65 2d 3e 70 54 72 69 67 67  SubParse->pTrigg
7910: 65 72 50 72 67 20 26 26 20 21 70 53 75 62 50 61  erPrg && !pSubPa
7920: 72 73 65 2d 3e 6e 4d 61 78 41 72 67 20 29 3b 0a  rse->nMaxArg );.
7930: 20 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72    sqlite3StackFr
7940: 65 65 28 64 62 2c 20 70 53 75 62 50 61 72 73 65  ee(db, pSubParse
7950: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 72  );..  return pPr
7960: 67 3b 0a 7d 0a 20 20 20 20 0a 2f 2a 0a 2a 2a 20  g;.}.    ./*.** 
7970: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
7980: 20 74 6f 20 61 20 54 72 69 67 67 65 72 50 72 67   to a TriggerPrg
7990: 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69   object containi
79a0: 6e 67 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  ng the sub-progr
79b0: 61 6d 20 66 6f 72 0a 2a 2a 20 74 72 69 67 67 65  am for.** trigge
79c0: 72 20 70 54 72 69 67 67 65 72 20 77 69 74 68 20  r pTrigger with 
79d0: 64 65 66 61 75 6c 74 20 4f 4e 20 43 4f 4e 46 4c  default ON CONFL
79e0: 49 43 54 20 61 6c 67 6f 72 69 74 68 6d 20 6f 72  ICT algorithm or
79f0: 63 6f 6e 66 2e 20 49 66 20 6e 6f 20 73 75 63 68  conf. If no such
7a00: 0a 2a 2a 20 54 72 69 67 67 65 72 50 72 67 20 6f  .** TriggerPrg o
7a10: 62 6a 65 63 74 20 65 78 69 73 74 73 2c 20 61 20  bject exists, a 
7a20: 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  new object is al
7a30: 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
7a40: 6c 61 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  lated before.** 
7a50: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a  being returned..
7a60: 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 67 67 65  */.static Trigge
7a70: 72 50 72 67 20 2a 67 65 74 52 6f 77 54 72 69 67  rPrg *getRowTrig
7a80: 67 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ger(.  Parse *pP
7a90: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 43  arse,       /* C
7aa0: 75 72 72 65 6e 74 20 70 61 72 73 65 20 63 6f 6e  urrent parse con
7ab0: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
7ac0: 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20 20 2f  r *pTrigger,   /
7ad0: 2a 20 54 72 69 67 67 65 72 20 74 6f 20 63 6f 64  * Trigger to cod
7ae0: 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
7af0: 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab,         /* T
7b00: 68 65 20 74 61 62 6c 65 20 74 72 69 67 67 65 72  he table trigger
7b10: 20 70 54 72 69 67 67 65 72 20 69 73 20 61 74 74   pTrigger is att
7b20: 61 63 68 65 64 20 74 6f 20 2a 2f 0a 20 20 69 6e  ached to */.  in
7b30: 74 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20  t orconf        
7b40: 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     /* ON CONFLIC
7b50: 54 20 61 6c 67 6f 72 69 74 68 6d 2e 20 2a 2f 0a  T algorithm. */.
7b60: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 52 6f 6f  ){.  Parse *pRoo
7b70: 74 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  t = sqlite3Parse
7b80: 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
7b90: 3b 0a 20 20 54 72 69 67 67 65 72 50 72 67 20 2a  ;.  TriggerPrg *
7ba0: 70 50 72 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  pPrg;..  assert(
7bb0: 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65   pTrigger->zName
7bc0: 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 74 61 62  ==0 || pTab==tab
7bd0: 6c 65 4f 66 54 72 69 67 67 65 72 28 70 54 72 69  leOfTrigger(pTri
7be0: 67 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  gger) );..  /* I
7bf0: 74 20 6d 61 79 20 62 65 20 74 68 61 74 20 74 68  t may be that th
7c00: 69 73 20 74 72 69 67 67 65 72 20 68 61 73 20 61  is trigger has a
7c10: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 64 65  lready been code
7c20: 64 20 28 6f 72 20 69 73 20 69 6e 20 74 68 65 0a  d (or is in the.
7c30: 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20    ** process of 
7c40: 62 65 69 6e 67 20 63 6f 64 65 64 29 2e 20 49 66  being coded). If
7c50: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
7c60: 65 2c 20 74 68 65 6e 20 61 6e 20 65 6e 74 72 79  e, then an entry
7c70: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6d 61 74   with.  ** a mat
7c80: 63 68 69 6e 67 20 54 72 69 67 67 65 72 50 72 67  ching TriggerPrg
7c90: 2e 70 54 72 69 67 67 65 72 20 66 69 65 6c 64 20  .pTrigger field 
7ca0: 77 69 6c 6c 20 62 65 20 70 72 65 73 65 6e 74 20  will be present 
7cb0: 73 6f 6d 65 77 68 65 72 65 0a 20 20 2a 2a 20 69  somewhere.  ** i
7cc0: 6e 20 74 68 65 20 50 61 72 73 65 2e 70 54 72 69  n the Parse.pTri
7cd0: 67 67 65 72 50 72 67 20 6c 69 73 74 2e 20 53 65  ggerPrg list. Se
7ce0: 61 72 63 68 20 66 6f 72 20 73 75 63 68 20 61 6e  arch for such an
7cf0: 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 66 6f   entry.  */.  fo
7d00: 72 28 70 50 72 67 3d 70 52 6f 6f 74 2d 3e 70 54  r(pPrg=pRoot->pT
7d10: 72 69 67 67 65 72 50 72 67 3b 20 0a 20 20 20 20  riggerPrg; .    
7d20: 20 20 70 50 72 67 20 26 26 20 28 70 50 72 67 2d    pPrg && (pPrg-
7d30: 3e 70 54 72 69 67 67 65 72 21 3d 70 54 72 69 67  >pTrigger!=pTrig
7d40: 67 65 72 20 7c 7c 20 70 50 72 67 2d 3e 6f 72 63  ger || pPrg->orc
7d50: 6f 6e 66 21 3d 6f 72 63 6f 6e 66 29 3b 20 0a 20  onf!=orconf); . 
7d60: 20 20 20 20 20 70 50 72 67 3d 70 50 72 67 2d 3e       pPrg=pPrg->
7d70: 70 4e 65 78 74 0a 20 20 29 3b 0a 0a 20 20 2f 2a  pNext.  );..  /*
7d80: 20 49 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   If an existing 
7d90: 54 72 69 67 67 65 72 50 72 67 20 63 6f 75 6c 64  TriggerPrg could
7da0: 20 6e 6f 74 20 62 65 20 6c 6f 63 61 74 65 64 2c   not be located,
7db0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
7dc0: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 72  e. */.  if( !pPr
7dd0: 67 20 29 7b 0a 20 20 20 20 70 50 72 67 20 3d 20  g ){.    pPrg = 
7de0: 63 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28 70  codeRowTrigger(p
7df0: 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c  Parse, pTrigger,
7e00: 20 70 54 61 62 2c 20 6f 72 63 6f 6e 66 29 3b 0a   pTab, orconf);.
7e10: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
7e20: 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  rg;.}../*.** Gen
7e30: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
7e40: 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  he trigger progr
7e50: 61 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  am associated wi
7e60: 74 68 20 74 72 69 67 67 65 72 20 70 20 6f 6e 20  th trigger p on 
7e70: 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 2e 20  .** table pTab. 
7e80: 54 68 65 20 72 65 67 2c 20 6f 72 63 6f 6e 66 20  The reg, orconf 
7e90: 61 6e 64 20 69 67 6e 6f 72 65 4a 75 6d 70 20 70  and ignoreJump p
7ea0: 61 72 61 6d 65 74 65 72 73 20 70 61 73 73 65 64  arameters passed
7eb0: 20 74 6f 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63   to this.** func
7ec0: 74 69 6f 6e 20 61 72 65 20 74 68 65 20 73 61 6d  tion are the sam
7ed0: 65 20 61 73 20 74 68 6f 73 65 20 64 65 73 63 72  e as those descr
7ee0: 69 62 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  ibed in the head
7ef0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a  er function for.
7f00: 2a 2a 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f  ** sqlite3CodeRo
7f10: 77 54 72 69 67 67 65 72 28 29 0a 2a 2f 0a 76 6f  wTrigger().*/.vo
7f20: 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f  id sqlite3CodeRo
7f30: 77 54 72 69 67 67 65 72 44 69 72 65 63 74 28 0a  wTriggerDirect(.
7f40: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7f50: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
7f60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69  context */.  Tri
7f70: 67 67 65 72 20 2a 70 2c 20 20 20 20 20 20 20 20  gger *p,        
7f80: 20 20 2f 2a 20 54 72 69 67 67 65 72 20 74 6f 20    /* Trigger to 
7f90: 63 6f 64 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  code */.  Table 
7fa0: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  *pTab,         /
7fb0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 63  * The table to c
7fc0: 6f 64 65 20 74 72 69 67 67 65 72 73 20 66 72 6f  ode triggers fro
7fd0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 2c 20  m */.  int reg, 
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
7ff0: 65 67 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  eg array contain
8000: 69 6e 67 20 4f 4c 44 2e 2a 20 61 6e 64 20 4e 45  ing OLD.* and NE
8010: 57 2e 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  W.* values */.  
8020: 69 6e 74 20 6f 72 63 6f 6e 66 2c 20 20 20 20 20  int orconf,     
8030: 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c       /* ON CONFL
8040: 49 43 54 20 70 6f 6c 69 63 79 20 2a 2f 0a 20 20  ICT policy */.  
8050: 69 6e 74 20 69 67 6e 6f 72 65 4a 75 6d 70 20 20  int ignoreJump  
8060: 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74       /* Instruct
8070: 69 6f 6e 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66  ion to jump to f
8080: 6f 72 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29  or RAISE(IGNORE)
8090: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
80a0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
80b0: 65 28 70 50 61 72 73 65 29 3b 20 2f 2a 20 4d 61  e(pParse); /* Ma
80c0: 69 6e 20 56 4d 20 2a 2f 0a 20 20 54 72 69 67 67  in VM */.  Trigg
80d0: 65 72 50 72 67 20 2a 70 50 72 67 3b 0a 20 20 70  erPrg *pPrg;.  p
80e0: 50 72 67 20 3d 20 67 65 74 52 6f 77 54 72 69 67  Prg = getRowTrig
80f0: 67 65 72 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ger(pParse, p, p
8100: 54 61 62 2c 20 6f 72 63 6f 6e 66 29 3b 0a 20 20  Tab, orconf);.  
8110: 61 73 73 65 72 74 28 20 70 50 72 67 20 7c 7c 20  assert( pPrg || 
8120: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
8130: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
8140: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f  ocFailed );..  /
8150: 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 50 72  * Code the OP_Pr
8160: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20  ogram opcode in 
8170: 74 68 65 20 70 61 72 65 6e 74 20 56 44 42 45 2e  the parent VDBE.
8180: 20 50 34 20 6f 66 20 74 68 65 20 4f 50 5f 50 72   P4 of the OP_Pr
8190: 6f 67 72 61 6d 20 0a 20 20 2a 2a 20 69 73 20 61  ogram .  ** is a
81a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
81b0: 73 75 62 2d 76 64 62 65 20 63 6f 6e 74 61 69 6e  sub-vdbe contain
81c0: 69 6e 67 20 74 68 65 20 74 72 69 67 67 65 72 20  ing the trigger 
81d0: 70 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 69  program.  */.  i
81e0: 66 28 20 70 50 72 67 20 29 7b 0a 20 20 20 20 69  f( pPrg ){.    i
81f0: 6e 74 20 62 52 65 63 75 72 73 69 76 65 20 3d 20  nt bRecursive = 
8200: 28 70 2d 3e 7a 4e 61 6d 65 20 26 26 20 30 3d 3d  (p->zName && 0==
8210: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
8220: 67 73 26 53 51 4c 49 54 45 5f 52 65 63 54 72 69  gs&SQLITE_RecTri
8230: 67 67 65 72 73 29 29 3b 0a 0a 20 20 20 20 73 71  ggers));..    sq
8240: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8250: 76 2c 20 4f 50 5f 50 72 6f 67 72 61 6d 2c 20 72  v, OP_Program, r
8260: 65 67 2c 20 69 67 6e 6f 72 65 4a 75 6d 70 2c 20  eg, ignoreJump, 
8270: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b  ++pParse->nMem);
8280: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8290: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
82a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50  (const char *)pP
82b0: 72 67 2d 3e 70 50 72 6f 67 72 61 6d 2c 20 50 34  rg->pProgram, P4
82c0: 5f 53 55 42 50 52 4f 47 52 41 4d 29 3b 0a 20 20  _SUBPROGRAM);.  
82d0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 0a 20    VdbeComment(. 
82e0: 20 20 20 20 20 20 20 28 76 2c 20 22 43 61 6c 6c         (v, "Call
82f0: 3a 20 25 73 2e 25 73 22 2c 20 28 70 2d 3e 7a 4e  : %s.%s", (p->zN
8300: 61 6d 65 3f 70 2d 3e 7a 4e 61 6d 65 3a 22 66 6b  ame?p->zName:"fk
8310: 65 79 22 29 2c 20 6f 6e 45 72 72 6f 72 54 65 78  ey"), onErrorTex
8320: 74 28 6f 72 63 6f 6e 66 29 29 29 3b 0a 0a 20 20  t(orconf)));..  
8330: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 50 35 20    /* Set the P5 
8340: 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4f  operand of the O
8350: 50 5f 50 72 6f 67 72 61 6d 20 69 6e 73 74 72 75  P_Program instru
8360: 63 74 69 6f 6e 20 74 6f 20 6e 6f 6e 2d 7a 65 72  ction to non-zer
8370: 6f 20 69 66 0a 20 20 20 20 2a 2a 20 72 65 63 75  o if.    ** recu
8380: 72 73 69 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e  rsive invocation
8390: 20 6f 66 20 74 68 69 73 20 74 72 69 67 67 65 72   of this trigger
83a0: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 61   program is disa
83b0: 6c 6c 6f 77 65 64 2e 20 52 65 63 75 72 73 69 76  llowed. Recursiv
83c0: 65 0a 20 20 20 20 2a 2a 20 69 6e 76 6f 63 61 74  e.    ** invocat
83d0: 69 6f 6e 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  ion is disallowe
83e0: 64 20 69 66 20 28 61 29 20 74 68 65 20 73 75 62  d if (a) the sub
83f0: 2d 70 72 6f 67 72 61 6d 20 69 73 20 72 65 61 6c  -program is real
8400: 6c 79 20 61 20 74 72 69 67 67 65 72 2c 0a 20 20  ly a trigger,.  
8410: 20 20 2a 2a 20 6e 6f 74 20 61 20 66 6f 72 65 69    ** not a forei
8420: 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 2c 20 61  gn key action, a
8430: 6e 64 20 28 62 29 20 74 68 65 20 66 6c 61 67 20  nd (b) the flag 
8440: 74 6f 20 65 6e 61 62 6c 65 20 72 65 63 75 72 73  to enable recurs
8450: 69 76 65 20 74 72 69 67 67 65 72 73 0a 20 20 20  ive triggers.   
8460: 20 2a 2a 20 69 73 20 63 6c 65 61 72 2e 20 20 2a   ** is clear.  *
8470: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
8480: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
8490: 29 62 52 65 63 75 72 73 69 76 65 29 3b 0a 20 20  )bRecursive);.  
84a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
84b0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 64  is called to cod
84c0: 65 20 74 68 65 20 72 65 71 75 69 72 65 64 20 46  e the required F
84d0: 4f 52 20 45 41 43 48 20 52 4f 57 20 74 72 69 67  OR EACH ROW trig
84e0: 67 65 72 73 20 66 6f 72 20 61 6e 20 6f 70 65 72  gers for an oper
84f0: 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c  ation.** on tabl
8500: 65 20 70 54 61 62 2e 20 54 68 65 20 6f 70 65 72  e pTab. The oper
8510: 61 74 69 6f 6e 20 74 6f 20 63 6f 64 65 20 74 72  ation to code tr
8520: 69 67 67 65 72 73 20 66 6f 72 20 28 49 4e 53 45  iggers for (INSE
8530: 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
8540: 4c 45 54 45 29 0a 2a 2a 20 69 73 20 67 69 76 65  LETE).** is give
8550: 6e 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61  n by the op para
8560: 6d 61 74 65 72 2e 20 54 68 65 20 74 72 5f 74 6d  mater. The tr_tm
8570: 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
8580: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 74 68  mines whether th
8590: 65 0a 2a 2a 20 42 45 46 4f 52 45 20 6f 72 20 41  e.** BEFORE or A
85a0: 46 54 45 52 20 74 72 69 67 67 65 72 73 20 61 72  FTER triggers ar
85b0: 65 20 63 6f 64 65 64 2e 20 49 66 20 74 68 65 20  e coded. If the 
85c0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20  operation is an 
85d0: 55 50 44 41 54 45 2c 20 74 68 65 6e 0a 2a 2a 20  UPDATE, then.** 
85e0: 70 61 72 61 6d 65 74 65 72 20 70 43 68 61 6e 67  parameter pChang
85f0: 65 73 20 69 73 20 70 61 73 73 65 64 20 74 68 65  es is passed the
8600: 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
8610: 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e   being modified.
8620: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
8630: 61 72 65 20 6e 6f 20 74 72 69 67 67 65 72 73 20  are no triggers 
8640: 74 68 61 74 20 66 69 72 65 20 61 74 20 74 68 65  that fire at the
8650: 20 73 70 65 63 69 66 69 65 64 20 74 69 6d 65 20   specified time 
8660: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
8670: 64 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  d.** operation o
8680: 6e 20 70 54 61 62 2c 20 74 68 69 73 20 66 75 6e  n pTab, this fun
8690: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
86a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 20  ..**.** The reg 
86b0: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
86c0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
86d0: 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
86e0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 0a 2a   of registers .*
86f0: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74  * that contain t
8700: 68 65 20 76 61 6c 75 65 73 20 73 75 62 73 74 69  he values substi
8710: 74 75 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65  tuted for the ne
8720: 77 2e 2a 20 61 6e 64 20 6f 6c 64 2e 2a 20 72 65  w.* and old.* re
8730: 66 65 72 65 6e 63 65 73 0a 2a 2a 20 69 6e 20 74  ferences.** in t
8740: 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  he trigger progr
8750: 61 6d 2e 20 49 66 20 4e 20 69 73 20 74 68 65 20  am. If N is the 
8760: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
8770: 73 20 69 6e 20 74 61 62 6c 65 20 70 54 61 62 0a  s in table pTab.
8780: 2a 2a 20 28 61 20 63 6f 70 79 20 6f 66 20 70 54  ** (a copy of pT
8790: 61 62 2d 3e 6e 43 6f 6c 29 2c 20 74 68 65 6e 20  ab->nCol), then 
87a0: 72 65 67 69 73 74 65 72 73 20 61 72 65 20 70 6f  registers are po
87b0: 70 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  pulated as follo
87c0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 65 67 69  ws:.**.**   Regi
87d0: 73 74 65 72 20 20 20 20 20 20 20 43 6f 6e 74 61  ster       Conta
87e0: 69 6e 73 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ins.**   -------
87f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8820: 2a 2a 20 20 20 72 65 67 2b 30 20 20 20 20 20 20  **   reg+0      
8830: 20 20 20 20 4f 4c 44 2e 72 6f 77 69 64 0a 2a 2a      OLD.rowid.**
8840: 20 20 20 72 65 67 2b 31 20 20 20 20 20 20 20 20     reg+1        
8850: 20 20 4f 4c 44 2e 2a 20 76 61 6c 75 65 20 6f 66    OLD.* value of
8860: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
8870: 6e 20 6f 66 20 70 54 61 62 0a 2a 2a 20 20 20 2e  n of pTab.**   .
8880: 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  ..            ..
8890: 2e 0a 2a 2a 20 20 20 72 65 67 2b 4e 20 20 20 20  ..**   reg+N    
88a0: 20 20 20 20 20 20 4f 4c 44 2e 2a 20 76 61 6c 75        OLD.* valu
88b0: 65 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20  e of right-most 
88c0: 63 6f 6c 75 6d 6e 20 6f 66 20 70 54 61 62 0a 2a  column of pTab.*
88d0: 2a 20 20 20 72 65 67 2b 4e 2b 31 20 20 20 20 20  *   reg+N+1     
88e0: 20 20 20 4e 45 57 2e 72 6f 77 69 64 0a 2a 2a 20     NEW.rowid.** 
88f0: 20 20 72 65 67 2b 4e 2b 32 20 20 20 20 20 20 20    reg+N+2       
8900: 20 4f 4c 44 2e 2a 20 76 61 6c 75 65 20 6f 66 20   OLD.* value of 
8910: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
8920: 20 6f 66 20 70 54 61 62 0a 2a 2a 20 20 20 2e 2e   of pTab.**   ..
8930: 2e 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .            ...
8940: 0a 2a 2a 20 20 20 72 65 67 2b 4e 2b 4e 2b 31 20  .**   reg+N+N+1 
8950: 20 20 20 20 20 4e 45 57 2e 2a 20 76 61 6c 75 65       NEW.* value
8960: 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63   of right-most c
8970: 6f 6c 75 6d 6e 20 6f 66 20 70 54 61 62 0a 2a 2a  olumn of pTab.**
8980: 0a 2a 2a 20 46 6f 72 20 4f 4e 20 44 45 4c 45 54  .** For ON DELET
8990: 45 20 74 72 69 67 67 65 72 73 2c 20 74 68 65 20  E triggers, the 
89a0: 72 65 67 69 73 74 65 72 73 20 63 6f 6e 74 61 69  registers contai
89b0: 6e 69 6e 67 20 74 68 65 20 4e 45 57 2e 2a 20 76  ning the NEW.* v
89c0: 61 6c 75 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 65  alues will.** ne
89d0: 76 65 72 20 62 65 20 61 63 63 65 73 73 65 64 20  ver be accessed 
89e0: 62 79 20 74 68 65 20 74 72 69 67 67 65 72 20 70  by the trigger p
89f0: 72 6f 67 72 61 6d 2c 20 73 6f 20 74 68 65 79 20  rogram, so they 
8a00: 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  are not allocate
8a10: 64 20 6f 72 20 0a 2a 2a 20 70 6f 70 75 6c 61 74  d or .** populat
8a20: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
8a30: 20 28 74 68 65 72 65 20 69 73 20 6e 6f 20 64 61   (there is no da
8a40: 74 61 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ta to populate t
8a50: 68 65 6d 20 77 69 74 68 20 61 6e 79 77 61 79 29  hem with anyway)
8a60: 2e 20 0a 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c  . .** Similarly,
8a70: 20 66 6f 72 20 4f 4e 20 49 4e 53 45 52 54 20 74   for ON INSERT t
8a80: 72 69 67 67 65 72 73 20 74 68 65 20 76 61 6c 75  riggers the valu
8a90: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
8aa0: 20 4f 4c 44 2e 2a 20 72 65 67 69 73 74 65 72 73   OLD.* registers
8ab0: 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72 20 61 63  .** are never ac
8ac0: 63 65 73 73 65 64 2c 20 61 6e 64 20 73 6f 20 61  cessed, and so a
8ad0: 72 65 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64  re not allocated
8ae0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
8af0: 53 6f 2c 20 66 6f 72 20 61 6e 0a 2a 2a 20 4f 4e  So, for an.** ON
8b00: 20 49 4e 53 45 52 54 20 74 72 69 67 67 65 72 2c   INSERT trigger,
8b10: 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   the value passe
8b20: 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
8b30: 6f 6e 20 61 73 20 70 61 72 61 6d 65 74 65 72 20  on as parameter 
8b40: 72 65 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20  reg.** is not a 
8b50: 72 65 61 64 61 62 6c 65 20 72 65 67 69 73 74 65  readable registe
8b60: 72 2c 20 61 6c 74 68 6f 75 67 68 20 72 65 67 69  r, although regi
8b70: 73 74 65 72 73 20 28 72 65 67 2b 4e 29 20 74 68  sters (reg+N) th
8b80: 72 6f 75 67 68 20 0a 2a 2a 20 28 72 65 67 2b 4e  rough .** (reg+N
8b90: 2b 4e 2b 31 29 20 61 72 65 2e 0a 2a 2a 0a 2a 2a  +N+1) are..**.**
8ba0: 20 50 61 72 61 6d 65 74 65 72 20 6f 72 63 6f 6e   Parameter orcon
8bb0: 66 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  f is the default
8bc0: 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
8bd0: 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 66  tion algorithm f
8be0: 6f 72 20 74 68 65 0a 2a 2a 20 74 72 69 67 67 65  or the.** trigge
8bf0: 72 20 70 72 6f 67 72 61 6d 20 74 6f 20 75 73 65  r program to use
8c00: 20 28 52 45 50 4c 41 43 45 2c 20 49 47 4e 4f 52   (REPLACE, IGNOR
8c10: 45 20 65 74 63 2e 29 2e 20 50 61 72 61 6d 65 74  E etc.). Paramet
8c20: 65 72 20 69 67 6e 6f 72 65 4a 75 6d 70 0a 2a 2a  er ignoreJump.**
8c30: 20 69 73 20 74 68 65 20 69 6e 73 74 72 75 63 74   is the instruct
8c40: 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 72 6f 6c  ion that control
8c50: 20 73 68 6f 75 6c 64 20 6a 75 6d 70 20 74 6f 20   should jump to 
8c60: 69 66 20 61 20 74 72 69 67 67 65 72 20 70 72 6f  if a trigger pro
8c70: 67 72 61 6d 0a 2a 2a 20 72 61 69 73 65 73 20 61  gram.** raises a
8c80: 6e 20 49 47 4e 4f 52 45 20 65 78 63 65 70 74 69  n IGNORE excepti
8c90: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
8ca0: 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65  te3CodeRowTrigge
8cb0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
8cc0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
8cd0: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
8ce0: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
8cf0: 72 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  r,   /* List of 
8d00: 74 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c  triggers on tabl
8d10: 65 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  e pTab */.  int 
8d20: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
8d30: 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 50   /* One of TK_UP
8d40: 44 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c  DATE, TK_INSERT,
8d50: 20 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20   TK_DELETE */.  
8d60: 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e 67  ExprList *pChang
8d70: 65 73 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73 20  es,  /* Changes 
8d80: 6c 69 73 74 20 66 6f 72 20 61 6e 79 20 55 50 44  list for any UPD
8d90: 41 54 45 20 4f 46 20 74 72 69 67 67 65 72 73 20  ATE OF triggers 
8da0: 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74 6d 2c 20  */.  int tr_tm, 
8db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
8dc0: 20 6f 66 20 54 52 49 47 47 45 52 5f 42 45 46 4f   of TRIGGER_BEFO
8dd0: 52 45 2c 20 54 52 49 47 47 45 52 5f 41 46 54 45  RE, TRIGGER_AFTE
8de0: 52 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  R */.  Table *pT
8df0: 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab,         /* T
8e00: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 6f 64 65  he table to code
8e10: 20 74 72 69 67 67 65 72 73 20 66 72 6f 6d 20 2a   triggers from *
8e20: 2f 0a 20 20 69 6e 74 20 72 65 67 2c 20 20 20 20  /.  int reg,    
8e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8e40: 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61  first in an arra
8e50: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 28  y of registers (
8e60: 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20  see above) */.  
8e70: 69 6e 74 20 6f 72 63 6f 6e 66 2c 20 20 20 20 20  int orconf,     
8e80: 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f 4e 46 4c       /* ON CONFL
8e90: 49 43 54 20 70 6f 6c 69 63 79 20 2a 2f 0a 20 20  ICT policy */.  
8ea0: 69 6e 74 20 69 67 6e 6f 72 65 4a 75 6d 70 20 20  int ignoreJump  
8eb0: 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74       /* Instruct
8ec0: 69 6f 6e 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66  ion to jump to f
8ed0: 6f 72 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29  or RAISE(IGNORE)
8ee0: 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67 65 72   */.){.  Trigger
8ef0: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   *p;          /*
8f00: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
8f10: 20 74 68 72 6f 75 67 68 20 70 54 72 69 67 67 65   through pTrigge
8f20: 72 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  r list */..  ass
8f30: 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 50 44 41  ert( op==TK_UPDA
8f40: 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 53  TE || op==TK_INS
8f50: 45 52 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 44 45  ERT || op==TK_DE
8f60: 4c 45 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  LETE );.  assert
8f70: 28 20 74 72 5f 74 6d 3d 3d 54 52 49 47 47 45 52  ( tr_tm==TRIGGER
8f80: 5f 42 45 46 4f 52 45 20 7c 7c 20 74 72 5f 74 6d  _BEFORE || tr_tm
8f90: 3d 3d 54 52 49 47 47 45 52 5f 41 46 54 45 52 20  ==TRIGGER_AFTER 
8fa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 70  );.  assert( (op
8fb0: 3d 3d 54 4b 5f 55 50 44 41 54 45 29 3d 3d 28 70  ==TK_UPDATE)==(p
8fc0: 43 68 61 6e 67 65 73 21 3d 30 29 20 29 3b 0a 0a  Changes!=0) );..
8fd0: 20 20 66 6f 72 28 70 3d 70 54 72 69 67 67 65 72    for(p=pTrigger
8fe0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
8ff0: 7b 0a 0a 20 20 20 20 2f 2a 20 53 61 6e 69 74 79  {..    /* Sanity
9000: 20 63 68 65 63 6b 69 6e 67 3a 20 20 54 68 65 20   checking:  The 
9010: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 74  schema for the t
9020: 72 69 67 67 65 72 20 61 6e 64 20 66 6f 72 20 74  rigger and for t
9030: 68 65 20 74 61 62 6c 65 20 61 72 65 0a 20 20 20  he table are.   
9040: 20 2a 2a 20 61 6c 77 61 79 73 20 64 65 66 69 6e   ** always defin
9050: 65 64 2e 20 20 54 68 65 20 74 72 69 67 67 65 72  ed.  The trigger
9060: 20 6d 75 73 74 20 62 65 20 69 6e 20 74 68 65 20   must be in the 
9070: 73 61 6d 65 20 73 63 68 65 6d 61 20 61 73 20 74  same schema as t
9080: 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
9090: 6f 72 20 65 6c 73 65 20 69 74 20 6d 75 73 74 20  or else it must 
90a0: 62 65 20 61 20 54 45 4d 50 20 74 72 69 67 67 65  be a TEMP trigge
90b0: 72 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  r. */.    assert
90c0: 28 20 70 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20  ( p->pSchema!=0 
90d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
90e0: 2d 3e 70 54 61 62 53 63 68 65 6d 61 21 3d 30 20  ->pTabSchema!=0 
90f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9100: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 2d 3e 70 54  ->pSchema==p->pT
9110: 61 62 53 63 68 65 6d 61 20 0a 20 20 20 20 20 20  abSchema .      
9120: 20 20 20 7c 7c 20 70 2d 3e 70 53 63 68 65 6d 61     || p->pSchema
9130: 3d 3d 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  ==pParse->db->aD
9140: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
9150: 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  .    /* Determin
9160: 65 20 77 68 65 74 68 65 72 20 77 65 20 73 68 6f  e whether we sho
9170: 75 6c 64 20 63 6f 64 65 20 74 68 69 73 20 74 72  uld code this tr
9180: 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  igger */.    if(
9190: 20 70 2d 3e 6f 70 3d 3d 6f 70 20 0a 20 20 20 20   p->op==op .    
91a0: 20 26 26 20 70 2d 3e 74 72 5f 74 6d 3d 3d 74 72   && p->tr_tm==tr
91b0: 5f 74 6d 20 0a 20 20 20 20 20 26 26 20 63 68 65  _tm .     && che
91c0: 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70 28  ckColumnOverlap(
91d0: 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70 43 68  p->pColumns, pCh
91e0: 61 6e 67 65 73 29 0a 20 20 20 20 29 7b 0a 20 20  anges).    ){.  
91f0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 52      sqlite3CodeR
9200: 6f 77 54 72 69 67 67 65 72 44 69 72 65 63 74 28  owTriggerDirect(
9210: 70 50 61 72 73 65 2c 20 70 2c 20 70 54 61 62 2c  pParse, p, pTab,
9220: 20 72 65 67 2c 20 6f 72 63 6f 6e 66 2c 20 69 67   reg, orconf, ig
9230: 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 7d  noreJump);.    }
9240: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
9250: 69 67 67 65 72 73 20 6d 61 79 20 61 63 63 65 73  iggers may acces
9260: 73 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  s values stored 
9270: 69 6e 20 74 68 65 20 6f 6c 64 2e 2a 20 6f 72 20  in the old.* or 
9280: 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  new.* pseudo-tab
9290: 6c 65 2e 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  le. .** This fun
92a0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
92b0: 33 32 2d 62 69 74 20 62 69 74 6d 61 73 6b 20 69  32-bit bitmask i
92c0: 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20  ndicating which 
92d0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 0a  columns of the .
92e0: 2a 2a 20 6f 6c 64 2e 2a 20 6f 72 20 6e 65 77 2e  ** old.* or new.
92f0: 2a 20 74 61 62 6c 65 73 20 61 63 74 75 61 6c 6c  * tables actuall
9300: 79 20 61 72 65 20 75 73 65 64 20 62 79 20 74 72  y are used by tr
9310: 69 67 67 65 72 73 2e 20 54 68 69 73 20 69 6e 66  iggers. This inf
9320: 6f 72 6d 61 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  ormation .** may
9330: 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20   be used by the 
9340: 63 61 6c 6c 65 72 2c 20 66 6f 72 20 65 78 61 6d  caller, for exam
9350: 70 6c 65 2c 20 74 6f 20 61 76 6f 69 64 20 68 61  ple, to avoid ha
9360: 76 69 6e 67 20 74 6f 20 6c 6f 61 64 20 74 68 65  ving to load the
9370: 20 65 6e 74 69 72 65 0a 2a 2a 20 6f 6c 64 2e 2a   entire.** old.*
9380: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 6d 65 6d   record into mem
9390: 6f 72 79 20 77 68 65 6e 20 65 78 65 63 75 74 69  ory when executi
93a0: 6e 67 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  ng an UPDATE or 
93b0: 44 45 4c 45 54 45 20 63 6f 6d 6d 61 6e 64 2e 0a  DELETE command..
93c0: 2a 2a 0a 2a 2a 20 42 69 74 20 30 20 6f 66 20 74  **.** Bit 0 of t
93d0: 68 65 20 72 65 74 75 72 6e 65 64 20 6d 61 73 6b  he returned mask
93e0: 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20 6c   is set if the l
93f0: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
9400: 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  of the.** table 
9410: 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20  may be accessed 
9420: 75 73 69 6e 67 20 61 6e 20 5b 6f 6c 64 7c 6e 65  using an [old|ne
9430: 77 5d 2e 3c 63 6f 6c 3e 20 72 65 66 65 72 65 6e  w].<col> referen
9440: 63 65 2e 20 42 69 74 20 31 20 69 73 20 73 65 74  ce. Bit 1 is set
9450: 20 69 66 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e   if.** the secon
9460: 64 20 6c 65 66 74 6d 6f 73 74 20 63 6f 6c 75 6d  d leftmost colum
9470: 6e 20 76 61 6c 75 65 20 69 73 20 72 65 71 75 69  n value is requi
9480: 72 65 64 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 20  red, and so on. 
9490: 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
94a0: 6d 6f 72 65 20 74 68 61 6e 20 33 32 20 63 6f 6c  more than 32 col
94b0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
94c0: 65 2c 20 61 6e 64 20 61 74 20 6c 65 61 73 74 20  e, and at least 
94d0: 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  one of the colum
94e0: 6e 73 0a 2a 2a 20 77 69 74 68 20 61 6e 20 69 6e  ns.** with an in
94f0: 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
9500: 20 33 32 20 6d 61 79 20 62 65 20 61 63 63 65 73   32 may be acces
9510: 73 65 64 2c 20 30 78 66 66 66 66 66 66 66 66 20  sed, 0xffffffff 
9520: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
9530: 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
9540: 73 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69  sible to determi
9550: 6e 65 20 69 66 20 74 68 65 20 6f 6c 64 2e 72 6f  ne if the old.ro
9560: 77 69 64 20 6f 72 20 6e 65 77 2e 72 6f 77 69 64  wid or new.rowid
9570: 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 2a 2a 20 61   column is .** a
9580: 63 63 65 73 73 65 64 20 62 79 20 74 72 69 67 67  ccessed by trigg
9590: 65 72 73 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ers. The caller 
95a0: 6d 75 73 74 20 61 6c 77 61 79 73 20 61 73 73 75  must always assu
95b0: 6d 65 20 74 68 61 74 20 69 74 20 69 73 2e 0a 2a  me that it is..*
95c0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  *.** Parameter i
95d0: 73 4e 65 77 20 6d 75 73 74 20 62 65 20 65 69 74  sNew must be eit
95e0: 68 65 72 20 31 20 6f 72 20 30 2e 20 49 66 20 69  her 1 or 0. If i
95f0: 74 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68 65  t is 0, then the
9600: 20 6d 61 73 6b 20 72 65 74 75 72 6e 65 64 0a 2a   mask returned.*
9610: 2a 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65  * applies to the
9620: 20 6f 6c 64 2e 2a 20 74 61 62 6c 65 2e 20 49 66   old.* table. If
9630: 20 31 2c 20 74 68 65 20 6e 65 77 2e 2a 20 74 61   1, the new.* ta
9640: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ble..**.** Param
9650: 65 74 65 72 20 74 72 5f 74 6d 20 6d 75 73 74 20  eter tr_tm must 
9660: 62 65 20 61 20 6d 61 73 6b 20 77 69 74 68 20 6f  be a mask with o
9670: 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
9680: 65 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45  e TRIGGER_BEFORE
9690: 0a 2a 2a 20 61 6e 64 20 54 52 49 47 47 45 52 5f  .** and TRIGGER_
96a0: 41 46 54 45 52 20 62 69 74 73 20 73 65 74 2e 20  AFTER bits set. 
96b0: 56 61 6c 75 65 73 20 61 63 63 65 73 73 65 64 20  Values accessed 
96c0: 62 79 20 42 45 46 4f 52 45 20 74 72 69 67 67 65  by BEFORE trigge
96d0: 72 73 20 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 69  rs are only.** i
96e0: 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72  ncluded in the r
96f0: 65 74 75 72 6e 65 64 20 6d 61 73 6b 20 69 66 20  eturned mask if 
9700: 74 68 65 20 54 52 49 47 47 45 52 5f 42 45 46 4f  the TRIGGER_BEFO
9710: 52 45 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  RE bit is set in
9720: 20 74 68 65 0a 2a 2a 20 74 72 5f 74 6d 20 70 61   the.** tr_tm pa
9730: 72 61 6d 65 74 65 72 2e 20 53 69 6d 69 6c 61 72  rameter. Similar
9740: 6c 79 2c 20 76 61 6c 75 65 73 20 61 63 63 65 73  ly, values acces
9750: 73 65 64 20 62 79 20 41 46 54 45 52 20 74 72 69  sed by AFTER tri
9760: 67 67 65 72 73 20 61 72 65 20 6f 6e 6c 79 0a 2a  ggers are only.*
9770: 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  * included in th
9780: 65 20 72 65 74 75 72 6e 65 64 20 6d 61 73 6b 20  e returned mask 
9790: 69 66 20 74 68 65 20 54 52 49 47 47 45 52 5f 41  if the TRIGGER_A
97a0: 46 54 45 52 20 62 69 74 20 69 73 20 73 65 74 20  FTER bit is set 
97b0: 69 6e 20 74 72 5f 74 6d 2e 0a 2a 2f 0a 75 33 32  in tr_tm..*/.u32
97c0: 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 43   sqlite3TriggerC
97d0: 6f 6c 6d 61 73 6b 28 0a 20 20 50 61 72 73 65 20  olmask(.  Parse 
97e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
97f0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
9800: 2a 2f 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54  */.  Trigger *pT
9810: 72 69 67 67 65 72 2c 20 20 20 2f 2a 20 4c 69 73  rigger,   /* Lis
9820: 74 20 6f 66 20 74 72 69 67 67 65 72 73 20 6f 6e  t of triggers on
9830: 20 74 61 62 6c 65 20 70 54 61 62 20 2a 2f 0a 20   table pTab */. 
9840: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 61 6e   ExprList *pChan
9850: 67 65 73 2c 20 20 2f 2a 20 43 68 61 6e 67 65 73  ges,  /* Changes
9860: 20 6c 69 73 74 20 66 6f 72 20 61 6e 79 20 55 50   list for any UP
9870: 44 41 54 45 20 4f 46 20 74 72 69 67 67 65 72 73  DATE OF triggers
9880: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4e 65 77 2c   */.  int isNew,
9890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
98a0: 66 6f 72 20 6e 65 77 2e 2a 20 72 65 66 20 6d 61  for new.* ref ma
98b0: 73 6b 2c 20 30 20 66 6f 72 20 6f 6c 64 2e 2a 20  sk, 0 for old.* 
98c0: 72 65 66 20 6d 61 73 6b 20 2a 2f 0a 20 20 69 6e  ref mask */.  in
98d0: 74 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20 20  t tr_tm,        
98e0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 54 52     /* Mask of TR
98f0: 49 47 47 45 52 5f 42 45 46 4f 52 45 7c 54 52 49  IGGER_BEFORE|TRI
9900: 47 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 20 20  GGER_AFTER */.  
9910: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
9920: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
9930: 65 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65  e to code trigge
9940: 72 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  rs from */.  int
9950: 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20 20   orconf         
9960: 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 4f 4e 20    /* Default ON 
9970: 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79 20  CONFLICT policy 
9980: 66 6f 72 20 74 72 69 67 67 65 72 20 73 74 65 70  for trigger step
9990: 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
99a0: 69 6e 74 20 6f 70 20 3d 20 70 43 68 61 6e 67 65  int op = pChange
99b0: 73 20 3f 20 54 4b 5f 55 50 44 41 54 45 20 3a 20  s ? TK_UPDATE : 
99c0: 54 4b 5f 44 45 4c 45 54 45 3b 0a 20 20 75 33 32  TK_DELETE;.  u32
99d0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 54 72 69   mask = 0;.  Tri
99e0: 67 67 65 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65  gger *p;..  asse
99f0: 72 74 28 20 69 73 4e 65 77 3d 3d 31 20 7c 7c 20  rt( isNew==1 || 
9a00: 69 73 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 66 6f  isNew==0 );.  fo
9a10: 72 28 70 3d 70 54 72 69 67 67 65 72 3b 20 70 3b  r(p=pTrigger; p;
9a20: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
9a30: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 6f 70 20    if( p->op==op 
9a40: 26 26 20 28 74 72 5f 74 6d 26 70 2d 3e 74 72 5f  && (tr_tm&p->tr_
9a50: 74 6d 29 0a 20 20 20 20 20 26 26 20 63 68 65 63  tm).     && chec
9a60: 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70 28 70  kColumnOverlap(p
9a70: 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 70 43 68 61 6e  ->pColumns,pChan
9a80: 67 65 73 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ges).    ){.    
9a90: 20 20 54 72 69 67 67 65 72 50 72 67 20 2a 70 50    TriggerPrg *pP
9aa0: 72 67 3b 0a 20 20 20 20 20 20 70 50 72 67 20 3d  rg;.      pPrg =
9ab0: 20 67 65 74 52 6f 77 54 72 69 67 67 65 72 28 70   getRowTrigger(p
9ac0: 50 61 72 73 65 2c 20 70 2c 20 70 54 61 62 2c 20  Parse, p, pTab, 
9ad0: 6f 72 63 6f 6e 66 29 3b 0a 20 20 20 20 20 20 69  orconf);.      i
9ae0: 66 28 20 70 50 72 67 20 29 7b 0a 20 20 20 20 20  f( pPrg ){.     
9af0: 20 20 20 6d 61 73 6b 20 7c 3d 20 70 50 72 67 2d     mask |= pPrg-
9b00: 3e 61 43 6f 6c 6d 61 73 6b 5b 69 73 4e 65 77 5d  >aColmask[isNew]
9b10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9b20: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6d 61    }..  return ma
9b30: 73 6b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  sk;.}..#endif /*
9b40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9b50: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a  _OMIT_TRIGGER) *
9b60: 2f 0a                                            /.