/ Hex Artifact Content
Login

Artifact a80036fcbd992729adc7cd34a875d59a71fa10cc:


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 72 69 67 67 65 72 20 77 69 6c 6c 20 62 65 20  trigger will be 
1110: 63 72 65 61 74 65 64 20 69 6e 20 2a 2f 0a 20 20  created in */.  
1120: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
1130: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
1140: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
1150: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
1160: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
1170: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
1180: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
1190: 20 7d 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65   }.  if( !pTable
11a0: 4e 61 6d 65 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Name || db->mall
11b0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11c0: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
11d0: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  anup;.  }..  /* 
11e0: 41 20 6c 6f 6e 67 2d 73 74 61 6e 64 69 6e 67 20  A long-standing 
11f0: 70 61 72 73 65 72 20 62 75 67 20 69 73 20 74 68  parser bug is th
1200: 61 74 20 74 68 69 73 20 73 79 6e 74 61 78 20 77  at this syntax w
1210: 61 73 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  as allowed:.  **
1220: 0a 20 20 2a 2a 20 20 20 20 43 52 45 41 54 45 20  .  **    CREATE 
1230: 54 52 49 47 47 45 52 20 61 74 74 61 63 68 65 64  TRIGGER attached
1240: 2e 64 65 6d 6f 20 41 46 54 45 52 20 49 4e 53 45  .demo AFTER INSE
1250: 52 54 20 4f 4e 20 61 74 74 61 63 68 65 64 2e 74  RT ON attached.t
1260: 61 62 20 2e 2e 2e 2e 0a 20 20 2a 2a 20 20 20 20  ab .....  **    
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e               ^^^
12a0: 5e 5e 5e 5e 5e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ^^^^^.  **.  ** 
12b0: 54 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b  To maintain back
12c0: 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
12d0: 69 74 79 2c 20 69 67 6e 6f 72 65 20 74 68 65 20  ity, ignore the 
12e0: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 6e 61  database.  ** na
12f0: 6d 65 20 6f 6e 20 70 54 61 62 6c 65 4e 61 6d 65  me on pTableName
1300: 20 69 66 20 77 65 20 61 72 65 20 72 65 70 61 72   if we are repar
1310: 73 69 6e 67 20 6f 75 72 20 6f 66 20 53 51 4c 49  sing our of SQLI
1320: 54 45 5f 4d 41 53 54 45 52 2e 0a 20 20 2a 2f 0a  TE_MASTER..  */.
1330: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1340: 75 73 79 20 26 26 20 69 44 62 21 3d 31 20 29 7b  usy && iDb!=1 ){
1350: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1360: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d  ee(db, pTableNam
1370: 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1380: 65 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 4e 61  e);.    pTableNa
1390: 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
13a0: 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  se = 0;.  }..  /
13b0: 2a 20 49 66 20 74 68 65 20 74 72 69 67 67 65 72  * If the trigger
13c0: 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
13d0: 69 66 69 65 64 2c 20 61 6e 64 20 74 68 65 20 74  ified, and the t
13e0: 61 62 6c 65 20 69 73 20 61 20 74 65 6d 70 20 74  able is a temp t
13f0: 61 62 6c 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  able,.  ** then 
1400: 73 65 74 20 69 44 62 20 74 6f 20 31 20 74 6f 20  set iDb to 1 to 
1410: 63 72 65 61 74 65 20 74 68 65 20 74 72 69 67 67  create the trigg
1420: 65 72 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  er in the tempor
1430: 61 72 79 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ary database..  
1440: 2a 2a 20 49 66 20 73 71 6c 69 74 65 33 53 72 63  ** If sqlite3Src
1450: 4c 69 73 74 4c 6f 6f 6b 75 70 28 29 20 72 65 74  ListLookup() ret
1460: 75 72 6e 73 20 30 2c 20 69 6e 64 69 63 61 74 69  urns 0, indicati
1470: 6e 67 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65  ng the table doe
1480: 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 78 69 73 74  s not.  ** exist
1490: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 63  , the error is c
14a0: 61 75 67 68 74 20 62 79 20 74 68 65 20 62 6c 6f  aught by the blo
14b0: 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  ck below..  */. 
14c0: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
14d0: 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
14e0: 72 73 65 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29  rse, pTableName)
14f0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  ;.  if( db->init
1500: 2e 62 75 73 79 3d 3d 30 20 26 26 20 70 4e 61 6d  .busy==0 && pNam
1510: 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
1520: 0a 20 20 20 20 20 20 20 20 26 26 20 70 54 61 62  .        && pTab
1530: 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
1540: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
1550: 0a 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20  .    iDb = 1;.  
1560: 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74  }..  /* Ensure t
1570: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 61  he table name ma
1580: 74 63 68 65 73 20 64 61 74 61 62 61 73 65 20 6e  tches database n
1590: 61 6d 65 20 61 6e 64 20 74 68 61 74 20 74 68 65  ame and that the
15a0: 20 74 61 62 6c 65 20 65 78 69 73 74 73 20 2a 2f   table exists */
15b0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
15c0: 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 74  cFailed ) goto t
15d0: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
15e0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
15f0: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
1600: 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  .  sqlite3FixIni
1610: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
1620: 20 69 44 62 2c 20 22 74 72 69 67 67 65 72 22 2c   iDb, "trigger",
1630: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73   pName);.  if( s
1640: 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
1650: 28 26 73 46 69 78 2c 20 70 54 61 62 6c 65 4e 61  (&sFix, pTableNa
1660: 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  me) ){.    goto 
1670: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
1680: 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71  .  }.  pTab = sq
1690: 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
16a0: 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  up(pParse, pTabl
16b0: 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70  eName);.  if( !p
16c0: 54 61 62 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Tab ){.    /* Th
16d0: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
16e0: 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69   exist. */.    i
16f0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
1700: 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =1 ){.      /* T
1710: 69 63 6b 65 74 20 23 33 38 31 30 2e 0a 20 20 20  icket #3810..   
1720: 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
1730: 77 68 65 6e 65 76 65 72 20 61 20 74 61 62 6c 65  whenever a table
1740: 20 69 73 20 64 72 6f 70 70 65 64 2c 20 61 6c 6c   is dropped, all
1750: 20 61 73 73 6f 63 69 61 74 65 64 20 74 72 69 67   associated trig
1760: 67 65 72 73 20 61 72 65 0a 20 20 20 20 20 20 2a  gers are.      *
1770: 2a 20 64 72 6f 70 70 65 64 20 74 6f 6f 2e 20 20  * dropped too.  
1780: 42 75 74 20 69 66 20 61 20 54 45 4d 50 20 74 72  But if a TEMP tr
1790: 69 67 67 65 72 20 69 73 20 63 72 65 61 74 65 64  igger is created
17a0: 20 6f 6e 20 61 20 6e 6f 6e 2d 54 45 4d 50 20 74   on a non-TEMP t
17b0: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  able.      ** an
17c0: 64 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  d the table is d
17d0: 72 6f 70 70 65 64 20 62 79 20 61 20 64 69 66 66  ropped by a diff
17e0: 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63  erent database c
17f0: 6f 6e 6e 65 63 74 69 6f 6e 2c 20 74 68 65 0a 20  onnection, the. 
1800: 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20       ** trigger 
1810: 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 20 74  is not visible t
1820: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  o the database c
1830: 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 64  onnection that d
1840: 6f 65 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  oes the.      **
1850: 20 64 72 6f 70 20 73 6f 20 74 68 65 20 74 72 69   drop so the tri
1860: 67 67 65 72 20 63 61 6e 6e 6f 74 20 62 65 20 64  gger cannot be d
1870: 72 6f 70 70 65 64 2e 20 20 54 68 69 73 20 72 65  ropped.  This re
1880: 73 75 6c 74 73 20 69 6e 20 61 6e 0a 20 20 20 20  sults in an.    
1890: 20 20 2a 2a 20 22 6f 72 70 68 61 6e 65 64 20 74    ** "orphaned t
18a0: 72 69 67 67 65 72 22 20 2d 20 61 20 74 72 69 67  rigger" - a trig
18b0: 67 65 72 20 77 68 6f 73 65 20 61 73 73 6f 63 69  ger whose associ
18c0: 61 74 65 64 20 74 61 62 6c 65 20 69 73 20 6d 69  ated table is mi
18d0: 73 73 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ssing..      */.
18e0: 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6f        db->init.o
18f0: 72 70 68 61 6e 54 72 69 67 67 65 72 20 3d 20 31  rphanTrigger = 1
1900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f  ;.    }.    goto
1910: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
1920: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
1930: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
1940: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1950: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
1960: 6f 74 20 63 72 65 61 74 65 20 74 72 69 67 67 65  ot create trigge
1970: 72 73 20 6f 6e 20 76 69 72 74 75 61 6c 20 74 61  rs on virtual ta
1980: 62 6c 65 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f  bles");.    goto
1990: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
19a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
19b0: 6b 20 74 68 61 74 20 74 68 65 20 74 72 69 67 67  k that the trigg
19c0: 65 72 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 72  er name is not r
19d0: 65 73 65 72 76 65 64 20 61 6e 64 20 74 68 61 74  eserved and that
19e0: 20 6e 6f 20 74 72 69 67 67 65 72 20 6f 66 20 74   no trigger of t
19f0: 68 65 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65  he.  ** specifie
1a00: 64 20 6e 61 6d 65 20 65 78 69 73 74 73 20 2a 2f  d name exists */
1a10: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
1a20: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1a30: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
1a40: 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 53 51 4c 49  ( !zName || SQLI
1a50: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
1a60: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
1a70: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
1a80: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
1a90: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
1aa0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1ab0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1ac0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
1ad0: 69 66 28 20 73 71 6c 69 74 65 33 48 61 73 68 46  if( sqlite3HashF
1ae0: 69 6e 64 28 26 28 64 62 2d 3e 61 44 62 5b 69 44  ind(&(db->aDb[iD
1af0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67  b].pSchema->trig
1b00: 48 61 73 68 29 2c 0a 20 20 20 20 20 20 20 20 20  Hash),.         
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
1b20: 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  me, sqlite3Strle
1b30: 6e 33 30 28 7a 4e 61 6d 65 29 29 20 29 7b 0a 20  n30(zName)) ){. 
1b40: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
1b50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1b60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1b70: 74 72 69 67 67 65 72 20 25 54 20 61 6c 72 65 61  trigger %T alrea
1b80: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
1b90: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
1ba0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
1bb0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
1bc0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
1bd0: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
1be0: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d  rse, iDb);.    }
1bf0: 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65  .    goto trigge
1c00: 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  r_cleanup;.  }..
1c10: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 63 72 65 61    /* Do not crea
1c20: 74 65 20 61 20 74 72 69 67 67 65 72 20 6f 6e 20  te a trigger on 
1c30: 61 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20 2a  a system table *
1c40: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  /.  if( sqlite3S
1c50: 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
1c60: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
1c70: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  7)==0 ){.    sql
1c80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c90: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65  rse, "cannot cre
1ca0: 61 74 65 20 74 72 69 67 67 65 72 20 6f 6e 20 73  ate trigger on s
1cb0: 79 73 74 65 6d 20 74 61 62 6c 65 22 29 3b 0a 20  ystem table");. 
1cc0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
1cd0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67  +;.    goto trig
1ce0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ger_cleanup;.  }
1cf0: 0a 0a 20 20 2f 2a 20 49 4e 53 54 45 41 44 20 6f  ..  /* INSTEAD o
1d00: 66 20 74 72 69 67 67 65 72 73 20 61 72 65 20 6f  f triggers are o
1d10: 6e 6c 79 20 66 6f 72 20 76 69 65 77 73 20 61 6e  nly for views an
1d20: 64 20 76 69 65 77 73 20 6f 6e 6c 79 20 73 75 70  d views only sup
1d30: 70 6f 72 74 20 49 4e 53 54 45 41 44 0a 20 20 2a  port INSTEAD.  *
1d40: 2a 20 6f 66 20 74 72 69 67 67 65 72 73 2e 0a 20  * of triggers.. 
1d50: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
1d60: 70 53 65 6c 65 63 74 20 26 26 20 74 72 5f 74 6d  pSelect && tr_tm
1d70: 21 3d 54 4b 5f 49 4e 53 54 45 41 44 20 29 7b 0a  !=TK_INSTEAD ){.
1d80: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1d90: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
1da0: 6e 6f 74 20 63 72 65 61 74 65 20 25 73 20 74 72  not create %s tr
1db0: 69 67 67 65 72 20 6f 6e 20 76 69 65 77 3a 20 25  igger on view: %
1dc0: 53 22 2c 20 0a 20 20 20 20 20 20 20 20 28 74 72  S", .        (tr
1dd0: 5f 74 6d 20 3d 3d 20 54 4b 5f 42 45 46 4f 52 45  _tm == TK_BEFORE
1de0: 29 3f 22 42 45 46 4f 52 45 22 3a 22 41 46 54 45  )?"BEFORE":"AFTE
1df0: 52 22 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20  R", pTableName, 
1e00: 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69  0);.    goto tri
1e10: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
1e20: 7d 0a 20 20 69 66 28 20 21 70 54 61 62 2d 3e 70  }.  if( !pTab->p
1e30: 53 65 6c 65 63 74 20 26 26 20 74 72 5f 74 6d 3d  Select && tr_tm=
1e40: 3d 54 4b 5f 49 4e 53 54 45 41 44 20 29 7b 0a 20  =TK_INSTEAD ){. 
1e50: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1e60: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
1e70: 6f 74 20 63 72 65 61 74 65 20 49 4e 53 54 45 41  ot create INSTEA
1e80: 44 20 4f 46 22 0a 20 20 20 20 20 20 20 20 22 20  D OF".        " 
1e90: 74 72 69 67 67 65 72 20 6f 6e 20 74 61 62 6c 65  trigger on table
1ea0: 3a 20 25 53 22 2c 20 70 54 61 62 6c 65 4e 61 6d  : %S", pTableNam
1eb0: 65 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  e, 0);.    goto 
1ec0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
1ed0: 0a 20 20 7d 0a 20 20 69 54 61 62 44 62 20 3d 20  .  }.  iTabDb = 
1ee0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1ef0: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
1f00: 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
1f10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1f20: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
1f30: 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
1f40: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 52 49  QLITE_CREATE_TRI
1f50: 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e 73 74 20  GGER;.    const 
1f60: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
1f70: 61 44 62 5b 69 54 61 62 44 62 5d 2e 7a 4e 61 6d  aDb[iTabDb].zNam
1f80: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1f90: 72 20 2a 7a 44 62 54 72 69 67 20 3d 20 69 73 54  r *zDbTrig = isT
1fa0: 65 6d 70 20 3f 20 64 62 2d 3e 61 44 62 5b 31 5d  emp ? db->aDb[1]
1fb0: 2e 7a 4e 61 6d 65 20 3a 20 7a 44 62 3b 0a 20 20  .zName : zDb;.  
1fc0: 20 20 69 66 28 20 69 54 61 62 44 62 3d 3d 31 20    if( iTabDb==1 
1fd0: 7c 7c 20 69 73 54 65 6d 70 20 29 20 63 6f 64 65  || isTemp ) code
1fe0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
1ff0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20  _TEMP_TRIGGER;. 
2000: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
2010: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
2020: 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  code, zName, pTa
2030: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 54 72 69  b->zName, zDbTri
2040: 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
2050: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
2060: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2070: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
2080: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
2090: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
20a0: 41 42 4c 45 28 69 54 61 62 44 62 29 2c 30 2c 7a  ABLE(iTabDb),0,z
20b0: 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  Db)){.      goto
20c0: 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70   trigger_cleanup
20d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
20e0: 69 66 0a 0a 20 20 2f 2a 20 49 4e 53 54 45 41 44  if..  /* INSTEAD
20f0: 20 4f 46 20 74 72 69 67 67 65 72 73 20 63 61 6e   OF triggers can
2100: 20 6f 6e 6c 79 20 61 70 70 65 61 72 20 6f 6e 20   only appear on 
2110: 76 69 65 77 73 20 61 6e 64 20 42 45 46 4f 52 45  views and BEFORE
2120: 20 74 72 69 67 67 65 72 73 0a 20 20 2a 2a 20 63   triggers.  ** c
2130: 61 6e 6e 6f 74 20 61 70 70 65 61 72 20 6f 6e 20  annot appear on 
2140: 76 69 65 77 73 2e 20 20 53 6f 20 77 65 20 6d 69  views.  So we mi
2150: 67 68 74 20 61 73 20 77 65 6c 6c 20 74 72 61 6e  ght as well tran
2160: 73 6c 61 74 65 20 65 76 65 72 79 0a 20 20 2a 2a  slate every.  **
2170: 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67   INSTEAD OF trig
2180: 67 65 72 20 69 6e 74 6f 20 61 20 42 45 46 4f 52  ger into a BEFOR
2190: 45 20 74 72 69 67 67 65 72 2e 20 20 49 74 20 73  E trigger.  It s
21a0: 69 6d 70 6c 69 66 69 65 73 20 63 6f 64 65 0a 20  implifies code. 
21b0: 20 2a 2a 20 65 6c 73 65 77 68 65 72 65 2e 0a 20   ** elsewhere.. 
21c0: 20 2a 2f 0a 20 20 69 66 20 28 74 72 5f 74 6d 20   */.  if (tr_tm 
21d0: 3d 3d 20 54 4b 5f 49 4e 53 54 45 41 44 29 7b 0a  == TK_INSTEAD){.
21e0: 20 20 20 20 74 72 5f 74 6d 20 3d 20 54 4b 5f 42      tr_tm = TK_B
21f0: 45 46 4f 52 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EFORE;.  }..  /*
2200: 20 42 75 69 6c 64 20 74 68 65 20 54 72 69 67 67   Build the Trigg
2210: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70  er object */.  p
2220: 54 72 69 67 67 65 72 20 3d 20 28 54 72 69 67 67  Trigger = (Trigg
2230: 65 72 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  er*)sqlite3DbMal
2240: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
2250: 6f 66 28 54 72 69 67 67 65 72 29 29 3b 0a 20 20  of(Trigger));.  
2260: 69 66 28 20 70 54 72 69 67 67 65 72 3d 3d 30 20  if( pTrigger==0 
2270: 29 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63  ) goto trigger_c
2280: 6c 65 61 6e 75 70 3b 0a 20 20 70 54 72 69 67 67  leanup;.  pTrigg
2290: 65 72 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  er->zName = zNam
22a0: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  e;.  zName = 0;.
22b0: 20 20 70 54 72 69 67 67 65 72 2d 3e 74 61 62 6c    pTrigger->tabl
22c0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
22d0: 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 4e 61  Dup(db, pTableNa
22e0: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 29 3b  me->a[0].zName);
22f0: 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  .  pTrigger->pSc
2300: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
2310: 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
2320: 54 72 69 67 67 65 72 2d 3e 70 54 61 62 53 63 68  Trigger->pTabSch
2330: 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68  ema = pTab->pSch
2340: 65 6d 61 3b 0a 20 20 70 54 72 69 67 67 65 72 2d  ema;.  pTrigger-
2350: 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  >op = (u8)op;.  
2360: 70 54 72 69 67 67 65 72 2d 3e 74 72 5f 74 6d 20  pTrigger->tr_tm 
2370: 3d 20 74 72 5f 74 6d 3d 3d 54 4b 5f 42 45 46 4f  = tr_tm==TK_BEFO
2380: 52 45 20 3f 20 54 52 49 47 47 45 52 5f 42 45 46  RE ? TRIGGER_BEF
2390: 4f 52 45 20 3a 20 54 52 49 47 47 45 52 5f 41 46  ORE : TRIGGER_AF
23a0: 54 45 52 3b 0a 20 20 70 54 72 69 67 67 65 72 2d  TER;.  pTrigger-
23b0: 3e 70 57 68 65 6e 20 3d 20 73 71 6c 69 74 65 33  >pWhen = sqlite3
23c0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65  ExprDup(db, pWhe
23d0: 6e 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  n, EXPRDUP_REDUC
23e0: 45 29 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e  E);.  pTrigger->
23f0: 70 43 6f 6c 75 6d 6e 73 20 3d 20 73 71 6c 69 74  pColumns = sqlit
2400: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
2410: 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 61 73 73  pColumns);.  ass
2420: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
2430: 77 54 72 69 67 67 65 72 3d 3d 30 20 29 3b 0a 20  wTrigger==0 );. 
2440: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69   pParse->pNewTri
2450: 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 3b  gger = pTrigger;
2460: 0a 0a 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  ..trigger_cleanu
2470: 70 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  p:.  sqlite3DbFr
2480: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
2490: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
24a0: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
24b0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
24c0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
24d0: 20 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20 73 71   pColumns);.  sq
24e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
24f0: 64 62 2c 20 70 57 68 65 6e 29 3b 0a 20 20 69 66  db, pWhen);.  if
2500: 28 20 21 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  ( !pParse->pNewT
2510: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 73 71  rigger ){.    sq
2520: 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67  lite3DeleteTrigg
2530: 65 72 28 64 62 2c 20 70 54 72 69 67 67 65 72 29  er(db, pTrigger)
2540: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2550: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
2560: 4e 65 77 54 72 69 67 67 65 72 3d 3d 70 54 72 69  NewTrigger==pTri
2570: 67 67 65 72 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  gger );.  }.}../
2580: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2590: 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
25a0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 74 72 69  r all of the tri
25b0: 67 67 65 72 20 61 63 74 69 6f 6e 73 20 68 61 76  gger actions hav
25c0: 65 20 62 65 65 6e 20 70 61 72 73 65 64 0a 2a 2a  e been parsed.**
25d0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
25e0: 70 6c 65 74 65 20 74 68 65 20 70 72 6f 63 65 73  plete the proces
25f0: 73 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 74 68  s of building th
2600: 65 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 76 6f  e trigger..*/.vo
2610: 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  id sqlite3Finish
2620: 54 72 69 67 67 65 72 28 0a 20 20 50 61 72 73 65  Trigger(.  Parse
2630: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2640: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
2650: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
2660: 72 53 74 65 70 20 2a 70 53 74 65 70 4c 69 73 74  rStep *pStepList
2670: 2c 20 2f 2a 20 54 68 65 20 74 72 69 67 67 65 72  , /* The trigger
2680: 65 64 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20  ed program */.  
2690: 54 6f 6b 65 6e 20 2a 70 41 6c 6c 20 20 20 20 20  Token *pAll     
26a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e          /* Token
26b0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
26c0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 43 52 45  the complete CRE
26d0: 41 54 45 20 54 52 49 47 47 45 52 20 2a 2f 0a 29  ATE TRIGGER */.)
26e0: 7b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  {.  Trigger *pTr
26f0: 69 67 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ig = pParse->pNe
2700: 77 54 72 69 67 67 65 72 3b 20 20 20 2f 2a 20 54  wTrigger;   /* T
2710: 72 69 67 67 65 72 20 62 65 69 6e 67 20 66 69 6e  rigger being fin
2720: 69 73 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  ished */.  char 
2730: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 72     /* Name of tr
2760: 69 67 67 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  igger */.  sqlit
2770: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2780: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
2790: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
27a0: 73 65 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20  se */.  DbFixer 
27b0: 73 46 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  sFix;           
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 2f 2a 20 46 69 78 65 72 20 6f 62 6a 65 63 74 20  /* Fixer object 
27e0: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2810: 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  Database contain
2820: 69 6e 67 20 74 68 65 20 74 72 69 67 67 65 72 20  ing the trigger 
2830: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 6e 61 6d 65 54  */.  Token nameT
2840: 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  oken;           
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2860: 54 72 69 67 67 65 72 20 6e 61 6d 65 20 66 6f 72  Trigger name for
2870: 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67   error reporting
2880: 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 2d 3e 70   */..  pParse->p
2890: 4e 65 77 54 72 69 67 67 65 72 20 3d 20 30 3b 0a  NewTrigger = 0;.
28a0: 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 72    if( NEVER(pPar
28b0: 73 65 2d 3e 6e 45 72 72 29 20 7c 7c 20 21 70 54  se->nErr) || !pT
28c0: 72 69 67 20 29 20 67 6f 74 6f 20 74 72 69 67 67  rig ) goto trigg
28d0: 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70  erfinish_cleanup
28e0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 54 72 69  ;.  zName = pTri
28f0: 67 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 44 62 20  g->zName;.  iDb 
2900: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2910: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
2920: 62 2c 20 70 54 72 69 67 2d 3e 70 53 63 68 65 6d  b, pTrig->pSchem
2930: 61 29 3b 0a 20 20 70 54 72 69 67 2d 3e 73 74 65  a);.  pTrig->ste
2940: 70 5f 6c 69 73 74 20 3d 20 70 53 74 65 70 4c 69  p_list = pStepLi
2950: 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 74  st;.  while( pSt
2960: 65 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 70 53  epList ){.    pS
2970: 74 65 70 4c 69 73 74 2d 3e 70 54 72 69 67 20 3d  tepList->pTrig =
2980: 20 70 54 72 69 67 3b 0a 20 20 20 20 70 53 74 65   pTrig;.    pSte
2990: 70 4c 69 73 74 20 3d 20 70 53 74 65 70 4c 69 73  pList = pStepLis
29a0: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  t->pNext;.  }.  
29b0: 6e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 3d 20 70 54  nameToken.z = pT
29c0: 72 69 67 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 6e 61  rig->zName;.  na
29d0: 6d 65 54 6f 6b 65 6e 2e 6e 20 3d 20 73 71 6c 69  meToken.n = sqli
29e0: 74 65 33 53 74 72 6c 65 6e 33 30 28 6e 61 6d 65  te3Strlen30(name
29f0: 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69  Token.z);.  sqli
2a00: 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
2a10: 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
2a20: 74 72 69 67 67 65 72 22 2c 20 26 6e 61 6d 65 54  trigger", &nameT
2a30: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c  oken);.  if( sql
2a40: 69 74 65 33 46 69 78 54 72 69 67 67 65 72 53 74  ite3FixTriggerSt
2a50: 65 70 28 26 73 46 69 78 2c 20 70 54 72 69 67 2d  ep(&sFix, pTrig-
2a60: 3e 73 74 65 70 5f 6c 69 73 74 29 20 0a 20 20 20  >step_list) .   
2a70: 7c 7c 20 73 71 6c 69 74 65 33 46 69 78 45 78 70  || sqlite3FixExp
2a80: 72 28 26 73 46 69 78 2c 20 70 54 72 69 67 2d 3e  r(&sFix, pTrig->
2a90: 70 57 68 65 6e 29 20 0a 20 20 29 7b 0a 20 20 20  pWhen) .  ){.   
2aa0: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e   goto triggerfin
2ab0: 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ish_cleanup;.  }
2ac0: 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 72 65  ..  /* if we are
2ad0: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
2ae0: 67 2c 0a 20 20 2a 2a 20 62 75 69 6c 64 20 74 68  g,.  ** build th
2af0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2b00: 65 6e 74 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  entry.  */.  if(
2b10: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
2b20: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  ){.    Vdbe *v;.
2b30: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20      char *z;..  
2b40: 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    /* Make an ent
2b50: 72 79 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ry in the sqlite
2b60: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f  _master table */
2b70: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
2b80: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
2b90: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
2ba0: 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e 69  goto triggerfini
2bb0: 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  sh_cleanup;.    
2bc0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
2bd0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
2be0: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
2bf0: 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  z = sqlite3DbStr
2c00: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
2c10: 70 41 6c 6c 2d 3e 7a 2c 20 70 41 6c 6c 2d 3e 6e  pAll->z, pAll->n
2c20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  );.    sqlite3Ne
2c30: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
2c40: 2c 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  ,.       "INSERT
2c50: 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55   INTO %Q.%s VALU
2c60: 45 53 28 27 74 72 69 67 67 65 72 27 2c 25 51 2c  ES('trigger',%Q,
2c70: 25 51 2c 30 2c 27 43 52 45 41 54 45 20 54 52 49  %Q,0,'CREATE TRI
2c80: 47 47 45 52 20 25 71 27 29 22 2c 0a 20 20 20 20  GGER %q')",.    
2c90: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
2ca0: 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
2cb0: 42 4c 45 28 69 44 62 29 2c 20 7a 4e 61 6d 65 2c  BLE(iDb), zName,
2cc0: 0a 20 20 20 20 20 20 20 70 54 72 69 67 2d 3e 74  .       pTrig->t
2cd0: 61 62 6c 65 2c 20 7a 29 3b 0a 20 20 20 20 73 71  able, z);.    sq
2ce0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2cf0: 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  z);.    sqlite3C
2d00: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
2d10: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
2d20: 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
2d30: 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
2d40: 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ,.        sqlite
2d50: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74 79  3MPrintf(db, "ty
2d60: 70 65 3d 27 74 72 69 67 67 65 72 27 20 41 4e 44  pe='trigger' AND
2d70: 20 6e 61 6d 65 3d 27 25 71 27 22 2c 20 7a 4e 61   name='%q'", zNa
2d80: 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  me));.  }..  if(
2d90: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
2da0: 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70  {.    Trigger *p
2db0: 4c 69 6e 6b 20 3d 20 70 54 72 69 67 3b 0a 20 20  Link = pTrig;.  
2dc0: 20 20 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20    Hash *pHash = 
2dd0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
2de0: 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 3b  chema->trigHash;
2df0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2e00: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
2e10: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
2e20: 29 3b 0a 20 20 20 20 70 54 72 69 67 20 3d 20 73  );.    pTrig = s
2e30: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
2e40: 28 70 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73  (pHash, zName, s
2e50: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2e60: 4e 61 6d 65 29 2c 20 70 54 72 69 67 29 3b 0a 20  Name), pTrig);. 
2e70: 20 20 20 69 66 28 20 70 54 72 69 67 20 29 7b 0a     if( pTrig ){.
2e80: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
2e90: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
2ea0: 7d 65 6c 73 65 20 69 66 28 20 70 4c 69 6e 6b 2d  }else if( pLink-
2eb0: 3e 70 53 63 68 65 6d 61 3d 3d 70 4c 69 6e 6b 2d  >pSchema==pLink-
2ec0: 3e 70 54 61 62 53 63 68 65 6d 61 20 29 7b 0a 20  >pTabSchema ){. 
2ed0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
2ee0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
2ef0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2f00: 70 4c 69 6e 6b 2d 3e 74 61 62 6c 65 29 3b 0a 20  pLink->table);. 
2f10: 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69       pTab = sqli
2f20: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 4c 69  te3HashFind(&pLi
2f30: 6e 6b 2d 3e 70 54 61 62 53 63 68 65 6d 61 2d 3e  nk->pTabSchema->
2f40: 74 62 6c 48 61 73 68 2c 20 70 4c 69 6e 6b 2d 3e  tblHash, pLink->
2f50: 74 61 62 6c 65 2c 20 6e 29 3b 0a 20 20 20 20 20  table, n);.     
2f60: 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
2f70: 20 29 3b 0a 20 20 20 20 20 20 70 4c 69 6e 6b 2d   );.      pLink-
2f80: 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
2f90: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 70  Trigger;.      p
2fa0: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 20 3d 20  Tab->pTrigger = 
2fb0: 70 4c 69 6e 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  pLink;.    }.  }
2fc0: 0a 0a 74 72 69 67 67 65 72 66 69 6e 69 73 68 5f  ..triggerfinish_
2fd0: 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
2fe0: 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 28  e3DeleteTrigger(
2ff0: 64 62 2c 20 70 54 72 69 67 29 3b 0a 20 20 61 73  db, pTrig);.  as
3000: 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e 70  sert( !pParse->p
3010: 4e 65 77 54 72 69 67 67 65 72 20 29 3b 0a 20 20  NewTrigger );.  
3020: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69  sqlite3DeleteTri
3030: 67 67 65 72 53 74 65 70 28 64 62 2c 20 70 53 74  ggerStep(db, pSt
3040: 65 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  epList);.}../*.*
3050: 2a 20 54 75 72 6e 20 61 20 53 45 4c 45 43 54 20  * Turn a SELECT 
3060: 73 74 61 74 65 6d 65 6e 74 20 28 74 68 61 74 20  statement (that 
3070: 74 68 65 20 70 53 65 6c 65 63 74 20 70 61 72 61  the pSelect para
3080: 6d 65 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 29  meter points to)
3090: 20 69 6e 74 6f 0a 2a 2a 20 61 20 74 72 69 67 67   into.** a trigg
30a0: 65 72 20 73 74 65 70 2e 20 20 52 65 74 75 72 6e  er step.  Return
30b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
30c0: 54 72 69 67 67 65 72 53 74 65 70 20 73 74 72 75  TriggerStep stru
30d0: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cture..**.** The
30e0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
30f0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
3100: 69 74 20 66 69 6e 64 73 20 61 20 53 45 4c 45 43  it finds a SELEC
3110: 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 0a 2a  T statement in.*
3120: 2a 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  * body of a TRIG
3130: 47 45 52 2e 20 20 0a 2a 2f 0a 54 72 69 67 67 65  GER.  .*/.Trigge
3140: 72 53 74 65 70 20 2a 73 71 6c 69 74 65 33 54 72  rStep *sqlite3Tr
3150: 69 67 67 65 72 53 65 6c 65 63 74 53 74 65 70 28  iggerSelectStep(
3160: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
3170: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
3180: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 54   TriggerStep *pT
3190: 72 69 67 67 65 72 53 74 65 70 20 3d 20 73 71 6c  riggerStep = sql
31a0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
31b0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72 69 67  (db, sizeof(Trig
31c0: 67 65 72 53 74 65 70 29 29 3b 0a 20 20 69 66 28  gerStep));.  if(
31d0: 20 70 54 72 69 67 67 65 72 53 74 65 70 3d 3d 30   pTriggerStep==0
31e0: 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   ) {.    sqlite3
31f0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
3200: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72   pSelect);.    r
3210: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
3220: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 6f 70 20  TriggerStep->op 
3230: 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
3240: 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 53 65  TriggerStep->pSe
3250: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a  lect = pSelect;.
3260: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3270: 6f 72 63 6f 6e 66 20 3d 20 4f 45 5f 44 65 66 61  orconf = OE_Defa
3280: 75 6c 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 54  ult;.  return pT
3290: 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f  riggerStep;.}../
32a0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70  *.** Allocate sp
32b0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 20 6e 65  ace to hold a ne
32c0: 77 20 74 72 69 67 67 65 72 20 73 74 65 70 2e 20  w trigger step. 
32d0: 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73   The allocated s
32e0: 70 61 63 65 0a 2a 2a 20 68 6f 6c 64 73 20 62 6f  pace.** holds bo
32f0: 74 68 20 74 68 65 20 54 72 69 67 67 65 72 53 74  th the TriggerSt
3300: 65 70 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  ep object and th
3310: 65 20 54 72 69 67 67 65 72 53 74 65 70 2e 74 61  e TriggerStep.ta
3320: 72 67 65 74 2e 7a 20 73 74 72 69 6e 67 2e 0a 2a  rget.z string..*
3330: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
3340: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
3350: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
3360: 64 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  d db->mallocFail
3370: 65 64 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74  ed is set..*/.st
3380: 61 74 69 63 20 54 72 69 67 67 65 72 53 74 65 70  atic TriggerStep
3390: 20 2a 74 72 69 67 67 65 72 53 74 65 70 41 6c 6c   *triggerStepAll
33a0: 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33  ocate(.  sqlite3
33b0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
33c0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
33d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
33e0: 20 75 38 20 6f 70 2c 20 20 20 20 20 20 20 20 20   u8 op,         
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3400: 54 72 69 67 67 65 72 20 6f 70 63 6f 64 65 20 2a  Trigger opcode *
3410: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 2f 2a 20 54 68 65 20 74 61 72 67 65 74 20 6e 61  /* The target na
3440: 6d 65 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  me */.){.  Trigg
3450: 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72  erStep *pTrigger
3460: 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67 67 65  Step;..  pTrigge
3470: 72 53 74 65 70 20 3d 20 73 71 6c 69 74 65 33 44  rStep = sqlite3D
3480: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
3490: 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 53 74  sizeof(TriggerSt
34a0: 65 70 29 20 2b 20 70 4e 61 6d 65 2d 3e 6e 29 3b  ep) + pName->n);
34b0: 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53  .  if( pTriggerS
34c0: 74 65 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  tep ){.    char 
34d0: 2a 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 54 72  *z = (char*)&pTr
34e0: 69 67 67 65 72 53 74 65 70 5b 31 5d 3b 0a 20 20  iggerStep[1];.  
34f0: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d    memcpy(z, pNam
3500: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
3510: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
3520: 70 2d 3e 74 61 72 67 65 74 2e 7a 20 3d 20 7a 3b  p->target.z = z;
3530: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
3540: 70 2d 3e 74 61 72 67 65 74 2e 6e 20 3d 20 70 4e  p->target.n = pN
3550: 61 6d 65 2d 3e 6e 3b 0a 20 20 20 20 70 54 72 69  ame->n;.    pTri
3560: 67 67 65 72 53 74 65 70 2d 3e 6f 70 20 3d 20 6f  ggerStep->op = o
3570: 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
3580: 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 7d 0a  pTriggerStep;.}.
3590: 0a 2f 2a 0a 2a 2a 20 42 75 69 6c 64 20 61 20 74  ./*.** Build a t
35a0: 72 69 67 67 65 72 20 73 74 65 70 20 6f 75 74 20  rigger step out 
35b0: 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 73 74 61  of an INSERT sta
35c0: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
35d0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
35e0: 74 68 65 20 6e 65 77 20 74 72 69 67 67 65 72 20  the new trigger 
35f0: 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  step..**.** The 
3600: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
3610: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69  s routine when i
3620: 74 20 73 65 65 73 20 61 6e 20 49 4e 53 45 52 54  t sees an INSERT
3630: 20 69 6e 73 69 64 65 20 74 68 65 0a 2a 2a 20 62   inside the.** b
3640: 6f 64 79 20 6f 66 20 61 20 74 72 69 67 67 65 72  ody of a trigger
3650: 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70  ..*/.TriggerStep
3660: 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72   *sqlite3Trigger
3670: 49 6e 73 65 72 74 53 74 65 70 28 0a 20 20 73 71  InsertStep(.  sq
3680: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
3690: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
36a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
36b0: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e    Token *pTableN
36c0: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
36d0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20   the table into 
36e0: 77 68 69 63 68 20 77 65 20 69 6e 73 65 72 74 20  which we insert 
36f0: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f  */.  IdList *pCo
3700: 6c 75 6d 6e 2c 20 20 20 20 2f 2a 20 4c 69 73 74  lumn,    /* List
3710: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70   of columns in p
3720: 54 61 62 6c 65 4e 61 6d 65 20 74 6f 20 69 6e 73  TableName to ins
3730: 65 72 74 20 69 6e 74 6f 20 2a 2f 0a 20 20 53 65  ert into */.  Se
3740: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
3750: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
3760: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 73 75 70  atement that sup
3770: 70 6c 69 65 73 20 76 61 6c 75 65 73 20 2a 2f 0a  plies values */.
3780: 20 20 75 38 20 6f 72 63 6f 6e 66 20 20 20 20 20    u8 orconf     
3790: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
37a0: 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 20  flict algorithm 
37b0: 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 52 65  (OE_Abort, OE_Re
37c0: 70 6c 61 63 65 2c 20 65 74 63 2e 29 20 2a 2f 0a  place, etc.) */.
37d0: 29 7b 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  ){.  TriggerStep
37e0: 20 2a 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a   *pTriggerStep;.
37f0: 0a 20 20 61 73 73 65 72 74 28 70 53 65 6c 65 63  .  assert(pSelec
3800: 74 20 21 3d 20 30 20 7c 7c 20 64 62 2d 3e 6d 61  t != 0 || db->ma
3810: 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 0a 20 20  llocFailed);..  
3820: 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20 74  pTriggerStep = t
3830: 72 69 67 67 65 72 53 74 65 70 41 6c 6c 6f 63 61  riggerStepAlloca
3840: 74 65 28 64 62 2c 20 54 4b 5f 49 4e 53 45 52 54  te(db, TK_INSERT
3850: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  , pTableName);. 
3860: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 65   if( pTriggerSte
3870: 70 20 29 7b 0a 20 20 20 20 70 54 72 69 67 67 65  p ){.    pTrigge
3880: 72 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d  rStep->pSelect =
3890: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
38a0: 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45  p(db, pSelect, E
38b0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
38c0: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
38d0: 2d 3e 70 49 64 4c 69 73 74 20 3d 20 70 43 6f 6c  ->pIdList = pCol
38e0: 75 6d 6e 3b 0a 20 20 20 20 70 54 72 69 67 67 65  umn;.    pTrigge
38f0: 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20  rStep->orconf = 
3900: 6f 72 63 6f 6e 66 3b 0a 20 20 7d 65 6c 73 65 7b  orconf;.  }else{
3910: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
3920: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  stDelete(db, pCo
3930: 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  lumn);.  }.  sql
3940: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
3950: 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 0a  (db, pSelect);..
3960: 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65    return pTrigge
3970: 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rStep;.}../*.** 
3980: 43 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69 67  Construct a trig
3990: 67 65 72 20 73 74 65 70 20 74 68 61 74 20 69 6d  ger step that im
39a0: 70 6c 65 6d 65 6e 74 73 20 61 6e 20 55 50 44 41  plements an UPDA
39b0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  TE statement and
39c0: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   return.** a poi
39d0: 6e 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69  nter to that tri
39e0: 67 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20  gger step.  The 
39f0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
3a00: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69  s routine when i
3a10: 74 0a 2a 2a 20 73 65 65 73 20 61 6e 20 55 50 44  t.** sees an UPD
3a20: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ATE statement in
3a30: 73 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66  side the body of
3a40: 20 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45   a CREATE TRIGGE
3a50: 52 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65  R..*/.TriggerSte
3a60: 70 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65  p *sqlite3Trigge
3a70: 72 55 70 64 61 74 65 53 74 65 70 28 0a 20 20 73  rUpdateStep(.  s
3a80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
3a90: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
3aa0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
3ab0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
3ac0: 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  eName,   /* Name
3ad0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
3ae0: 20 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20   be updated */. 
3af0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
3b00: 74 2c 20 20 20 20 2f 2a 20 54 68 65 20 53 45 54  t,    /* The SET
3b10: 20 63 6c 61 75 73 65 3a 20 6c 69 73 74 20 6f 66   clause: list of
3b20: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 6e 65 77 20   column and new 
3b30: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 45 78 70 72  values */.  Expr
3b40: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
3b50: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
3b60: 61 75 73 65 20 2a 2f 0a 20 20 75 38 20 6f 72 63  ause */.  u8 orc
3b70: 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 20 2f  onf            /
3b80: 2a 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61  * The conflict a
3b90: 6c 67 6f 72 69 74 68 6d 2e 20 28 4f 45 5f 41 62  lgorithm. (OE_Ab
3ba0: 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
3bb0: 65 74 63 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69  etc) */.){.  Tri
3bc0: 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67  ggerStep *pTrigg
3bd0: 65 72 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67  erStep;..  pTrig
3be0: 67 65 72 53 74 65 70 20 3d 20 74 72 69 67 67 65  gerStep = trigge
3bf0: 72 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62  rStepAllocate(db
3c00: 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20 70 54 61  , TK_UPDATE, pTa
3c10: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  bleName);.  if( 
3c20: 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a  pTriggerStep ){.
3c30: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
3c40: 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 73 71  ->pExprList = sq
3c50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
3c60: 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 45 58 50  (db, pEList, EXP
3c70: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
3c80: 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e    pTriggerStep->
3c90: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
3ca0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65  ExprDup(db, pWhe
3cb0: 72 65 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  re, EXPRDUP_REDU
3cc0: 43 45 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65  CE);.    pTrigge
3cd0: 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20  rStep->orconf = 
3ce0: 6f 72 63 6f 6e 66 3b 0a 20 20 7d 0a 20 20 73 71  orconf;.  }.  sq
3cf0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
3d00: 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
3d10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
3d20: 6c 65 74 65 28 64 62 2c 20 70 57 68 65 72 65 29  lete(db, pWhere)
3d30: 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67  ;.  return pTrig
3d40: 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  gerStep;.}../*.*
3d50: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 74 72  * Construct a tr
3d60: 69 67 67 65 72 20 73 74 65 70 20 74 68 61 74 20  igger step that 
3d70: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 44 45 4c  implements a DEL
3d80: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ETE statement an
3d90: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  d return.** a po
3da0: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 74 72  inter to that tr
3db0: 69 67 67 65 72 20 73 74 65 70 2e 20 20 54 68 65  igger step.  The
3dc0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
3dd0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
3de0: 69 74 0a 2a 2a 20 73 65 65 73 20 61 20 44 45 4c  it.** sees a DEL
3df0: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ETE statement in
3e00: 73 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66  side the body of
3e10: 20 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45   a CREATE TRIGGE
3e20: 52 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65  R..*/.TriggerSte
3e30: 70 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65  p *sqlite3Trigge
3e40: 72 44 65 6c 65 74 65 53 74 65 70 28 0a 20 20 73  rDeleteStep(.  s
3e50: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
3e60: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
3e70: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
3e80: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
3e90: 4e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  Name,      /* Th
3ea0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69  e table from whi
3eb0: 63 68 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65  ch rows are dele
3ec0: 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ted */.  Expr *p
3ed0: 57 68 65 72 65 20 20 20 20 20 20 20 20 20 20 20  Where           
3ee0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
3ef0: 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 54 72 69  ause */.){.  Tri
3f00: 67 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67  ggerStep *pTrigg
3f10: 65 72 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67  erStep;..  pTrig
3f20: 67 65 72 53 74 65 70 20 3d 20 74 72 69 67 67 65  gerStep = trigge
3f30: 72 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62  rStepAllocate(db
3f40: 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 70 54 61  , TK_DELETE, pTa
3f50: 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  bleName);.  if( 
3f60: 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a  pTriggerStep ){.
3f70: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
3f80: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
3f90: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57  e3ExprDup(db, pW
3fa0: 68 65 72 65 2c 20 45 58 50 52 44 55 50 5f 52 45  here, EXPRDUP_RE
3fb0: 44 55 43 45 29 3b 0a 20 20 20 20 70 54 72 69 67  DUCE);.    pTrig
3fc0: 67 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20  gerStep->orconf 
3fd0: 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20  = OE_Default;.  
3fe0: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
3ff0: 65 6c 65 74 65 28 64 62 2c 20 70 57 68 65 72 65  elete(db, pWhere
4000: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69  );.  return pTri
4010: 67 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 20  ggerStep;.}../* 
4020: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
4030: 64 65 6c 65 74 65 20 61 20 54 72 69 67 67 65 72  delete a Trigger
4040: 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 76 6f   structure.*/.vo
4050: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
4060: 54 72 69 67 67 65 72 28 73 71 6c 69 74 65 33 20  Trigger(sqlite3 
4070: 2a 64 62 2c 20 54 72 69 67 67 65 72 20 2a 70 54  *db, Trigger *pT
4080: 72 69 67 67 65 72 29 7b 0a 20 20 69 66 28 20 70  rigger){.  if( p
4090: 54 72 69 67 67 65 72 3d 3d 30 20 29 20 72 65 74  Trigger==0 ) ret
40a0: 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  urn;.  sqlite3De
40b0: 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28  leteTriggerStep(
40c0: 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 73 74  db, pTrigger->st
40d0: 65 70 5f 6c 69 73 74 29 3b 0a 20 20 73 71 6c 69  ep_list);.  sqli
40e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
40f0: 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 29 3b 0a  rigger->zName);.
4100: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4110: 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61  db, pTrigger->ta
4120: 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ble);.  sqlite3E
4130: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 54  xprDelete(db, pT
4140: 72 69 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b 0a  rigger->pWhen);.
4150: 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
4160: 65 6c 65 74 65 28 64 62 2c 20 70 54 72 69 67 67  elete(db, pTrigg
4170: 65 72 2d 3e 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20  er->pColumns);. 
4180: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4190: 62 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a  b, pTrigger);.}.
41a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
41b0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
41c0: 6f 20 64 72 6f 70 20 61 20 74 72 69 67 67 65 72  o drop a trigger
41d0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
41e0: 73 65 20 73 63 68 65 6d 61 2e 20 0a 2a 2a 0a 2a  se schema. .**.*
41f0: 2a 20 54 68 69 73 20 6d 61 79 20 62 65 20 63 61  * This may be ca
4200: 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20 66 72  lled directly fr
4210: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 20 61 6e  om the parser an
4220: 64 20 74 68 65 72 65 66 6f 72 65 20 69 64 65 6e  d therefore iden
4230: 74 69 66 69 65 73 0a 2a 2a 20 74 68 65 20 74 72  tifies.** the tr
4240: 69 67 67 65 72 20 62 79 20 6e 61 6d 65 2e 20 20  igger by name.  
4250: 54 68 65 20 73 71 6c 69 74 65 33 44 72 6f 70 54  The sqlite3DropT
4260: 72 69 67 67 65 72 50 74 72 28 29 20 72 6f 75 74  riggerPtr() rout
4270: 69 6e 65 20 64 6f 65 73 20 74 68 65 0a 2a 2a 20  ine does the.** 
4280: 73 61 6d 65 20 6a 6f 62 20 61 73 20 74 68 69 73  same job as this
4290: 20 72 6f 75 74 69 6e 65 20 65 78 63 65 70 74 20   routine except 
42a0: 69 74 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  it takes a point
42b0: 65 72 20 74 6f 20 74 68 65 20 74 72 69 67 67 65  er to the trigge
42c0: 72 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20  r.** instead of 
42d0: 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65  the trigger name
42e0: 2e 0a 2a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ..**/.void sqlit
42f0: 65 33 44 72 6f 70 54 72 69 67 67 65 72 28 50 61  e3DropTrigger(Pa
4300: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
4310: 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
4320: 20 6e 6f 45 72 72 29 7b 0a 20 20 54 72 69 67 67   noErr){.  Trigg
4330: 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20 30  er *pTrigger = 0
4340: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
4350: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
4360: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
4370: 65 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  e;.  int nName;.
4380: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4390: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
43a0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
43b0: 6c 65 64 20 29 20 67 6f 74 6f 20 64 72 6f 70 5f  led ) goto drop_
43c0: 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b  trigger_cleanup;
43d0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
43e0: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
43f0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
4400: 20 20 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69     goto drop_tri
4410: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
4420: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  }..  assert( pNa
4430: 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
4440: 20 7a 44 62 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b   zDb = pName->a[
4450: 30 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20  0].zDatabase;.  
4460: 7a 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 2d 3e 61  zName = pName->a
4470: 5b 30 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 6e 4e 61  [0].zName;.  nNa
4480: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
4490: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 61  en30(zName);.  a
44a0: 73 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c  ssert( zDb!=0 ||
44b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
44c0: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
44d0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54   );.  for(i=OMIT
44e0: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
44f0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
4500: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
4510: 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63  1 : i;  /* Searc
4520: 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41  h TEMP before MA
4530: 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44  IN */.    if( zD
4540: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
4550: 43 6d 70 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  Cmp(db->aDb[j].z
4560: 4e 61 6d 65 2c 20 7a 44 62 29 20 29 20 63 6f 6e  Name, zDb) ) con
4570: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
4580: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
4590: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c  MutexHeld(db, j,
45a0: 20 30 29 20 29 3b 0a 20 20 20 20 70 54 72 69 67   0) );.    pTrig
45b0: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 48 61 73  ger = sqlite3Has
45c0: 68 46 69 6e 64 28 26 28 64 62 2d 3e 61 44 62 5b  hFind(&(db->aDb[
45d0: 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67  j].pSchema->trig
45e0: 48 61 73 68 29 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  Hash), zName, nN
45f0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ame);.    if( pT
4600: 72 69 67 67 65 72 20 29 20 62 72 65 61 6b 3b 0a  rigger ) break;.
4610: 20 20 7d 0a 20 20 69 66 28 20 21 70 54 72 69 67    }.  if( !pTrig
4620: 67 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ger ){.    if( !
4630: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  noErr ){.      s
4640: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4650: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
4660: 74 72 69 67 67 65 72 3a 20 25 53 22 2c 20 70 4e  trigger: %S", pN
4670: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ame, 0);.    }el
4680: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
4690: 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
46a0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 7a  Schema(pParse, z
46b0: 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Db);.    }.    p
46c0: 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
46d0: 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
46e0: 20 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c   drop_trigger_cl
46f0: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 71 6c  eanup;.  }.  sql
4700: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
4710: 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  tr(pParse, pTrig
4720: 67 65 72 29 3b 0a 0a 64 72 6f 70 5f 74 72 69 67  ger);..drop_trig
4730: 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  ger_cleanup:.  s
4740: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
4750: 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
4760: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4770: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
4780: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
4790: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74   for the table t
47a0: 68 61 74 20 61 20 74 72 69 67 67 65 72 0a 2a 2a  hat a trigger.**
47b0: 20 69 73 20 73 65 74 20 6f 6e 2e 0a 2a 2f 0a 73   is set on..*/.s
47c0: 74 61 74 69 63 20 54 61 62 6c 65 20 2a 74 61 62  tatic Table *tab
47d0: 6c 65 4f 66 54 72 69 67 67 65 72 28 54 72 69 67  leOfTrigger(Trig
47e0: 67 65 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a  ger *pTrigger){.
47f0: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
4800: 33 53 74 72 6c 65 6e 33 30 28 70 54 72 69 67 67  3Strlen30(pTrigg
4810: 65 72 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 72 65  er->table);.  re
4820: 74 75 72 6e 20 73 71 6c 69 74 65 33 48 61 73 68  turn sqlite3Hash
4830: 46 69 6e 64 28 26 70 54 72 69 67 67 65 72 2d 3e  Find(&pTrigger->
4840: 70 54 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48  pTabSchema->tblH
4850: 61 73 68 2c 20 70 54 72 69 67 67 65 72 2d 3e 74  ash, pTrigger->t
4860: 61 62 6c 65 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a  able, n);.}.../*
4870: 0a 2a 2a 20 44 72 6f 70 20 61 20 74 72 69 67 67  .** Drop a trigg
4880: 65 72 20 67 69 76 65 6e 20 61 20 70 6f 69 6e 74  er given a point
4890: 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67 67  er to that trigg
48a0: 65 72 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  er. .*/.void sql
48b0: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
48c0: 74 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  tr(Parse *pParse
48d0: 2c 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67  , Trigger *pTrig
48e0: 67 65 72 29 7b 0a 20 20 54 61 62 6c 65 20 20 20  ger){.  Table   
48f0: 2a 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20  *pTable;.  Vdbe 
4900: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
4910: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4920: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 44    int iDb;..  iD
4930: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
4940: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
4950: 3e 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70  >db, pTrigger->p
4960: 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
4970: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
4980: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 70 54  <db->nDb );.  pT
4990: 61 62 6c 65 20 3d 20 74 61 62 6c 65 4f 66 54 72  able = tableOfTr
49a0: 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b  igger(pTrigger);
49b0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
49c0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
49d0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 3d 3d  Table->pSchema==
49e0: 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
49f0: 61 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 23  a || iDb==1 );.#
4a00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4a10: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
4a20: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
4a30: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
4a40: 54 52 49 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e  TRIGGER;.    con
4a50: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
4a60: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
4a70: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
4a80: 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
4a90: 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
4aa0: 20 69 66 28 20 69 44 62 3d 3d 31 20 29 20 63 6f   if( iDb==1 ) co
4ab0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
4ac0: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20  _TEMP_TRIGGER;. 
4ad0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
4ae0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
4af0: 63 6f 64 65 2c 20 70 54 72 69 67 67 65 72 2d 3e  code, pTrigger->
4b00: 7a 4e 61 6d 65 2c 20 70 54 61 62 6c 65 2d 3e 7a  zName, pTable->z
4b10: 4e 61 6d 65 2c 20 7a 44 62 29 20 7c 7c 0a 20 20  Name, zDb) ||.  
4b20: 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43      sqlite3AuthC
4b30: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
4b40: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
4b50: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
4b60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
4b70: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
4b80: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
4b90: 74 6f 20 64 65 73 74 72 6f 79 20 74 68 65 20 64  to destroy the d
4ba0: 61 74 61 62 61 73 65 20 72 65 63 6f 72 64 20 6f  atabase record o
4bb0: 66 20 74 68 65 20 74 72 69 67 67 65 72 2e 0a 20  f the trigger.. 
4bc0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
4bd0: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  able!=0 );.  if(
4be0: 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   (v = sqlite3Get
4bf0: 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30  Vdbe(pParse))!=0
4c00: 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 61 73 65   ){.    int base
4c10: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
4c20: 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20 5f 5f 4c  st int iLn = __L
4c30: 49 4e 45 5f 5f 2b 32 3b 0a 20 20 20 20 73 74 61  INE__+2;.    sta
4c40: 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70  tic const VdbeOp
4c50: 4c 69 73 74 20 64 72 6f 70 54 72 69 67 67 65 72  List dropTrigger
4c60: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
4c70: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
4c80: 20 41 44 44 52 28 39 29 2c 20 20 30 7d 2c 0a 20   ADDR(9),  0},. 
4c90: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
4ca0: 38 2c 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20  8,    0, 1,     
4cb0: 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20     0}, /* 1 */. 
4cc0: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
4cd0: 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20  ,     0, 1,     
4ce0: 20 20 20 32 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     2},.      { O
4cf0: 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 32 2c  P_Ne,         2,
4d00: 20 41 44 44 52 28 38 29 2c 20 20 31 7d 2c 0a 20   ADDR(8),  1},. 
4d10: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
4d20: 38 2c 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20  8,    0, 1,     
4d30: 20 20 20 30 7d 2c 20 2f 2a 20 34 3a 20 22 74 72     0}, /* 4: "tr
4d40: 69 67 67 65 72 22 20 2a 2f 0a 20 20 20 20 20 20  igger" */.      
4d50: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
4d60: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 32 7d   0, 0,        2}
4d70: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c  ,.      { OP_Ne,
4d80: 20 20 20 20 20 20 20 20 20 32 2c 20 41 44 44 52           2, ADDR
4d90: 28 38 29 2c 20 20 31 7d 2c 0a 20 20 20 20 20 20  (8),  1},.      
4da0: 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
4db0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
4dc0: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78  ,.      { OP_Nex
4dd0: 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52  t,       0, ADDR
4de0: 28 31 29 2c 20 20 30 7d 2c 20 2f 2a 20 38 20 2a  (1),  0}, /* 8 *
4df0: 2f 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 73 71  /.    };..    sq
4e00: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
4e10: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
4e20: 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   0, iDb);.    sq
4e30: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
4e40: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
4e50: 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71  );.    base = sq
4e60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
4e70: 73 74 28 76 2c 20 20 41 72 72 61 79 53 69 7a 65  st(v,  ArraySize
4e80: 28 64 72 6f 70 54 72 69 67 67 65 72 29 2c 20 64  (dropTrigger), d
4e90: 72 6f 70 54 72 69 67 67 65 72 2c 20 69 4c 6e 29  ropTrigger, iLn)
4ea0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4eb0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 62 61 73  eChangeP4(v, bas
4ec0: 65 2b 31 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a  e+1, pTrigger->z
4ed0: 4e 61 6d 65 2c 20 50 34 5f 54 52 41 4e 53 49 45  Name, P4_TRANSIE
4ee0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
4ef0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4f00: 62 61 73 65 2b 34 2c 20 22 74 72 69 67 67 65 72  base+4, "trigger
4f10: 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ", P4_STATIC);. 
4f20: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
4f30: 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
4f40: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
4f50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4f60: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
4f70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4f80: 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54  dOp4(v, OP_DropT
4f90: 72 69 67 67 65 72 2c 20 69 44 62 2c 20 30 2c 20  rigger, iDb, 0, 
4fa0: 30 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61  0, pTrigger->zNa
4fb0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  me, 0);.    if( 
4fc0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c 33 20 29  pParse->nMem<3 )
4fd0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
4fe0: 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20 20 7d 0a  nMem = 3;.    }.
4ff0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
5000: 6f 76 65 20 61 20 74 72 69 67 67 65 72 20 66 72  ove a trigger fr
5010: 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  om the hash tabl
5020: 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  es of the sqlite
5030: 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 76 6f  * pointer..*/.vo
5040: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
5050: 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67 65 72  AndDeleteTrigger
5060: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
5070: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
5080: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 72 69  r *zName){.  Tri
5090: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
50a0: 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a    Hash *pHash;..
50b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
50c0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
50d0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
50e0: 20 20 70 48 61 73 68 20 3d 20 26 28 64 62 2d 3e    pHash = &(db->
50f0: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
5100: 2d 3e 74 72 69 67 48 61 73 68 29 3b 0a 20 20 70  ->trigHash);.  p
5110: 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
5120: 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73  3HashInsert(pHas
5130: 68 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65  h, zName, sqlite
5140: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
5150: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  , 0);.  if( ALWA
5160: 59 53 28 70 54 72 69 67 67 65 72 29 20 29 7b 0a  YS(pTrigger) ){.
5170: 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72      if( pTrigger
5180: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 72 69 67  ->pSchema==pTrig
5190: 67 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 20  ger->pTabSchema 
51a0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
51b0: 70 54 61 62 20 3d 20 74 61 62 6c 65 4f 66 54 72  pTab = tableOfTr
51c0: 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b  igger(pTrigger);
51d0: 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a  .      Trigger *
51e0: 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  *pp;.      for(p
51f0: 70 3d 26 70 54 61 62 2d 3e 70 54 72 69 67 67 65  p=&pTab->pTrigge
5200: 72 3b 20 2a 70 70 21 3d 70 54 72 69 67 67 65 72  r; *pp!=pTrigger
5210: 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e  ; pp=&((*pp)->pN
5220: 65 78 74 29 29 3b 0a 20 20 20 20 20 20 2a 70 70  ext));.      *pp
5230: 20 3d 20 28 2a 70 70 29 2d 3e 70 4e 65 78 74 3b   = (*pp)->pNext;
5240: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5250: 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 28  e3DeleteTrigger(
5260: 64 62 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  db, pTrigger);. 
5270: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
5280: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
5290: 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nges;.  }.}../*.
52a0: 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 74 68 65  ** pEList is the
52b0: 20 53 45 54 20 63 6c 61 75 73 65 20 6f 66 20 61   SET clause of a
52c0: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
52d0: 6e 74 2e 20 20 45 61 63 68 20 65 6e 74 72 79 0a  nt.  Each entry.
52e0: 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 69 73 20  ** in pEList is 
52f0: 6f 66 20 74 68 65 20 66 6f 72 6d 61 74 20 3c 69  of the format <i
5300: 64 3e 3d 3c 65 78 70 72 3e 2e 20 20 49 66 20 61  d>=<expr>.  If a
5310: 6e 79 20 6f 66 20 74 68 65 20 65 6e 74 72 69 65  ny of the entrie
5320: 73 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20 68  s.** in pEList h
5330: 61 76 65 20 61 6e 20 3c 69 64 3e 20 77 68 69 63  ave an <id> whic
5340: 68 20 6d 61 74 63 68 65 73 20 61 6e 20 69 64 65  h matches an ide
5350: 6e 74 69 66 69 65 72 20 69 6e 20 70 49 64 4c 69  ntifier in pIdLi
5360: 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  st,.** then retu
5370: 72 6e 20 54 52 55 45 2e 20 20 49 66 20 70 49 64  rn TRUE.  If pId
5380: 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  List==NULL, then
5390: 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65   it is considere
53a0: 64 20 61 0a 2a 2a 20 77 69 6c 64 63 61 72 64 20  d a.** wildcard 
53b0: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79  that matches any
53c0: 74 68 69 6e 67 2e 20 20 4c 69 6b 65 77 69 73 65  thing.  Likewise
53d0: 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e 55 4c 4c   if pEList==NULL
53e0: 20 74 68 65 6e 0a 2a 2a 20 69 74 20 6d 61 74 63   then.** it matc
53f0: 68 65 73 20 61 6e 79 74 68 69 6e 67 20 73 6f 20  hes anything so 
5400: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 72  always return tr
5410: 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ue.  Return fals
5420: 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 65  e only.** if the
5430: 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 2e 0a  re is no match..
5440: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
5450: 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70  eckColumnOverlap
5460: 28 49 64 4c 69 73 74 20 2a 70 49 64 4c 69 73 74  (IdList *pIdList
5470: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
5480: 73 74 29 7b 0a 20 20 69 6e 74 20 65 3b 0a 20 20  st){.  int e;.  
5490: 69 66 28 20 70 49 64 4c 69 73 74 3d 3d 30 20 7c  if( pIdList==0 |
54a0: 7c 20 4e 45 56 45 52 28 70 45 4c 69 73 74 3d 3d  | NEVER(pEList==
54b0: 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
54c0: 20 66 6f 72 28 65 3d 30 3b 20 65 3c 70 45 4c 69   for(e=0; e<pELi
54d0: 73 74 2d 3e 6e 45 78 70 72 3b 20 65 2b 2b 29 7b  st->nExpr; e++){
54e0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
54f0: 49 64 4c 69 73 74 49 6e 64 65 78 28 70 49 64 4c  IdListIndex(pIdL
5500: 69 73 74 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 65  ist, pEList->a[e
5510: 5d 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29 20 72 65  ].zName)>=0 ) re
5520: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
5530: 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  turn 0; .}../*.*
5540: 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20  * Return a list 
5550: 6f 66 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  of all triggers 
5560: 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 20 69 66  on table pTab if
5570: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 74   there exists at
5580: 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 74 72   least.** one tr
5590: 69 67 67 65 72 20 74 68 61 74 20 6d 75 73 74 20  igger that must 
55a0: 62 65 20 66 69 72 65 64 20 77 68 65 6e 20 61 6e  be fired when an
55b0: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 79   operation of ty
55c0: 70 65 20 27 6f 70 27 20 69 73 20 0a 2a 2a 20 70  pe 'op' is .** p
55d0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
55e0: 74 61 62 6c 65 2c 20 61 6e 64 2c 20 69 66 20 74  table, and, if t
55f0: 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  hat operation is
5600: 20 61 6e 20 55 50 44 41 54 45 2c 20 69 66 20 61   an UPDATE, if a
5610: 74 0a 2a 2a 20 6c 65 61 73 74 20 6f 6e 65 20 6f  t.** least one o
5620: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  f the columns in
5630: 20 70 43 68 61 6e 67 65 73 20 69 73 20 62 65 69   pChanges is bei
5640: 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a  ng modified..*/.
5650: 54 72 69 67 67 65 72 20 2a 73 71 6c 69 74 65 33  Trigger *sqlite3
5660: 54 72 69 67 67 65 72 73 45 78 69 73 74 28 0a 20  TriggersExist(. 
5670: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5680: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
5690: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
56a0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
56b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
56c0: 62 6c 65 20 74 68 65 20 63 6f 6e 74 61 69 6e 73  ble the contains
56d0: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 2a 2f   the triggers */
56e0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
56f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e             /* on
5700: 65 20 6f 66 20 54 4b 5f 44 45 4c 45 54 45 2c 20  e of TK_DELETE, 
5710: 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 55 50  TK_INSERT, TK_UP
5720: 44 41 54 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69  DATE */.  ExprLi
5730: 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 20  st *pChanges,   
5740: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 74 68 61    /* Columns tha
5750: 74 20 63 68 61 6e 67 65 20 69 6e 20 61 6e 20 55  t change in an U
5760: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  PDATE statement 
5770: 2a 2f 0a 20 20 69 6e 74 20 2a 70 4d 61 73 6b 20  */.  int *pMask 
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5790: 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 54 52 49  OUT: Mask of TRI
57a0: 47 47 45 52 5f 42 45 46 4f 52 45 7c 54 52 49 47  GGER_BEFORE|TRIG
57b0: 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 29 7b 0a  GER_AFTER */.){.
57c0: 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a    int mask = 0;.
57d0: 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 73 74    Trigger *pList
57e0: 20 3d 20 30 3b 0a 20 20 54 72 69 67 67 65 72 20   = 0;.  Trigger 
57f0: 2a 70 3b 0a 0a 20 20 69 66 28 20 28 70 50 61 72  *p;..  if( (pPar
5800: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
5810: 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
5820: 67 67 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  gger)!=0 ){.    
5830: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 54  pList = sqlite3T
5840: 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73  riggerList(pPars
5850: 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20  e, pTab);.  }.  
5860: 61 73 73 65 72 74 28 20 70 4c 69 73 74 3d 3d 30  assert( pList==0
5870: 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54   || IsVirtual(pT
5880: 61 62 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ab)==0 );.  for(
5890: 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
58a0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
58b0: 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 63 68   p->op==op && ch
58c0: 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72 6c 61 70  eckColumnOverlap
58d0: 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 20 70 43  (p->pColumns, pC
58e0: 68 61 6e 67 65 73 29 20 29 7b 0a 20 20 20 20 20  hanges) ){.     
58f0: 20 6d 61 73 6b 20 7c 3d 20 70 2d 3e 74 72 5f 74   mask |= p->tr_t
5900: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  m;.    }.  }.  i
5910: 66 28 20 70 4d 61 73 6b 20 29 7b 0a 20 20 20 20  f( pMask ){.    
5920: 2a 70 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 20  *pMask = mask;. 
5930: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 6d 61 73   }.  return (mas
5940: 6b 20 3f 20 70 4c 69 73 74 20 3a 20 30 29 3b 0a  k ? pList : 0);.
5950: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
5960: 20 74 68 65 20 70 53 74 65 70 2d 3e 74 61 72 67   the pStep->targ
5970: 65 74 20 74 6f 6b 65 6e 20 69 6e 74 6f 20 61 20  et token into a 
5980: 53 72 63 4c 69 73 74 20 61 6e 64 20 72 65 74 75  SrcList and retu
5990: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
59a0: 74 6f 20 74 68 61 74 20 53 72 63 4c 69 73 74 2e  to that SrcList.
59b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
59c0: 69 6e 65 20 61 64 64 73 20 61 20 73 70 65 63 69  ine adds a speci
59d0: 66 69 63 20 64 61 74 61 62 61 73 65 20 6e 61 6d  fic database nam
59e0: 65 2c 20 69 66 20 6e 65 65 64 65 64 2c 20 74 6f  e, if needed, to
59f0: 20 74 68 65 20 74 61 72 67 65 74 20 77 68 65 6e   the target when
5a00: 0a 2a 2a 20 66 6f 72 6d 69 6e 67 20 74 68 65 20  .** forming the 
5a10: 53 72 63 4c 69 73 74 2e 20 20 54 68 69 73 20 70  SrcList.  This p
5a20: 72 65 76 65 6e 74 73 20 61 20 74 72 69 67 67 65  revents a trigge
5a30: 72 20 69 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  r in one databas
5a40: 65 20 66 72 6f 6d 0a 2a 2a 20 72 65 66 65 72 72  e from.** referr
5a50: 69 6e 67 20 74 6f 20 61 20 74 61 72 67 65 74 20  ing to a target 
5a60: 69 6e 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  in another datab
5a70: 61 73 65 2e 20 20 41 6e 20 65 78 63 65 70 74 69  ase.  An excepti
5a80: 6f 6e 20 69 73 20 77 68 65 6e 20 74 68 65 0a 2a  on is when the.*
5a90: 2a 20 74 72 69 67 67 65 72 20 69 73 20 69 6e 20  * trigger is in 
5aa0: 54 45 4d 50 20 69 6e 20 77 68 69 63 68 20 63 61  TEMP in which ca
5ab0: 73 65 20 69 74 20 63 61 6e 20 72 65 66 65 72 20  se it can refer 
5ac0: 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74  to any other dat
5ad0: 61 62 61 73 65 20 69 74 0a 2a 2a 20 77 61 6e 74  abase it.** want
5ae0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 72 63  s..*/.static Src
5af0: 4c 69 73 74 20 2a 74 61 72 67 65 74 53 72 63 4c  List *targetSrcL
5b00: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
5b10: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  arse,       /* T
5b20: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
5b30: 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 53  xt */.  TriggerS
5b40: 74 65 70 20 2a 70 53 74 65 70 20 20 20 2f 2a 20  tep *pStep   /* 
5b50: 54 68 65 20 74 72 69 67 67 65 72 20 63 6f 6e 74  The trigger cont
5b60: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 72 67 65  aining the targe
5b70: 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20  t token */.){.  
5b80: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
5b90: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
5ba0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
5bb0: 20 75 73 65 20 2a 2f 0a 20 20 53 72 63 4c 69 73   use */.  SrcLis
5bc0: 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20 2f  t *pSrc;       /
5bd0: 2a 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20  * SrcList to be 
5be0: 72 65 74 75 72 6e 65 64 20 2a 2f 0a 0a 20 20 70  returned */..  p
5bf0: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
5c00: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
5c10: 65 2d 3e 64 62 2c 20 30 2c 20 26 70 53 74 65 70  e->db, 0, &pStep
5c20: 2d 3e 74 61 72 67 65 74 2c 20 30 29 3b 0a 20 20  ->target, 0);.  
5c30: 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20  if( pSrc ){.    
5c40: 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53  assert( pSrc->nS
5c50: 72 63 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  rc>0 );.    asse
5c60: 72 74 28 20 70 53 72 63 2d 3e 61 21 3d 30 20 29  rt( pSrc->a!=0 )
5c70: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
5c80: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
5c90: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 74  (pParse->db, pSt
5ca0: 65 70 2d 3e 70 54 72 69 67 2d 3e 70 53 63 68 65  ep->pTrig->pSche
5cb0: 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  ma);.    if( iDb
5cc0: 3d 3d 30 20 7c 7c 20 69 44 62 3e 3d 32 20 29 7b  ==0 || iDb>=2 ){
5cd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
5ce0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5cf0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
5d00: 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e  Db<pParse->db->n
5d10: 44 62 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63  Db );.      pSrc
5d20: 2d 3e 61 5b 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ->a[pSrc->nSrc-1
5d30: 5d 2e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ].zDatabase = sq
5d40: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
5d50: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  , db->aDb[iDb].z
5d60: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
5d70: 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a  .  return pSrc;.
5d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
5d90: 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20  e VDBE code for 
5da0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69  the statements i
5db0: 6e 73 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f  nside the body o
5dc0: 66 20 61 20 73 69 6e 67 6c 65 20 0a 2a 2a 20 74  f a single .** t
5dd0: 72 69 67 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  rigger..*/.stati
5de0: 63 20 69 6e 74 20 63 6f 64 65 54 72 69 67 67 65  c int codeTrigge
5df0: 72 50 72 6f 67 72 61 6d 28 0a 20 20 50 61 72 73  rProgram(.  Pars
5e00: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5e10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
5e20: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
5e30: 20 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 53   TriggerStep *pS
5e40: 74 65 70 4c 69 73 74 2c 20 20 20 2f 2a 20 4c 69  tepList,   /* Li
5e50: 73 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73  st of statements
5e60: 20 69 6e 73 69 64 65 20 74 68 65 20 74 72 69 67   inside the trig
5e70: 67 65 72 20 62 6f 64 79 20 2a 2f 0a 20 20 69 6e  ger body */.  in
5e80: 74 20 6f 72 63 6f 6e 66 20 20 20 20 20 20 20 20  t orconf        
5e90: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
5ea0: 69 63 74 20 61 6c 67 6f 72 69 74 68 6d 2e 20 28  ict algorithm. (
5eb0: 4f 45 5f 41 62 6f 72 74 2c 20 65 74 63 29 20 2a  OE_Abort, etc) *
5ec0: 2f 20 20 0a 29 7b 0a 20 20 54 72 69 67 67 65 72  /  .){.  Trigger
5ed0: 53 74 65 70 20 2a 70 53 74 65 70 3b 0a 20 20 56  Step *pStep;.  V
5ee0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
5ef0: 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74 65  >pVdbe;.  sqlite
5f00: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5f10: 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  db;..  assert( p
5f20: 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
5f30: 61 62 20 26 26 20 70 50 61 72 73 65 2d 3e 70 54  ab && pParse->pT
5f40: 6f 70 6c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73  oplevel );.  ass
5f50: 65 72 74 28 20 70 53 74 65 70 4c 69 73 74 20 29  ert( pStepList )
5f60: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
5f70: 20 29 3b 0a 20 20 66 6f 72 28 70 53 74 65 70 3d   );.  for(pStep=
5f80: 70 53 74 65 70 4c 69 73 74 3b 20 70 53 74 65 70  pStepList; pStep
5f90: 3b 20 70 53 74 65 70 3d 70 53 74 65 70 2d 3e 70  ; pStep=pStep->p
5fa0: 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 46 69  Next){.    /* Fi
5fb0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 4f 4e 20  gure out the ON 
5fc0: 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79 20  CONFLICT policy 
5fd0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
5fe0: 64 20 66 6f 72 20 74 68 69 73 20 73 74 65 70 0a  d for this step.
5ff0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72      ** of the tr
6000: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 20 49  igger program. I
6010: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
6020: 74 68 61 74 20 63 61 75 73 65 64 20 74 68 69 73  that caused this
6030: 20 74 72 69 67 67 65 72 0a 20 20 20 20 2a 2a 20   trigger.    ** 
6040: 74 6f 20 66 69 72 65 20 68 61 64 20 61 6e 20 65  to fire had an e
6050: 78 70 6c 69 63 69 74 20 4f 4e 20 43 4f 4e 46 4c  xplicit ON CONFL
6060: 49 43 54 2c 20 74 68 65 6e 20 75 73 65 20 69 74  ICT, then use it
6070: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
6080: 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 4e 20 43  .    ** the ON C
6090: 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63 79 20 74  ONFLICT policy t
60a0: 68 61 74 20 77 61 73 20 73 70 65 63 69 66 69 65  hat was specifie
60b0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
60c0: 20 74 72 69 67 67 65 72 0a 20 20 20 20 2a 2a 20   trigger.    ** 
60d0: 73 74 65 70 20 73 74 61 74 65 6d 65 6e 74 2e 20  step statement. 
60e0: 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
60f0: 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
6100: 54 52 49 47 47 45 52 20 41 46 54 45 52 20 49 4e  TRIGGER AFTER IN
6110: 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e  SERT ON t1 BEGIN
6120: 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 49 4e 53  ;.    **     INS
6130: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
6140: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 6e 65  NTO t2 VALUES(ne
6150: 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20  w.a, new.b);.   
6160: 20 2a 2a 20 20 20 45 4e 44 3b 0a 20 20 20 20 2a   **   END;.    *
6170: 2a 0a 20 20 20 20 2a 2a 20 20 20 49 4e 53 45 52  *.    **   INSER
6180: 54 20 49 4e 54 4f 20 74 31 20 2e 2e 2e 20 3b 20  T INTO t1 ... ; 
6190: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 69 6e             -- in
61a0: 73 65 72 74 20 69 6e 74 6f 20 74 32 20 75 73 65  sert into t2 use
61b0: 73 20 52 45 50 4c 41 43 45 20 70 6f 6c 69 63 79  s REPLACE policy
61c0: 0a 20 20 20 20 2a 2a 20 20 20 49 4e 53 45 52 54  .    **   INSERT
61d0: 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
61e0: 74 31 20 2e 2e 2e 20 3b 20 20 2d 2d 20 69 6e 73  t1 ... ;  -- ins
61f0: 65 72 74 20 69 6e 74 6f 20 74 32 20 75 73 65 73  ert into t2 uses
6200: 20 49 47 4e 4f 52 45 20 70 6f 6c 69 63 79 0a 20   IGNORE policy. 
6210: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
6220: 2d 3e 65 4f 72 63 6f 6e 66 20 3d 20 28 6f 72 63  ->eOrconf = (orc
6230: 6f 6e 66 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29  onf==OE_Default)
6240: 3f 70 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 3a 28  ?pStep->orconf:(
6250: 75 38 29 6f 72 63 6f 6e 66 3b 0a 20 20 20 20 61  u8)orconf;.    a
6260: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6f  ssert( pParse->o
6270: 6b 43 6f 6e 73 74 46 61 63 74 6f 72 3d 3d 30 20  kConstFactor==0 
6280: 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20  );..    switch( 
6290: 70 53 74 65 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  pStep->op ){.   
62a0: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 44 41 54     case TK_UPDAT
62b0: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
62c0: 69 74 65 33 55 70 64 61 74 65 28 70 50 61 72 73  ite3Update(pPars
62d0: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 74 61  e, .          ta
62e0: 72 67 65 74 53 72 63 4c 69 73 74 28 70 50 61 72  rgetSrcList(pPar
62f0: 73 65 2c 20 70 53 74 65 70 29 2c 0a 20 20 20 20  se, pStep),.    
6300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6310: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 74  rListDup(db, pSt
6320: 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 2c 20 30  ep->pExprList, 0
6330: 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  ), .          sq
6340: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
6350: 20 70 53 74 65 70 2d 3e 70 57 68 65 72 65 2c 20   pStep->pWhere, 
6360: 30 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  0), .          p
6370: 50 61 72 73 65 2d 3e 65 4f 72 63 6f 6e 66 0a 20  Parse->eOrconf. 
6380: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
6390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
63a0: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49  .      case TK_I
63b0: 4e 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 20  NSERT: {.       
63c0: 20 73 71 6c 69 74 65 33 49 6e 73 65 72 74 28 70   sqlite3Insert(p
63d0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
63e0: 20 20 74 61 72 67 65 74 53 72 63 4c 69 73 74 28    targetSrcList(
63f0: 70 50 61 72 73 65 2c 20 70 53 74 65 70 29 2c 0a  pParse, pStep),.
6400: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6410: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
6420: 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 2c 20 30  Step->pSelect, 0
6430: 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  ), .          sq
6440: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64  lite3IdListDup(d
6450: 62 2c 20 70 53 74 65 70 2d 3e 70 49 64 4c 69 73  b, pStep->pIdLis
6460: 74 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  t), .          p
6470: 50 61 72 73 65 2d 3e 65 4f 72 63 6f 6e 66 0a 20  Parse->eOrconf. 
6480: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
6490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
64a0: 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 44  .      case TK_D
64b0: 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20 20 20 20  ELETE: {.       
64c0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 46 72   sqlite3DeleteFr
64d0: 6f 6d 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  om(pParse, .    
64e0: 20 20 20 20 20 20 74 61 72 67 65 74 53 72 63 4c        targetSrcL
64f0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 74 65  ist(pParse, pSte
6500: 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71  p),.          sq
6510: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
6520: 20 70 53 74 65 70 2d 3e 70 57 68 65 72 65 2c 20   pStep->pWhere, 
6530: 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
6540: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6550: 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75     }.      defau
6560: 6c 74 3a 20 61 73 73 65 72 74 28 20 70 53 74 65  lt: assert( pSte
6570: 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
6580: 20 29 3b 20 7b 0a 20 20 20 20 20 20 20 20 53 65   ); {.        Se
6590: 6c 65 63 74 44 65 73 74 20 73 44 65 73 74 3b 0a  lectDest sDest;.
65a0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
65b0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
65c0: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
65d0: 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 2c 20 30  Step->pSelect, 0
65e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
65f0: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
6600: 28 26 73 44 65 73 74 2c 20 53 52 54 5f 44 69 73  (&sDest, SRT_Dis
6610: 63 61 72 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  card, 0);.      
6620: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
6630: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
6640: 20 26 73 44 65 73 74 29 3b 0a 20 20 20 20 20 20   &sDest);.      
6650: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
6660: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
6670: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
6680: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
6690: 20 0a 20 20 20 20 69 66 28 20 70 53 74 65 70 2d   .    if( pStep-
66a0: 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op!=TK_SELECT )
66b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
66c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
66d0: 52 65 73 65 74 43 6f 75 6e 74 29 3b 0a 20 20 20  ResetCount);.   
66e0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
66f0: 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
6700: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
6710: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a  AIN_COMMENTS./*.
6720: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6730: 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
6740: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 29 20 61 6e  VdbeComment() an
6750: 6e 6f 74 61 74 69 6f 6e 73 20 74 6f 20 61 20 56  notations to a V
6760: 44 42 45 0a 2a 2a 20 70 72 6f 67 72 61 6d 2e 20  DBE.** program. 
6770: 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  It is not used i
6780: 6e 20 70 72 6f 64 75 63 74 69 6f 6e 20 63 6f 64  n production cod
6790: 65 2c 20 6f 6e 6c 79 20 66 6f 72 20 64 65 62 75  e, only for debu
67a0: 67 67 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  gging..*/.static
67b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 6e 45   const char *onE
67c0: 72 72 6f 72 54 65 78 74 28 69 6e 74 20 6f 6e 45  rrorText(int onE
67d0: 72 72 6f 72 29 7b 0a 20 20 73 77 69 74 63 68 28  rror){.  switch(
67e0: 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20   onError ){.    
67f0: 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20  case OE_Abort:  
6800: 20 20 72 65 74 75 72 6e 20 22 61 62 6f 72 74 22    return "abort"
6810: 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f  ;.    case OE_Ro
6820: 6c 6c 62 61 63 6b 3a 20 72 65 74 75 72 6e 20 22  llback: return "
6830: 72 6f 6c 6c 62 61 63 6b 22 3b 0a 20 20 20 20 63  rollback";.    c
6840: 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 20 20 20  ase OE_Fail:    
6850: 20 72 65 74 75 72 6e 20 22 66 61 69 6c 22 3b 0a   return "fail";.
6860: 20 20 20 20 63 61 73 65 20 4f 45 5f 52 65 70 6c      case OE_Repl
6870: 61 63 65 3a 20 20 72 65 74 75 72 6e 20 22 72 65  ace:  return "re
6880: 70 6c 61 63 65 22 3b 0a 20 20 20 20 63 61 73 65  place";.    case
6890: 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 72 65   OE_Ignore:   re
68a0: 74 75 72 6e 20 22 69 67 6e 6f 72 65 22 3b 0a 20  turn "ignore";. 
68b0: 20 20 20 63 61 73 65 20 4f 45 5f 44 65 66 61 75     case OE_Defau
68c0: 6c 74 3a 20 20 72 65 74 75 72 6e 20 22 64 65 66  lt:  return "def
68d0: 61 75 6c 74 22 3b 0a 20 20 7d 0a 20 20 72 65 74  ault";.  }.  ret
68e0: 75 72 6e 20 22 6e 2f 61 22 3b 0a 7d 0a 23 65 6e  urn "n/a";.}.#en
68f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  dif../*.** Parse
6900: 20 63 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75   context structu
6910: 72 65 20 70 46 72 6f 6d 20 68 61 73 20 6a 75 73  re pFrom has jus
6920: 74 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20 63  t been used to c
6930: 72 65 61 74 65 20 61 20 73 75 62 2d 76 64 62 65  reate a sub-vdbe
6940: 0a 2a 2a 20 28 74 72 69 67 67 65 72 20 70 72 6f  .** (trigger pro
6950: 67 72 61 6d 29 2e 20 49 66 20 61 6e 20 65 72 72  gram). If an err
6960: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
6970: 20 74 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20   transfer error 
6980: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
6990: 72 6f 6d 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f  rom pFrom to pTo
69a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
69b0: 20 74 72 61 6e 73 66 65 72 50 61 72 73 65 45 72   transferParseEr
69c0: 72 6f 72 28 50 61 72 73 65 20 2a 70 54 6f 2c 20  ror(Parse *pTo, 
69d0: 50 61 72 73 65 20 2a 70 46 72 6f 6d 29 7b 0a 20  Parse *pFrom){. 
69e0: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
69f0: 7a 45 72 72 4d 73 67 3d 3d 30 20 7c 7c 20 70 46  zErrMsg==0 || pF
6a00: 72 6f 6d 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 61  rom->nErr );.  a
6a10: 73 73 65 72 74 28 20 70 54 6f 2d 3e 7a 45 72 72  ssert( pTo->zErr
6a20: 4d 73 67 3d 3d 30 20 7c 7c 20 70 54 6f 2d 3e 6e  Msg==0 || pTo->n
6a30: 45 72 72 20 29 3b 0a 20 20 69 66 28 20 70 54 6f  Err );.  if( pTo
6a40: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
6a50: 20 70 54 6f 2d 3e 7a 45 72 72 4d 73 67 20 3d 20   pTo->zErrMsg = 
6a60: 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73 67 3b 0a  pFrom->zErrMsg;.
6a70: 20 20 20 20 70 54 6f 2d 3e 6e 45 72 72 20 3d 20      pTo->nErr = 
6a80: 70 46 72 6f 6d 2d 3e 6e 45 72 72 3b 0a 20 20 7d  pFrom->nErr;.  }
6a90: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
6aa0: 33 44 62 46 72 65 65 28 70 46 72 6f 6d 2d 3e 64  3DbFree(pFrom->d
6ab0: 62 2c 20 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73  b, pFrom->zErrMs
6ac0: 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  g);.  }.}../*.**
6ad0: 20 43 72 65 61 74 65 20 61 6e 64 20 70 6f 70 75   Create and popu
6ae0: 6c 61 74 65 20 61 20 6e 65 77 20 54 72 69 67 67  late a new Trigg
6af0: 65 72 50 72 67 20 6f 62 6a 65 63 74 20 77 69 74  erPrg object wit
6b00: 68 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  h a sub-program 
6b10: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  .** implementing
6b20: 20 74 72 69 67 67 65 72 20 70 54 72 69 67 67 65   trigger pTrigge
6b30: 72 20 77 69 74 68 20 4f 4e 20 43 4f 4e 46 4c 49  r with ON CONFLI
6b40: 43 54 20 70 6f 6c 69 63 79 20 6f 72 63 6f 6e 66  CT policy orconf
6b50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69 67  ..*/.static Trig
6b60: 67 65 72 50 72 67 20 2a 63 6f 64 65 52 6f 77 54  gerPrg *codeRowT
6b70: 72 69 67 67 65 72 28 0a 20 20 50 61 72 73 65 20  rigger(.  Parse 
6b80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
6b90: 2a 20 43 75 72 72 65 6e 74 20 70 61 72 73 65 20  * Current parse 
6ba0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69  context */.  Tri
6bb0: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c 20  gger *pTrigger, 
6bc0: 20 20 2f 2a 20 54 72 69 67 67 65 72 20 74 6f 20    /* Trigger to 
6bd0: 63 6f 64 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  code */.  Table 
6be0: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  *pTab,         /
6bf0: 2a 20 54 68 65 20 74 61 62 6c 65 20 70 54 72 69  * The table pTri
6c00: 67 67 65 72 20 69 73 20 61 74 74 61 63 68 65 64  gger is attached
6c10: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63   to */.  int orc
6c20: 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a  onf           /*
6c30: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c   ON CONFLICT pol
6c40: 69 63 79 20 74 6f 20 63 6f 64 65 20 74 72 69 67  icy to code trig
6c50: 67 65 72 20 70 72 6f 67 72 61 6d 20 77 69 74 68  ger program with
6c60: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
6c70: 70 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 50 61  pTop = sqlite3Pa
6c80: 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
6c90: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se);.  sqlite3 *
6ca0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6cb0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
6cc0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 72 69 67 67  andle */.  Trigg
6cd0: 65 72 50 72 67 20 2a 70 50 72 67 3b 20 20 20 20  erPrg *pPrg;    
6ce0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
6cf0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 45  to return */.  E
6d00: 78 70 72 20 2a 70 57 68 65 6e 20 3d 20 30 3b 20  xpr *pWhen = 0; 
6d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 75             /* Du
6d20: 70 6c 69 63 61 74 65 20 6f 66 20 74 72 69 67 67  plicate of trigg
6d30: 65 72 20 57 48 45 4e 20 65 78 70 72 65 73 73 69  er WHEN expressi
6d40: 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  on */.  Vdbe *v;
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d60: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
6d70: 20 56 4d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e   VM */.  NameCon
6d80: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
6d90: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
6da0: 74 65 78 74 20 66 6f 72 20 73 75 62 2d 76 64 62  text for sub-vdb
6db0: 65 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  e */.  SubProgra
6dc0: 6d 20 2a 70 50 72 6f 67 72 61 6d 20 3d 20 30 3b  m *pProgram = 0;
6dd0: 20 20 20 2f 2a 20 53 75 62 2d 76 64 62 65 20 66     /* Sub-vdbe f
6de0: 6f 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  or trigger progr
6df0: 61 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  am */.  Parse *p
6e00: 53 75 62 50 61 72 73 65 3b 20 20 20 20 20 20 20  SubParse;       
6e10: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
6e20: 74 65 78 74 20 66 6f 72 20 73 75 62 2d 76 64 62  text for sub-vdb
6e30: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 54  e */.  int iEndT
6e40: 72 69 67 67 65 72 20 3d 20 30 3b 20 20 20 20 20  rigger = 0;     
6e50: 20 20 20 2f 2a 20 4c 61 62 65 6c 20 74 6f 20 6a     /* Label to j
6e60: 75 6d 70 20 74 6f 20 69 66 20 57 48 45 4e 20 69  ump to if WHEN i
6e70: 73 20 66 61 6c 73 65 20 2a 2f 0a 0a 20 20 61 73  s false */..  as
6e80: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e  sert( pTrigger->
6e90: 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 54 61 62  zName==0 || pTab
6ea0: 3d 3d 74 61 62 6c 65 4f 66 54 72 69 67 67 65 72  ==tableOfTrigger
6eb0: 28 70 54 72 69 67 67 65 72 29 20 29 3b 0a 20 20  (pTrigger) );.  
6ec0: 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 70 56  assert( pTop->pV
6ed0: 64 62 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  dbe );..  /* All
6ee0: 6f 63 61 74 65 20 74 68 65 20 54 72 69 67 67 65  ocate the Trigge
6ef0: 72 50 72 67 20 61 6e 64 20 53 75 62 50 72 6f 67  rPrg and SubProg
6f00: 72 61 6d 20 6f 62 6a 65 63 74 73 2e 20 54 6f 20  ram objects. To 
6f10: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 79  ensure that they
6f20: 0a 20 20 2a 2a 20 61 72 65 20 66 72 65 65 64 20  .  ** are freed 
6f30: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
6f40: 72 73 2c 20 6c 69 6e 6b 20 74 68 65 6d 20 69 6e  rs, link them in
6f50: 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70 54 72  to the Parse.pTr
6f60: 69 67 67 65 72 50 72 67 20 0a 20 20 2a 2a 20 6c  iggerPrg .  ** l
6f70: 69 73 74 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c  ist of the top-l
6f80: 65 76 65 6c 20 50 61 72 73 65 20 6f 62 6a 65 63  evel Parse objec
6f90: 74 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  t sooner rather 
6fa0: 74 68 61 6e 20 6c 61 74 65 72 2e 20 20 2a 2f 0a  than later.  */.
6fb0: 20 20 70 50 72 67 20 3d 20 73 71 6c 69 74 65 33    pPrg = sqlite3
6fc0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
6fd0: 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72 50   sizeof(TriggerP
6fe0: 72 67 29 29 3b 0a 20 20 69 66 28 20 21 70 50 72  rg));.  if( !pPr
6ff0: 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  g ) return 0;.  
7000: 70 50 72 67 2d 3e 70 4e 65 78 74 20 3d 20 70 54  pPrg->pNext = pT
7010: 6f 70 2d 3e 70 54 72 69 67 67 65 72 50 72 67 3b  op->pTriggerPrg;
7020: 0a 20 20 70 54 6f 70 2d 3e 70 54 72 69 67 67 65  .  pTop->pTrigge
7030: 72 50 72 67 20 3d 20 70 50 72 67 3b 0a 20 20 70  rPrg = pPrg;.  p
7040: 50 72 67 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20  Prg->pProgram = 
7050: 70 50 72 6f 67 72 61 6d 20 3d 20 73 71 6c 69 74  pProgram = sqlit
7060: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
7070: 62 2c 20 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  b, sizeof(SubPro
7080: 67 72 61 6d 29 29 3b 0a 20 20 69 66 28 20 21 70  gram));.  if( !p
7090: 50 72 6f 67 72 61 6d 20 29 20 72 65 74 75 72 6e  Program ) return
70a0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   0;.  sqlite3Vdb
70b0: 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28  eLinkSubProgram(
70c0: 70 54 6f 70 2d 3e 70 56 64 62 65 2c 20 70 50 72  pTop->pVdbe, pPr
70d0: 6f 67 72 61 6d 29 3b 0a 20 20 70 50 72 67 2d 3e  ogram);.  pPrg->
70e0: 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
70f0: 67 65 72 3b 0a 20 20 70 50 72 67 2d 3e 6f 72 63  ger;.  pPrg->orc
7100: 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20 20  onf = orconf;.  
7110: 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b 30  pPrg->aColmask[0
7120: 5d 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a  ] = 0xffffffff;.
7130: 20 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b    pPrg->aColmask
7140: 5b 31 5d 20 3d 20 30 78 66 66 66 66 66 66 66 66  [1] = 0xffffffff
7150: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
7160: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 20   and populate a 
7170: 6e 65 77 20 50 61 72 73 65 20 63 6f 6e 74 65 78  new Parse contex
7180: 74 20 74 6f 20 75 73 65 20 66 6f 72 20 63 6f 64  t to use for cod
7190: 69 6e 67 20 74 68 65 20 0a 20 20 2a 2a 20 74 72  ing the .  ** tr
71a0: 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
71b0: 6d 2e 20 20 2a 2f 0a 20 20 70 53 75 62 50 61 72  m.  */.  pSubPar
71c0: 73 65 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63  se = sqlite3Stac
71d0: 6b 41 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  kAllocZero(db, s
71e0: 69 7a 65 6f 66 28 50 61 72 73 65 29 29 3b 0a 20  izeof(Parse));. 
71f0: 20 69 66 28 20 21 70 53 75 62 50 61 72 73 65 20   if( !pSubParse 
7200: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65  ) return 0;.  me
7210: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
7220: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
7230: 43 2e 70 50 61 72 73 65 20 3d 20 70 53 75 62 50  C.pParse = pSubP
7240: 61 72 73 65 3b 0a 20 20 70 53 75 62 50 61 72 73  arse;.  pSubPars
7250: 65 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70 53  e->db = db;.  pS
7260: 75 62 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65  ubParse->pTrigge
7270: 72 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 70  rTab = pTab;.  p
7280: 53 75 62 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  SubParse->pTople
7290: 76 65 6c 20 3d 20 70 54 6f 70 3b 0a 20 20 70 53  vel = pTop;.  pS
72a0: 75 62 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f  ubParse->zAuthCo
72b0: 6e 74 65 78 74 20 3d 20 70 54 72 69 67 67 65 72  ntext = pTrigger
72c0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 70 53 75 62 50  ->zName;.  pSubP
72d0: 61 72 73 65 2d 3e 65 54 72 69 67 67 65 72 4f 70  arse->eTriggerOp
72e0: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 3b   = pTrigger->op;
72f0: 0a 20 20 70 53 75 62 50 61 72 73 65 2d 3e 6e 51  .  pSubParse->nQ
7300: 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
7310: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 0a  e->nQueryLoop;..
7320: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
7330: 56 64 62 65 28 70 53 75 62 50 61 72 73 65 29 3b  Vdbe(pSubParse);
7340: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
7350: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
7360: 22 53 74 61 72 74 3a 20 25 73 2e 25 73 20 28 25  "Start: %s.%s (%
7370: 73 20 25 73 25 73 25 73 20 4f 4e 20 25 73 29 22  s %s%s%s ON %s)"
7380: 2c 20 0a 20 20 20 20 20 20 70 54 72 69 67 67 65  , .      pTrigge
7390: 72 2d 3e 7a 4e 61 6d 65 2c 20 6f 6e 45 72 72 6f  r->zName, onErro
73a0: 72 54 65 78 74 28 6f 72 63 6f 6e 66 29 2c 0a 20  rText(orconf),. 
73b0: 20 20 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e       (pTrigger->
73c0: 74 72 5f 74 6d 3d 3d 54 52 49 47 47 45 52 5f 42  tr_tm==TRIGGER_B
73d0: 45 46 4f 52 45 20 3f 20 22 42 45 46 4f 52 45 22  EFORE ? "BEFORE"
73e0: 20 3a 20 22 41 46 54 45 52 22 29 2c 0a 20 20 20   : "AFTER"),.   
73f0: 20 20 20 20 20 28 70 54 72 69 67 67 65 72 2d 3e       (pTrigger->
7400: 6f 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 3f 20  op==TK_UPDATE ? 
7410: 22 55 50 44 41 54 45 22 20 3a 20 22 22 29 2c 0a  "UPDATE" : ""),.
7420: 20 20 20 20 20 20 20 20 28 70 54 72 69 67 67 65          (pTrigge
7430: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54  r->op==TK_INSERT
7440: 20 3f 20 22 49 4e 53 45 52 54 22 20 3a 20 22 22   ? "INSERT" : ""
7450: 29 2c 0a 20 20 20 20 20 20 20 20 28 70 54 72 69  ),.        (pTri
7460: 67 67 65 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 45 4c  gger->op==TK_DEL
7470: 45 54 45 20 3f 20 22 44 45 4c 45 54 45 22 20 3a  ETE ? "DELETE" :
7480: 20 22 22 29 2c 0a 20 20 20 20 20 20 70 54 61 62   ""),.      pTab
7490: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
74a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
74b0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 73 71  MIT_TRACE.    sq
74c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
74d0: 34 28 76 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  4(v, -1, .      
74e0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
74f0: 62 2c 20 22 2d 2d 20 54 52 49 47 47 45 52 20 25  b, "-- TRIGGER %
7500: 73 22 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e  s", pTrigger->zN
7510: 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43  ame), P4_DYNAMIC
7520: 0a 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  .    );.#endif..
7530: 20 20 20 20 2f 2a 20 49 66 20 6f 6e 65 20 77 61      /* If one wa
7540: 73 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 64  s specified, cod
7550: 65 20 74 68 65 20 57 48 45 4e 20 63 6c 61 75 73  e the WHEN claus
7560: 65 2e 20 49 66 20 69 74 20 65 76 61 6c 75 61 74  e. If it evaluat
7570: 65 73 20 74 6f 20 66 61 6c 73 65 0a 20 20 20 20  es to false.    
7580: 2a 2a 20 28 6f 72 20 4e 55 4c 4c 29 20 74 68 65  ** (or NULL) the
7590: 20 73 75 62 2d 76 64 62 65 20 69 73 20 69 6d 6d   sub-vdbe is imm
75a0: 65 64 69 61 74 65 6c 79 20 68 61 6c 74 65 64 20  ediately halted 
75b0: 62 79 20 6a 75 6d 70 69 6e 67 20 74 6f 20 74 68  by jumping to th
75c0: 65 20 0a 20 20 20 20 2a 2a 20 4f 50 5f 48 61 6c  e .    ** OP_Hal
75d0: 74 20 69 6e 73 65 72 74 65 64 20 61 74 20 74 68  t inserted at th
75e0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f  e end of the pro
75f0: 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66  gram.  */.    if
7600: 28 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65  ( pTrigger->pWhe
7610: 6e 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 6e  n ){.      pWhen
7620: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7630: 70 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e  p(db, pTrigger->
7640: 70 57 68 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20  pWhen, 0);.     
7650: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
7660: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
7670: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 57  prNames(&sNC, pW
7680: 68 65 6e 29 20 0a 20 20 20 20 20 20 20 26 26 20  hen) .       && 
7690: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
76a0: 3d 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  ==0 .      ){.  
76b0: 20 20 20 20 20 20 69 45 6e 64 54 72 69 67 67 65        iEndTrigge
76c0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  r = sqlite3VdbeM
76d0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
76e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
76f0: 49 66 46 61 6c 73 65 28 70 53 75 62 50 61 72 73  IfFalse(pSubPars
7700: 65 2c 20 70 57 68 65 6e 2c 20 69 45 6e 64 54 72  e, pWhen, iEndTr
7710: 69 67 67 65 72 2c 20 53 51 4c 49 54 45 5f 4a 55  igger, SQLITE_JU
7720: 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
7730: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7740: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
7750: 57 68 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  When);.    }..  
7760: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 74 72    /* Code the tr
7770: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 69 6e  igger program in
7780: 74 6f 20 74 68 65 20 73 75 62 2d 76 64 62 65 2e  to the sub-vdbe.
7790: 20 2a 2f 0a 20 20 20 20 63 6f 64 65 54 72 69 67   */.    codeTrig
77a0: 67 65 72 50 72 6f 67 72 61 6d 28 70 53 75 62 50  gerProgram(pSubP
77b0: 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 2d 3e  arse, pTrigger->
77c0: 73 74 65 70 5f 6c 69 73 74 2c 20 6f 72 63 6f 6e  step_list, orcon
77d0: 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65  f);..    /* Inse
77e0: 72 74 20 61 6e 20 4f 50 5f 48 61 6c 74 20 61 74  rt an OP_Halt at
77f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
7800: 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a  sub-program. */.
7810: 20 20 20 20 69 66 28 20 69 45 6e 64 54 72 69 67      if( iEndTrig
7820: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
7830: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
7840: 61 62 65 6c 28 76 2c 20 69 45 6e 64 54 72 69 67  abel(v, iEndTrig
7850: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
7860: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7870: 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a 20  0(v, OP_Halt);. 
7880: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
7890: 76 2c 20 22 45 6e 64 3a 20 25 73 2e 25 73 22 2c  v, "End: %s.%s",
78a0: 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d 65   pTrigger->zName
78b0: 2c 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f 72  , onErrorText(or
78c0: 63 6f 6e 66 29 29 29 3b 0a 0a 20 20 20 20 74 72  conf)));..    tr
78d0: 61 6e 73 66 65 72 50 61 72 73 65 45 72 72 6f 72  ansferParseError
78e0: 28 70 50 61 72 73 65 2c 20 70 53 75 62 50 61 72  (pParse, pSubPar
78f0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  se);.    if( db-
7900: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
7910: 20 29 7b 0a 20 20 20 20 20 20 70 50 72 6f 67 72   ){.      pProgr
7920: 61 6d 2d 3e 61 4f 70 20 3d 20 73 71 6c 69 74 65  am->aOp = sqlite
7930: 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79  3VdbeTakeOpArray
7940: 28 76 2c 20 26 70 50 72 6f 67 72 61 6d 2d 3e 6e  (v, &pProgram->n
7950: 4f 70 2c 20 26 70 54 6f 70 2d 3e 6e 4d 61 78 41  Op, &pTop->nMaxA
7960: 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rg);.    }.    p
7970: 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 3d 20  Program->nMem = 
7980: 70 53 75 62 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b  pSubParse->nMem;
7990: 0a 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  .    pProgram->n
79a0: 43 73 72 20 3d 20 70 53 75 62 50 61 72 73 65 2d  Csr = pSubParse-
79b0: 3e 6e 54 61 62 3b 0a 20 20 20 20 70 50 72 6f 67  >nTab;.    pProg
79c0: 72 61 6d 2d 3e 6e 4f 6e 63 65 20 3d 20 70 53 75  ram->nOnce = pSu
79d0: 62 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20  bParse->nOnce;. 
79e0: 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b     pProgram->tok
79f0: 65 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 54 72  en = (void *)pTr
7a00: 69 67 67 65 72 3b 0a 20 20 20 20 70 50 72 67 2d  igger;.    pPrg-
7a10: 3e 61 43 6f 6c 6d 61 73 6b 5b 30 5d 20 3d 20 70  >aColmask[0] = p
7a20: 53 75 62 50 61 72 73 65 2d 3e 6f 6c 64 6d 61 73  SubParse->oldmas
7a30: 6b 3b 0a 20 20 20 20 70 50 72 67 2d 3e 61 43 6f  k;.    pPrg->aCo
7a40: 6c 6d 61 73 6b 5b 31 5d 20 3d 20 70 53 75 62 50  lmask[1] = pSubP
7a50: 61 72 73 65 2d 3e 6e 65 77 6d 61 73 6b 3b 0a 20  arse->newmask;. 
7a60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
7a70: 6c 65 74 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  lete(v);.  }..  
7a80: 61 73 73 65 72 74 28 20 21 70 53 75 62 50 61 72  assert( !pSubPar
7a90: 73 65 2d 3e 70 41 69 6e 63 20 20 20 20 20 20 20  se->pAinc       
7aa0: 26 26 20 21 70 53 75 62 50 61 72 73 65 2d 3e 70  && !pSubParse->p
7ab0: 5a 6f 6d 62 69 65 54 61 62 20 29 3b 0a 20 20 61  ZombieTab );.  a
7ac0: 73 73 65 72 74 28 20 21 70 53 75 62 50 61 72 73  ssert( !pSubPars
7ad0: 65 2d 3e 70 54 72 69 67 67 65 72 50 72 67 20 26  e->pTriggerPrg &
7ae0: 26 20 21 70 53 75 62 50 61 72 73 65 2d 3e 6e 4d  & !pSubParse->nM
7af0: 61 78 41 72 67 20 29 3b 0a 20 20 73 71 6c 69 74  axArg );.  sqlit
7b00: 65 33 50 61 72 73 65 72 52 65 73 65 74 28 70 53  e3ParserReset(pS
7b10: 75 62 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  ubParse);.  sqli
7b20: 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c  te3StackFree(db,
7b30: 20 70 53 75 62 50 61 72 73 65 29 3b 0a 0a 20 20   pSubParse);..  
7b40: 72 65 74 75 72 6e 20 70 50 72 67 3b 0a 7d 0a 20  return pPrg;.}. 
7b50: 20 20 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e     ./*.** Return
7b60: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7b70: 54 72 69 67 67 65 72 50 72 67 20 6f 62 6a 65 63  TriggerPrg objec
7b80: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
7b90: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 66 6f 72   sub-program for
7ba0: 0a 2a 2a 20 74 72 69 67 67 65 72 20 70 54 72 69  .** trigger pTri
7bb0: 67 67 65 72 20 77 69 74 68 20 64 65 66 61 75 6c  gger with defaul
7bc0: 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c  t ON CONFLICT al
7bd0: 67 6f 72 69 74 68 6d 20 6f 72 63 6f 6e 66 2e 20  gorithm orconf. 
7be0: 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 54 72  If no such.** Tr
7bf0: 69 67 67 65 72 50 72 67 20 6f 62 6a 65 63 74 20  iggerPrg object 
7c00: 65 78 69 73 74 73 2c 20 61 20 6e 65 77 20 6f 62  exists, a new ob
7c10: 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
7c20: 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  d and populated 
7c30: 62 65 66 6f 72 65 0a 2a 2a 20 62 65 69 6e 67 20  before.** being 
7c40: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
7c50: 74 69 63 20 54 72 69 67 67 65 72 50 72 67 20 2a  tic TriggerPrg *
7c60: 67 65 74 52 6f 77 54 72 69 67 67 65 72 28 0a 20  getRowTrigger(. 
7c70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7c80: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7c90: 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   parse context *
7ca0: 2f 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  /.  Trigger *pTr
7cb0: 69 67 67 65 72 2c 20 20 20 2f 2a 20 54 72 69 67  igger,   /* Trig
7cc0: 67 65 72 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20  ger to code */. 
7cd0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
7ce0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
7cf0: 6c 65 20 74 72 69 67 67 65 72 20 70 54 72 69 67  le trigger pTrig
7d00: 67 65 72 20 69 73 20 61 74 74 61 63 68 65 64 20  ger is attached 
7d10: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f  to */.  int orco
7d20: 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nf           /* 
7d30: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f  ON CONFLICT algo
7d40: 72 69 74 68 6d 2e 20 2a 2f 0a 29 7b 0a 20 20 50  rithm. */.){.  P
7d50: 61 72 73 65 20 2a 70 52 6f 6f 74 20 3d 20 73 71  arse *pRoot = sq
7d60: 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
7d70: 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 54 72  el(pParse);.  Tr
7d80: 69 67 67 65 72 50 72 67 20 2a 70 50 72 67 3b 0a  iggerPrg *pPrg;.
7d90: 0a 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67  .  assert( pTrig
7da0: 67 65 72 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  ger->zName==0 ||
7db0: 20 70 54 61 62 3d 3d 74 61 62 6c 65 4f 66 54 72   pTab==tableOfTr
7dc0: 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29 20  igger(pTrigger) 
7dd0: 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 6d 61 79 20  );..  /* It may 
7de0: 62 65 20 74 68 61 74 20 74 68 69 73 20 74 72 69  be that this tri
7df0: 67 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  gger has already
7e00: 20 62 65 65 6e 20 63 6f 64 65 64 20 28 6f 72 20   been coded (or 
7e10: 69 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70  is in the.  ** p
7e20: 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
7e30: 63 6f 64 65 64 29 2e 20 49 66 20 74 68 69 73 20  coded). If this 
7e40: 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
7e50: 6e 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 0a  n an entry with.
7e60: 20 20 2a 2a 20 61 20 6d 61 74 63 68 69 6e 67 20    ** a matching 
7e70: 54 72 69 67 67 65 72 50 72 67 2e 70 54 72 69 67  TriggerPrg.pTrig
7e80: 67 65 72 20 66 69 65 6c 64 20 77 69 6c 6c 20 62  ger field will b
7e90: 65 20 70 72 65 73 65 6e 74 20 73 6f 6d 65 77 68  e present somewh
7ea0: 65 72 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ere.  ** in the 
7eb0: 50 61 72 73 65 2e 70 54 72 69 67 67 65 72 50 72  Parse.pTriggerPr
7ec0: 67 20 6c 69 73 74 2e 20 53 65 61 72 63 68 20 66  g list. Search f
7ed0: 6f 72 20 73 75 63 68 20 61 6e 20 65 6e 74 72 79  or such an entry
7ee0: 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 72 67  .  */.  for(pPrg
7ef0: 3d 70 52 6f 6f 74 2d 3e 70 54 72 69 67 67 65 72  =pRoot->pTrigger
7f00: 50 72 67 3b 20 0a 20 20 20 20 20 20 70 50 72 67  Prg; .      pPrg
7f10: 20 26 26 20 28 70 50 72 67 2d 3e 70 54 72 69 67   && (pPrg->pTrig
7f20: 67 65 72 21 3d 70 54 72 69 67 67 65 72 20 7c 7c  ger!=pTrigger ||
7f30: 20 70 50 72 67 2d 3e 6f 72 63 6f 6e 66 21 3d 6f   pPrg->orconf!=o
7f40: 72 63 6f 6e 66 29 3b 20 0a 20 20 20 20 20 20 70  rconf); .      p
7f50: 50 72 67 3d 70 50 72 67 2d 3e 70 4e 65 78 74 0a  Prg=pPrg->pNext.
7f60: 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e    );..  /* If an
7f70: 20 65 78 69 73 74 69 6e 67 20 54 72 69 67 67 65   existing Trigge
7f80: 72 50 72 67 20 63 6f 75 6c 64 20 6e 6f 74 20 62  rPrg could not b
7f90: 65 20 6c 6f 63 61 74 65 64 2c 20 63 72 65 61 74  e located, creat
7fa0: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 20 2a 2f 0a  e a new one. */.
7fb0: 20 20 69 66 28 20 21 70 50 72 67 20 29 7b 0a 20    if( !pPrg ){. 
7fc0: 20 20 20 70 50 72 67 20 3d 20 63 6f 64 65 52 6f     pPrg = codeRo
7fd0: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
7fe0: 20 70 54 72 69 67 67 65 72 2c 20 70 54 61 62 2c   pTrigger, pTab,
7ff0: 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 7d 0a 0a 20   orconf);.  }.. 
8000: 20 72 65 74 75 72 6e 20 70 50 72 67 3b 0a 7d 0a   return pPrg;.}.
8010: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
8020: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 74 72 69  code for the tri
8030: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 61 73 73  gger program ass
8040: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 72 69  ociated with tri
8050: 67 67 65 72 20 70 20 6f 6e 20 0a 2a 2a 20 74 61  gger p on .** ta
8060: 62 6c 65 20 70 54 61 62 2e 20 54 68 65 20 72 65  ble pTab. The re
8070: 67 2c 20 6f 72 63 6f 6e 66 20 61 6e 64 20 69 67  g, orconf and ig
8080: 6e 6f 72 65 4a 75 6d 70 20 70 61 72 61 6d 65 74  noreJump paramet
8090: 65 72 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ers passed to th
80a0: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
80b0: 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  re the same as t
80c0: 68 6f 73 65 20 64 65 73 63 72 69 62 65 64 20 69  hose described i
80d0: 6e 20 74 68 65 20 68 65 61 64 65 72 20 66 75 6e  n the header fun
80e0: 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 73 71 6c  ction for.** sql
80f0: 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67  ite3CodeRowTrigg
8100: 65 72 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  er().*/.void sql
8110: 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67  ite3CodeRowTrigg
8120: 65 72 44 69 72 65 63 74 28 0a 20 20 50 61 72 73  erDirect(.  Pars
8130: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
8140: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
8150: 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20 2a  t */.  Trigger *
8160: 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  p,          /* T
8170: 72 69 67 67 65 72 20 74 6f 20 63 6f 64 65 20 2a  rigger to code *
8180: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
8190: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
81a0: 74 61 62 6c 65 20 74 6f 20 63 6f 64 65 20 74 72  table to code tr
81b0: 69 67 67 65 72 73 20 66 72 6f 6d 20 2a 2f 0a 20  iggers from */. 
81c0: 20 69 6e 74 20 72 65 67 2c 20 20 20 20 20 20 20   int reg,       
81d0: 20 20 20 20 20 20 2f 2a 20 52 65 67 20 61 72 72        /* Reg arr
81e0: 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4f 4c  ay containing OL
81f0: 44 2e 2a 20 61 6e 64 20 4e 45 57 2e 2a 20 76 61  D.* and NEW.* va
8200: 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  lues */.  int or
8210: 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20 2f  conf,          /
8220: 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f  * ON CONFLICT po
8230: 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 67  licy */.  int ig
8240: 6e 6f 72 65 4a 75 6d 70 20 20 20 20 20 20 20 2f  noreJump       /
8250: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  * Instruction to
8260: 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52 41 49   jump to for RAI
8270: 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a 29 7b  SE(IGNORE) */.){
8280: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
8290: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
82a0: 73 65 29 3b 20 2f 2a 20 4d 61 69 6e 20 56 4d 20  se); /* Main VM 
82b0: 2a 2f 0a 20 20 54 72 69 67 67 65 72 50 72 67 20  */.  TriggerPrg 
82c0: 2a 70 50 72 67 3b 0a 20 20 70 50 72 67 20 3d 20  *pPrg;.  pPrg = 
82d0: 67 65 74 52 6f 77 54 72 69 67 67 65 72 28 70 50  getRowTrigger(pP
82e0: 61 72 73 65 2c 20 70 2c 20 70 54 61 62 2c 20 6f  arse, p, pTab, o
82f0: 72 63 6f 6e 66 29 3b 0a 20 20 61 73 73 65 72 74  rconf);.  assert
8300: 28 20 70 50 72 67 20 7c 7c 20 70 50 61 72 73 65  ( pPrg || pParse
8310: 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65  ->nErr || pParse
8320: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8330: 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65  ed );..  /* Code
8340: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
8350: 6f 70 63 6f 64 65 20 69 6e 20 74 68 65 20 70 61  opcode in the pa
8360: 72 65 6e 74 20 56 44 42 45 2e 20 50 34 20 6f 66  rent VDBE. P4 of
8370: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
8380: 0a 20 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74  .  ** is a point
8390: 65 72 20 74 6f 20 74 68 65 20 73 75 62 2d 76 64  er to the sub-vd
83a0: 62 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  be containing th
83b0: 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  e trigger progra
83c0: 6d 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 72  m.  */.  if( pPr
83d0: 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 52 65  g ){.    int bRe
83e0: 63 75 72 73 69 76 65 20 3d 20 28 70 2d 3e 7a 4e  cursive = (p->zN
83f0: 61 6d 65 20 26 26 20 30 3d 3d 28 70 50 61 72 73  ame && 0==(pPars
8400: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  e->db->flags&SQL
8410: 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 29  ITE_RecTriggers)
8420: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
8430: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8440: 50 72 6f 67 72 61 6d 2c 20 72 65 67 2c 20 69 67  Program, reg, ig
8450: 6e 6f 72 65 4a 75 6d 70 2c 20 2b 2b 70 50 61 72  noreJump, ++pPar
8460: 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 73  se->nMem);.    s
8470: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8480: 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74  P4(v, -1, (const
8490: 20 63 68 61 72 20 2a 29 70 50 72 67 2d 3e 70 50   char *)pPrg->pP
84a0: 72 6f 67 72 61 6d 2c 20 50 34 5f 53 55 42 50 52  rogram, P4_SUBPR
84b0: 4f 47 52 41 4d 29 3b 0a 20 20 20 20 56 64 62 65  OGRAM);.    Vdbe
84c0: 43 6f 6d 6d 65 6e 74 28 0a 20 20 20 20 20 20 20  Comment(.       
84d0: 20 28 76 2c 20 22 43 61 6c 6c 3a 20 25 73 2e 25   (v, "Call: %s.%
84e0: 73 22 2c 20 28 70 2d 3e 7a 4e 61 6d 65 3f 70 2d  s", (p->zName?p-
84f0: 3e 7a 4e 61 6d 65 3a 22 66 6b 65 79 22 29 2c 20  >zName:"fkey"), 
8500: 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f 72 63 6f  onErrorText(orco
8510: 6e 66 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  nf)));..    /* S
8520: 65 74 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e  et the P5 operan
8530: 64 20 6f 66 20 74 68 65 20 4f 50 5f 50 72 6f 67  d of the OP_Prog
8540: 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ram instruction 
8550: 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 20  to non-zero if. 
8560: 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20     ** recursive 
8570: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
8580: 69 73 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  is trigger progr
8590: 61 6d 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64  am is disallowed
85a0: 2e 20 52 65 63 75 72 73 69 76 65 0a 20 20 20 20  . Recursive.    
85b0: 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 69 73  ** invocation is
85c0: 20 64 69 73 61 6c 6c 6f 77 65 64 20 69 66 20 28   disallowed if (
85d0: 61 29 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  a) the sub-progr
85e0: 61 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 74  am is really a t
85f0: 72 69 67 67 65 72 2c 0a 20 20 20 20 2a 2a 20 6e  rigger,.    ** n
8600: 6f 74 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  ot a foreign key
8610: 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20 28 62 29   action, and (b)
8620: 20 74 68 65 20 66 6c 61 67 20 74 6f 20 65 6e 61   the flag to ena
8630: 62 6c 65 20 72 65 63 75 72 73 69 76 65 20 74 72  ble recursive tr
8640: 69 67 67 65 72 73 0a 20 20 20 20 2a 2a 20 69 73  iggers.    ** is
8650: 20 63 6c 65 61 72 2e 20 20 2a 2f 0a 20 20 20 20   clear.  */.    
8660: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8670: 65 50 35 28 76 2c 20 28 75 38 29 62 52 65 63 75  eP5(v, (u8)bRecu
8680: 72 73 69 76 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rsive);.  }.}../
8690: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
86a0: 6c 65 64 20 74 6f 20 63 6f 64 65 20 74 68 65 20  led to code the 
86b0: 72 65 71 75 69 72 65 64 20 46 4f 52 20 45 41 43  required FOR EAC
86c0: 48 20 52 4f 57 20 74 72 69 67 67 65 72 73 20 66  H ROW triggers f
86d0: 6f 72 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a  or an operation.
86e0: 2a 2a 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62  ** on table pTab
86f0: 2e 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  . The operation 
8700: 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72 73  to code triggers
8710: 20 66 6f 72 20 28 49 4e 53 45 52 54 2c 20 55 50   for (INSERT, UP
8720: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 29 0a  DATE or DELETE).
8730: 2a 2a 20 69 73 20 67 69 76 65 6e 20 62 79 20 74  ** is given by t
8740: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
8750: 20 54 68 65 20 74 72 5f 74 6d 20 70 61 72 61 6d   The tr_tm param
8760: 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
8770: 77 68 65 74 68 65 72 20 74 68 65 0a 2a 2a 20 42  whether the.** B
8780: 45 46 4f 52 45 20 6f 72 20 41 46 54 45 52 20 74  EFORE or AFTER t
8790: 72 69 67 67 65 72 73 20 61 72 65 20 63 6f 64 65  riggers are code
87a0: 64 2e 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  d. If the operat
87b0: 69 6f 6e 20 69 73 20 61 6e 20 55 50 44 41 54 45  ion is an UPDATE
87c0: 2c 20 74 68 65 6e 0a 2a 2a 20 70 61 72 61 6d 65  , then.** parame
87d0: 74 65 72 20 70 43 68 61 6e 67 65 73 20 69 73 20  ter pChanges is 
87e0: 70 61 73 73 65 64 20 74 68 65 20 6c 69 73 74 20  passed the list 
87f0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 62 65 69 6e 67  of columns being
8800: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
8810: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
8820: 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20 66   triggers that f
8830: 69 72 65 20 61 74 20 74 68 65 20 73 70 65 63 69  ire at the speci
8840: 66 69 65 64 20 74 69 6d 65 20 66 6f 72 20 74 68  fied time for th
8850: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 6f  e specified.** o
8860: 70 65 72 61 74 69 6f 6e 20 6f 6e 20 70 54 61 62  peration on pTab
8870: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
8880: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
8890: 2a 20 54 68 65 20 72 65 67 20 61 72 67 75 6d 65  * The reg argume
88a0: 6e 74 20 69 73 20 74 68 65 20 61 64 64 72 65 73  nt is the addres
88b0: 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 69  s of the first i
88c0: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
88d0: 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74  gisters .** that
88e0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 76 61 6c   contain the val
88f0: 75 65 73 20 73 75 62 73 74 69 74 75 74 65 64 20  ues substituted 
8900: 66 6f 72 20 74 68 65 20 6e 65 77 2e 2a 20 61 6e  for the new.* an
8910: 64 20 6f 6c 64 2e 2a 20 72 65 66 65 72 65 6e 63  d old.* referenc
8920: 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 74 72 69  es.** in the tri
8930: 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 20 49 66  gger program. If
8940: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
8950: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
8960: 61 62 6c 65 20 70 54 61 62 0a 2a 2a 20 28 61 20  able pTab.** (a 
8970: 63 6f 70 79 20 6f 66 20 70 54 61 62 2d 3e 6e 43  copy of pTab->nC
8980: 6f 6c 29 2c 20 74 68 65 6e 20 72 65 67 69 73 74  ol), then regist
8990: 65 72 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  ers are populate
89a0: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
89b0: 0a 2a 2a 20 20 20 52 65 67 69 73 74 65 72 20 20  .**   Register  
89c0: 20 20 20 20 20 43 6f 6e 74 61 69 6e 73 0a 2a 2a       Contains.**
89d0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
89e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 72  ---------.**   r
8a10: 65 67 2b 30 20 20 20 20 20 20 20 20 20 20 4f 4c  eg+0          OL
8a20: 44 2e 72 6f 77 69 64 0a 2a 2a 20 20 20 72 65 67  D.rowid.**   reg
8a30: 2b 31 20 20 20 20 20 20 20 20 20 20 4f 4c 44 2e  +1          OLD.
8a40: 2a 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 2d  * value of left-
8a50: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  most column of p
8a60: 54 61 62 0a 2a 2a 20 20 20 2e 2e 2e 20 20 20 20  Tab.**   ...    
8a70: 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
8a80: 20 72 65 67 2b 4e 20 20 20 20 20 20 20 20 20 20   reg+N          
8a90: 4f 4c 44 2e 2a 20 76 61 6c 75 65 20 6f 66 20 72  OLD.* value of r
8aa0: 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
8ab0: 20 6f 66 20 70 54 61 62 0a 2a 2a 20 20 20 72 65   of pTab.**   re
8ac0: 67 2b 4e 2b 31 20 20 20 20 20 20 20 20 4e 45 57  g+N+1        NEW
8ad0: 2e 72 6f 77 69 64 0a 2a 2a 20 20 20 72 65 67 2b  .rowid.**   reg+
8ae0: 4e 2b 32 20 20 20 20 20 20 20 20 4f 4c 44 2e 2a  N+2        OLD.*
8af0: 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 2d 6d   value of left-m
8b00: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 54  ost column of pT
8b10: 61 62 0a 2a 2a 20 20 20 2e 2e 2e 20 20 20 20 20  ab.**   ...     
8b20: 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
8b30: 72 65 67 2b 4e 2b 4e 2b 31 20 20 20 20 20 20 4e  reg+N+N+1      N
8b40: 45 57 2e 2a 20 76 61 6c 75 65 20 6f 66 20 72 69  EW.* value of ri
8b50: 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  ght-most column 
8b60: 6f 66 20 70 54 61 62 0a 2a 2a 0a 2a 2a 20 46 6f  of pTab.**.** Fo
8b70: 72 20 4f 4e 20 44 45 4c 45 54 45 20 74 72 69 67  r ON DELETE trig
8b80: 67 65 72 73 2c 20 74 68 65 20 72 65 67 69 73 74  gers, the regist
8b90: 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ers containing t
8ba0: 68 65 20 4e 45 57 2e 2a 20 76 61 6c 75 65 73 20  he NEW.* values 
8bb0: 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 65  will.** never be
8bc0: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
8bd0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
8be0: 2c 20 73 6f 20 74 68 65 79 20 61 72 65 20 6e 6f  , so they are no
8bf0: 74 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 0a  t allocated or .
8c00: 2a 2a 20 70 6f 70 75 6c 61 74 65 64 20 62 79 20  ** populated by 
8c10: 74 68 65 20 63 61 6c 6c 65 72 20 28 74 68 65 72  the caller (ther
8c20: 65 20 69 73 20 6e 6f 20 64 61 74 61 20 74 6f 20  e is no data to 
8c30: 70 6f 70 75 6c 61 74 65 20 74 68 65 6d 20 77 69  populate them wi
8c40: 74 68 20 61 6e 79 77 61 79 29 2e 20 0a 2a 2a 20  th anyway). .** 
8c50: 53 69 6d 69 6c 61 72 6c 79 2c 20 66 6f 72 20 4f  Similarly, for O
8c60: 4e 20 49 4e 53 45 52 54 20 74 72 69 67 67 65 72  N INSERT trigger
8c70: 73 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  s the values sto
8c80: 72 65 64 20 69 6e 20 74 68 65 20 4f 4c 44 2e 2a  red in the OLD.*
8c90: 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 61 72   registers.** ar
8ca0: 65 20 6e 65 76 65 72 20 61 63 63 65 73 73 65 64  e never accessed
8cb0: 2c 20 61 6e 64 20 73 6f 20 61 72 65 20 6e 6f 74  , and so are not
8cc0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
8cd0: 65 20 63 61 6c 6c 65 72 2e 20 53 6f 2c 20 66 6f  e caller. So, fo
8ce0: 72 20 61 6e 0a 2a 2a 20 4f 4e 20 49 4e 53 45 52  r an.** ON INSER
8cf0: 54 20 74 72 69 67 67 65 72 2c 20 74 68 65 20 76  T trigger, the v
8d00: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 74  alue passed to t
8d10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20  his function as 
8d20: 70 61 72 61 6d 65 74 65 72 20 72 65 67 0a 2a 2a  parameter reg.**
8d30: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 64 61 62   is not a readab
8d40: 6c 65 20 72 65 67 69 73 74 65 72 2c 20 61 6c 74  le register, alt
8d50: 68 6f 75 67 68 20 72 65 67 69 73 74 65 72 73 20  hough registers 
8d60: 28 72 65 67 2b 4e 29 20 74 68 72 6f 75 67 68 20  (reg+N) through 
8d70: 0a 2a 2a 20 28 72 65 67 2b 4e 2b 4e 2b 31 29 20  .** (reg+N+N+1) 
8d80: 61 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  are..**.** Param
8d90: 65 74 65 72 20 6f 72 63 6f 6e 66 20 69 73 20 74  eter orconf is t
8da0: 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 66 6c  he default confl
8db0: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
8dc0: 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 74 68 65  lgorithm for the
8dd0: 0a 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67  .** trigger prog
8de0: 72 61 6d 20 74 6f 20 75 73 65 20 28 52 45 50 4c  ram to use (REPL
8df0: 41 43 45 2c 20 49 47 4e 4f 52 45 20 65 74 63 2e  ACE, IGNORE etc.
8e00: 29 2e 20 50 61 72 61 6d 65 74 65 72 20 69 67 6e  ). Parameter ign
8e10: 6f 72 65 4a 75 6d 70 0a 2a 2a 20 69 73 20 74 68  oreJump.** is th
8e20: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  e instruction th
8e30: 61 74 20 63 6f 6e 74 72 6f 6c 20 73 68 6f 75 6c  at control shoul
8e40: 64 20 6a 75 6d 70 20 74 6f 20 69 66 20 61 20 74  d jump to if a t
8e50: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 0a 2a  rigger program.*
8e60: 2a 20 72 61 69 73 65 73 20 61 6e 20 49 47 4e 4f  * raises an IGNO
8e70: 52 45 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f  RE exception..*/
8e80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
8e90: 65 52 6f 77 54 72 69 67 67 65 72 28 0a 20 20 50  eRowTrigger(.  P
8ea0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8eb0: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
8ec0: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
8ed0: 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20 20 2f  r *pTrigger,   /
8ee0: 2a 20 4c 69 73 74 20 6f 66 20 74 72 69 67 67 65  * List of trigge
8ef0: 72 73 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62  rs on table pTab
8f00: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
8f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
8f20: 65 20 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c 20  e of TK_UPDATE, 
8f30: 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 44 45  TK_INSERT, TK_DE
8f40: 4c 45 54 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69  LETE */.  ExprLi
8f50: 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f  st *pChanges,  /
8f60: 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74 20 66  * Changes list f
8f70: 6f 72 20 61 6e 79 20 55 50 44 41 54 45 20 4f 46  or any UPDATE OF
8f80: 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69   triggers */.  i
8f90: 6e 74 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20  nt tr_tm,       
8fa0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 52      /* One of TR
8fb0: 49 47 47 45 52 5f 42 45 46 4f 52 45 2c 20 54 52  IGGER_BEFORE, TR
8fc0: 49 47 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 20  IGGER_AFTER */. 
8fd0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
8fe0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
8ff0: 6c 65 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67  le to code trigg
9000: 65 72 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ers from */.  in
9010: 74 20 72 65 67 2c 20 20 20 20 20 20 20 20 20 20  t reg,          
9020: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
9030: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
9040: 65 67 69 73 74 65 72 73 20 28 73 65 65 20 61 62  egisters (see ab
9050: 6f 76 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  ove) */.  int or
9060: 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20 2f  conf,          /
9070: 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f  * ON CONFLICT po
9080: 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 67  licy */.  int ig
9090: 6e 6f 72 65 4a 75 6d 70 20 20 20 20 20 20 20 2f  noreJump       /
90a0: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  * Instruction to
90b0: 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52 41 49   jump to for RAI
90c0: 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a 29 7b  SE(IGNORE) */.){
90d0: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 3b 20 20  .  Trigger *p;  
90e0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
90f0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
9100: 67 68 20 70 54 72 69 67 67 65 72 20 6c 69 73 74  gh pTrigger list
9110: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f   */..  assert( o
9120: 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20  p==TK_UPDATE || 
9130: 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 7c 7c  op==TK_INSERT ||
9140: 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20 29   op==TK_DELETE )
9150: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 5f 74  ;.  assert( tr_t
9160: 6d 3d 3d 54 52 49 47 47 45 52 5f 42 45 46 4f 52  m==TRIGGER_BEFOR
9170: 45 20 7c 7c 20 74 72 5f 74 6d 3d 3d 54 52 49 47  E || tr_tm==TRIG
9180: 47 45 52 5f 41 46 54 45 52 20 29 3b 0a 20 20 61  GER_AFTER );.  a
9190: 73 73 65 72 74 28 20 28 6f 70 3d 3d 54 4b 5f 55  ssert( (op==TK_U
91a0: 50 44 41 54 45 29 3d 3d 28 70 43 68 61 6e 67 65  PDATE)==(pChange
91b0: 73 21 3d 30 29 20 29 3b 0a 0a 20 20 66 6f 72 28  s!=0) );..  for(
91c0: 70 3d 70 54 72 69 67 67 65 72 3b 20 70 3b 20 70  p=pTrigger; p; p
91d0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 0a 20 20 20  =p->pNext){..   
91e0: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
91f0: 69 6e 67 3a 20 20 54 68 65 20 73 63 68 65 6d 61  ing:  The schema
9200: 20 66 6f 72 20 74 68 65 20 74 72 69 67 67 65 72   for the trigger
9210: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 61 62   and for the tab
9220: 6c 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c  le are.    ** al
9230: 77 61 79 73 20 64 65 66 69 6e 65 64 2e 20 20 54  ways defined.  T
9240: 68 65 20 74 72 69 67 67 65 72 20 6d 75 73 74 20  he trigger must 
9250: 62 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 73  be in the same s
9260: 63 68 65 6d 61 20 61 73 20 74 68 65 20 74 61 62  chema as the tab
9270: 6c 65 0a 20 20 20 20 2a 2a 20 6f 72 20 65 6c 73  le.    ** or els
9280: 65 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 54  e it must be a T
9290: 45 4d 50 20 74 72 69 67 67 65 72 2e 20 2a 2f 0a  EMP trigger. */.
92a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
92b0: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
92c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62   assert( p->pTab
92d0: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
92e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68   assert( p->pSch
92f0: 65 6d 61 3d 3d 70 2d 3e 70 54 61 62 53 63 68 65  ema==p->pTabSche
9300: 6d 61 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ma .         || 
9310: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 50 61 72  p->pSchema==pPar
9320: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  se->db->aDb[1].p
9330: 53 63 68 65 6d 61 20 29 3b 0a 0a 20 20 20 20 2f  Schema );..    /
9340: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
9350: 68 65 72 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  her we should co
9360: 64 65 20 74 68 69 73 20 74 72 69 67 67 65 72 20  de this trigger 
9370: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  */.    if( p->op
9380: 3d 3d 6f 70 20 0a 20 20 20 20 20 26 26 20 70 2d  ==op .     && p-
9390: 3e 74 72 5f 74 6d 3d 3d 74 72 5f 74 6d 20 0a 20  >tr_tm==tr_tm . 
93a0: 20 20 20 20 26 26 20 63 68 65 63 6b 43 6f 6c 75      && checkColu
93b0: 6d 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70 43 6f  mnOverlap(p->pCo
93c0: 6c 75 6d 6e 73 2c 20 70 43 68 61 6e 67 65 73 29  lumns, pChanges)
93d0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
93e0: 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67  lite3CodeRowTrig
93f0: 67 65 72 44 69 72 65 63 74 28 70 50 61 72 73 65  gerDirect(pParse
9400: 2c 20 70 2c 20 70 54 61 62 2c 20 72 65 67 2c 20  , p, pTab, reg, 
9410: 6f 72 63 6f 6e 66 2c 20 69 67 6e 6f 72 65 4a 75  orconf, ignoreJu
9420: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  mp);.    }.  }.}
9430: 0a 0a 2f 2a 0a 2a 2a 20 54 72 69 67 67 65 72 73  ../*.** Triggers
9440: 20 6d 61 79 20 61 63 63 65 73 73 20 76 61 6c 75   may access valu
9450: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
9460: 20 6f 6c 64 2e 2a 20 6f 72 20 6e 65 77 2e 2a 20   old.* or new.* 
9470: 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 0a 2a  pseudo-table. .*
9480: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9490: 72 65 74 75 72 6e 73 20 61 20 33 32 2d 62 69 74  returns a 32-bit
94a0: 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74   bitmask indicat
94b0: 69 6e 67 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  ing which column
94c0: 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 6c 64  s of the .** old
94d0: 2e 2a 20 6f 72 20 6e 65 77 2e 2a 20 74 61 62 6c  .* or new.* tabl
94e0: 65 73 20 61 63 74 75 61 6c 6c 79 20 61 72 65 20  es actually are 
94f0: 75 73 65 64 20 62 79 20 74 72 69 67 67 65 72 73  used by triggers
9500: 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
9510: 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 75 73  on .** may be us
9520: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
9530: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
9540: 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74  o avoid having t
9550: 6f 20 6c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  o load the entir
9560: 65 0a 2a 2a 20 6f 6c 64 2e 2a 20 72 65 63 6f 72  e.** old.* recor
9570: 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 77 68  d into memory wh
9580: 65 6e 20 65 78 65 63 75 74 69 6e 67 20 61 6e 20  en executing an 
9590: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
95a0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
95b0: 42 69 74 20 30 20 6f 66 20 74 68 65 20 72 65 74  Bit 0 of the ret
95c0: 75 72 6e 65 64 20 6d 61 73 6b 20 69 73 20 73 65  urned mask is se
95d0: 74 20 69 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f  t if the left-mo
95e0: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
95f0: 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 62 65  .** table may be
9600: 20 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20   accessed using 
9610: 61 6e 20 5b 6f 6c 64 7c 6e 65 77 5d 2e 3c 63 6f  an [old|new].<co
9620: 6c 3e 20 72 65 66 65 72 65 6e 63 65 2e 20 42 69  l> reference. Bi
9630: 74 20 31 20 69 73 20 73 65 74 20 69 66 0a 2a 2a  t 1 is set if.**
9640: 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74   the second left
9650: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  most column valu
9660: 65 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 61  e is required, a
9670: 6e 64 20 73 6f 20 6f 6e 2e 20 49 66 20 74 68 65  nd so on. If the
9680: 72 65 0a 2a 2a 20 61 72 65 20 6d 6f 72 65 20 74  re.** are more t
9690: 68 61 6e 20 33 32 20 63 6f 6c 75 6d 6e 73 20 69  han 32 columns i
96a0: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64  n the table, and
96b0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
96c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20   the columns.** 
96d0: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72  with an index gr
96e0: 65 61 74 65 72 20 74 68 61 6e 20 33 32 20 6d 61  eater than 32 ma
96f0: 79 20 62 65 20 61 63 63 65 73 73 65 64 2c 20 30  y be accessed, 0
9700: 78 66 66 66 66 66 66 66 66 20 69 73 20 72 65 74  xffffffff is ret
9710: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  urned..**.** It 
9720: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
9730: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
9740: 74 68 65 20 6f 6c 64 2e 72 6f 77 69 64 20 6f 72  the old.rowid or
9750: 20 6e 65 77 2e 72 6f 77 69 64 20 63 6f 6c 75 6d   new.rowid colum
9760: 6e 20 69 73 20 0a 2a 2a 20 61 63 63 65 73 73 65  n is .** accesse
9770: 64 20 62 79 20 74 72 69 67 67 65 72 73 2e 20 54  d by triggers. T
9780: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 61  he caller must a
9790: 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74 68 61  lways assume tha
97a0: 74 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 50  t it is..**.** P
97b0: 61 72 61 6d 65 74 65 72 20 69 73 4e 65 77 20 6d  arameter isNew m
97c0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 31 20  ust be either 1 
97d0: 6f 72 20 30 2e 20 49 66 20 69 74 20 69 73 20 30  or 0. If it is 0
97e0: 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 73 6b 20  , then the mask 
97f0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 70 70 6c  returned.** appl
9800: 69 65 73 20 74 6f 20 74 68 65 20 6f 6c 64 2e 2a  ies to the old.*
9810: 20 74 61 62 6c 65 2e 20 49 66 20 31 2c 20 74 68   table. If 1, th
9820: 65 20 6e 65 77 2e 2a 20 74 61 62 6c 65 2e 0a 2a  e new.* table..*
9830: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 74  *.** Parameter t
9840: 72 5f 74 6d 20 6d 75 73 74 20 62 65 20 61 20 6d  r_tm must be a m
9850: 61 73 6b 20 77 69 74 68 20 6f 6e 65 20 6f 72 20  ask with one or 
9860: 62 6f 74 68 20 6f 66 20 74 68 65 20 54 52 49 47  both of the TRIG
9870: 47 45 52 5f 42 45 46 4f 52 45 0a 2a 2a 20 61 6e  GER_BEFORE.** an
9880: 64 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 20  d TRIGGER_AFTER 
9890: 62 69 74 73 20 73 65 74 2e 20 56 61 6c 75 65 73  bits set. Values
98a0: 20 61 63 63 65 73 73 65 64 20 62 79 20 42 45 46   accessed by BEF
98b0: 4f 52 45 20 74 72 69 67 67 65 72 73 20 61 72 65  ORE triggers are
98c0: 20 6f 6e 6c 79 0a 2a 2a 20 69 6e 63 6c 75 64 65   only.** include
98d0: 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  d in the returne
98e0: 64 20 6d 61 73 6b 20 69 66 20 74 68 65 20 54 52  d mask if the TR
98f0: 49 47 47 45 52 5f 42 45 46 4f 52 45 20 62 69 74  IGGER_BEFORE bit
9900: 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 0a 2a   is set in the.*
9910: 2a 20 74 72 5f 74 6d 20 70 61 72 61 6d 65 74 65  * tr_tm paramete
9920: 72 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 76 61  r. Similarly, va
9930: 6c 75 65 73 20 61 63 63 65 73 73 65 64 20 62 79  lues accessed by
9940: 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73 20   AFTER triggers 
9950: 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 69 6e 63 6c  are only.** incl
9960: 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
9970: 72 6e 65 64 20 6d 61 73 6b 20 69 66 20 74 68 65  rned mask if the
9980: 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 20 62   TRIGGER_AFTER b
9990: 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 72 5f  it is set in tr_
99a0: 74 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  tm..*/.u32 sqlit
99b0: 65 33 54 72 69 67 67 65 72 43 6f 6c 6d 61 73 6b  e3TriggerColmask
99c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
99d0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
99e0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
99f0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
9a00: 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  ,   /* List of t
9a10: 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65  riggers on table
9a20: 20 70 54 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c   pTab */.  ExprL
9a30: 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20  ist *pChanges,  
9a40: 2f 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74 20  /* Changes list 
9a50: 66 6f 72 20 61 6e 79 20 55 50 44 41 54 45 20 4f  for any UPDATE O
9a60: 46 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20  F triggers */.  
9a70: 69 6e 74 20 69 73 4e 65 77 2c 20 20 20 20 20 20  int isNew,      
9a80: 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 6e 65       /* 1 for ne
9a90: 77 2e 2a 20 72 65 66 20 6d 61 73 6b 2c 20 30 20  w.* ref mask, 0 
9aa0: 66 6f 72 20 6f 6c 64 2e 2a 20 72 65 66 20 6d 61  for old.* ref ma
9ab0: 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74  sk */.  int tr_t
9ac0: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m,           /* 
9ad0: 4d 61 73 6b 20 6f 66 20 54 52 49 47 47 45 52 5f  Mask of TRIGGER_
9ae0: 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52 5f 41  BEFORE|TRIGGER_A
9af0: 46 54 45 52 20 2a 2f 0a 20 20 54 61 62 6c 65 20  FTER */.  Table 
9b00: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  *pTab,         /
9b10: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 63  * The table to c
9b20: 6f 64 65 20 74 72 69 67 67 65 72 73 20 66 72 6f  ode triggers fro
9b30: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e  m */.  int orcon
9b40: 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  f           /* D
9b50: 65 66 61 75 6c 74 20 4f 4e 20 43 4f 4e 46 4c 49  efault ON CONFLI
9b60: 43 54 20 70 6f 6c 69 63 79 20 66 6f 72 20 74 72  CT policy for tr
9b70: 69 67 67 65 72 20 73 74 65 70 73 20 2a 2f 0a 29  igger steps */.)
9b80: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f 70  {.  const int op
9b90: 20 3d 20 70 43 68 61 6e 67 65 73 20 3f 20 54 4b   = pChanges ? TK
9ba0: 5f 55 50 44 41 54 45 20 3a 20 54 4b 5f 44 45 4c  _UPDATE : TK_DEL
9bb0: 45 54 45 3b 0a 20 20 75 33 32 20 6d 61 73 6b 20  ETE;.  u32 mask 
9bc0: 3d 20 30 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  = 0;.  Trigger *
9bd0: 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  p;..  assert( is
9be0: 4e 65 77 3d 3d 31 20 7c 7c 20 69 73 4e 65 77 3d  New==1 || isNew=
9bf0: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 54  =0 );.  for(p=pT
9c00: 72 69 67 67 65 72 3b 20 70 3b 20 70 3d 70 2d 3e  rigger; p; p=p->
9c10: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
9c20: 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 28 74 72  p->op==op && (tr
9c30: 5f 74 6d 26 70 2d 3e 74 72 5f 74 6d 29 0a 20 20  _tm&p->tr_tm).  
9c40: 20 20 20 26 26 20 63 68 65 63 6b 43 6f 6c 75 6d     && checkColum
9c50: 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70 43 6f 6c  nOverlap(p->pCol
9c60: 75 6d 6e 73 2c 70 43 68 61 6e 67 65 73 29 0a 20  umns,pChanges). 
9c70: 20 20 20 29 7b 0a 20 20 20 20 20 20 54 72 69 67     ){.      Trig
9c80: 67 65 72 50 72 67 20 2a 70 50 72 67 3b 0a 20 20  gerPrg *pPrg;.  
9c90: 20 20 20 20 70 50 72 67 20 3d 20 67 65 74 52 6f      pPrg = getRo
9ca0: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
9cb0: 20 70 2c 20 70 54 61 62 2c 20 6f 72 63 6f 6e 66   p, pTab, orconf
9cc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
9cd0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73  g ){.        mas
9ce0: 6b 20 7c 3d 20 70 50 72 67 2d 3e 61 43 6f 6c 6d  k |= pPrg->aColm
9cf0: 61 73 6b 5b 69 73 4e 65 77 5d 3b 0a 20 20 20 20  ask[isNew];.    
9d00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
9d10: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
9d20: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
9d30: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9d40: 54 52 49 47 47 45 52 29 20 2a 2f 0a              TRIGGER) */.