SQLite

Hex Artifact Content
Login

Artifact ee7e178fb9188f44b532cebd449a7c1df90fb684:


0000: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  /*.**.** The aut
0010: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0020: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0030: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0040: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0050: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0060: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0070: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0080: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
0090: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00a0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00b0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00c0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00d0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00e0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
00f0: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0100: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0110: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0170: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c  ontains the impl
0180: 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 54  ementation for T
0190: 52 49 47 47 45 52 73 0a 2a 2f 0a 23 69 6e 63 6c  RIGGERs.*/.#incl
01a0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
01b0: 22 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  "..#ifndef SQLIT
01c0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f  E_OMIT_TRIGGER./
01d0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 6c 69  *.** Delete a li
01e0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 54 72 69  nked list of Tri
01f0: 67 67 65 72 53 74 65 70 20 73 74 72 75 63 74 75  ggerStep structu
0200: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
0210: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
0220: 72 53 74 65 70 28 73 71 6c 69 74 65 33 20 2a 64  rStep(sqlite3 *d
0230: 62 2c 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  b, TriggerStep *
0240: 70 54 72 69 67 67 65 72 53 74 65 70 29 7b 0a 20  pTriggerStep){. 
0250: 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
0260: 53 74 65 70 20 29 7b 0a 20 20 20 20 54 72 69 67  Step ){.    Trig
0270: 67 65 72 53 74 65 70 20 2a 20 70 54 6d 70 20 3d  gerStep * pTmp =
0280: 20 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 20   pTriggerStep;. 
0290: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 20     pTriggerStep 
02a0: 3d 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e  = pTriggerStep->
02b0: 70 4e 65 78 74 3b 0a 0a 20 20 20 20 73 71 6c 69  pNext;..    sqli
02c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
02d0: 2c 20 70 54 6d 70 2d 3e 70 57 68 65 72 65 29 3b  , pTmp->pWhere);
02e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
02f0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0300: 54 6d 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b  Tmp->pExprList);
0310: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
0320: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6d  ctDelete(db, pTm
0330: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  p->pSelect);.   
0340: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
0350: 6c 65 74 65 28 64 62 2c 20 70 54 6d 70 2d 3e 70  lete(db, pTmp->p
0360: 49 64 4c 69 73 74 29 3b 0a 0a 20 20 20 20 73 71  IdList);..    sq
0370: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0380: 70 54 6d 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pTmp);.  }.}../*
0390: 0a 2a 2a 20 47 69 76 65 6e 20 74 61 62 6c 65 20  .** Given table 
03a0: 70 54 61 62 2c 20 72 65 74 75 72 6e 20 61 20 6c  pTab, return a l
03b0: 69 73 74 20 6f 66 20 61 6c 6c 20 74 68 65 20 74  ist of all the t
03c0: 72 69 67 67 65 72 73 20 61 74 74 61 63 68 65 64  riggers attached
03d0: 20 74 6f 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   to .** the tabl
03e0: 65 2e 20 54 68 65 20 6c 69 73 74 20 69 73 20 63  e. The list is c
03f0: 6f 6e 6e 65 63 74 65 64 20 62 79 20 54 72 69 67  onnected by Trig
0400: 67 65 72 2e 70 4e 65 78 74 20 70 6f 69 6e 74 65  ger.pNext pointe
0410: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  rs..**.** All of
0420: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 6f 6e   the triggers on
0430: 20 70 54 61 62 20 74 68 61 74 20 61 72 65 20 69   pTab that are i
0440: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
0450: 61 73 65 20 61 73 20 70 54 61 62 0a 2a 2a 20 61  ase as pTab.** a
0460: 72 65 20 61 6c 72 65 61 64 79 20 61 74 74 61 63  re already attac
0470: 68 65 64 20 74 6f 20 70 54 61 62 2d 3e 70 54 72  hed to pTab->pTr
0480: 69 67 67 65 72 2e 20 20 42 75 74 20 74 68 65 72  igger.  But ther
0490: 65 20 6d 69 67 68 74 20 62 65 20 61 64 64 69 74  e might be addit
04a0: 69 6f 6e 61 6c 0a 2a 2a 20 74 72 69 67 67 65 72  ional.** trigger
04b0: 73 20 6f 6e 20 70 54 61 62 20 69 6e 20 74 68 65  s on pTab in the
04c0: 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 20 20 54   TEMP schema.  T
04d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 65 70  his routine prep
04e0: 65 6e 64 73 20 61 6c 6c 0a 2a 2a 20 54 45 4d 50  ends all.** TEMP
04f0: 20 74 72 69 67 67 65 72 73 20 6f 6e 20 70 54 61   triggers on pTa
0500: 62 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  b to the beginni
0510: 6e 67 20 6f 66 20 74 68 65 20 70 54 61 62 2d 3e  ng of the pTab->
0520: 70 54 72 69 67 67 65 72 20 6c 69 73 74 0a 2a 2a  pTrigger list.**
0530: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
0540: 20 63 6f 6d 62 69 6e 65 64 20 6c 69 73 74 2e 0a   combined list..
0550: 2a 2a 0a 2a 2a 20 54 6f 20 73 74 61 74 65 20 69  **.** To state i
0560: 74 20 61 6e 6f 74 68 65 72 20 77 61 79 3a 20 20  t another way:  
0570: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
0580: 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 61  urns a list of a
0590: 6c 6c 20 74 72 69 67 67 65 72 73 0a 2a 2a 20 74  ll triggers.** t
05a0: 68 61 74 20 66 69 72 65 20 6f 66 66 20 6f 66 20  hat fire off of 
05b0: 70 54 61 62 2e 20 20 54 68 65 20 6c 69 73 74 20  pTab.  The list 
05c0: 77 69 6c 6c 20 69 6e 63 6c 75 64 65 20 61 6e 79  will include any
05d0: 20 54 45 4d 50 20 74 72 69 67 67 65 72 73 20 6f   TEMP triggers o
05e0: 6e 0a 2a 2a 20 70 54 61 62 20 61 73 20 77 65 6c  n.** pTab as wel
05f0: 6c 20 61 73 20 74 68 65 20 74 72 69 67 67 65 72  l as the trigger
0600: 73 20 6c 69 73 65 64 20 69 6e 20 70 54 61 62 2d  s lised in pTab-
0610: 3e 70 54 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72  >pTrigger..*/.Tr
0620: 69 67 67 65 72 20 2a 73 71 6c 69 74 65 33 54 72  igger *sqlite3Tr
0630: 69 67 67 65 72 4c 69 73 74 28 50 61 72 73 65 20  iggerList(Parse 
0640: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
0650: 70 54 61 62 29 7b 0a 20 20 53 63 68 65 6d 61 20  pTab){.  Schema 
0660: 2a 20 63 6f 6e 73 74 20 70 54 6d 70 53 63 68 65  * const pTmpSche
0670: 6d 61 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ma = pParse->db-
0680: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[1].pSchema;
0690: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 4c 69 73  .  Trigger *pLis
06a0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
06b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
06c0: 6f 66 20 74 72 69 67 67 65 72 73 20 74 6f 20 72  of triggers to r
06d0: 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  eturn */..  if( 
06e0: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 54  pParse->disableT
06f0: 72 69 67 67 65 72 73 20 29 7b 0a 20 20 20 20 72  riggers ){.    r
0700: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
0710: 69 66 28 20 70 54 6d 70 53 63 68 65 6d 61 21 3d  if( pTmpSchema!=
0720: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
0730: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
0740: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
0750: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
0760: 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  Held(pParse->db,
0770: 20 30 2c 20 70 54 6d 70 53 63 68 65 6d 61 29 20   0, pTmpSchema) 
0780: 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  );.    for(p=sql
0790: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 54  iteHashFirst(&pT
07a0: 6d 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48 61  mpSchema->trigHa
07b0: 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65  sh); p; p=sqlite
07c0: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20  HashNext(p)){.  
07d0: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
07e0: 69 67 20 3d 20 28 54 72 69 67 67 65 72 20 2a 29  ig = (Trigger *)
07f0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
0800: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 72  );.      if( pTr
0810: 69 67 2d 3e 70 54 61 62 53 63 68 65 6d 61 3d 3d  ig->pTabSchema==
0820: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 0a 20 20  pTab->pSchema.  
0830: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
0840: 65 33 53 74 72 49 43 6d 70 28 70 54 72 69 67 2d  e3StrICmp(pTrig-
0850: 3e 74 61 62 6c 65 2c 20 70 54 61 62 2d 3e 7a 4e  >table, pTab->zN
0860: 61 6d 65 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  ame) .      ){. 
0870: 20 20 20 20 20 20 20 70 54 72 69 67 2d 3e 70 4e         pTrig->pN
0880: 65 78 74 20 3d 20 28 70 4c 69 73 74 20 3f 20 70  ext = (pList ? p
0890: 4c 69 73 74 20 3a 20 70 54 61 62 2d 3e 70 54 72  List : pTab->pTr
08a0: 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  igger);.        
08b0: 70 4c 69 73 74 20 3d 20 70 54 72 69 67 3b 0a 20  pList = pTrig;. 
08c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
08d0: 0a 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73  ..  return (pLis
08e0: 74 20 3f 20 70 4c 69 73 74 20 3a 20 70 54 61 62  t ? pList : pTab
08f0: 2d 3e 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a  ->pTrigger);.}..
0900: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61  /*.** This is ca
0910: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
0920: 65 72 20 77 68 65 6e 20 69 74 20 73 65 65 73 20  er when it sees 
0930: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  a CREATE TRIGGER
0940: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 75 70   statement.** up
0950: 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 20 6f 66   to the point of
0960: 20 74 68 65 20 42 45 47 49 4e 20 62 65 66 6f 72   the BEGIN befor
0970: 65 20 74 68 65 20 74 72 69 67 67 65 72 20 61 63  e the trigger ac
0980: 74 69 6f 6e 73 2e 20 20 41 20 54 72 69 67 67 65  tions.  A Trigge
0990: 72 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69  r.** structure i
09a0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 61 73 65  s generated base
09b0: 64 20 6f 6e 20 74 68 65 20 69 6e 66 6f 72 6d 61  d on the informa
09c0: 74 69 6f 6e 20 61 76 61 69 6c 61 62 6c 65 20 61  tion available a
09d0: 6e 64 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  nd stored.** in 
09e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
09f0: 67 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ger.  After the 
0a00: 74 72 69 67 67 65 72 20 61 63 74 69 6f 6e 73 20  trigger actions 
0a10: 68 61 76 65 20 62 65 65 6e 20 70 61 72 73 65 64  have been parsed
0a20: 2c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  , the.** sqlite3
0a30: 46 69 6e 69 73 68 54 72 69 67 67 65 72 28 29 20  FinishTrigger() 
0a40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
0a50: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
0a60: 68 65 20 74 72 69 67 67 65 72 0a 2a 2a 20 63 6f  he trigger.** co
0a70: 6e 73 74 72 75 63 74 69 6f 6e 20 70 72 6f 63 65  nstruction proce
0a80: 73 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ss..*/.void sqli
0a90: 74 65 33 42 65 67 69 6e 54 72 69 67 67 65 72 28  te3BeginTrigger(
0aa0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0ab0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
0ac0: 72 73 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  rse context of t
0ad0: 68 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45  he CREATE TRIGGE
0ae0: 52 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  R statement */. 
0af0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
0b00: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65       /* The name
0b10: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
0b20: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
0b30: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
0b40: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67  name of the trig
0b50: 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f  ger */.  int tr_
0b60: 74 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tm,          /* 
0b70: 4f 6e 65 20 6f 66 20 54 4b 5f 42 45 46 4f 52 45  One of TK_BEFORE
0b80: 2c 20 54 4b 5f 41 46 54 45 52 2c 20 54 4b 5f 49  , TK_AFTER, TK_I
0b90: 4e 53 54 45 41 44 20 2a 2f 0a 20 20 69 6e 74 20  NSTEAD */.  int 
0ba0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
0bb0: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 49 4e 53  /* One of TK_INS
0bc0: 45 52 54 2c 20 54 4b 5f 55 50 44 41 54 45 2c 20  ERT, TK_UPDATE, 
0bd0: 54 4b 5f 44 45 4c 45 54 45 20 2a 2f 0a 20 20 49  TK_DELETE */.  I
0be0: 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 73 2c  dList *pColumns,
0bf0: 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73     /* column lis
0c00: 74 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  t if this is an 
0c10: 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67 65  UPDATE OF trigge
0c20: 72 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  r */.  SrcList *
0c30: 70 54 61 62 6c 65 4e 61 6d 65 2c 2f 2a 20 54 68  pTableName,/* Th
0c40: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
0c50: 62 6c 65 2f 76 69 65 77 20 74 68 65 20 74 72 69  ble/view the tri
0c60: 67 67 65 72 20 61 70 70 6c 69 65 73 20 74 6f 20  gger applies to 
0c70: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 6e  */.  Expr *pWhen
0c80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 4e  ,        /* WHEN
0c90: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
0ca0: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20   isTemp,        
0cb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
0cc0: 54 45 4d 50 4f 52 41 52 59 20 6b 65 79 77 6f 72  TEMPORARY keywor
0cd0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0ce0: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
0cf0: 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73        /* Suppres
0d00: 73 20 65 72 72 6f 72 73 20 69 66 20 74 68 65 20  s errors if the 
0d10: 74 72 69 67 67 65 72 20 61 6c 72 65 61 64 79 20  trigger already 
0d20: 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
0d30: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
0d40: 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6e 65   = 0;  /* The ne
0d50: 77 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 54  w trigger */.  T
0d60: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
0d70: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
0d80: 74 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72  that the trigger
0d90: 20 66 69 72 65 73 20 6f 66 66 20 6f 66 20 2a 2f   fires off of */
0da0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
0db0: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61   0;        /* Na
0dc0: 6d 65 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  me of the trigge
0dd0: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
0de0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0df0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
0e00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
0e10: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
0e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0e30: 20 64 61 74 61 62 61 73 65 20 74 6f 20 73 74 6f   database to sto
0e40: 72 65 20 74 68 65 20 74 72 69 67 67 65 72 20 69  re the trigger i
0e50: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
0e60: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
0e70: 2a 20 54 68 65 20 75 6e 71 75 61 6c 69 66 69 65  * The unqualifie
0e80: 64 20 64 62 20 6e 61 6d 65 20 2a 2f 0a 20 20 44  d db name */.  D
0e90: 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
0ea0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20         /* State 
0eb0: 76 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 44  vector for the D
0ec0: 42 20 66 69 78 65 72 20 2a 2f 0a 20 20 69 6e 74  B fixer */.  int
0ed0: 20 69 54 61 62 44 62 3b 20 20 20 20 20 20 20 20   iTabDb;        
0ee0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
0ef0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
0f00: 6c 64 69 6e 67 20 70 54 61 62 20 2a 2f 0a 0a 20  lding pTab */.. 
0f10: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 21   assert( pName1!
0f20: 3d 30 20 29 3b 20 20 20 2f 2a 20 70 4e 61 6d 65  =0 );   /* pName
0f30: 31 2d 3e 7a 20 6d 69 67 68 74 20 62 65 20 4e 55  1->z might be NU
0f40: 4c 4c 2c 20 62 75 74 20 6e 6f 74 20 70 4e 61 6d  LL, but not pNam
0f50: 65 31 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 61  e1 itself */.  a
0f60: 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30  ssert( pName2!=0
0f70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
0f80: 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 7c 7c 20 6f  ==TK_INSERT || o
0f90: 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20  p==TK_UPDATE || 
0fa0: 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20 29 3b  op==TK_DELETE );
0fb0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0fc0: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0fd0: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
0fe0: 20 20 2f 2a 20 49 66 20 54 45 4d 50 20 77 61 73    /* If TEMP was
0ff0: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
1000: 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d   the trigger nam
1010: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
1020: 6c 69 66 69 65 64 2e 20 2a 2f 0a 20 20 20 20 69  lified. */.    i
1030: 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29  f( pName2->n>0 )
1040: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1050: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1060: 22 74 65 6d 70 6f 72 61 72 79 20 74 72 69 67 67  "temporary trigg
1070: 65 72 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  er may not have 
1080: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 22 29  qualified name")
1090: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69  ;.      goto tri
10a0: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  gger_cleanup;.  
10b0: 20 20 7d 0a 20 20 20 20 69 44 62 20 3d 20 31 3b    }.    iDb = 1;
10c0: 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61  .    pName = pNa
10d0: 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me1;.  }else{.  
10e0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
10f0: 74 68 65 20 64 62 20 74 68 61 74 20 74 68 65 20  the db that the 
1100: 74 68 65 20 74 72 69 67 67 65 72 20 77 69 6c 6c  the trigger will
1110: 20 62 65 20 63 72 65 61 74 65 64 20 69 6e 20 2a   be created in *
1120: 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
1130: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
1140: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
1150: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
1160: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
1170: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67  .      goto trig
1180: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ger_cleanup;.   
1190: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 54   }.  }.  if( !pT
11a0: 61 62 6c 65 4e 61 6d 65 20 7c 7c 20 64 62 2d 3e  ableName || db->
11b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
11c0: 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72      goto trigger
11d0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
11e0: 20 2f 2a 20 41 20 6c 6f 6e 67 2d 73 74 61 6e 64   /* A long-stand
11f0: 69 6e 67 20 70 61 72 73 65 72 20 62 75 67 20 69  ing parser bug i
1200: 73 20 74 68 61 74 20 74 68 69 73 20 73 79 6e 74  s that this synt
1210: 61 78 20 77 61 73 20 61 6c 6c 6f 77 65 64 3a 0a  ax was allowed:.
1220: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 43 52 45    **.  **    CRE
1230: 41 54 45 20 54 52 49 47 47 45 52 20 61 74 74 61  ATE TRIGGER atta
1240: 63 68 65 64 2e 64 65 6d 6f 20 41 46 54 45 52 20  ched.demo AFTER 
1250: 49 4e 53 45 52 54 20 4f 4e 20 61 74 74 61 63 68  INSERT ON attach
1260: 65 64 2e 74 61 62 20 2e 2e 2e 2e 0a 20 20 2a 2a  ed.tab .....  **
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 20 20 20                  
12a0: 20 5e 5e 5e 5e 5e 5e 5e 5e 0a 20 20 2a 2a 0a 20   ^^^^^^^^.  **. 
12b0: 20 2a 2a 20 54 6f 20 6d 61 69 6e 74 61 69 6e 20   ** To maintain 
12c0: 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
12d0: 69 62 69 6c 69 74 79 2c 20 69 67 6e 6f 72 65 20  ibility, ignore 
12e0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
12f0: 2a 20 6e 61 6d 65 20 6f 6e 20 70 54 61 62 6c 65  * name on pTable
1300: 4e 61 6d 65 20 69 66 20 77 65 20 61 72 65 20 72  Name if we are r
1310: 65 70 61 72 73 69 6e 67 20 6f 75 72 20 6f 66 20  eparsing our of 
1320: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 0a 20  SQLITE_MASTER.. 
1330: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
1340: 69 74 2e 62 75 73 79 20 26 26 20 69 44 62 21 3d  it.busy && iDb!=
1350: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1360: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
1370: 65 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  eName->a[0].zDat
1380: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 54 61 62  abase);.    pTab
1390: 6c 65 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61  leName->a[0].zDa
13a0: 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
13b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 69  .  /* If the tri
13c0: 67 67 65 72 20 6e 61 6d 65 20 77 61 73 20 75 6e  gger name was un
13d0: 71 75 61 6c 69 66 69 65 64 2c 20 61 6e 64 20 74  qualified, and t
13e0: 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 74 65  he table is a te
13f0: 6d 70 20 74 61 62 6c 65 2c 0a 20 20 2a 2a 20 74  mp table,.  ** t
1400: 68 65 6e 20 73 65 74 20 69 44 62 20 74 6f 20 31  hen set iDb to 1
1410: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
1420: 72 69 67 67 65 72 20 69 6e 20 74 68 65 20 74 65  rigger in the te
1430: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
1440: 2e 0a 20 20 2a 2a 20 49 66 20 73 71 6c 69 74 65  ..  ** If sqlite
1450: 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 29  3SrcListLookup()
1460: 20 72 65 74 75 72 6e 73 20 30 2c 20 69 6e 64 69   returns 0, indi
1470: 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
1480: 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 65   does not.  ** e
1490: 78 69 73 74 2c 20 74 68 65 20 65 72 72 6f 72 20  xist, the error 
14a0: 69 73 20 63 61 75 67 68 74 20 62 79 20 74 68 65  is caught by the
14b0: 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20   block below..  
14c0: 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  */.  pTab = sqli
14d0: 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70  te3SrcListLookup
14e0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 4e  (pParse, pTableN
14f0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ame);.  if( db->
1500: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 26 26 20  init.busy==0 && 
1510: 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
1520: 70 54 61 62 0a 20 20 20 20 20 20 20 20 26 26 20  pTab.        && 
1530: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  pTab->pSchema==d
1540: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
1550: 61 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 31  a ){.    iDb = 1
1560: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75  ;.  }..  /* Ensu
1570: 72 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  re the table nam
1580: 65 20 6d 61 74 63 68 65 73 20 64 61 74 61 62 61  e matches databa
1590: 73 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 61 74  se name and that
15a0: 20 74 68 65 20 74 61 62 6c 65 20 65 78 69 73 74   the table exist
15b0: 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
15c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
15d0: 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e  to trigger_clean
15e0: 75 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  up;.  assert( pT
15f0: 61 62 6c 65 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  ableName->nSrc==
1600: 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  1 );.  if( sqlit
1610: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
1620: 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74   pParse, iDb, "t
1630: 72 69 67 67 65 72 22 2c 20 70 4e 61 6d 65 29 20  rigger", pName) 
1640: 26 26 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  && .      sqlite
1650: 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69  3FixSrcList(&sFi
1660: 78 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29 20 29  x, pTableName) )
1670: 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  {.    goto trigg
1680: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
1690: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
16a0: 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
16b0: 61 72 73 65 2c 20 70 54 61 62 6c 65 4e 61 6d 65  arse, pTableName
16c0: 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 29  );.  if( !pTab )
16d0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  {.    /* The tab
16e0: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
16f0: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62  t. */.    if( db
1700: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 7b  ->init.iDb==1 ){
1710: 0a 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  .      /* Ticket
1720: 20 23 33 38 31 30 2e 0a 20 20 20 20 20 20 2a 2a   #3810..      **
1730: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 68 65 6e 65   Normally, whene
1740: 76 65 72 20 61 20 74 61 62 6c 65 20 69 73 20 64  ver a table is d
1750: 72 6f 70 70 65 64 2c 20 61 6c 6c 20 61 73 73 6f  ropped, all asso
1760: 63 69 61 74 65 64 20 74 72 69 67 67 65 72 73 20  ciated triggers 
1770: 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 64 72 6f  are.      ** dro
1780: 70 70 65 64 20 74 6f 6f 2e 20 20 42 75 74 20 69  pped too.  But i
1790: 66 20 61 20 54 45 4d 50 20 74 72 69 67 67 65 72  f a TEMP trigger
17a0: 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 20 61   is created on a
17b0: 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 0a   non-TEMP table.
17c0: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
17d0: 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65   table is droppe
17e0: 64 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74  d by a different
17f0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1800: 74 69 6f 6e 2c 20 74 68 65 0a 20 20 20 20 20 20  tion, the.      
1810: 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20 6e 6f  ** trigger is no
1820: 74 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 65  t visible to the
1830: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1840: 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 74  tion that does t
1850: 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 72 6f 70  he.      ** drop
1860: 20 73 6f 20 74 68 65 20 74 72 69 67 67 65 72 20   so the trigger 
1870: 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
1880: 64 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73  d.  This results
1890: 20 69 6e 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20   in an.      ** 
18a0: 22 6f 72 70 68 61 6e 65 64 20 74 72 69 67 67 65  "orphaned trigge
18b0: 72 22 20 2d 20 61 20 74 72 69 67 67 65 72 20 77  r" - a trigger w
18c0: 68 6f 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  hose associated 
18d0: 74 61 62 6c 65 20 69 73 20 6d 69 73 73 69 6e 67  table is missing
18e0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18f0: 20 64 62 2d 3e 69 6e 69 74 2e 6f 72 70 68 61 6e   db->init.orphan
1900: 54 72 69 67 67 65 72 20 3d 20 31 3b 0a 20 20 20  Trigger = 1;.   
1910: 20 7d 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67   }.    goto trig
1920: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ger_cleanup;.  }
1930: 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
1940: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
1950: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1960: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72  arse, "cannot cr
1970: 65 61 74 65 20 74 72 69 67 67 65 72 73 20 6f 6e  eate triggers on
1980: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 22   virtual tables"
1990: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67  );.    goto trig
19a0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ger_cleanup;.  }
19b0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
19c0: 74 20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61  t the trigger na
19d0: 6d 65 20 69 73 20 6e 6f 74 20 72 65 73 65 72 76  me is not reserv
19e0: 65 64 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 74  ed and that no t
19f0: 72 69 67 67 65 72 20 6f 66 20 74 68 65 0a 20 20  rigger of the.  
1a00: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 61 6d  ** specified nam
1a10: 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 7a 4e  e exists */.  zN
1a20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1a30: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1a40: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a 4e  Name);.  if( !zN
1a50: 61 6d 65 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  ame || SQLITE_OK
1a60: 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
1a70: 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
1a80: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67   zName) ){.    g
1a90: 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61  oto trigger_clea
1aa0: 6e 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  nup;.  }.  asser
1ab0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1ac0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
1ad0: 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 73  b, 0) );.  if( s
1ae0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
1af0: 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  (db->aDb[iDb].pS
1b00: 63 68 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 29  chema->trigHash)
1b10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b20: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 73          zName, s
1b30: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1b40: 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 69 66  Name)) ){.    if
1b50: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
1b60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1b70: 67 28 70 50 61 72 73 65 2c 20 22 74 72 69 67 67  g(pParse, "trigg
1b80: 65 72 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  er %T already ex
1b90: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
1ba0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bb0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
1bc0: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20  t.busy );.      
1bd0: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1be0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
1bf0: 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iDb);.    }.    
1c00: 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63 6c 65  goto trigger_cle
1c10: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  anup;.  }..  /* 
1c20: 44 6f 20 6e 6f 74 20 63 72 65 61 74 65 20 61 20  Do not create a 
1c30: 74 72 69 67 67 65 72 20 6f 6e 20 61 20 73 79 73  trigger on a sys
1c40: 74 65 6d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  tem table */.  i
1c50: 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
1c60: 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
1c70: 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
1c80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1c90: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1ca0: 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74  "cannot create t
1cb0: 72 69 67 67 65 72 20 6f 6e 20 73 79 73 74 65 6d  rigger on system
1cc0: 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 70 50   table");.    pP
1cd0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
1ce0: 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f 63    goto trigger_c
1cf0: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  leanup;.  }..  /
1d00: 2a 20 49 4e 53 54 45 41 44 20 6f 66 20 74 72 69  * INSTEAD of tri
1d10: 67 67 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 66  ggers are only f
1d20: 6f 72 20 76 69 65 77 73 20 61 6e 64 20 76 69 65  or views and vie
1d30: 77 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  ws only support 
1d40: 49 4e 53 54 45 41 44 0a 20 20 2a 2a 20 6f 66 20  INSTEAD.  ** of 
1d50: 74 72 69 67 67 65 72 73 2e 0a 20 20 2a 2f 0a 20  triggers..  */. 
1d60: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
1d70: 63 74 20 26 26 20 74 72 5f 74 6d 21 3d 54 4b 5f  ct && tr_tm!=TK_
1d80: 49 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73  INSTEAD ){.    s
1d90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1da0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63  Parse, "cannot c
1db0: 72 65 61 74 65 20 25 73 20 74 72 69 67 67 65 72  reate %s trigger
1dc0: 20 6f 6e 20 76 69 65 77 3a 20 25 53 22 2c 20 0a   on view: %S", .
1dd0: 20 20 20 20 20 20 20 20 28 74 72 5f 74 6d 20 3d          (tr_tm =
1de0: 3d 20 54 4b 5f 42 45 46 4f 52 45 29 3f 22 42 45  = TK_BEFORE)?"BE
1df0: 46 4f 52 45 22 3a 22 41 46 54 45 52 22 2c 20 70  FORE":"AFTER", p
1e00: 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29 3b 0a 20  TableName, 0);. 
1e10: 20 20 20 67 6f 74 6f 20 74 72 69 67 67 65 72 5f     goto trigger_
1e20: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69  cleanup;.  }.  i
1e30: 66 28 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63  f( !pTab->pSelec
1e40: 74 20 26 26 20 74 72 5f 74 6d 3d 3d 54 4b 5f 49  t && tr_tm==TK_I
1e50: 4e 53 54 45 41 44 20 29 7b 0a 20 20 20 20 73 71  NSTEAD ){.    sq
1e60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1e70: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63 72  arse, "cannot cr
1e80: 65 61 74 65 20 49 4e 53 54 45 41 44 20 4f 46 22  eate INSTEAD OF"
1e90: 0a 20 20 20 20 20 20 20 20 22 20 74 72 69 67 67  .        " trigg
1ea0: 65 72 20 6f 6e 20 74 61 62 6c 65 3a 20 25 53 22  er on table: %S"
1eb0: 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2c 20 30 29  , pTableName, 0)
1ec0: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 69 67 67  ;.    goto trigg
1ed0: 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  er_cleanup;.  }.
1ee0: 20 20 69 54 61 62 44 62 20 3d 20 73 71 6c 69 74    iTabDb = sqlit
1ef0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
1f00: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1f10: 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
1f20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1f30: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
1f40: 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
1f50: 5f 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 3b  _CREATE_TRIGGER;
1f60: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1f70: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
1f80: 54 61 62 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  TabDb].zName;.  
1f90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1fa0: 62 54 72 69 67 20 3d 20 69 73 54 65 6d 70 20 3f  bTrig = isTemp ?
1fb0: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d   db->aDb[1].zNam
1fc0: 65 20 3a 20 7a 44 62 3b 0a 20 20 20 20 69 66 28  e : zDb;.    if(
1fd0: 20 69 54 61 62 44 62 3d 3d 31 20 7c 7c 20 69 73   iTabDb==1 || is
1fe0: 54 65 6d 70 20 29 20 63 6f 64 65 20 3d 20 53 51  Temp ) code = SQ
1ff0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
2000: 5f 54 52 49 47 47 45 52 3b 0a 20 20 20 20 69 66  _TRIGGER;.    if
2010: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
2020: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
2030: 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
2040: 61 6d 65 2c 20 7a 44 62 54 72 69 67 29 20 29 7b  ame, zDbTrig) ){
2050: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67  .      goto trig
2060: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ger_cleanup;.   
2070: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
2080: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
2090: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
20a0: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
20b0: 69 54 61 62 44 62 29 2c 30 2c 7a 44 62 29 29 7b  iTabDb),0,zDb)){
20c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 69 67  .      goto trig
20d0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ger_cleanup;.   
20e0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
20f0: 20 2f 2a 20 49 4e 53 54 45 41 44 20 4f 46 20 74   /* INSTEAD OF t
2100: 72 69 67 67 65 72 73 20 63 61 6e 20 6f 6e 6c 79  riggers can only
2110: 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65 77 73   appear on views
2120: 20 61 6e 64 20 42 45 46 4f 52 45 20 74 72 69 67   and BEFORE trig
2130: 67 65 72 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74  gers.  ** cannot
2140: 20 61 70 70 65 61 72 20 6f 6e 20 76 69 65 77 73   appear on views
2150: 2e 20 20 53 6f 20 77 65 20 6d 69 67 68 74 20 61  .  So we might a
2160: 73 20 77 65 6c 6c 20 74 72 61 6e 73 6c 61 74 65  s well translate
2170: 20 65 76 65 72 79 0a 20 20 2a 2a 20 49 4e 53 54   every.  ** INST
2180: 45 41 44 20 4f 46 20 74 72 69 67 67 65 72 20 69  EAD OF trigger i
2190: 6e 74 6f 20 61 20 42 45 46 4f 52 45 20 74 72 69  nto a BEFORE tri
21a0: 67 67 65 72 2e 20 20 49 74 20 73 69 6d 70 6c 69  gger.  It simpli
21b0: 66 69 65 73 20 63 6f 64 65 0a 20 20 2a 2a 20 65  fies code.  ** e
21c0: 6c 73 65 77 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  lsewhere..  */. 
21d0: 20 69 66 20 28 74 72 5f 74 6d 20 3d 3d 20 54 4b   if (tr_tm == TK
21e0: 5f 49 4e 53 54 45 41 44 29 7b 0a 20 20 20 20 74  _INSTEAD){.    t
21f0: 72 5f 74 6d 20 3d 20 54 4b 5f 42 45 46 4f 52 45  r_tm = TK_BEFORE
2200: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c  ;.  }..  /* Buil
2210: 64 20 74 68 65 20 54 72 69 67 67 65 72 20 6f 62  d the Trigger ob
2220: 6a 65 63 74 20 2a 2f 0a 20 20 70 54 72 69 67 67  ject */.  pTrigg
2230: 65 72 20 3d 20 28 54 72 69 67 67 65 72 2a 29 73  er = (Trigger*)s
2240: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
2250: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 72  ro(db, sizeof(Tr
2260: 69 67 67 65 72 29 29 3b 0a 20 20 69 66 28 20 70  igger));.  if( p
2270: 54 72 69 67 67 65 72 3d 3d 30 20 29 20 67 6f 74  Trigger==0 ) got
2280: 6f 20 74 72 69 67 67 65 72 5f 63 6c 65 61 6e 75  o trigger_cleanu
2290: 70 3b 0a 20 20 70 54 72 69 67 67 65 72 2d 3e 7a  p;.  pTrigger->z
22a0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
22b0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 72  zName = 0;.  pTr
22c0: 69 67 67 65 72 2d 3e 74 61 62 6c 65 20 3d 20 73  igger->table = s
22d0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
22e0: 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 2d 3e 61  b, pTableName->a
22f0: 5b 30 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 70 54  [0].zName);.  pT
2300: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 20  rigger->pSchema 
2310: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
2320: 53 63 68 65 6d 61 3b 0a 20 20 70 54 72 69 67 67  Schema;.  pTrigg
2330: 65 72 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 3d  er->pTabSchema =
2340: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a   pTab->pSchema;.
2350: 20 20 70 54 72 69 67 67 65 72 2d 3e 6f 70 20 3d    pTrigger->op =
2360: 20 28 75 38 29 6f 70 3b 0a 20 20 70 54 72 69 67   (u8)op;.  pTrig
2370: 67 65 72 2d 3e 74 72 5f 74 6d 20 3d 20 74 72 5f  ger->tr_tm = tr_
2380: 74 6d 3d 3d 54 4b 5f 42 45 46 4f 52 45 20 3f 20  tm==TK_BEFORE ? 
2390: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 3a  TRIGGER_BEFORE :
23a0: 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 3b 0a   TRIGGER_AFTER;.
23b0: 20 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68 65    pTrigger->pWhe
23c0: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
23d0: 75 70 28 64 62 2c 20 70 57 68 65 6e 2c 20 45 58  up(db, pWhen, EX
23e0: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
23f0: 20 70 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75   pTrigger->pColu
2400: 6d 6e 73 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  mns = sqlite3IdL
2410: 69 73 74 44 75 70 28 64 62 2c 20 70 43 6f 6c 75  istDup(db, pColu
2420: 6d 6e 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mns);.  assert( 
2430: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
2440: 67 65 72 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72  ger==0 );.  pPar
2450: 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 20  se->pNewTrigger 
2460: 3d 20 70 54 72 69 67 67 65 72 3b 0a 0a 74 72 69  = pTrigger;..tri
2470: 67 67 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  gger_cleanup:.  
2480: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2490: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
24a0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
24b0: 28 64 62 2c 20 70 54 61 62 6c 65 4e 61 6d 65 29  (db, pTableName)
24c0: 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
24d0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  tDelete(db, pCol
24e0: 75 6d 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  umns);.  sqlite3
24f0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
2500: 57 68 65 6e 29 3b 0a 20 20 69 66 28 20 21 70 50  When);.  if( !pP
2510: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
2520: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
2530: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 64 62  DeleteTrigger(db
2540: 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 7d  , pTrigger);.  }
2550: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2560: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72  ( pParse->pNewTr
2570: 69 67 67 65 72 3d 3d 70 54 72 69 67 67 65 72 20  igger==pTrigger 
2580: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2590: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
25a0: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c  called after all
25b0: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
25c0: 61 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65  actions have bee
25d0: 6e 20 70 61 72 73 65 64 0a 2a 2a 20 69 6e 20 6f  n parsed.** in o
25e0: 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
25f0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
2600: 62 75 69 6c 64 69 6e 67 20 74 68 65 20 74 72 69  building the tri
2610: 67 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gger..*/.void sq
2620: 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67 67  lite3FinishTrigg
2630: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
2640: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
2650: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
2660: 2a 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65 70  */.  TriggerStep
2670: 20 2a 70 53 74 65 70 4c 69 73 74 2c 20 2f 2a 20   *pStepList, /* 
2680: 54 68 65 20 74 72 69 67 67 65 72 65 64 20 70 72  The triggered pr
2690: 6f 67 72 61 6d 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ogram */.  Token
26a0: 20 2a 70 41 6c 6c 20 20 20 20 20 20 20 20 20 20   *pAll          
26b0: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 68 61 74     /* Token that
26c0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63   describes the c
26d0: 6f 6d 70 6c 65 74 65 20 43 52 45 41 54 45 20 54  omplete CREATE T
26e0: 52 49 47 47 45 52 20 2a 2f 0a 29 7b 0a 20 20 54  RIGGER */.){.  T
26f0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 20 3d 20  rigger *pTrig = 
2700: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
2710: 67 65 72 3b 20 20 20 2f 2a 20 54 72 69 67 67 65  ger;   /* Trigge
2720: 72 20 62 65 69 6e 67 20 66 69 6e 69 73 68 65 64  r being finished
2730: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
2740: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2760: 20 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72   Name of trigger
2770: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2780: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
27b0: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
27e0: 78 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  xer object */.  
27f0: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
2820: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2830: 68 65 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20  he trigger */.  
2840: 54 6f 6b 65 6e 20 6e 61 6d 65 54 6f 6b 65 6e 3b  Token nameToken;
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2860: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 69 67 67          /* Trigg
2870: 65 72 20 6e 61 6d 65 20 66 6f 72 20 65 72 72 6f  er name for erro
2880: 72 20 72 65 70 6f 72 74 69 6e 67 20 2a 2f 0a 0a  r reporting */..
2890: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72    pParse->pNewTr
28a0: 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  igger = 0;.  if(
28b0: 20 4e 45 56 45 52 28 70 50 61 72 73 65 2d 3e 6e   NEVER(pParse->n
28c0: 45 72 72 29 20 7c 7c 20 21 70 54 72 69 67 20 29  Err) || !pTrig )
28d0: 20 67 6f 74 6f 20 74 72 69 67 67 65 72 66 69 6e   goto triggerfin
28e0: 69 73 68 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7a  ish_cleanup;.  z
28f0: 4e 61 6d 65 20 3d 20 70 54 72 69 67 2d 3e 7a 4e  Name = pTrig->zN
2900: 61 6d 65 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  ame;.  iDb = sql
2910: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
2920: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
2930: 72 69 67 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  rig->pSchema);. 
2940: 20 70 54 72 69 67 2d 3e 73 74 65 70 5f 6c 69 73   pTrig->step_lis
2950: 74 20 3d 20 70 53 74 65 70 4c 69 73 74 3b 0a 20  t = pStepList;. 
2960: 20 77 68 69 6c 65 28 20 70 53 74 65 70 4c 69 73   while( pStepLis
2970: 74 20 29 7b 0a 20 20 20 20 70 53 74 65 70 4c 69  t ){.    pStepLi
2980: 73 74 2d 3e 70 54 72 69 67 20 3d 20 70 54 72 69  st->pTrig = pTri
2990: 67 3b 0a 20 20 20 20 70 53 74 65 70 4c 69 73 74  g;.    pStepList
29a0: 20 3d 20 70 53 74 65 70 4c 69 73 74 2d 3e 70 4e   = pStepList->pN
29b0: 65 78 74 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 54  ext;.  }.  nameT
29c0: 6f 6b 65 6e 2e 7a 20 3d 20 70 54 72 69 67 2d 3e  oken.z = pTrig->
29d0: 7a 4e 61 6d 65 3b 0a 20 20 6e 61 6d 65 54 6f 6b  zName;.  nameTok
29e0: 65 6e 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  en.n = sqlite3St
29f0: 72 6c 65 6e 33 30 28 6e 61 6d 65 54 6f 6b 65 6e  rlen30(nameToken
2a00: 2e 7a 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  .z);.  if( sqlit
2a10: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
2a20: 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74   pParse, iDb, "t
2a30: 72 69 67 67 65 72 22 2c 20 26 6e 61 6d 65 54 6f  rigger", &nameTo
2a40: 6b 65 6e 29 20 0a 20 20 20 20 20 20 20 20 20 20  ken) .          
2a50: 26 26 20 73 71 6c 69 74 65 33 46 69 78 54 72 69  && sqlite3FixTri
2a60: 67 67 65 72 53 74 65 70 28 26 73 46 69 78 2c 20  ggerStep(&sFix, 
2a70: 70 54 72 69 67 2d 3e 73 74 65 70 5f 6c 69 73 74  pTrig->step_list
2a80: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
2a90: 69 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61  iggerfinish_clea
2aa0: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 69  nup;.  }..  /* i
2ab0: 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69  f we are not ini
2ac0: 74 69 61 6c 69 7a 69 6e 67 2c 0a 20 20 2a 2a 20  tializing,.  ** 
2ad0: 62 75 69 6c 64 20 74 68 65 20 73 71 6c 69 74 65  build the sqlite
2ae0: 5f 6d 61 73 74 65 72 20 65 6e 74 72 79 0a 20 20  _master entry.  
2af0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
2b00: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 56  it.busy ){.    V
2b10: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
2b20: 20 2a 7a 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b   *z;..    /* Mak
2b30: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
2b40: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2b50: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 76 20 3d  table */.    v =
2b60: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
2b70: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
2b80: 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 74 72 69   v==0 ) goto tri
2b90: 67 67 65 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e  ggerfinish_clean
2ba0: 75 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  up;.    sqlite3B
2bb0: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
2bc0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
2bd0: 62 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  b);.    z = sqli
2be0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
2bf0: 20 28 63 68 61 72 2a 29 70 41 6c 6c 2d 3e 7a 2c   (char*)pAll->z,
2c00: 20 70 41 6c 6c 2d 3e 6e 29 3b 0a 20 20 20 20 73   pAll->n);.    s
2c10: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
2c20: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
2c30: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
2c40: 2e 25 73 20 56 41 4c 55 45 53 28 27 74 72 69 67  .%s VALUES('trig
2c50: 67 65 72 27 2c 25 51 2c 25 51 2c 30 2c 27 43 52  ger',%Q,%Q,0,'CR
2c60: 45 41 54 45 20 54 52 49 47 47 45 52 20 25 71 27  EATE TRIGGER %q'
2c70: 29 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  )",.       db->a
2c80: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
2c90: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
2ca0: 2c 20 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  , zName,.       
2cb0: 70 54 72 69 67 2d 3e 74 61 62 6c 65 2c 20 7a 29  pTrig->table, z)
2cc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
2cd0: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
2ce0: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
2cf0: 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
2d00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2d10: 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
2d20: 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  p(v, iDb,.      
2d30: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
2d40: 28 64 62 2c 20 22 74 79 70 65 3d 27 74 72 69 67  (db, "type='trig
2d50: 67 65 72 27 20 41 4e 44 20 6e 61 6d 65 3d 27 25  ger' AND name='%
2d60: 71 27 22 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20  q'", zName));.  
2d70: 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  }..  if( db->ini
2d80: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 72  t.busy ){.    Tr
2d90: 69 67 67 65 72 20 2a 70 4c 69 6e 6b 20 3d 20 70  igger *pLink = p
2da0: 54 72 69 67 3b 0a 20 20 20 20 48 61 73 68 20 2a  Trig;.    Hash *
2db0: 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62  pHash = &db->aDb
2dc0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [iDb].pSchema->t
2dd0: 72 69 67 48 61 73 68 3b 0a 20 20 20 20 61 73 73  rigHash;.    ass
2de0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
2df0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
2e00: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
2e10: 54 72 69 67 20 3d 20 73 71 6c 69 74 65 33 48 61  Trig = sqlite3Ha
2e20: 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20  shInsert(pHash, 
2e30: 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74  zName, sqlite3St
2e40: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 70  rlen30(zName), p
2e50: 54 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 70  Trig);.    if( p
2e60: 54 72 69 67 20 29 7b 0a 20 20 20 20 20 20 64 62  Trig ){.      db
2e70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
2e80: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
2e90: 28 20 70 4c 69 6e 6b 2d 3e 70 53 63 68 65 6d 61  ( pLink->pSchema
2ea0: 3d 3d 70 4c 69 6e 6b 2d 3e 70 54 61 62 53 63 68  ==pLink->pTabSch
2eb0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ema ){.      Tab
2ec0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
2ed0: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
2ee0: 74 72 6c 65 6e 33 30 28 70 4c 69 6e 6b 2d 3e 74  trlen30(pLink->t
2ef0: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 70 54 61  able);.      pTa
2f00: 62 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  b = sqlite3HashF
2f10: 69 6e 64 28 26 70 4c 69 6e 6b 2d 3e 70 54 61 62  ind(&pLink->pTab
2f20: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
2f30: 20 70 4c 69 6e 6b 2d 3e 74 61 62 6c 65 2c 20 6e   pLink->table, n
2f40: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2f50: 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
2f60: 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d    pLink->pNext =
2f70: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b   pTab->pTrigger;
2f80: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 54 72  .      pTab->pTr
2f90: 69 67 67 65 72 20 3d 20 70 4c 69 6e 6b 3b 0a 20  igger = pLink;. 
2fa0: 20 20 20 7d 0a 20 20 7d 0a 0a 74 72 69 67 67 65     }.  }..trigge
2fb0: 72 66 69 6e 69 73 68 5f 63 6c 65 61 6e 75 70 3a  rfinish_cleanup:
2fc0: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
2fd0: 54 72 69 67 67 65 72 28 64 62 2c 20 70 54 72 69  Trigger(db, pTri
2fe0: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  g);.  assert( !p
2ff0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67  Parse->pNewTrigg
3000: 65 72 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  er );.  sqlite3D
3010: 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70  eleteTriggerStep
3020: 28 64 62 2c 20 70 53 74 65 70 4c 69 73 74 29 3b  (db, pStepList);
3030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  .}../*.** Turn a
3040: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3050: 74 20 28 74 68 61 74 20 74 68 65 20 70 53 65 6c  t (that the pSel
3060: 65 63 74 20 70 61 72 61 6d 65 74 65 72 20 70 6f  ect parameter po
3070: 69 6e 74 73 20 74 6f 29 20 69 6e 74 6f 0a 2a 2a  ints to) into.**
3080: 20 61 20 74 72 69 67 67 65 72 20 73 74 65 70 2e   a trigger step.
3090: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
30a0: 65 72 20 74 6f 20 61 20 54 72 69 67 67 65 72 53  er to a TriggerS
30b0: 74 65 70 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  tep structure..*
30c0: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
30d0: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
30e0: 6e 65 20 77 68 65 6e 20 69 74 20 66 69 6e 64 73  ne when it finds
30f0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
3100: 65 6e 74 20 69 6e 0a 2a 2a 20 62 6f 64 79 20 6f  ent in.** body o
3110: 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 0a 2a  f a TRIGGER.  .*
3120: 2f 0a 54 72 69 67 67 65 72 53 74 65 70 20 2a 73  /.TriggerStep *s
3130: 71 6c 69 74 65 33 54 72 69 67 67 65 72 53 65 6c  qlite3TriggerSel
3140: 65 63 74 53 74 65 70 28 73 71 6c 69 74 65 33 20  ectStep(sqlite3 
3150: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  *db, Select *pSe
3160: 6c 65 63 74 29 7b 0a 20 20 54 72 69 67 67 65 72  lect){.  Trigger
3170: 53 74 65 70 20 2a 70 54 72 69 67 67 65 72 53 74  Step *pTriggerSt
3180: 65 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ep = sqlite3DbMa
3190: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
31a0: 65 6f 66 28 54 72 69 67 67 65 72 53 74 65 70 29  eof(TriggerStep)
31b0: 29 3b 0a 20 20 69 66 28 20 70 54 72 69 67 67 65  );.  if( pTrigge
31c0: 72 53 74 65 70 3d 3d 30 20 29 20 7b 0a 20 20 20  rStep==0 ) {.   
31d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
31e0: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
31f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
3200: 0a 20 20 7d 0a 20 20 70 54 72 69 67 67 65 72 53  .  }.  pTriggerS
3210: 74 65 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  tep->op = TK_SEL
3220: 45 43 54 3b 0a 20 20 70 54 72 69 67 67 65 72 53  ECT;.  pTriggerS
3230: 74 65 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70  tep->pSelect = p
3240: 53 65 6c 65 63 74 3b 0a 20 20 70 54 72 69 67 67  Select;.  pTrigg
3250: 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d  erStep->orconf =
3260: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 72   OE_Default;.  r
3270: 65 74 75 72 6e 20 70 54 72 69 67 67 65 72 53 74  eturn pTriggerSt
3280: 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ep;.}../*.** All
3290: 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 68  ocate space to h
32a0: 6f 6c 64 20 61 20 6e 65 77 20 74 72 69 67 67 65  old a new trigge
32b0: 72 20 73 74 65 70 2e 20 20 54 68 65 20 61 6c 6c  r step.  The all
32c0: 6f 63 61 74 65 64 20 73 70 61 63 65 0a 2a 2a 20  ocated space.** 
32d0: 68 6f 6c 64 73 20 62 6f 74 68 20 74 68 65 20 54  holds both the T
32e0: 72 69 67 67 65 72 53 74 65 70 20 6f 62 6a 65 63  riggerStep objec
32f0: 74 20 61 6e 64 20 74 68 65 20 54 72 69 67 67 65  t and the Trigge
3300: 72 53 74 65 70 2e 74 61 72 67 65 74 2e 7a 20 73  rStep.target.z s
3310: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tring..**.** If 
3320: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
3330: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
3340: 75 72 6e 65 64 20 61 6e 64 20 64 62 2d 3e 6d 61  urned and db->ma
3350: 6c 6c 6f 63 46 61 69 6c 65 64 20 69 73 20 73 65  llocFailed is se
3360: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69  t..*/.static Tri
3370: 67 67 65 72 53 74 65 70 20 2a 74 72 69 67 67 65  ggerStep *trigge
3380: 72 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 0a 20  rStepAllocate(. 
3390: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33b0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
33c0: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f 70 2c 20  ion */.  u8 op, 
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e0: 20 20 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20       /* Trigger 
33f0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 54 6f 6b 65  opcode */.  Toke
3400: 6e 20 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20  n *pName        
3410: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
3420: 61 72 67 65 74 20 6e 61 6d 65 20 2a 2f 0a 29 7b  arget name */.){
3430: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
3440: 70 54 72 69 67 67 65 72 53 74 65 70 3b 0a 0a 20  pTriggerStep;.. 
3450: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 3d 20   pTriggerStep = 
3460: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
3470: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
3480: 72 69 67 67 65 72 53 74 65 70 29 20 2b 20 70 4e  riggerStep) + pN
3490: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70  ame->n);.  if( p
34a0: 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20  TriggerStep ){. 
34b0: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68     char *z = (ch
34c0: 61 72 2a 29 26 70 54 72 69 67 67 65 72 53 74 65  ar*)&pTriggerSte
34d0: 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  p[1];.    memcpy
34e0: 28 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  (z, pName->z, pN
34f0: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 72  ame->n);.    pTr
3500: 69 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65  iggerStep->targe
3510: 74 2e 7a 20 3d 20 7a 3b 0a 20 20 20 20 70 54 72  t.z = z;.    pTr
3520: 69 67 67 65 72 53 74 65 70 2d 3e 74 61 72 67 65  iggerStep->targe
3530: 74 2e 6e 20 3d 20 70 4e 61 6d 65 2d 3e 6e 3b 0a  t.n = pName->n;.
3540: 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70      pTriggerStep
3550: 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 7d 0a 20  ->op = op;.  }. 
3560: 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72   return pTrigger
3570: 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  Step;.}../*.** B
3580: 75 69 6c 64 20 61 20 74 72 69 67 67 65 72 20 73  uild a trigger s
3590: 74 65 70 20 6f 75 74 20 6f 66 20 61 6e 20 49 4e  tep out of an IN
35a0: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  SERT statement. 
35b0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
35c0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 77 20  r.** to the new 
35d0: 74 72 69 67 67 65 72 20 73 74 65 70 2e 0a 2a 2a  trigger step..**
35e0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
35f0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
3600: 65 20 77 68 65 6e 20 69 74 20 73 65 65 73 20 61  e when it sees a
3610: 6e 20 49 4e 53 45 52 54 20 69 6e 73 69 64 65 20  n INSERT inside 
3620: 74 68 65 0a 2a 2a 20 62 6f 64 79 20 6f 66 20 61  the.** body of a
3630: 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 54 72 69   trigger..*/.Tri
3640: 67 67 65 72 53 74 65 70 20 2a 73 71 6c 69 74 65  ggerStep *sqlite
3650: 33 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74  3TriggerInsertSt
3660: 65 70 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ep(.  sqlite3 *d
3670: 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  b,        /* The
3680: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
3690: 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
36a0: 2a 70 54 61 62 6c 65 4e 61 6d 65 2c 20 20 2f 2a  *pTableName,  /*
36b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
36c0: 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  le into which we
36d0: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 49 64 4c   insert */.  IdL
36e0: 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20  ist *pColumn,   
36f0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
3700: 6d 6e 73 20 69 6e 20 70 54 61 62 6c 65 4e 61 6d  mns in pTableNam
3710: 65 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  e to insert into
3720: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3730: 70 45 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  pEList,   /* The
3740: 20 56 41 4c 55 45 20 63 6c 61 75 73 65 3a 20 61   VALUE clause: a
3750: 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   list of values 
3760: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a  to be inserted *
3770: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
3780: 65 63 74 2c 20 20 20 20 2f 2a 20 41 20 53 45 4c  ect,    /* A SEL
3790: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
37a0: 61 74 20 73 75 70 70 6c 69 65 73 20 76 61 6c 75  at supplies valu
37b0: 65 73 20 2a 2f 0a 20 20 75 38 20 6f 72 63 6f 6e  es */.  u8 orcon
37c0: 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  f           /* T
37d0: 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c 67 6f  he conflict algo
37e0: 72 69 74 68 6d 20 28 4f 45 5f 41 62 6f 72 74 2c  rithm (OE_Abort,
37f0: 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 65 74 63   OE_Replace, etc
3800: 2e 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67 67  .) */.){.  Trigg
3810: 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65 72  erStep *pTrigger
3820: 53 74 65 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  Step;..  assert(
3830: 70 45 4c 69 73 74 20 3d 3d 20 30 20 7c 7c 20 70  pEList == 0 || p
3840: 53 65 6c 65 63 74 20 3d 3d 20 30 29 3b 0a 20 20  Select == 0);.  
3850: 61 73 73 65 72 74 28 70 45 4c 69 73 74 20 21 3d  assert(pEList !=
3860: 20 30 20 7c 7c 20 70 53 65 6c 65 63 74 20 21 3d   0 || pSelect !=
3870: 20 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63   0 || db->malloc
3880: 46 61 69 6c 65 64 29 3b 0a 0a 20 20 70 54 72 69  Failed);..  pTri
3890: 67 67 65 72 53 74 65 70 20 3d 20 74 72 69 67 67  ggerStep = trigg
38a0: 65 72 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 64  erStepAllocate(d
38b0: 62 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 70 54  b, TK_INSERT, pT
38c0: 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ableName);.  if(
38d0: 20 70 54 72 69 67 67 65 72 53 74 65 70 20 29 7b   pTriggerStep ){
38e0: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
38f0: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  p->pSelect = sql
3900: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
3910: 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44  , pSelect, EXPRD
3920: 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20  UP_REDUCE);.    
3930: 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70 49  pTriggerStep->pI
3940: 64 4c 69 73 74 20 3d 20 70 43 6f 6c 75 6d 6e 3b  dList = pColumn;
3950: 0a 20 20 20 20 70 54 72 69 67 67 65 72 53 74 65  .    pTriggerSte
3960: 70 2d 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 73  p->pExprList = s
3970: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
3980: 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 45 58  p(db, pEList, EX
3990: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
39a0: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
39b0: 3e 6f 72 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66  >orconf = orconf
39c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
39d0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
39e0: 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b  te(db, pColumn);
39f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
3a00: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
3a10: 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69   pEList);.  sqli
3a20: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
3a30: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 0a 20  db, pSelect);.. 
3a40: 20 72 65 74 75 72 6e 20 70 54 72 69 67 67 65 72   return pTrigger
3a50: 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Step;.}../*.** C
3a60: 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69 67 67  onstruct a trigg
3a70: 65 72 20 73 74 65 70 20 74 68 61 74 20 69 6d 70  er step that imp
3a80: 6c 65 6d 65 6e 74 73 20 61 6e 20 55 50 44 41 54  lements an UPDAT
3a90: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  E statement and 
3aa0: 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  return.** a poin
3ab0: 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69 67  ter to that trig
3ac0: 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20 70  ger step.  The p
3ad0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
3ae0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69 74   routine when it
3af0: 0a 2a 2a 20 73 65 65 73 20 61 6e 20 55 50 44 41  .** sees an UPDA
3b00: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73  TE statement ins
3b10: 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20  ide the body of 
3b20: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  a CREATE TRIGGER
3b30: 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70  ..*/.TriggerStep
3b40: 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72   *sqlite3Trigger
3b50: 55 70 64 61 74 65 53 74 65 70 28 0a 20 20 73 71  UpdateStep(.  sq
3b60: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
3b70: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3b80: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
3b90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
3ba0: 4e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  Name,   /* Name 
3bb0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
3bc0: 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20  be updated */.  
3bd0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
3be0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 53 45 54 20  ,    /* The SET 
3bf0: 63 6c 61 75 73 65 3a 20 6c 69 73 74 20 6f 66 20  clause: list of 
3c00: 63 6f 6c 75 6d 6e 20 61 6e 64 20 6e 65 77 20 76  column and new v
3c10: 61 6c 75 65 73 20 2a 2f 0a 20 20 45 78 70 72 20  alues */.  Expr 
3c20: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
3c30: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3c40: 75 73 65 20 2a 2f 0a 20 20 75 38 20 6f 72 63 6f  use */.  u8 orco
3c50: 6e 66 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nf            /*
3c60: 20 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6c   The conflict al
3c70: 67 6f 72 69 74 68 6d 2e 20 28 4f 45 5f 41 62 6f  gorithm. (OE_Abo
3c80: 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 65  rt, OE_Ignore, e
3c90: 74 63 29 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67  tc) */.){.  Trig
3ca0: 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65  gerStep *pTrigge
3cb0: 72 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67 67  rStep;..  pTrigg
3cc0: 65 72 53 74 65 70 20 3d 20 74 72 69 67 67 65 72  erStep = trigger
3cd0: 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62 2c  StepAllocate(db,
3ce0: 20 54 4b 5f 55 50 44 41 54 45 2c 20 70 54 61 62   TK_UPDATE, pTab
3cf0: 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  leName);.  if( p
3d00: 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20  TriggerStep ){. 
3d10: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
3d20: 3e 70 45 78 70 72 4c 69 73 74 20 3d 20 73 71 6c  >pExprList = sql
3d30: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
3d40: 64 62 2c 20 70 45 4c 69 73 74 2c 20 45 58 50 52  db, pEList, EXPR
3d50: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
3d60: 20 70 54 72 69 67 67 65 72 53 74 65 70 2d 3e 70   pTriggerStep->p
3d70: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
3d80: 78 70 72 44 75 70 28 64 62 2c 20 70 57 68 65 72  xprDup(db, pWher
3d90: 65 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  e, EXPRDUP_REDUC
3da0: 45 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  E);.    pTrigger
3db0: 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d 20 6f  Step->orconf = o
3dc0: 72 63 6f 6e 66 3b 0a 20 20 7d 0a 20 20 73 71 6c  rconf;.  }.  sql
3dd0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
3de0: 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a  te(db, pEList);.
3df0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3e00: 65 74 65 28 64 62 2c 20 70 57 68 65 72 65 29 3b  ete(db, pWhere);
3e10: 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67 67  .  return pTrigg
3e20: 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  erStep;.}../*.**
3e30: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 74 72 69   Construct a tri
3e40: 67 67 65 72 20 73 74 65 70 20 74 68 61 74 20 69  gger step that i
3e50: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 44 45 4c 45  mplements a DELE
3e60: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  TE statement and
3e70: 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   return.** a poi
3e80: 6e 74 65 72 20 74 6f 20 74 68 61 74 20 74 72 69  nter to that tri
3e90: 67 67 65 72 20 73 74 65 70 2e 20 20 54 68 65 20  gger step.  The 
3ea0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
3eb0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 69  s routine when i
3ec0: 74 0a 2a 2a 20 73 65 65 73 20 61 20 44 45 4c 45  t.** sees a DELE
3ed0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 73  TE statement ins
3ee0: 69 64 65 20 74 68 65 20 62 6f 64 79 20 6f 66 20  ide the body of 
3ef0: 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  a CREATE TRIGGER
3f00: 2e 0a 2a 2f 0a 54 72 69 67 67 65 72 53 74 65 70  ..*/.TriggerStep
3f10: 20 2a 73 71 6c 69 74 65 33 54 72 69 67 67 65 72   *sqlite3Trigger
3f20: 44 65 6c 65 74 65 53 74 65 70 28 0a 20 20 73 71  DeleteStep(.  sq
3f30: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
3f40: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
3f50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
3f60: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e    Token *pTableN
3f70: 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ame,      /* The
3f80: 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
3f90: 68 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74  h rows are delet
3fa0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
3fb0: 68 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20  here            
3fc0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3fd0: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 54 72 69 67  use */.){.  Trig
3fe0: 67 65 72 53 74 65 70 20 2a 70 54 72 69 67 67 65  gerStep *pTrigge
3ff0: 72 53 74 65 70 3b 0a 0a 20 20 70 54 72 69 67 67  rStep;..  pTrigg
4000: 65 72 53 74 65 70 20 3d 20 74 72 69 67 67 65 72  erStep = trigger
4010: 53 74 65 70 41 6c 6c 6f 63 61 74 65 28 64 62 2c  StepAllocate(db,
4020: 20 54 4b 5f 44 45 4c 45 54 45 2c 20 70 54 61 62   TK_DELETE, pTab
4030: 6c 65 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  leName);.  if( p
4040: 54 72 69 67 67 65 72 53 74 65 70 20 29 7b 0a 20  TriggerStep ){. 
4050: 20 20 20 70 54 72 69 67 67 65 72 53 74 65 70 2d     pTriggerStep-
4060: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
4070: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 68  3ExprDup(db, pWh
4080: 65 72 65 2c 20 45 58 50 52 44 55 50 5f 52 45 44  ere, EXPRDUP_RED
4090: 55 43 45 29 3b 0a 20 20 20 20 70 54 72 69 67 67  UCE);.    pTrigg
40a0: 65 72 53 74 65 70 2d 3e 6f 72 63 6f 6e 66 20 3d  erStep->orconf =
40b0: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 7d   OE_Default;.  }
40c0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
40d0: 6c 65 74 65 28 64 62 2c 20 70 57 68 65 72 65 29  lete(db, pWhere)
40e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 72 69 67  ;.  return pTrig
40f0: 67 65 72 53 74 65 70 3b 0a 7d 0a 0a 2f 2a 20 0a  gerStep;.}../* .
4100: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64  ** Recursively d
4110: 65 6c 65 74 65 20 61 20 54 72 69 67 67 65 72 20  elete a Trigger 
4120: 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 76 6f 69  structure.*/.voi
4130: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  d sqlite3DeleteT
4140: 72 69 67 67 65 72 28 73 71 6c 69 74 65 33 20 2a  rigger(sqlite3 *
4150: 64 62 2c 20 54 72 69 67 67 65 72 20 2a 70 54 72  db, Trigger *pTr
4160: 69 67 67 65 72 29 7b 0a 20 20 69 66 28 20 70 54  igger){.  if( pT
4170: 72 69 67 67 65 72 3d 3d 30 20 29 20 72 65 74 75  rigger==0 ) retu
4180: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  rn;.  sqlite3Del
4190: 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28 64  eteTriggerStep(d
41a0: 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 73 74 65  b, pTrigger->ste
41b0: 70 5f 6c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  p_list);.  sqlit
41c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 72  e3DbFree(db, pTr
41d0: 69 67 67 65 72 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  igger->zName);. 
41e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
41f0: 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61 62  b, pTrigger->tab
4200: 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  le);.  sqlite3Ex
4210: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 54 72  prDelete(db, pTr
4220: 69 67 67 65 72 2d 3e 70 57 68 65 6e 29 3b 0a 20  igger->pWhen);. 
4230: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
4240: 6c 65 74 65 28 64 62 2c 20 70 54 72 69 67 67 65  lete(db, pTrigge
4250: 72 2d 3e 70 43 6f 6c 75 6d 6e 73 29 3b 0a 20 20  r->pColumns);.  
4260: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4270: 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 7d 0a 0a  , pTrigger);.}..
4280: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4290: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
42a0: 20 64 72 6f 70 20 61 20 74 72 69 67 67 65 72 20   drop a trigger 
42b0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
42c0: 65 20 73 63 68 65 6d 61 2e 20 0a 2a 2a 0a 2a 2a  e schema. .**.**
42d0: 20 54 68 69 73 20 6d 61 79 20 62 65 20 63 61 6c   This may be cal
42e0: 6c 65 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f  led directly fro
42f0: 6d 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64  m the parser and
4300: 20 74 68 65 72 65 66 6f 72 65 20 69 64 65 6e 74   therefore ident
4310: 69 66 69 65 73 0a 2a 2a 20 74 68 65 20 74 72 69  ifies.** the tri
4320: 67 67 65 72 20 62 79 20 6e 61 6d 65 2e 20 20 54  gger by name.  T
4330: 68 65 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72  he sqlite3DropTr
4340: 69 67 67 65 72 50 74 72 28 29 20 72 6f 75 74 69  iggerPtr() routi
4350: 6e 65 20 64 6f 65 73 20 74 68 65 0a 2a 2a 20 73  ne does the.** s
4360: 61 6d 65 20 6a 6f 62 20 61 73 20 74 68 69 73 20  ame job as this 
4370: 72 6f 75 74 69 6e 65 20 65 78 63 65 70 74 20 69  routine except i
4380: 74 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65  t takes a pointe
4390: 72 20 74 6f 20 74 68 65 20 74 72 69 67 67 65 72  r to the trigger
43a0: 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74  .** instead of t
43b0: 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 2e  he trigger name.
43c0: 0a 2a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  .**/.void sqlite
43d0: 33 44 72 6f 70 54 72 69 67 67 65 72 28 50 61 72  3DropTrigger(Par
43e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
43f0: 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
4400: 6e 6f 45 72 72 29 7b 0a 20 20 54 72 69 67 67 65  noErr){.  Trigge
4410: 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20 30 3b  r *pTrigger = 0;
4420: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
4430: 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63  t char *zDb;.  c
4440: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4450: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20  ;.  int nName;. 
4460: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
4470: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
4480: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
4490: 65 64 20 29 20 67 6f 74 6f 20 64 72 6f 70 5f 74  ed ) goto drop_t
44a0: 72 69 67 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a  rigger_cleanup;.
44b0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
44c0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
44d0: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
44e0: 20 20 67 6f 74 6f 20 64 72 6f 70 5f 74 72 69 67    goto drop_trig
44f0: 67 65 72 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ger_cleanup;.  }
4500: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ..  assert( pNam
4510: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
4520: 7a 44 62 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b 30  zDb = pName->a[0
4530: 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7a  ].zDatabase;.  z
4540: 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 2d 3e 61 5b  Name = pName->a[
4550: 30 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 6e 4e 61 6d  0].zName;.  nNam
4560: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
4570: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 61 73  n30(zName);.  as
4580: 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20  sert( zDb!=0 || 
4590: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
45a0: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
45b0: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
45c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
45d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
45e0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
45f0: 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68   : i;  /* Search
4600: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
4610: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62  N */.    if( zDb
4620: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
4630: 6d 70 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  mp(db->aDb[j].zN
4640: 61 6d 65 2c 20 7a 44 62 29 20 29 20 63 6f 6e 74  ame, zDb) ) cont
4650: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
4660: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
4670: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20  utexHeld(db, j, 
4680: 30 29 20 29 3b 0a 20 20 20 20 70 54 72 69 67 67  0) );.    pTrigg
4690: 65 72 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  er = sqlite3Hash
46a0: 46 69 6e 64 28 26 28 64 62 2d 3e 61 44 62 5b 6a  Find(&(db->aDb[j
46b0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 72 69 67 48  ].pSchema->trigH
46c0: 61 73 68 29 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  ash), zName, nNa
46d0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 72  me);.    if( pTr
46e0: 69 67 67 65 72 20 29 20 62 72 65 61 6b 3b 0a 20  igger ) break;. 
46f0: 20 7d 0a 20 20 69 66 28 20 21 70 54 72 69 67 67   }.  if( !pTrigg
4700: 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6e  er ){.    if( !n
4710: 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  oErr ){.      sq
4720: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4730: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
4740: 72 69 67 67 65 72 3a 20 25 53 22 2c 20 70 4e 61  rigger: %S", pNa
4750: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  me, 0);.    }els
4760: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
4770: 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
4780: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 7a 44  chema(pParse, zD
4790: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  b);.    }.    pP
47a0: 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
47b0: 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
47c0: 64 72 6f 70 5f 74 72 69 67 67 65 72 5f 63 6c 65  drop_trigger_cle
47d0: 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  anup;.  }.  sqli
47e0: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74  te3DropTriggerPt
47f0: 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  r(pParse, pTrigg
4800: 65 72 29 3b 0a 0a 64 72 6f 70 5f 74 72 69 67 67  er);..drop_trigg
4810: 65 72 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  er_cleanup:.  sq
4820: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
4830: 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
4840: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
4850: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4860: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
4870: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 68  for the table th
4880: 61 74 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20  at a trigger.** 
4890: 69 73 20 73 65 74 20 6f 6e 2e 0a 2a 2f 0a 73 74  is set on..*/.st
48a0: 61 74 69 63 20 54 61 62 6c 65 20 2a 74 61 62 6c  atic Table *tabl
48b0: 65 4f 66 54 72 69 67 67 65 72 28 54 72 69 67 67  eOfTrigger(Trigg
48c0: 65 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20  er *pTrigger){. 
48d0: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
48e0: 53 74 72 6c 65 6e 33 30 28 70 54 72 69 67 67 65  Strlen30(pTrigge
48f0: 72 2d 3e 74 61 62 6c 65 29 3b 0a 20 20 72 65 74  r->table);.  ret
4900: 75 72 6e 20 73 71 6c 69 74 65 33 48 61 73 68 46  urn sqlite3HashF
4910: 69 6e 64 28 26 70 54 72 69 67 67 65 72 2d 3e 70  ind(&pTrigger->p
4920: 54 61 62 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  TabSchema->tblHa
4930: 73 68 2c 20 70 54 72 69 67 67 65 72 2d 3e 74 61  sh, pTrigger->ta
4940: 62 6c 65 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ble, n);.}.../*.
4950: 2a 2a 20 44 72 6f 70 20 61 20 74 72 69 67 67 65  ** Drop a trigge
4960: 72 20 67 69 76 65 6e 20 61 20 70 6f 69 6e 74 65  r given a pointe
4970: 72 20 74 6f 20 74 68 61 74 20 74 72 69 67 67 65  r to that trigge
4980: 72 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  r. .*/.void sqli
4990: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74  te3DropTriggerPt
49a0: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
49b0: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
49c0: 65 72 29 7b 0a 20 20 54 61 62 6c 65 20 20 20 2a  er){.  Table   *
49d0: 70 54 61 62 6c 65 3b 0a 20 20 56 64 62 65 20 2a  pTable;.  Vdbe *
49e0: 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
49f0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
4a00: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 44 62   int iDb;..  iDb
4a10: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
4a20: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
4a30: 64 62 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 53  db, pTrigger->pS
4a40: 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74  chema);.  assert
4a50: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
4a60: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 70 54 61  db->nDb );.  pTa
4a70: 62 6c 65 20 3d 20 74 61 62 6c 65 4f 66 54 72 69  ble = tableOfTri
4a80: 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a  gger(pTrigger);.
4a90: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
4aa0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
4ab0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  able->pSchema==p
4ac0: 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
4ad0: 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 23 69   || iDb==1 );.#i
4ae0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4af0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
4b00: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
4b10: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
4b20: 52 49 47 47 45 52 3b 0a 20 20 20 20 63 6f 6e 73  RIGGER;.    cons
4b30: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
4b40: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
4b50: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
4b60: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
4b70: 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
4b80: 69 66 28 20 69 44 62 3d 3d 31 20 29 20 63 6f 64  if( iDb==1 ) cod
4b90: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
4ba0: 54 45 4d 50 5f 54 52 49 47 47 45 52 3b 0a 20 20  TEMP_TRIGGER;.  
4bb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
4bc0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
4bd0: 6f 64 65 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a  ode, pTrigger->z
4be0: 4e 61 6d 65 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  Name, pTable->zN
4bf0: 61 6d 65 2c 20 7a 44 62 29 20 7c 7c 0a 20 20 20  ame, zDb) ||.   
4c00: 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68     sqlite3AuthCh
4c10: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
4c20: 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
4c30: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
4c40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
4c50: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
4c60: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
4c70: 6f 20 64 65 73 74 72 6f 79 20 74 68 65 20 64 61  o destroy the da
4c80: 74 61 62 61 73 65 20 72 65 63 6f 72 64 20 6f 66  tabase record of
4c90: 20 74 68 65 20 74 72 69 67 67 65 72 2e 0a 20 20   the trigger..  
4ca0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
4cb0: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ble!=0 );.  if( 
4cc0: 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  (v = sqlite3GetV
4cd0: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
4ce0: 29 7b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b  ){.    int base;
4cf0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
4d00: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f  t VdbeOpList dro
4d10: 70 54 72 69 67 67 65 72 5b 5d 20 3d 20 7b 0a 20  pTrigger[] = {. 
4d20: 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
4d30: 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29  ,     0, ADDR(9)
4d40: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
4d50: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c  P_String8,    0,
4d60: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   1,        0}, /
4d70: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 1 */.      { O
4d80: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
4d90: 20 31 2c 20 20 20 20 20 20 20 20 32 7d 2c 0a 20   1,        2},. 
4da0: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20       { OP_Ne,   
4db0: 20 20 20 20 20 20 32 2c 20 41 44 44 52 28 38 29        2, ADDR(8)
4dc0: 2c 20 20 31 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  1},.      { O
4dd0: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c  P_String8,    0,
4de0: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   1,        0}, /
4df0: 2a 20 34 3a 20 22 74 72 69 67 67 65 72 22 20 2a  * 4: "trigger" *
4e00: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c  /.      { OP_Col
4e10: 75 6d 6e 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  umn,     0, 0,  
4e20: 20 20 20 20 20 20 32 7d 2c 0a 20 20 20 20 20 20        2},.      
4e30: 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20  { OP_Ne,        
4e40: 20 32 2c 20 41 44 44 52 28 38 29 2c 20 20 31 7d   2, ADDR(8),  1}
4e50: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c  ,.      { OP_Del
4e60: 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ete,     0, 0,  
4e70: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
4e80: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
4e90: 20 30 2c 20 41 44 44 52 28 31 29 2c 20 20 30 7d   0, ADDR(1),  0}
4ea0: 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b  , /* 8 */.    };
4eb0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ..    sqlite3Beg
4ec0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
4ed0: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
4ee0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  ;.    sqlite3Ope
4ef0: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61  nMasterTable(pPa
4f00: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 62  rse, iDb);.    b
4f10: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
4f20: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 20 41  eAddOpList(v,  A
4f30: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 72 69  rraySize(dropTri
4f40: 67 67 65 72 29 2c 20 64 72 6f 70 54 72 69 67 67  gger), dropTrigg
4f50: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
4f60: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4f70: 62 61 73 65 2b 31 2c 20 70 54 72 69 67 67 65 72  base+1, pTrigger
4f80: 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 54 52 41 4e  ->zName, P4_TRAN
4f90: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
4fa0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
4fb0: 76 2c 20 62 61 73 65 2b 34 2c 20 22 74 72 69 67  v, base+4, "trig
4fc0: 67 65 72 22 2c 20 50 34 5f 53 54 41 54 49 43 29  ger", P4_STATIC)
4fd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
4fe0: 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
4ff0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
5000: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5010: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
5020: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5030: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
5040: 6f 70 54 72 69 67 67 65 72 2c 20 69 44 62 2c 20  opTrigger, iDb, 
5050: 30 2c 20 30 2c 20 70 54 72 69 67 67 65 72 2d 3e  0, 0, pTrigger->
5060: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69  zName, 0);.    i
5070: 66 28 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3c  f( pParse->nMem<
5080: 33 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  3 ){.      pPars
5090: 65 2d 3e 6e 4d 65 6d 20 3d 20 33 3b 0a 20 20 20  e->nMem = 3;.   
50a0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
50b0: 52 65 6d 6f 76 65 20 61 20 74 72 69 67 67 65 72  Remove a trigger
50c0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
50d0: 61 62 6c 65 73 20 6f 66 20 74 68 65 20 73 71 6c  ables of the sql
50e0: 69 74 65 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  ite* pointer..*/
50f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
5100: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 72 69 67  inkAndDeleteTrig
5110: 67 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ger(sqlite3 *db,
5120: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
5130: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
5140: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
5150: 72 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68  r;.  Hash *pHash
5160: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
5170: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
5180: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
5190: 29 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 28 64  );.  pHash = &(d
51a0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
51b0: 65 6d 61 2d 3e 74 72 69 67 48 61 73 68 29 3b 0a  ema->trigHash);.
51c0: 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
51d0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70  ite3HashInsert(p
51e0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c  Hash, zName, sql
51f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
5200: 6d 65 29 2c 20 30 29 3b 0a 20 20 69 66 28 20 41  me), 0);.  if( A
5210: 4c 57 41 59 53 28 70 54 72 69 67 67 65 72 29 20  LWAYS(pTrigger) 
5220: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 72 69 67  ){.    if( pTrig
5230: 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ger->pSchema==pT
5240: 72 69 67 67 65 72 2d 3e 70 54 61 62 53 63 68 65  rigger->pTabSche
5250: 6d 61 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  ma ){.      Tabl
5260: 65 20 2a 70 54 61 62 20 3d 20 74 61 62 6c 65 4f  e *pTab = tableO
5270: 66 54 72 69 67 67 65 72 28 70 54 72 69 67 67 65  fTrigger(pTrigge
5280: 72 29 3b 0a 20 20 20 20 20 20 54 72 69 67 67 65  r);.      Trigge
5290: 72 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f  r **pp;.      fo
52a0: 72 28 70 70 3d 26 70 54 61 62 2d 3e 70 54 72 69  r(pp=&pTab->pTri
52b0: 67 67 65 72 3b 20 2a 70 70 21 3d 70 54 72 69 67  gger; *pp!=pTrig
52c0: 67 65 72 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ger; pp=&((*pp)-
52d0: 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
52e0: 2a 70 70 20 3d 20 28 2a 70 70 29 2d 3e 70 4e 65  *pp = (*pp)->pNe
52f0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  xt;.    }.    sq
5300: 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67  lite3DeleteTrigg
5310: 65 72 28 64 62 2c 20 70 54 72 69 67 67 65 72 29  er(db, pTrigger)
5320: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
5330: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
5340: 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a  Changes;.  }.}..
5350: 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20  /*.** pEList is 
5360: 74 68 65 20 53 45 54 20 63 6c 61 75 73 65 20 6f  the SET clause o
5370: 66 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  f an UPDATE stat
5380: 65 6d 65 6e 74 2e 20 20 45 61 63 68 20 65 6e 74  ement.  Each ent
5390: 72 79 0a 2a 2a 20 69 6e 20 70 45 4c 69 73 74 20  ry.** in pEList 
53a0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 61 74  is of the format
53b0: 20 3c 69 64 3e 3d 3c 65 78 70 72 3e 2e 20 20 49   <id>=<expr>.  I
53c0: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 6e 74  f any of the ent
53d0: 72 69 65 73 0a 2a 2a 20 69 6e 20 70 45 4c 69 73  ries.** in pELis
53e0: 74 20 68 61 76 65 20 61 6e 20 3c 69 64 3e 20 77  t have an <id> w
53f0: 68 69 63 68 20 6d 61 74 63 68 65 73 20 61 6e 20  hich matches an 
5400: 69 64 65 6e 74 69 66 69 65 72 20 69 6e 20 70 49  identifier in pI
5410: 64 4c 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72  dList,.** then r
5420: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
5430: 70 49 64 4c 69 73 74 3d 3d 4e 55 4c 4c 2c 20 74  pIdList==NULL, t
5440: 68 65 6e 20 69 74 20 69 73 20 63 6f 6e 73 69 64  hen it is consid
5450: 65 72 65 64 20 61 0a 2a 2a 20 77 69 6c 64 63 61  ered a.** wildca
5460: 72 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  rd that matches 
5470: 61 6e 79 74 68 69 6e 67 2e 20 20 4c 69 6b 65 77  anything.  Likew
5480: 69 73 65 20 69 66 20 70 45 4c 69 73 74 3d 3d 4e  ise if pEList==N
5490: 55 4c 4c 20 74 68 65 6e 0a 2a 2a 20 69 74 20 6d  ULL then.** it m
54a0: 61 74 63 68 65 73 20 61 6e 79 74 68 69 6e 67 20  atches anything 
54b0: 73 6f 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  so always return
54c0: 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20 66   true.  Return f
54d0: 61 6c 73 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20  alse only.** if 
54e0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
54f0: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
5500: 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72   checkColumnOver
5510: 6c 61 70 28 49 64 4c 69 73 74 20 2a 70 49 64 4c  lap(IdList *pIdL
5520: 69 73 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ist, ExprList *p
5530: 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 65 3b  EList){.  int e;
5540: 0a 20 20 69 66 28 20 70 49 64 4c 69 73 74 3d 3d  .  if( pIdList==
5550: 30 20 7c 7c 20 4e 45 56 45 52 28 70 45 4c 69 73  0 || NEVER(pELis
5560: 74 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 31  t==0) ) return 1
5570: 3b 0a 20 20 66 6f 72 28 65 3d 30 3b 20 65 3c 70  ;.  for(e=0; e<p
5580: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 65 2b  EList->nExpr; e+
5590: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
55a0: 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
55b0: 49 64 4c 69 73 74 2c 20 70 45 4c 69 73 74 2d 3e  IdList, pEList->
55c0: 61 5b 65 5d 2e 7a 4e 61 6d 65 29 3e 3d 30 20 29  a[e].zName)>=0 )
55d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
55e0: 20 72 65 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f   return 0; .}../
55f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69  *.** Return a li
5600: 73 74 20 6f 66 20 61 6c 6c 20 74 72 69 67 67 65  st of all trigge
5610: 72 73 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62  rs on table pTab
5620: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
5630: 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65   at least.** one
5640: 20 74 72 69 67 67 65 72 20 74 68 61 74 20 6d 75   trigger that mu
5650: 73 74 20 62 65 20 66 69 72 65 64 20 77 68 65 6e  st be fired when
5660: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66   an operation of
5670: 20 74 79 70 65 20 27 6f 70 27 20 69 73 20 0a 2a   type 'op' is .*
5680: 2a 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  * performed on t
5690: 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 2c 20 69  he table, and, i
56a0: 66 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e  f that operation
56b0: 20 69 73 20 61 6e 20 55 50 44 41 54 45 2c 20 69   is an UPDATE, i
56c0: 66 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 6f 6e  f at.** least on
56d0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  e of the columns
56e0: 20 69 6e 20 70 43 68 61 6e 67 65 73 20 69 73 20   in pChanges is 
56f0: 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a  being modified..
5700: 2a 2f 0a 54 72 69 67 67 65 72 20 2a 73 71 6c 69  */.Trigger *sqli
5710: 74 65 33 54 72 69 67 67 65 72 73 45 78 69 73 74  te3TriggersExist
5720: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5730: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
5740: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
5750: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
5760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5770: 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6e 74 61   table the conta
5780: 69 6e 73 20 74 68 65 20 74 72 69 67 67 65 72 73  ins the triggers
5790: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
57b0: 20 6f 6e 65 20 6f 66 20 54 4b 5f 44 45 4c 45 54   one of TK_DELET
57c0: 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b  E, TK_INSERT, TK
57d0: 5f 55 50 44 41 54 45 20 2a 2f 0a 20 20 45 78 70  _UPDATE */.  Exp
57e0: 72 4c 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c  rList *pChanges,
57f0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20       /* Columns 
5800: 74 68 61 74 20 63 68 61 6e 67 65 20 69 6e 20 61  that change in a
5810: 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
5820: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4d 61  nt */.  int *pMa
5830: 73 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  sk              
5840: 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20  /* OUT: Mask of 
5850: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 7c 54  TRIGGER_BEFORE|T
5860: 52 49 47 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a  RIGGER_AFTER */.
5870: 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20  ){.  int mask = 
5880: 30 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 4c  0;.  Trigger *pL
5890: 69 73 74 20 3d 20 30 3b 0a 20 20 54 72 69 67 67  ist = 0;.  Trigg
58a0: 65 72 20 2a 70 3b 0a 0a 20 20 69 66 28 20 28 70  er *p;..  if( (p
58b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
58c0: 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65   & SQLITE_Enable
58d0: 54 72 69 67 67 65 72 29 21 3d 30 20 29 7b 0a 20  Trigger)!=0 ){. 
58e0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
58f0: 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50  e3TriggerList(pP
5900: 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d  arse, pTab);.  }
5910: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
5920: 3d 3d 30 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  ==0 || IsVirtual
5930: 28 70 54 61 62 29 3d 3d 30 20 29 3b 0a 20 20 66  (pTab)==0 );.  f
5940: 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
5950: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
5960: 69 66 28 20 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26  if( p->op==op &&
5970: 20 63 68 65 63 6b 43 6f 6c 75 6d 6e 4f 76 65 72   checkColumnOver
5980: 6c 61 70 28 70 2d 3e 70 43 6f 6c 75 6d 6e 73 2c  lap(p->pColumns,
5990: 20 70 43 68 61 6e 67 65 73 29 20 29 7b 0a 20 20   pChanges) ){.  
59a0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 70 2d 3e 74      mask |= p->t
59b0: 72 5f 74 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  r_tm;.    }.  }.
59c0: 20 20 69 66 28 20 70 4d 61 73 6b 20 29 7b 0a 20    if( pMask ){. 
59d0: 20 20 20 2a 70 4d 61 73 6b 20 3d 20 6d 61 73 6b     *pMask = mask
59e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
59f0: 6d 61 73 6b 20 3f 20 70 4c 69 73 74 20 3a 20 30  mask ? pList : 0
5a00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  );.}../*.** Conv
5a10: 65 72 74 20 74 68 65 20 70 53 74 65 70 2d 3e 74  ert the pStep->t
5a20: 61 72 67 65 74 20 74 6f 6b 65 6e 20 69 6e 74 6f  arget token into
5a30: 20 61 20 53 72 63 4c 69 73 74 20 61 6e 64 20 72   a SrcList and r
5a40: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
5a50: 2a 2a 20 74 6f 20 74 68 61 74 20 53 72 63 4c 69  ** to that SrcLi
5a60: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  st..**.** This r
5a70: 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 73 70  outine adds a sp
5a80: 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65 20  ecific database 
5a90: 6e 61 6d 65 2c 20 69 66 20 6e 65 65 64 65 64 2c  name, if needed,
5aa0: 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20 77   to the target w
5ab0: 68 65 6e 0a 2a 2a 20 66 6f 72 6d 69 6e 67 20 74  hen.** forming t
5ac0: 68 65 20 53 72 63 4c 69 73 74 2e 20 20 54 68 69  he SrcList.  Thi
5ad0: 73 20 70 72 65 76 65 6e 74 73 20 61 20 74 72 69  s prevents a tri
5ae0: 67 67 65 72 20 69 6e 20 6f 6e 65 20 64 61 74 61  gger in one data
5af0: 62 61 73 65 20 66 72 6f 6d 0a 2a 2a 20 72 65 66  base from.** ref
5b00: 65 72 72 69 6e 67 20 74 6f 20 61 20 74 61 72 67  erring to a targ
5b10: 65 74 20 69 6e 20 61 6e 6f 74 68 65 72 20 64 61  et in another da
5b20: 74 61 62 61 73 65 2e 20 20 41 6e 20 65 78 63 65  tabase.  An exce
5b30: 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 74 68  ption is when th
5b40: 65 0a 2a 2a 20 74 72 69 67 67 65 72 20 69 73 20  e.** trigger is 
5b50: 69 6e 20 54 45 4d 50 20 69 6e 20 77 68 69 63 68  in TEMP in which
5b60: 20 63 61 73 65 20 69 74 20 63 61 6e 20 72 65 66   case it can ref
5b70: 65 72 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20  er to any other 
5b80: 64 61 74 61 62 61 73 65 20 69 74 0a 2a 2a 20 77  database it.** w
5b90: 61 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ants..*/.static 
5ba0: 53 72 63 4c 69 73 74 20 2a 74 61 72 67 65 74 53  SrcList *targetS
5bb0: 72 63 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  rcList(.  Parse 
5bc0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
5bd0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
5be0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67  ntext */.  Trigg
5bf0: 65 72 53 74 65 70 20 2a 70 53 74 65 70 20 20 20  erStep *pStep   
5c00: 2f 2a 20 54 68 65 20 74 72 69 67 67 65 72 20 63  /* The trigger c
5c10: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
5c20: 72 67 65 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  rget token */.){
5c30: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
5c40: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
5c50: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
5c60: 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 53 72 63   to use */.  Src
5c70: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
5c80: 20 20 2f 2a 20 53 72 63 4c 69 73 74 20 74 6f 20    /* SrcList to 
5c90: 62 65 20 72 65 74 75 72 6e 65 64 20 2a 2f 0a 0a  be returned */..
5ca0: 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33    pSrc = sqlite3
5cb0: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50  SrcListAppend(pP
5cc0: 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 26 70 53  arse->db, 0, &pS
5cd0: 74 65 70 2d 3e 74 61 72 67 65 74 2c 20 30 29 3b  tep->target, 0);
5ce0: 0a 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20  .  if( pSrc ){. 
5cf0: 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d     assert( pSrc-
5d00: 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 20 20 61  >nSrc>0 );.    a
5d10: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 21 3d  ssert( pSrc->a!=
5d20: 30 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  0 );.    iDb = s
5d30: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
5d40: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
5d50: 70 53 74 65 70 2d 3e 70 54 72 69 67 2d 3e 70 53  pStep->pTrig->pS
5d60: 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20  chema);.    if( 
5d70: 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 3d 32  iDb==0 || iDb>=2
5d80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5d90: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5da0: 64 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  db;.      assert
5db0: 28 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62  ( iDb<pParse->db
5dc0: 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 70  ->nDb );.      p
5dd0: 53 72 63 2d 3e 61 5b 70 53 72 63 2d 3e 6e 53 72  Src->a[pSrc->nSr
5de0: 63 2d 31 5d 2e 7a 44 61 74 61 62 61 73 65 20 3d  c-1].zDatabase =
5df0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
5e00: 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  (db, db->aDb[iDb
5e10: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
5e20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 53 72    }.  return pSr
5e30: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  c;.}../*.** Gene
5e40: 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66  rate VDBE code f
5e50: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
5e60: 73 20 69 6e 73 69 64 65 20 74 68 65 20 62 6f 64  s inside the bod
5e70: 79 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 0a 2a  y of a single .*
5e80: 2a 20 74 72 69 67 67 65 72 2e 0a 2a 2f 0a 73 74  * trigger..*/.st
5e90: 61 74 69 63 20 69 6e 74 20 63 6f 64 65 54 72 69  atic int codeTri
5ea0: 67 67 65 72 50 72 6f 67 72 61 6d 28 0a 20 20 50  ggerProgram(.  P
5eb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5ed0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
5ee0: 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20  /.  TriggerStep 
5ef0: 2a 70 53 74 65 70 4c 69 73 74 2c 20 20 20 2f 2a  *pStepList,   /*
5f00: 20 4c 69 73 74 20 6f 66 20 73 74 61 74 65 6d 65   List of stateme
5f10: 6e 74 73 20 69 6e 73 69 64 65 20 74 68 65 20 74  nts inside the t
5f20: 72 69 67 67 65 72 20 62 6f 64 79 20 2a 2f 0a 20  rigger body */. 
5f30: 20 69 6e 74 20 6f 72 63 6f 6e 66 20 20 20 20 20   int orconf     
5f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
5f50: 6e 66 6c 69 63 74 20 61 6c 67 6f 72 69 74 68 6d  nflict algorithm
5f60: 2e 20 28 4f 45 5f 41 62 6f 72 74 2c 20 65 74 63  . (OE_Abort, etc
5f70: 29 20 2a 2f 20 20 0a 29 7b 0a 20 20 54 72 69 67  ) */  .){.  Trig
5f80: 67 65 72 53 74 65 70 20 2a 70 53 74 65 70 3b 0a  gerStep *pStep;.
5f90: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5fa0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c  se->pVdbe;.  sql
5fb0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5fc0: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
5fd0: 28 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67  ( pParse->pTrigg
5fe0: 65 72 54 61 62 20 26 26 20 70 50 61 72 73 65 2d  erTab && pParse-
5ff0: 3e 70 54 6f 70 6c 65 76 65 6c 20 29 3b 0a 20 20  >pToplevel );.  
6000: 61 73 73 65 72 74 28 20 70 53 74 65 70 4c 69 73  assert( pStepLis
6010: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  t );.  assert( v
6020: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 53 74  !=0 );.  for(pSt
6030: 65 70 3d 70 53 74 65 70 4c 69 73 74 3b 20 70 53  ep=pStepList; pS
6040: 74 65 70 3b 20 70 53 74 65 70 3d 70 53 74 65 70  tep; pStep=pStep
6050: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
6060: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
6070: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69  ON CONFLICT poli
6080: 63 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  cy that will be 
6090: 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 73 74  used for this st
60a0: 65 70 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ep.    ** of the
60b0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
60c0: 2e 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  . If the stateme
60d0: 6e 74 20 74 68 61 74 20 63 61 75 73 65 64 20 74  nt that caused t
60e0: 68 69 73 20 74 72 69 67 67 65 72 0a 20 20 20 20  his trigger.    
60f0: 2a 2a 20 74 6f 20 66 69 72 65 20 68 61 64 20 61  ** to fire had a
6100: 6e 20 65 78 70 6c 69 63 69 74 20 4f 4e 20 43 4f  n explicit ON CO
6110: 4e 46 4c 49 43 54 2c 20 74 68 65 6e 20 75 73 65  NFLICT, then use
6120: 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   it. Otherwise, 
6130: 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f  use.    ** the O
6140: 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f 6c 69 63  N CONFLICT polic
6150: 79 20 74 68 61 74 20 77 61 73 20 73 70 65 63 69  y that was speci
6160: 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  fied as part of 
6170: 74 68 65 20 74 72 69 67 67 65 72 0a 20 20 20 20  the trigger.    
6180: 2a 2a 20 73 74 65 70 20 73 74 61 74 65 6d 65 6e  ** step statemen
6190: 74 2e 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  t. Example:.    
61a0: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  **.    **   CREA
61b0: 54 45 20 54 52 49 47 47 45 52 20 41 46 54 45 52  TE TRIGGER AFTER
61c0: 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45   INSERT ON t1 BE
61d0: 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20  GIN;.    **     
61e0: 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43  INSERT OR REPLAC
61f0: 45 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  E INTO t2 VALUES
6200: 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a  (new.a, new.b);.
6210: 20 20 20 20 2a 2a 20 20 20 45 4e 44 3b 0a 20 20      **   END;.  
6220: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 49 4e    **.    **   IN
6230: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 2e 2e 2e  SERT INTO t1 ...
6240: 20 3b 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d   ;            --
6250: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 32 20   insert into t2 
6260: 75 73 65 73 20 52 45 50 4c 41 43 45 20 70 6f 6c  uses REPLACE pol
6270: 69 63 79 0a 20 20 20 20 2a 2a 20 20 20 49 4e 53  icy.    **   INS
6280: 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e  ERT OR IGNORE IN
6290: 54 4f 20 74 31 20 2e 2e 2e 20 3b 20 20 2d 2d 20  TO t1 ... ;  -- 
62a0: 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 32 20 75  insert into t2 u
62b0: 73 65 73 20 49 47 4e 4f 52 45 20 70 6f 6c 69 63  ses IGNORE polic
62c0: 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  y.    */.    pPa
62d0: 72 73 65 2d 3e 65 4f 72 63 6f 6e 66 20 3d 20 28  rse->eOrconf = (
62e0: 6f 72 63 6f 6e 66 3d 3d 4f 45 5f 44 65 66 61 75  orconf==OE_Defau
62f0: 6c 74 29 3f 70 53 74 65 70 2d 3e 6f 72 63 6f 6e  lt)?pStep->orcon
6300: 66 3a 28 75 38 29 6f 72 63 6f 6e 66 3b 0a 0a 20  f:(u8)orconf;.. 
6310: 20 20 20 73 77 69 74 63 68 28 20 70 53 74 65 70     switch( pStep
6320: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 63 61  ->op ){.      ca
6330: 73 65 20 54 4b 5f 55 50 44 41 54 45 3a 20 7b 0a  se TK_UPDATE: {.
6340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 55          sqlite3U
6350: 70 64 61 74 65 28 70 50 61 72 73 65 2c 20 0a 20  pdate(pParse, . 
6360: 20 20 20 20 20 20 20 20 20 74 61 72 67 65 74 53           targetS
6370: 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  rcList(pParse, p
6380: 53 74 65 70 29 2c 0a 20 20 20 20 20 20 20 20 20  Step),.         
6390: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
63a0: 44 75 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70  Dup(db, pStep->p
63b0: 45 78 70 72 4c 69 73 74 2c 20 30 29 2c 20 0a 20  ExprList, 0), . 
63c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
63d0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 65  ExprDup(db, pSte
63e0: 70 2d 3e 70 57 68 65 72 65 2c 20 30 29 2c 20 0a  p->pWhere, 0), .
63f0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
6400: 2d 3e 65 4f 72 63 6f 6e 66 0a 20 20 20 20 20 20  ->eOrconf.      
6410: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65    );.        bre
6420: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6430: 20 20 63 61 73 65 20 54 4b 5f 49 4e 53 45 52 54    case TK_INSERT
6440: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
6450: 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65  te3Insert(pParse
6460: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 74 61 72  , .          tar
6470: 67 65 74 53 72 63 4c 69 73 74 28 70 50 61 72 73  getSrcList(pPars
6480: 65 2c 20 70 53 74 65 70 29 2c 0a 20 20 20 20 20  e, pStep),.     
6490: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
64a0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 74 65  ListDup(db, pSte
64b0: 70 2d 3e 70 45 78 70 72 4c 69 73 74 2c 20 30 29  p->pExprList, 0)
64c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
64d0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
64e0: 2c 20 70 53 74 65 70 2d 3e 70 53 65 6c 65 63 74  , pStep->pSelect
64f0: 2c 20 30 29 2c 20 0a 20 20 20 20 20 20 20 20 20  , 0), .         
6500: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
6510: 70 28 64 62 2c 20 70 53 74 65 70 2d 3e 70 49 64  p(db, pStep->pId
6520: 4c 69 73 74 29 2c 20 0a 20 20 20 20 20 20 20 20  List), .        
6530: 20 20 70 50 61 72 73 65 2d 3e 65 4f 72 63 6f 6e    pParse->eOrcon
6540: 66 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  f.        );.   
6550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6560: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54    }.      case T
6570: 4b 5f 44 45 4c 45 54 45 3a 20 7b 0a 20 20 20 20  K_DELETE: {.    
6580: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
6590: 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 0a 20  eFrom(pParse, . 
65a0: 20 20 20 20 20 20 20 20 20 74 61 72 67 65 74 53           targetS
65b0: 72 63 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  rcList(pParse, p
65c0: 53 74 65 70 29 2c 0a 20 20 20 20 20 20 20 20 20  Step),.         
65d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
65e0: 64 62 2c 20 70 53 74 65 70 2d 3e 70 57 68 65 72  db, pStep->pWher
65f0: 65 2c 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b  e, 0).        );
6600: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
6620: 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
6630: 53 74 65 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Step->op==TK_SEL
6640: 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 20  ECT ); {.       
6650: 20 53 65 6c 65 63 74 44 65 73 74 20 73 44 65 73   SelectDest sDes
6660: 74 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  t;.        Selec
6670: 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  t *pSelect = sql
6680: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
6690: 2c 20 70 53 74 65 70 2d 3e 70 53 65 6c 65 63 74  , pStep->pSelect
66a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
66b0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
66c0: 6e 69 74 28 26 73 44 65 73 74 2c 20 53 52 54 5f  nit(&sDest, SRT_
66d0: 44 69 73 63 61 72 64 2c 20 30 29 3b 0a 20 20 20  Discard, 0);.   
66e0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
66f0: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
6700: 63 74 2c 20 26 73 44 65 73 74 29 3b 0a 20 20 20  ct, &sDest);.   
6710: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
6720: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
6730: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  lect);.        b
6740: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
6750: 20 20 7d 20 0a 20 20 20 20 69 66 28 20 70 53 74    } .    if( pSt
6760: 65 70 2d 3e 6f 70 21 3d 54 4b 5f 53 45 4c 45 43  ep->op!=TK_SELEC
6770: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
6780: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
6790: 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 29 3b 0a  OP_ResetCount);.
67a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
67b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn 0;.}..#ifdef
67c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
67d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
67e0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
67f0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 29 20 61   VdbeComment() a
6800: 6e 6e 6f 74 61 74 69 6f 6e 73 20 74 6f 20 61 20  nnotations to a 
6810: 56 44 42 45 0a 2a 2a 20 70 72 6f 67 72 61 6d 2e  VDBE.** program.
6820: 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20   It is not used 
6830: 69 6e 20 70 72 6f 64 75 63 74 69 6f 6e 20 63 6f  in production co
6840: 64 65 2c 20 6f 6e 6c 79 20 66 6f 72 20 64 65 62  de, only for deb
6850: 75 67 67 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ugging..*/.stati
6860: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 6e  c const char *on
6870: 45 72 72 6f 72 54 65 78 74 28 69 6e 74 20 6f 6e  ErrorText(int on
6880: 45 72 72 6f 72 29 7b 0a 20 20 73 77 69 74 63 68  Error){.  switch
6890: 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ( onError ){.   
68a0: 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20   case OE_Abort: 
68b0: 20 20 20 72 65 74 75 72 6e 20 22 61 62 6f 72 74     return "abort
68c0: 22 3b 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52  ";.    case OE_R
68d0: 6f 6c 6c 62 61 63 6b 3a 20 72 65 74 75 72 6e 20  ollback: return 
68e0: 22 72 6f 6c 6c 62 61 63 6b 22 3b 0a 20 20 20 20  "rollback";.    
68f0: 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 20 20  case OE_Fail:   
6900: 20 20 72 65 74 75 72 6e 20 22 66 61 69 6c 22 3b    return "fail";
6910: 0a 20 20 20 20 63 61 73 65 20 4f 45 5f 52 65 70  .    case OE_Rep
6920: 6c 61 63 65 3a 20 20 72 65 74 75 72 6e 20 22 72  lace:  return "r
6930: 65 70 6c 61 63 65 22 3b 0a 20 20 20 20 63 61 73  eplace";.    cas
6940: 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 72  e OE_Ignore:   r
6950: 65 74 75 72 6e 20 22 69 67 6e 6f 72 65 22 3b 0a  eturn "ignore";.
6960: 20 20 20 20 63 61 73 65 20 4f 45 5f 44 65 66 61      case OE_Defa
6970: 75 6c 74 3a 20 20 72 65 74 75 72 6e 20 22 64 65  ult:  return "de
6980: 66 61 75 6c 74 22 3b 0a 20 20 7d 0a 20 20 72 65  fault";.  }.  re
6990: 74 75 72 6e 20 22 6e 2f 61 22 3b 0a 7d 0a 23 65  turn "n/a";.}.#e
69a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  ndif../*.** Pars
69b0: 65 20 63 6f 6e 74 65 78 74 20 73 74 72 75 63 74  e context struct
69c0: 75 72 65 20 70 46 72 6f 6d 20 68 61 73 20 6a 75  ure pFrom has ju
69d0: 73 74 20 62 65 65 6e 20 75 73 65 64 20 74 6f 20  st been used to 
69e0: 63 72 65 61 74 65 20 61 20 73 75 62 2d 76 64 62  create a sub-vdb
69f0: 65 0a 2a 2a 20 28 74 72 69 67 67 65 72 20 70 72  e.** (trigger pr
6a00: 6f 67 72 61 6d 29 2e 20 49 66 20 61 6e 20 65 72  ogram). If an er
6a10: 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
6a20: 2c 20 74 72 61 6e 73 66 65 72 20 65 72 72 6f 72  , transfer error
6a30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
6a40: 66 72 6f 6d 20 70 46 72 6f 6d 20 74 6f 20 70 54  from pFrom to pT
6a50: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
6a60: 64 20 74 72 61 6e 73 66 65 72 50 61 72 73 65 45  d transferParseE
6a70: 72 72 6f 72 28 50 61 72 73 65 20 2a 70 54 6f 2c  rror(Parse *pTo,
6a80: 20 50 61 72 73 65 20 2a 70 46 72 6f 6d 29 7b 0a   Parse *pFrom){.
6a90: 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
6aa0: 3e 7a 45 72 72 4d 73 67 3d 3d 30 20 7c 7c 20 70  >zErrMsg==0 || p
6ab0: 46 72 6f 6d 2d 3e 6e 45 72 72 20 29 3b 0a 20 20  From->nErr );.  
6ac0: 61 73 73 65 72 74 28 20 70 54 6f 2d 3e 7a 45 72  assert( pTo->zEr
6ad0: 72 4d 73 67 3d 3d 30 20 7c 7c 20 70 54 6f 2d 3e  rMsg==0 || pTo->
6ae0: 6e 45 72 72 20 29 3b 0a 20 20 69 66 28 20 70 54  nErr );.  if( pT
6af0: 6f 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  o->nErr==0 ){.  
6b00: 20 20 70 54 6f 2d 3e 7a 45 72 72 4d 73 67 20 3d    pTo->zErrMsg =
6b10: 20 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d 73 67 3b   pFrom->zErrMsg;
6b20: 0a 20 20 20 20 70 54 6f 2d 3e 6e 45 72 72 20 3d  .    pTo->nErr =
6b30: 20 70 46 72 6f 6d 2d 3e 6e 45 72 72 3b 0a 20 20   pFrom->nErr;.  
6b40: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
6b50: 65 33 44 62 46 72 65 65 28 70 46 72 6f 6d 2d 3e  e3DbFree(pFrom->
6b60: 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 45 72 72 4d  db, pFrom->zErrM
6b70: 73 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  sg);.  }.}../*.*
6b80: 2a 20 43 72 65 61 74 65 20 61 6e 64 20 70 6f 70  * Create and pop
6b90: 75 6c 61 74 65 20 61 20 6e 65 77 20 54 72 69 67  ulate a new Trig
6ba0: 67 65 72 50 72 67 20 6f 62 6a 65 63 74 20 77 69  gerPrg object wi
6bb0: 74 68 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d  th a sub-program
6bc0: 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e   .** implementin
6bd0: 67 20 74 72 69 67 67 65 72 20 70 54 72 69 67 67  g trigger pTrigg
6be0: 65 72 20 77 69 74 68 20 4f 4e 20 43 4f 4e 46 4c  er with ON CONFL
6bf0: 49 43 54 20 70 6f 6c 69 63 79 20 6f 72 63 6f 6e  ICT policy orcon
6c00: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 72 69  f..*/.static Tri
6c10: 67 67 65 72 50 72 67 20 2a 63 6f 64 65 52 6f 77  ggerPrg *codeRow
6c20: 54 72 69 67 67 65 72 28 0a 20 20 50 61 72 73 65  Trigger(.  Parse
6c30: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
6c40: 2f 2a 20 43 75 72 72 65 6e 74 20 70 61 72 73 65  /* Current parse
6c50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 72   context */.  Tr
6c60: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 2c  igger *pTrigger,
6c70: 20 20 20 2f 2a 20 54 72 69 67 67 65 72 20 74 6f     /* Trigger to
6c80: 20 63 6f 64 65 20 2a 2f 0a 20 20 54 61 62 6c 65   code */.  Table
6c90: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
6ca0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 54 72  /* The table pTr
6cb0: 69 67 67 65 72 20 69 73 20 61 74 74 61 63 68 65  igger is attache
6cc0: 64 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  d to */.  int or
6cd0: 63 6f 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f  conf           /
6ce0: 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f  * ON CONFLICT po
6cf0: 6c 69 63 79 20 74 6f 20 63 6f 64 65 20 74 72 69  licy to code tri
6d00: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 77 69 74  gger program wit
6d10: 68 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  h */.){.  Parse 
6d20: 2a 70 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 50  *pTop = sqlite3P
6d30: 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
6d40: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  rse);.  sqlite3 
6d50: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6d60: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
6d70: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 72 69 67  handle */.  Trig
6d80: 67 65 72 50 72 67 20 2a 70 50 72 67 3b 20 20 20  gerPrg *pPrg;   
6d90: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
6da0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
6db0: 45 78 70 72 20 2a 70 57 68 65 6e 20 3d 20 30 3b  Expr *pWhen = 0;
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
6dd0: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 72 69 67  uplicate of trig
6de0: 67 65 72 20 57 48 45 4e 20 65 78 70 72 65 73 73  ger WHEN express
6df0: 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
6e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6e10: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
6e20: 79 20 56 4d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  y VM */.  NameCo
6e30: 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20  ntext sNC;      
6e40: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f        /* Name co
6e50: 6e 74 65 78 74 20 66 6f 72 20 73 75 62 2d 76 64  ntext for sub-vd
6e60: 62 65 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  be */.  SubProgr
6e70: 61 6d 20 2a 70 50 72 6f 67 72 61 6d 20 3d 20 30  am *pProgram = 0
6e80: 3b 20 20 20 2f 2a 20 53 75 62 2d 76 64 62 65 20  ;   /* Sub-vdbe 
6e90: 66 6f 72 20 74 72 69 67 67 65 72 20 70 72 6f 67  for trigger prog
6ea0: 72 61 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ram */.  Parse *
6eb0: 70 53 75 62 50 61 72 73 65 3b 20 20 20 20 20 20  pSubParse;      
6ec0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
6ed0: 6e 74 65 78 74 20 66 6f 72 20 73 75 62 2d 76 64  ntext for sub-vd
6ee0: 62 65 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  be */.  int iEnd
6ef0: 54 72 69 67 67 65 72 20 3d 20 30 3b 20 20 20 20  Trigger = 0;    
6f00: 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 74 6f 20      /* Label to 
6f10: 6a 75 6d 70 20 74 6f 20 69 66 20 57 48 45 4e 20  jump to if WHEN 
6f20: 69 73 20 66 61 6c 73 65 20 2a 2f 0a 0a 20 20 61  is false */..  a
6f30: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
6f40: 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 54 61  >zName==0 || pTa
6f50: 62 3d 3d 74 61 62 6c 65 4f 66 54 72 69 67 67 65  b==tableOfTrigge
6f60: 72 28 70 54 72 69 67 67 65 72 29 20 29 3b 0a 20  r(pTrigger) );. 
6f70: 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 70   assert( pTop->p
6f80: 56 64 62 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  Vdbe );..  /* Al
6f90: 6c 6f 63 61 74 65 20 74 68 65 20 54 72 69 67 67  locate the Trigg
6fa0: 65 72 50 72 67 20 61 6e 64 20 53 75 62 50 72 6f  erPrg and SubPro
6fb0: 67 72 61 6d 20 6f 62 6a 65 63 74 73 2e 20 54 6f  gram objects. To
6fc0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
6fd0: 79 0a 20 20 2a 2a 20 61 72 65 20 66 72 65 65 64  y.  ** are freed
6fe0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
6ff0: 75 72 73 2c 20 6c 69 6e 6b 20 74 68 65 6d 20 69  urs, link them i
7000: 6e 74 6f 20 74 68 65 20 50 61 72 73 65 2e 70 54  nto the Parse.pT
7010: 72 69 67 67 65 72 50 72 67 20 0a 20 20 2a 2a 20  riggerPrg .  ** 
7020: 6c 69 73 74 20 6f 66 20 74 68 65 20 74 6f 70 2d  list of the top-
7030: 6c 65 76 65 6c 20 50 61 72 73 65 20 6f 62 6a 65  level Parse obje
7040: 63 74 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  ct sooner rather
7050: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 20 2a 2f   than later.  */
7060: 0a 20 20 70 50 72 67 20 3d 20 73 71 6c 69 74 65  .  pPrg = sqlite
7070: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
7080: 2c 20 73 69 7a 65 6f 66 28 54 72 69 67 67 65 72  , sizeof(Trigger
7090: 50 72 67 29 29 3b 0a 20 20 69 66 28 20 21 70 50  Prg));.  if( !pP
70a0: 72 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rg ) return 0;. 
70b0: 20 70 50 72 67 2d 3e 70 4e 65 78 74 20 3d 20 70   pPrg->pNext = p
70c0: 54 6f 70 2d 3e 70 54 72 69 67 67 65 72 50 72 67  Top->pTriggerPrg
70d0: 3b 0a 20 20 70 54 6f 70 2d 3e 70 54 72 69 67 67  ;.  pTop->pTrigg
70e0: 65 72 50 72 67 20 3d 20 70 50 72 67 3b 0a 20 20  erPrg = pPrg;.  
70f0: 70 50 72 67 2d 3e 70 50 72 6f 67 72 61 6d 20 3d  pPrg->pProgram =
7100: 20 70 50 72 6f 67 72 61 6d 20 3d 20 73 71 6c 69   pProgram = sqli
7110: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7120: 64 62 2c 20 73 69 7a 65 6f 66 28 53 75 62 50 72  db, sizeof(SubPr
7130: 6f 67 72 61 6d 29 29 3b 0a 20 20 69 66 28 20 21  ogram));.  if( !
7140: 70 50 72 6f 67 72 61 6d 20 29 20 72 65 74 75 72  pProgram ) retur
7150: 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  n 0;.  sqlite3Vd
7160: 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d  beLinkSubProgram
7170: 28 70 54 6f 70 2d 3e 70 56 64 62 65 2c 20 70 50  (pTop->pVdbe, pP
7180: 72 6f 67 72 61 6d 29 3b 0a 20 20 70 50 72 67 2d  rogram);.  pPrg-
7190: 3e 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69  >pTrigger = pTri
71a0: 67 67 65 72 3b 0a 20 20 70 50 72 67 2d 3e 6f 72  gger;.  pPrg->or
71b0: 63 6f 6e 66 20 3d 20 6f 72 63 6f 6e 66 3b 0a 20  conf = orconf;. 
71c0: 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73 6b 5b   pPrg->aColmask[
71d0: 30 5d 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  0] = 0xffffffff;
71e0: 0a 20 20 70 50 72 67 2d 3e 61 43 6f 6c 6d 61 73  .  pPrg->aColmas
71f0: 6b 5b 31 5d 20 3d 20 30 78 66 66 66 66 66 66 66  k[1] = 0xfffffff
7200: 66 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  f;..  /* Allocat
7210: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  e and populate a
7220: 20 6e 65 77 20 50 61 72 73 65 20 63 6f 6e 74 65   new Parse conte
7230: 78 74 20 74 6f 20 75 73 65 20 66 6f 72 20 63 6f  xt to use for co
7240: 64 69 6e 67 20 74 68 65 20 0a 20 20 2a 2a 20 74  ding the .  ** t
7250: 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72  rigger sub-progr
7260: 61 6d 2e 20 20 2a 2f 0a 20 20 70 53 75 62 50 61  am.  */.  pSubPa
7270: 72 73 65 20 3d 20 73 71 6c 69 74 65 33 53 74 61  rse = sqlite3Sta
7280: 63 6b 41 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  ckAllocZero(db, 
7290: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 29 3b 0a  sizeof(Parse));.
72a0: 20 20 69 66 28 20 21 70 53 75 62 50 61 72 73 65    if( !pSubParse
72b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d   ) return 0;.  m
72c0: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
72d0: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73  izeof(sNC));.  s
72e0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 53 75 62  NC.pParse = pSub
72f0: 50 61 72 73 65 3b 0a 20 20 70 53 75 62 50 61 72  Parse;.  pSubPar
7300: 73 65 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70  se->db = db;.  p
7310: 53 75 62 50 61 72 73 65 2d 3e 70 54 72 69 67 67  SubParse->pTrigg
7320: 65 72 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  erTab = pTab;.  
7330: 70 53 75 62 50 61 72 73 65 2d 3e 70 54 6f 70 6c  pSubParse->pTopl
7340: 65 76 65 6c 20 3d 20 70 54 6f 70 3b 0a 20 20 70  evel = pTop;.  p
7350: 53 75 62 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  SubParse->zAuthC
7360: 6f 6e 74 65 78 74 20 3d 20 70 54 72 69 67 67 65  ontext = pTrigge
7370: 72 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 70 53 75 62  r->zName;.  pSub
7380: 50 61 72 73 65 2d 3e 65 54 72 69 67 67 65 72 4f  Parse->eTriggerO
7390: 70 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 6f 70  p = pTrigger->op
73a0: 3b 0a 20 20 70 53 75 62 50 61 72 73 65 2d 3e 6e  ;.  pSubParse->n
73b0: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72  QueryLoop = pPar
73c0: 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a  se->nQueryLoop;.
73d0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
73e0: 74 56 64 62 65 28 70 53 75 62 50 61 72 73 65 29  tVdbe(pSubParse)
73f0: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
7400: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
7410: 20 22 53 74 61 72 74 3a 20 25 73 2e 25 73 20 28   "Start: %s.%s (
7420: 25 73 20 25 73 25 73 25 73 20 4f 4e 20 25 73 29  %s %s%s%s ON %s)
7430: 22 2c 20 0a 20 20 20 20 20 20 70 54 72 69 67 67  ", .      pTrigg
7440: 65 72 2d 3e 7a 4e 61 6d 65 2c 20 6f 6e 45 72 72  er->zName, onErr
7450: 6f 72 54 65 78 74 28 6f 72 63 6f 6e 66 29 2c 0a  orText(orconf),.
7460: 20 20 20 20 20 20 28 70 54 72 69 67 67 65 72 2d        (pTrigger-
7470: 3e 74 72 5f 74 6d 3d 3d 54 52 49 47 47 45 52 5f  >tr_tm==TRIGGER_
7480: 42 45 46 4f 52 45 20 3f 20 22 42 45 46 4f 52 45  BEFORE ? "BEFORE
7490: 22 20 3a 20 22 41 46 54 45 52 22 29 2c 0a 20 20  " : "AFTER"),.  
74a0: 20 20 20 20 20 20 28 70 54 72 69 67 67 65 72 2d        (pTrigger-
74b0: 3e 6f 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 3f  >op==TK_UPDATE ?
74c0: 20 22 55 50 44 41 54 45 22 20 3a 20 22 22 29 2c   "UPDATE" : ""),
74d0: 0a 20 20 20 20 20 20 20 20 28 70 54 72 69 67 67  .        (pTrigg
74e0: 65 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52  er->op==TK_INSER
74f0: 54 20 3f 20 22 49 4e 53 45 52 54 22 20 3a 20 22  T ? "INSERT" : "
7500: 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 54 72  "),.        (pTr
7510: 69 67 67 65 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 45  igger->op==TK_DE
7520: 4c 45 54 45 20 3f 20 22 44 45 4c 45 54 45 22 20  LETE ? "DELETE" 
7530: 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 70 54 61  : ""),.      pTa
7540: 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  b->zName.    ));
7550: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7560: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 73  OMIT_TRACE.    s
7570: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7580: 50 34 28 76 2c 20 2d 31 2c 20 0a 20 20 20 20 20  P4(v, -1, .     
7590: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
75a0: 64 62 2c 20 22 2d 2d 20 54 52 49 47 47 45 52 20  db, "-- TRIGGER 
75b0: 25 73 22 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a  %s", pTrigger->z
75c0: 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49  Name), P4_DYNAMI
75d0: 43 0a 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a  C.    );.#endif.
75e0: 0a 20 20 20 20 2f 2a 20 49 66 20 6f 6e 65 20 77  .    /* If one w
75f0: 61 73 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f  as specified, co
7600: 64 65 20 74 68 65 20 57 48 45 4e 20 63 6c 61 75  de the WHEN clau
7610: 73 65 2e 20 49 66 20 69 74 20 65 76 61 6c 75 61  se. If it evalua
7620: 74 65 73 20 74 6f 20 66 61 6c 73 65 0a 20 20 20  tes to false.   
7630: 20 2a 2a 20 28 6f 72 20 4e 55 4c 4c 29 20 74 68   ** (or NULL) th
7640: 65 20 73 75 62 2d 76 64 62 65 20 69 73 20 69 6d  e sub-vdbe is im
7650: 6d 65 64 69 61 74 65 6c 79 20 68 61 6c 74 65 64  mediately halted
7660: 20 62 79 20 6a 75 6d 70 69 6e 67 20 74 6f 20 74   by jumping to t
7670: 68 65 20 0a 20 20 20 20 2a 2a 20 4f 50 5f 48 61  he .    ** OP_Ha
7680: 6c 74 20 69 6e 73 65 72 74 65 64 20 61 74 20 74  lt inserted at t
7690: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72  he end of the pr
76a0: 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20 69  ogram.  */.    i
76b0: 66 28 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68  f( pTrigger->pWh
76c0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65  en ){.      pWhe
76d0: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
76e0: 75 70 28 64 62 2c 20 70 54 72 69 67 67 65 72 2d  up(db, pTrigger-
76f0: 3e 70 57 68 65 6e 2c 20 30 29 3b 0a 20 20 20 20  >pWhen, 0);.    
7700: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
7710: 3d 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45  =sqlite3ResolveE
7720: 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  xprNames(&sNC, p
7730: 57 68 65 6e 29 20 0a 20 20 20 20 20 20 20 26 26  When) .       &&
7740: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7750: 64 3d 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20  d==0 .      ){. 
7760: 20 20 20 20 20 20 20 69 45 6e 64 54 72 69 67 67         iEndTrigg
7770: 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  er = sqlite3Vdbe
7780: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
7790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
77a0: 72 49 66 46 61 6c 73 65 28 70 53 75 62 50 61 72  rIfFalse(pSubPar
77b0: 73 65 2c 20 70 57 68 65 6e 2c 20 69 45 6e 64 54  se, pWhen, iEndT
77c0: 72 69 67 67 65 72 2c 20 53 51 4c 49 54 45 5f 4a  rigger, SQLITE_J
77d0: 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
77e0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
77f0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
7800: 70 57 68 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  pWhen);.    }.. 
7810: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 74     /* Code the t
7820: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 69  rigger program i
7830: 6e 74 6f 20 74 68 65 20 73 75 62 2d 76 64 62 65  nto the sub-vdbe
7840: 2e 20 2a 2f 0a 20 20 20 20 63 6f 64 65 54 72 69  . */.    codeTri
7850: 67 67 65 72 50 72 6f 67 72 61 6d 28 70 53 75 62  ggerProgram(pSub
7860: 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 2d  Parse, pTrigger-
7870: 3e 73 74 65 70 5f 6c 69 73 74 2c 20 6f 72 63 6f  >step_list, orco
7880: 6e 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73  nf);..    /* Ins
7890: 65 72 74 20 61 6e 20 4f 50 5f 48 61 6c 74 20 61  ert an OP_Halt a
78a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
78b0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 2a 2f   sub-program. */
78c0: 0a 20 20 20 20 69 66 28 20 69 45 6e 64 54 72 69  .    if( iEndTri
78d0: 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  gger ){.      sq
78e0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
78f0: 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 54 72 69  Label(v, iEndTri
7900: 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gger);.    }.   
7910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7920: 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a  p0(v, OP_Halt);.
7930: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
7940: 28 76 2c 20 22 45 6e 64 3a 20 25 73 2e 25 73 22  (v, "End: %s.%s"
7950: 2c 20 70 54 72 69 67 67 65 72 2d 3e 7a 4e 61 6d  , pTrigger->zNam
7960: 65 2c 20 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f  e, onErrorText(o
7970: 72 63 6f 6e 66 29 29 29 3b 0a 0a 20 20 20 20 74  rconf)));..    t
7980: 72 61 6e 73 66 65 72 50 61 72 73 65 45 72 72 6f  ransferParseErro
7990: 72 28 70 50 61 72 73 65 2c 20 70 53 75 62 50 61  r(pParse, pSubPa
79a0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62  rse);.    if( db
79b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
79c0: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 72 6f 67  0 ){.      pProg
79d0: 72 61 6d 2d 3e 61 4f 70 20 3d 20 73 71 6c 69 74  ram->aOp = sqlit
79e0: 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61  e3VdbeTakeOpArra
79f0: 79 28 76 2c 20 26 70 50 72 6f 67 72 61 6d 2d 3e  y(v, &pProgram->
7a00: 6e 4f 70 2c 20 26 70 54 6f 70 2d 3e 6e 4d 61 78  nOp, &pTop->nMax
7a10: 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Arg);.    }.    
7a20: 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 3d  pProgram->nMem =
7a30: 20 70 53 75 62 50 61 72 73 65 2d 3e 6e 4d 65 6d   pSubParse->nMem
7a40: 3b 0a 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e  ;.    pProgram->
7a50: 6e 43 73 72 20 3d 20 70 53 75 62 50 61 72 73 65  nCsr = pSubParse
7a60: 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 70 50 72 6f  ->nTab;.    pPro
7a70: 67 72 61 6d 2d 3e 6e 4f 6e 63 65 20 3d 20 70 53  gram->nOnce = pS
7a80: 75 62 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a  ubParse->nOnce;.
7a90: 20 20 20 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f      pProgram->to
7aa0: 6b 65 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 54  ken = (void *)pT
7ab0: 72 69 67 67 65 72 3b 0a 20 20 20 20 70 50 72 67  rigger;.    pPrg
7ac0: 2d 3e 61 43 6f 6c 6d 61 73 6b 5b 30 5d 20 3d 20  ->aColmask[0] = 
7ad0: 70 53 75 62 50 61 72 73 65 2d 3e 6f 6c 64 6d 61  pSubParse->oldma
7ae0: 73 6b 3b 0a 20 20 20 20 70 50 72 67 2d 3e 61 43  sk;.    pPrg->aC
7af0: 6f 6c 6d 61 73 6b 5b 31 5d 20 3d 20 70 53 75 62  olmask[1] = pSub
7b00: 50 61 72 73 65 2d 3e 6e 65 77 6d 61 73 6b 3b 0a  Parse->newmask;.
7b10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
7b20: 65 6c 65 74 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  elete(v);.  }.. 
7b30: 20 61 73 73 65 72 74 28 20 21 70 53 75 62 50 61   assert( !pSubPa
7b40: 72 73 65 2d 3e 70 41 69 6e 63 20 20 20 20 20 20  rse->pAinc      
7b50: 20 26 26 20 21 70 53 75 62 50 61 72 73 65 2d 3e   && !pSubParse->
7b60: 70 5a 6f 6d 62 69 65 54 61 62 20 29 3b 0a 20 20  pZombieTab );.  
7b70: 61 73 73 65 72 74 28 20 21 70 53 75 62 50 61 72  assert( !pSubPar
7b80: 73 65 2d 3e 70 54 72 69 67 67 65 72 50 72 67 20  se->pTriggerPrg 
7b90: 26 26 20 21 70 53 75 62 50 61 72 73 65 2d 3e 6e  && !pSubParse->n
7ba0: 4d 61 78 41 72 67 20 29 3b 0a 20 20 73 71 6c 69  MaxArg );.  sqli
7bb0: 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c  te3StackFree(db,
7bc0: 20 70 53 75 62 50 61 72 73 65 29 3b 0a 0a 20 20   pSubParse);..  
7bd0: 72 65 74 75 72 6e 20 70 50 72 67 3b 0a 7d 0a 20  return pPrg;.}. 
7be0: 20 20 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e     ./*.** Return
7bf0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7c00: 54 72 69 67 67 65 72 50 72 67 20 6f 62 6a 65 63  TriggerPrg objec
7c10: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
7c20: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 66 6f 72   sub-program for
7c30: 0a 2a 2a 20 74 72 69 67 67 65 72 20 70 54 72 69  .** trigger pTri
7c40: 67 67 65 72 20 77 69 74 68 20 64 65 66 61 75 6c  gger with defaul
7c50: 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c  t ON CONFLICT al
7c60: 67 6f 72 69 74 68 6d 20 6f 72 63 6f 6e 66 2e 20  gorithm orconf. 
7c70: 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 54 72  If no such.** Tr
7c80: 69 67 67 65 72 50 72 67 20 6f 62 6a 65 63 74 20  iggerPrg object 
7c90: 65 78 69 73 74 73 2c 20 61 20 6e 65 77 20 6f 62  exists, a new ob
7ca0: 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
7cb0: 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  d and populated 
7cc0: 62 65 66 6f 72 65 0a 2a 2a 20 62 65 69 6e 67 20  before.** being 
7cd0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
7ce0: 74 69 63 20 54 72 69 67 67 65 72 50 72 67 20 2a  tic TriggerPrg *
7cf0: 67 65 74 52 6f 77 54 72 69 67 67 65 72 28 0a 20  getRowTrigger(. 
7d00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7d10: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7d20: 20 70 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   parse context *
7d30: 2f 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  /.  Trigger *pTr
7d40: 69 67 67 65 72 2c 20 20 20 2f 2a 20 54 72 69 67  igger,   /* Trig
7d50: 67 65 72 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20  ger to code */. 
7d60: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
7d70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
7d80: 6c 65 20 74 72 69 67 67 65 72 20 70 54 72 69 67  le trigger pTrig
7d90: 67 65 72 20 69 73 20 61 74 74 61 63 68 65 64 20  ger is attached 
7da0: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f  to */.  int orco
7db0: 6e 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nf           /* 
7dc0: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 61 6c 67 6f  ON CONFLICT algo
7dd0: 72 69 74 68 6d 2e 20 2a 2f 0a 29 7b 0a 20 20 50  rithm. */.){.  P
7de0: 61 72 73 65 20 2a 70 52 6f 6f 74 20 3d 20 73 71  arse *pRoot = sq
7df0: 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
7e00: 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 54 72  el(pParse);.  Tr
7e10: 69 67 67 65 72 50 72 67 20 2a 70 50 72 67 3b 0a  iggerPrg *pPrg;.
7e20: 0a 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67  .  assert( pTrig
7e30: 67 65 72 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  ger->zName==0 ||
7e40: 20 70 54 61 62 3d 3d 74 61 62 6c 65 4f 66 54 72   pTab==tableOfTr
7e50: 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29 20  igger(pTrigger) 
7e60: 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 6d 61 79 20  );..  /* It may 
7e70: 62 65 20 74 68 61 74 20 74 68 69 73 20 74 72 69  be that this tri
7e80: 67 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  gger has already
7e90: 20 62 65 65 6e 20 63 6f 64 65 64 20 28 6f 72 20   been coded (or 
7ea0: 69 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70  is in the.  ** p
7eb0: 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
7ec0: 63 6f 64 65 64 29 2e 20 49 66 20 74 68 69 73 20  coded). If this 
7ed0: 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
7ee0: 6e 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 0a  n an entry with.
7ef0: 20 20 2a 2a 20 61 20 6d 61 74 63 68 69 6e 67 20    ** a matching 
7f00: 54 72 69 67 67 65 72 50 72 67 2e 70 54 72 69 67  TriggerPrg.pTrig
7f10: 67 65 72 20 66 69 65 6c 64 20 77 69 6c 6c 20 62  ger field will b
7f20: 65 20 70 72 65 73 65 6e 74 20 73 6f 6d 65 77 68  e present somewh
7f30: 65 72 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ere.  ** in the 
7f40: 50 61 72 73 65 2e 70 54 72 69 67 67 65 72 50 72  Parse.pTriggerPr
7f50: 67 20 6c 69 73 74 2e 20 53 65 61 72 63 68 20 66  g list. Search f
7f60: 6f 72 20 73 75 63 68 20 61 6e 20 65 6e 74 72 79  or such an entry
7f70: 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 72 67  .  */.  for(pPrg
7f80: 3d 70 52 6f 6f 74 2d 3e 70 54 72 69 67 67 65 72  =pRoot->pTrigger
7f90: 50 72 67 3b 20 0a 20 20 20 20 20 20 70 50 72 67  Prg; .      pPrg
7fa0: 20 26 26 20 28 70 50 72 67 2d 3e 70 54 72 69 67   && (pPrg->pTrig
7fb0: 67 65 72 21 3d 70 54 72 69 67 67 65 72 20 7c 7c  ger!=pTrigger ||
7fc0: 20 70 50 72 67 2d 3e 6f 72 63 6f 6e 66 21 3d 6f   pPrg->orconf!=o
7fd0: 72 63 6f 6e 66 29 3b 20 0a 20 20 20 20 20 20 70  rconf); .      p
7fe0: 50 72 67 3d 70 50 72 67 2d 3e 70 4e 65 78 74 0a  Prg=pPrg->pNext.
7ff0: 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e    );..  /* If an
8000: 20 65 78 69 73 74 69 6e 67 20 54 72 69 67 67 65   existing Trigge
8010: 72 50 72 67 20 63 6f 75 6c 64 20 6e 6f 74 20 62  rPrg could not b
8020: 65 20 6c 6f 63 61 74 65 64 2c 20 63 72 65 61 74  e located, creat
8030: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 20 2a 2f 0a  e a new one. */.
8040: 20 20 69 66 28 20 21 70 50 72 67 20 29 7b 0a 20    if( !pPrg ){. 
8050: 20 20 20 70 50 72 67 20 3d 20 63 6f 64 65 52 6f     pPrg = codeRo
8060: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
8070: 20 70 54 72 69 67 67 65 72 2c 20 70 54 61 62 2c   pTrigger, pTab,
8080: 20 6f 72 63 6f 6e 66 29 3b 0a 20 20 7d 0a 0a 20   orconf);.  }.. 
8090: 20 72 65 74 75 72 6e 20 70 50 72 67 3b 0a 7d 0a   return pPrg;.}.
80a0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
80b0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 74 72 69  code for the tri
80c0: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 61 73 73  gger program ass
80d0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 72 69  ociated with tri
80e0: 67 67 65 72 20 70 20 6f 6e 20 0a 2a 2a 20 74 61  gger p on .** ta
80f0: 62 6c 65 20 70 54 61 62 2e 20 54 68 65 20 72 65  ble pTab. The re
8100: 67 2c 20 6f 72 63 6f 6e 66 20 61 6e 64 20 69 67  g, orconf and ig
8110: 6e 6f 72 65 4a 75 6d 70 20 70 61 72 61 6d 65 74  noreJump paramet
8120: 65 72 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ers passed to th
8130: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
8140: 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  re the same as t
8150: 68 6f 73 65 20 64 65 73 63 72 69 62 65 64 20 69  hose described i
8160: 6e 20 74 68 65 20 68 65 61 64 65 72 20 66 75 6e  n the header fun
8170: 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 73 71 6c  ction for.** sql
8180: 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67  ite3CodeRowTrigg
8190: 65 72 28 29 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  er().*/.void sql
81a0: 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67  ite3CodeRowTrigg
81b0: 65 72 44 69 72 65 63 74 28 0a 20 20 50 61 72 73  erDirect(.  Pars
81c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
81d0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
81e0: 74 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20 2a  t */.  Trigger *
81f0: 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  p,          /* T
8200: 72 69 67 67 65 72 20 74 6f 20 63 6f 64 65 20 2a  rigger to code *
8210: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
8220: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8230: 74 61 62 6c 65 20 74 6f 20 63 6f 64 65 20 74 72  table to code tr
8240: 69 67 67 65 72 73 20 66 72 6f 6d 20 2a 2f 0a 20  iggers from */. 
8250: 20 69 6e 74 20 72 65 67 2c 20 20 20 20 20 20 20   int reg,       
8260: 20 20 20 20 20 20 2f 2a 20 52 65 67 20 61 72 72        /* Reg arr
8270: 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4f 4c  ay containing OL
8280: 44 2e 2a 20 61 6e 64 20 4e 45 57 2e 2a 20 76 61  D.* and NEW.* va
8290: 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  lues */.  int or
82a0: 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20 2f  conf,          /
82b0: 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f  * ON CONFLICT po
82c0: 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 67  licy */.  int ig
82d0: 6e 6f 72 65 4a 75 6d 70 20 20 20 20 20 20 20 2f  noreJump       /
82e0: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  * Instruction to
82f0: 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52 41 49   jump to for RAI
8300: 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a 29 7b  SE(IGNORE) */.){
8310: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
8320: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
8330: 73 65 29 3b 20 2f 2a 20 4d 61 69 6e 20 56 4d 20  se); /* Main VM 
8340: 2a 2f 0a 20 20 54 72 69 67 67 65 72 50 72 67 20  */.  TriggerPrg 
8350: 2a 70 50 72 67 3b 0a 20 20 70 50 72 67 20 3d 20  *pPrg;.  pPrg = 
8360: 67 65 74 52 6f 77 54 72 69 67 67 65 72 28 70 50  getRowTrigger(pP
8370: 61 72 73 65 2c 20 70 2c 20 70 54 61 62 2c 20 6f  arse, p, pTab, o
8380: 72 63 6f 6e 66 29 3b 0a 20 20 61 73 73 65 72 74  rconf);.  assert
8390: 28 20 70 50 72 67 20 7c 7c 20 70 50 61 72 73 65  ( pPrg || pParse
83a0: 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65  ->nErr || pParse
83b0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
83c0: 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65  ed );..  /* Code
83d0: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
83e0: 6f 70 63 6f 64 65 20 69 6e 20 74 68 65 20 70 61  opcode in the pa
83f0: 72 65 6e 74 20 56 44 42 45 2e 20 50 34 20 6f 66  rent VDBE. P4 of
8400: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
8410: 0a 20 20 2a 2a 20 69 73 20 61 20 70 6f 69 6e 74  .  ** is a point
8420: 65 72 20 74 6f 20 74 68 65 20 73 75 62 2d 76 64  er to the sub-vd
8430: 62 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  be containing th
8440: 65 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  e trigger progra
8450: 6d 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 72  m.  */.  if( pPr
8460: 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 52 65  g ){.    int bRe
8470: 63 75 72 73 69 76 65 20 3d 20 28 70 2d 3e 7a 4e  cursive = (p->zN
8480: 61 6d 65 20 26 26 20 30 3d 3d 28 70 50 61 72 73  ame && 0==(pPars
8490: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  e->db->flags&SQL
84a0: 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 29  ITE_RecTriggers)
84b0: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
84c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
84d0: 50 72 6f 67 72 61 6d 2c 20 72 65 67 2c 20 69 67  Program, reg, ig
84e0: 6e 6f 72 65 4a 75 6d 70 2c 20 2b 2b 70 50 61 72  noreJump, ++pPar
84f0: 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 73  se->nMem);.    s
8500: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8510: 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74  P4(v, -1, (const
8520: 20 63 68 61 72 20 2a 29 70 50 72 67 2d 3e 70 50   char *)pPrg->pP
8530: 72 6f 67 72 61 6d 2c 20 50 34 5f 53 55 42 50 52  rogram, P4_SUBPR
8540: 4f 47 52 41 4d 29 3b 0a 20 20 20 20 56 64 62 65  OGRAM);.    Vdbe
8550: 43 6f 6d 6d 65 6e 74 28 0a 20 20 20 20 20 20 20  Comment(.       
8560: 20 28 76 2c 20 22 43 61 6c 6c 3a 20 25 73 2e 25   (v, "Call: %s.%
8570: 73 22 2c 20 28 70 2d 3e 7a 4e 61 6d 65 3f 70 2d  s", (p->zName?p-
8580: 3e 7a 4e 61 6d 65 3a 22 66 6b 65 79 22 29 2c 20  >zName:"fkey"), 
8590: 6f 6e 45 72 72 6f 72 54 65 78 74 28 6f 72 63 6f  onErrorText(orco
85a0: 6e 66 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  nf)));..    /* S
85b0: 65 74 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e  et the P5 operan
85c0: 64 20 6f 66 20 74 68 65 20 4f 50 5f 50 72 6f 67  d of the OP_Prog
85d0: 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ram instruction 
85e0: 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 0a 20  to non-zero if. 
85f0: 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20     ** recursive 
8600: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
8610: 69 73 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  is trigger progr
8620: 61 6d 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64  am is disallowed
8630: 2e 20 52 65 63 75 72 73 69 76 65 0a 20 20 20 20  . Recursive.    
8640: 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20 69 73  ** invocation is
8650: 20 64 69 73 61 6c 6c 6f 77 65 64 20 69 66 20 28   disallowed if (
8660: 61 29 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  a) the sub-progr
8670: 61 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 74  am is really a t
8680: 72 69 67 67 65 72 2c 0a 20 20 20 20 2a 2a 20 6e  rigger,.    ** n
8690: 6f 74 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  ot a foreign key
86a0: 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20 28 62 29   action, and (b)
86b0: 20 74 68 65 20 66 6c 61 67 20 74 6f 20 65 6e 61   the flag to ena
86c0: 62 6c 65 20 72 65 63 75 72 73 69 76 65 20 74 72  ble recursive tr
86d0: 69 67 67 65 72 73 0a 20 20 20 20 2a 2a 20 69 73  iggers.    ** is
86e0: 20 63 6c 65 61 72 2e 20 20 2a 2f 0a 20 20 20 20   clear.  */.    
86f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8700: 65 50 35 28 76 2c 20 28 75 38 29 62 52 65 63 75  eP5(v, (u8)bRecu
8710: 72 73 69 76 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rsive);.  }.}../
8720: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
8730: 6c 65 64 20 74 6f 20 63 6f 64 65 20 74 68 65 20  led to code the 
8740: 72 65 71 75 69 72 65 64 20 46 4f 52 20 45 41 43  required FOR EAC
8750: 48 20 52 4f 57 20 74 72 69 67 67 65 72 73 20 66  H ROW triggers f
8760: 6f 72 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a  or an operation.
8770: 2a 2a 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62  ** on table pTab
8780: 2e 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  . The operation 
8790: 74 6f 20 63 6f 64 65 20 74 72 69 67 67 65 72 73  to code triggers
87a0: 20 66 6f 72 20 28 49 4e 53 45 52 54 2c 20 55 50   for (INSERT, UP
87b0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 29 0a  DATE or DELETE).
87c0: 2a 2a 20 69 73 20 67 69 76 65 6e 20 62 79 20 74  ** is given by t
87d0: 68 65 20 6f 70 20 70 61 72 61 6d 61 74 65 72 2e  he op paramater.
87e0: 20 54 68 65 20 74 72 5f 74 6d 20 70 61 72 61 6d   The tr_tm param
87f0: 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
8800: 77 68 65 74 68 65 72 20 74 68 65 0a 2a 2a 20 42  whether the.** B
8810: 45 46 4f 52 45 20 6f 72 20 41 46 54 45 52 20 74  EFORE or AFTER t
8820: 72 69 67 67 65 72 73 20 61 72 65 20 63 6f 64 65  riggers are code
8830: 64 2e 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  d. If the operat
8840: 69 6f 6e 20 69 73 20 61 6e 20 55 50 44 41 54 45  ion is an UPDATE
8850: 2c 20 74 68 65 6e 0a 2a 2a 20 70 61 72 61 6d 65  , then.** parame
8860: 74 65 72 20 70 43 68 61 6e 67 65 73 20 69 73 20  ter pChanges is 
8870: 70 61 73 73 65 64 20 74 68 65 20 6c 69 73 74 20  passed the list 
8880: 6f 66 20 63 6f 6c 75 6d 6e 73 20 62 65 69 6e 67  of columns being
8890: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
88a0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
88b0: 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20 66   triggers that f
88c0: 69 72 65 20 61 74 20 74 68 65 20 73 70 65 63 69  ire at the speci
88d0: 66 69 65 64 20 74 69 6d 65 20 66 6f 72 20 74 68  fied time for th
88e0: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 6f  e specified.** o
88f0: 70 65 72 61 74 69 6f 6e 20 6f 6e 20 70 54 61 62  peration on pTab
8900: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
8910: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
8920: 2a 20 54 68 65 20 72 65 67 20 61 72 67 75 6d 65  * The reg argume
8930: 6e 74 20 69 73 20 74 68 65 20 61 64 64 72 65 73  nt is the addres
8940: 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 69  s of the first i
8950: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
8960: 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74  gisters .** that
8970: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 76 61 6c   contain the val
8980: 75 65 73 20 73 75 62 73 74 69 74 75 74 65 64 20  ues substituted 
8990: 66 6f 72 20 74 68 65 20 6e 65 77 2e 2a 20 61 6e  for the new.* an
89a0: 64 20 6f 6c 64 2e 2a 20 72 65 66 65 72 65 6e 63  d old.* referenc
89b0: 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 74 72 69  es.** in the tri
89c0: 67 67 65 72 20 70 72 6f 67 72 61 6d 2e 20 49 66  gger program. If
89d0: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
89e0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
89f0: 61 62 6c 65 20 70 54 61 62 0a 2a 2a 20 28 61 20  able pTab.** (a 
8a00: 63 6f 70 79 20 6f 66 20 70 54 61 62 2d 3e 6e 43  copy of pTab->nC
8a10: 6f 6c 29 2c 20 74 68 65 6e 20 72 65 67 69 73 74  ol), then regist
8a20: 65 72 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  ers are populate
8a30: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
8a40: 0a 2a 2a 20 20 20 52 65 67 69 73 74 65 72 20 20  .**   Register  
8a50: 20 20 20 20 20 43 6f 6e 74 61 69 6e 73 0a 2a 2a       Contains.**
8a60: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
8a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 72  ---------.**   r
8aa0: 65 67 2b 30 20 20 20 20 20 20 20 20 20 20 4f 4c  eg+0          OL
8ab0: 44 2e 72 6f 77 69 64 0a 2a 2a 20 20 20 72 65 67  D.rowid.**   reg
8ac0: 2b 31 20 20 20 20 20 20 20 20 20 20 4f 4c 44 2e  +1          OLD.
8ad0: 2a 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 2d  * value of left-
8ae0: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  most column of p
8af0: 54 61 62 0a 2a 2a 20 20 20 2e 2e 2e 20 20 20 20  Tab.**   ...    
8b00: 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
8b10: 20 72 65 67 2b 4e 20 20 20 20 20 20 20 20 20 20   reg+N          
8b20: 4f 4c 44 2e 2a 20 76 61 6c 75 65 20 6f 66 20 72  OLD.* value of r
8b30: 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
8b40: 20 6f 66 20 70 54 61 62 0a 2a 2a 20 20 20 72 65   of pTab.**   re
8b50: 67 2b 4e 2b 31 20 20 20 20 20 20 20 20 4e 45 57  g+N+1        NEW
8b60: 2e 72 6f 77 69 64 0a 2a 2a 20 20 20 72 65 67 2b  .rowid.**   reg+
8b70: 4e 2b 32 20 20 20 20 20 20 20 20 4f 4c 44 2e 2a  N+2        OLD.*
8b80: 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74 2d 6d   value of left-m
8b90: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 54  ost column of pT
8ba0: 61 62 0a 2a 2a 20 20 20 2e 2e 2e 20 20 20 20 20  ab.**   ...     
8bb0: 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
8bc0: 72 65 67 2b 4e 2b 4e 2b 31 20 20 20 20 20 20 4e  reg+N+N+1      N
8bd0: 45 57 2e 2a 20 76 61 6c 75 65 20 6f 66 20 72 69  EW.* value of ri
8be0: 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  ght-most column 
8bf0: 6f 66 20 70 54 61 62 0a 2a 2a 0a 2a 2a 20 46 6f  of pTab.**.** Fo
8c00: 72 20 4f 4e 20 44 45 4c 45 54 45 20 74 72 69 67  r ON DELETE trig
8c10: 67 65 72 73 2c 20 74 68 65 20 72 65 67 69 73 74  gers, the regist
8c20: 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ers containing t
8c30: 68 65 20 4e 45 57 2e 2a 20 76 61 6c 75 65 73 20  he NEW.* values 
8c40: 77 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 65  will.** never be
8c50: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
8c60: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
8c70: 2c 20 73 6f 20 74 68 65 79 20 61 72 65 20 6e 6f  , so they are no
8c80: 74 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 0a  t allocated or .
8c90: 2a 2a 20 70 6f 70 75 6c 61 74 65 64 20 62 79 20  ** populated by 
8ca0: 74 68 65 20 63 61 6c 6c 65 72 20 28 74 68 65 72  the caller (ther
8cb0: 65 20 69 73 20 6e 6f 20 64 61 74 61 20 74 6f 20  e is no data to 
8cc0: 70 6f 70 75 6c 61 74 65 20 74 68 65 6d 20 77 69  populate them wi
8cd0: 74 68 20 61 6e 79 77 61 79 29 2e 20 0a 2a 2a 20  th anyway). .** 
8ce0: 53 69 6d 69 6c 61 72 6c 79 2c 20 66 6f 72 20 4f  Similarly, for O
8cf0: 4e 20 49 4e 53 45 52 54 20 74 72 69 67 67 65 72  N INSERT trigger
8d00: 73 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  s the values sto
8d10: 72 65 64 20 69 6e 20 74 68 65 20 4f 4c 44 2e 2a  red in the OLD.*
8d20: 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 61 72   registers.** ar
8d30: 65 20 6e 65 76 65 72 20 61 63 63 65 73 73 65 64  e never accessed
8d40: 2c 20 61 6e 64 20 73 6f 20 61 72 65 20 6e 6f 74  , and so are not
8d50: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
8d60: 65 20 63 61 6c 6c 65 72 2e 20 53 6f 2c 20 66 6f  e caller. So, fo
8d70: 72 20 61 6e 0a 2a 2a 20 4f 4e 20 49 4e 53 45 52  r an.** ON INSER
8d80: 54 20 74 72 69 67 67 65 72 2c 20 74 68 65 20 76  T trigger, the v
8d90: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 74  alue passed to t
8da0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20  his function as 
8db0: 70 61 72 61 6d 65 74 65 72 20 72 65 67 0a 2a 2a  parameter reg.**
8dc0: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 64 61 62   is not a readab
8dd0: 6c 65 20 72 65 67 69 73 74 65 72 2c 20 61 6c 74  le register, alt
8de0: 68 6f 75 67 68 20 72 65 67 69 73 74 65 72 73 20  hough registers 
8df0: 28 72 65 67 2b 4e 29 20 74 68 72 6f 75 67 68 20  (reg+N) through 
8e00: 0a 2a 2a 20 28 72 65 67 2b 4e 2b 4e 2b 31 29 20  .** (reg+N+N+1) 
8e10: 61 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  are..**.** Param
8e20: 65 74 65 72 20 6f 72 63 6f 6e 66 20 69 73 20 74  eter orconf is t
8e30: 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 66 6c  he default confl
8e40: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
8e50: 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 74 68 65  lgorithm for the
8e60: 0a 2a 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67  .** trigger prog
8e70: 72 61 6d 20 74 6f 20 75 73 65 20 28 52 45 50 4c  ram to use (REPL
8e80: 41 43 45 2c 20 49 47 4e 4f 52 45 20 65 74 63 2e  ACE, IGNORE etc.
8e90: 29 2e 20 50 61 72 61 6d 65 74 65 72 20 69 67 6e  ). Parameter ign
8ea0: 6f 72 65 4a 75 6d 70 0a 2a 2a 20 69 73 20 74 68  oreJump.** is th
8eb0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  e instruction th
8ec0: 61 74 20 63 6f 6e 74 72 6f 6c 20 73 68 6f 75 6c  at control shoul
8ed0: 64 20 6a 75 6d 70 20 74 6f 20 69 66 20 61 20 74  d jump to if a t
8ee0: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 0a 2a  rigger program.*
8ef0: 2a 20 72 61 69 73 65 73 20 61 6e 20 49 47 4e 4f  * raises an IGNO
8f00: 52 45 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f  RE exception..*/
8f10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
8f20: 65 52 6f 77 54 72 69 67 67 65 72 28 0a 20 20 50  eRowTrigger(.  P
8f30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8f40: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
8f50: 74 65 78 74 20 2a 2f 0a 20 20 54 72 69 67 67 65  text */.  Trigge
8f60: 72 20 2a 70 54 72 69 67 67 65 72 2c 20 20 20 2f  r *pTrigger,   /
8f70: 2a 20 4c 69 73 74 20 6f 66 20 74 72 69 67 67 65  * List of trigge
8f80: 72 73 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62  rs on table pTab
8f90: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
8fa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
8fb0: 65 20 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c 20  e of TK_UPDATE, 
8fc0: 54 4b 5f 49 4e 53 45 52 54 2c 20 54 4b 5f 44 45  TK_INSERT, TK_DE
8fd0: 4c 45 54 45 20 2a 2f 0a 20 20 45 78 70 72 4c 69  LETE */.  ExprLi
8fe0: 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20 2f  st *pChanges,  /
8ff0: 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74 20 66  * Changes list f
9000: 6f 72 20 61 6e 79 20 55 50 44 41 54 45 20 4f 46  or any UPDATE OF
9010: 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69   triggers */.  i
9020: 6e 74 20 74 72 5f 74 6d 2c 20 20 20 20 20 20 20  nt tr_tm,       
9030: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 52      /* One of TR
9040: 49 47 47 45 52 5f 42 45 46 4f 52 45 2c 20 54 52  IGGER_BEFORE, TR
9050: 49 47 47 45 52 5f 41 46 54 45 52 20 2a 2f 0a 20  IGGER_AFTER */. 
9060: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
9070: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
9080: 6c 65 20 74 6f 20 63 6f 64 65 20 74 72 69 67 67  le to code trigg
9090: 65 72 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ers from */.  in
90a0: 74 20 72 65 67 2c 20 20 20 20 20 20 20 20 20 20  t reg,          
90b0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
90c0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
90d0: 65 67 69 73 74 65 72 73 20 28 73 65 65 20 61 62  egisters (see ab
90e0: 6f 76 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  ove) */.  int or
90f0: 63 6f 6e 66 2c 20 20 20 20 20 20 20 20 20 20 2f  conf,          /
9100: 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 70 6f  * ON CONFLICT po
9110: 6c 69 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 67  licy */.  int ig
9120: 6e 6f 72 65 4a 75 6d 70 20 20 20 20 20 20 20 2f  noreJump       /
9130: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  * Instruction to
9140: 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 52 41 49   jump to for RAI
9150: 53 45 28 49 47 4e 4f 52 45 29 20 2a 2f 0a 29 7b  SE(IGNORE) */.){
9160: 0a 20 20 54 72 69 67 67 65 72 20 2a 70 3b 20 20  .  Trigger *p;  
9170: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
9180: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
9190: 67 68 20 70 54 72 69 67 67 65 72 20 6c 69 73 74  gh pTrigger list
91a0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f   */..  assert( o
91b0: 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20  p==TK_UPDATE || 
91c0: 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 7c 7c  op==TK_INSERT ||
91d0: 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20 29   op==TK_DELETE )
91e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 5f 74  ;.  assert( tr_t
91f0: 6d 3d 3d 54 52 49 47 47 45 52 5f 42 45 46 4f 52  m==TRIGGER_BEFOR
9200: 45 20 7c 7c 20 74 72 5f 74 6d 3d 3d 54 52 49 47  E || tr_tm==TRIG
9210: 47 45 52 5f 41 46 54 45 52 20 29 3b 0a 20 20 61  GER_AFTER );.  a
9220: 73 73 65 72 74 28 20 28 6f 70 3d 3d 54 4b 5f 55  ssert( (op==TK_U
9230: 50 44 41 54 45 29 3d 3d 28 70 43 68 61 6e 67 65  PDATE)==(pChange
9240: 73 21 3d 30 29 20 29 3b 0a 0a 20 20 66 6f 72 28  s!=0) );..  for(
9250: 70 3d 70 54 72 69 67 67 65 72 3b 20 70 3b 20 70  p=pTrigger; p; p
9260: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 0a 20 20 20  =p->pNext){..   
9270: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
9280: 69 6e 67 3a 20 20 54 68 65 20 73 63 68 65 6d 61  ing:  The schema
9290: 20 66 6f 72 20 74 68 65 20 74 72 69 67 67 65 72   for the trigger
92a0: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 74 61 62   and for the tab
92b0: 6c 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c  le are.    ** al
92c0: 77 61 79 73 20 64 65 66 69 6e 65 64 2e 20 20 54  ways defined.  T
92d0: 68 65 20 74 72 69 67 67 65 72 20 6d 75 73 74 20  he trigger must 
92e0: 62 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 73  be in the same s
92f0: 63 68 65 6d 61 20 61 73 20 74 68 65 20 74 61 62  chema as the tab
9300: 6c 65 0a 20 20 20 20 2a 2a 20 6f 72 20 65 6c 73  le.    ** or els
9310: 65 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 54  e it must be a T
9320: 45 4d 50 20 74 72 69 67 67 65 72 2e 20 2a 2f 0a  EMP trigger. */.
9330: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
9340: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
9350: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62   assert( p->pTab
9360: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
9370: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68   assert( p->pSch
9380: 65 6d 61 3d 3d 70 2d 3e 70 54 61 62 53 63 68 65  ema==p->pTabSche
9390: 6d 61 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ma .         || 
93a0: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 50 61 72  p->pSchema==pPar
93b0: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  se->db->aDb[1].p
93c0: 53 63 68 65 6d 61 20 29 3b 0a 0a 20 20 20 20 2f  Schema );..    /
93d0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
93e0: 68 65 72 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  her we should co
93f0: 64 65 20 74 68 69 73 20 74 72 69 67 67 65 72 20  de this trigger 
9400: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  */.    if( p->op
9410: 3d 3d 6f 70 20 0a 20 20 20 20 20 26 26 20 70 2d  ==op .     && p-
9420: 3e 74 72 5f 74 6d 3d 3d 74 72 5f 74 6d 20 0a 20  >tr_tm==tr_tm . 
9430: 20 20 20 20 26 26 20 63 68 65 63 6b 43 6f 6c 75      && checkColu
9440: 6d 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70 43 6f  mnOverlap(p->pCo
9450: 6c 75 6d 6e 73 2c 20 70 43 68 61 6e 67 65 73 29  lumns, pChanges)
9460: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
9470: 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67  lite3CodeRowTrig
9480: 67 65 72 44 69 72 65 63 74 28 70 50 61 72 73 65  gerDirect(pParse
9490: 2c 20 70 2c 20 70 54 61 62 2c 20 72 65 67 2c 20  , p, pTab, reg, 
94a0: 6f 72 63 6f 6e 66 2c 20 69 67 6e 6f 72 65 4a 75  orconf, ignoreJu
94b0: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  mp);.    }.  }.}
94c0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 69 67 67 65 72 73  ../*.** Triggers
94d0: 20 6d 61 79 20 61 63 63 65 73 73 20 76 61 6c 75   may access valu
94e0: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
94f0: 20 6f 6c 64 2e 2a 20 6f 72 20 6e 65 77 2e 2a 20   old.* or new.* 
9500: 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 0a 2a  pseudo-table. .*
9510: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9520: 72 65 74 75 72 6e 73 20 61 20 33 32 2d 62 69 74  returns a 32-bit
9530: 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74   bitmask indicat
9540: 69 6e 67 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  ing which column
9550: 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 6c 64  s of the .** old
9560: 2e 2a 20 6f 72 20 6e 65 77 2e 2a 20 74 61 62 6c  .* or new.* tabl
9570: 65 73 20 61 63 74 75 61 6c 6c 79 20 61 72 65 20  es actually are 
9580: 75 73 65 64 20 62 79 20 74 72 69 67 67 65 72 73  used by triggers
9590: 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
95a0: 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 75 73  on .** may be us
95b0: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
95c0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
95d0: 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74  o avoid having t
95e0: 6f 20 6c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  o load the entir
95f0: 65 0a 2a 2a 20 6f 6c 64 2e 2a 20 72 65 63 6f 72  e.** old.* recor
9600: 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 77 68  d into memory wh
9610: 65 6e 20 65 78 65 63 75 74 69 6e 67 20 61 6e 20  en executing an 
9620: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
9630: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
9640: 42 69 74 20 30 20 6f 66 20 74 68 65 20 72 65 74  Bit 0 of the ret
9650: 75 72 6e 65 64 20 6d 61 73 6b 20 69 73 20 73 65  urned mask is se
9660: 74 20 69 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f  t if the left-mo
9670: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
9680: 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 62 65  .** table may be
9690: 20 61 63 63 65 73 73 65 64 20 75 73 69 6e 67 20   accessed using 
96a0: 61 6e 20 5b 6f 6c 64 7c 6e 65 77 5d 2e 3c 63 6f  an [old|new].<co
96b0: 6c 3e 20 72 65 66 65 72 65 6e 63 65 2e 20 42 69  l> reference. Bi
96c0: 74 20 31 20 69 73 20 73 65 74 20 69 66 0a 2a 2a  t 1 is set if.**
96d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 65 66 74   the second left
96e0: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  most column valu
96f0: 65 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 61  e is required, a
9700: 6e 64 20 73 6f 20 6f 6e 2e 20 49 66 20 74 68 65  nd so on. If the
9710: 72 65 0a 2a 2a 20 61 72 65 20 6d 6f 72 65 20 74  re.** are more t
9720: 68 61 6e 20 33 32 20 63 6f 6c 75 6d 6e 73 20 69  han 32 columns i
9730: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64  n the table, and
9740: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
9750: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20   the columns.** 
9760: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72  with an index gr
9770: 65 61 74 65 72 20 74 68 61 6e 20 33 32 20 6d 61  eater than 32 ma
9780: 79 20 62 65 20 61 63 63 65 73 73 65 64 2c 20 30  y be accessed, 0
9790: 78 66 66 66 66 66 66 66 66 20 69 73 20 72 65 74  xffffffff is ret
97a0: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  urned..**.** It 
97b0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
97c0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
97d0: 74 68 65 20 6f 6c 64 2e 72 6f 77 69 64 20 6f 72  the old.rowid or
97e0: 20 6e 65 77 2e 72 6f 77 69 64 20 63 6f 6c 75 6d   new.rowid colum
97f0: 6e 20 69 73 20 0a 2a 2a 20 61 63 63 65 73 73 65  n is .** accesse
9800: 64 20 62 79 20 74 72 69 67 67 65 72 73 2e 20 54  d by triggers. T
9810: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 61  he caller must a
9820: 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74 68 61  lways assume tha
9830: 74 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 50  t it is..**.** P
9840: 61 72 61 6d 65 74 65 72 20 69 73 4e 65 77 20 6d  arameter isNew m
9850: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 31 20  ust be either 1 
9860: 6f 72 20 30 2e 20 49 66 20 69 74 20 69 73 20 30  or 0. If it is 0
9870: 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 73 6b 20  , then the mask 
9880: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 70 70 6c  returned.** appl
9890: 69 65 73 20 74 6f 20 74 68 65 20 6f 6c 64 2e 2a  ies to the old.*
98a0: 20 74 61 62 6c 65 2e 20 49 66 20 31 2c 20 74 68   table. If 1, th
98b0: 65 20 6e 65 77 2e 2a 20 74 61 62 6c 65 2e 0a 2a  e new.* table..*
98c0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 74  *.** Parameter t
98d0: 72 5f 74 6d 20 6d 75 73 74 20 62 65 20 61 20 6d  r_tm must be a m
98e0: 61 73 6b 20 77 69 74 68 20 6f 6e 65 20 6f 72 20  ask with one or 
98f0: 62 6f 74 68 20 6f 66 20 74 68 65 20 54 52 49 47  both of the TRIG
9900: 47 45 52 5f 42 45 46 4f 52 45 0a 2a 2a 20 61 6e  GER_BEFORE.** an
9910: 64 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 20  d TRIGGER_AFTER 
9920: 62 69 74 73 20 73 65 74 2e 20 56 61 6c 75 65 73  bits set. Values
9930: 20 61 63 63 65 73 73 65 64 20 62 79 20 42 45 46   accessed by BEF
9940: 4f 52 45 20 74 72 69 67 67 65 72 73 20 61 72 65  ORE triggers are
9950: 20 6f 6e 6c 79 0a 2a 2a 20 69 6e 63 6c 75 64 65   only.** include
9960: 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  d in the returne
9970: 64 20 6d 61 73 6b 20 69 66 20 74 68 65 20 54 52  d mask if the TR
9980: 49 47 47 45 52 5f 42 45 46 4f 52 45 20 62 69 74  IGGER_BEFORE bit
9990: 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 0a 2a   is set in the.*
99a0: 2a 20 74 72 5f 74 6d 20 70 61 72 61 6d 65 74 65  * tr_tm paramete
99b0: 72 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 76 61  r. Similarly, va
99c0: 6c 75 65 73 20 61 63 63 65 73 73 65 64 20 62 79  lues accessed by
99d0: 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73 20   AFTER triggers 
99e0: 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 69 6e 63 6c  are only.** incl
99f0: 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
9a00: 72 6e 65 64 20 6d 61 73 6b 20 69 66 20 74 68 65  rned mask if the
9a10: 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 20 62   TRIGGER_AFTER b
9a20: 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 72 5f  it is set in tr_
9a30: 74 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  tm..*/.u32 sqlit
9a40: 65 33 54 72 69 67 67 65 72 43 6f 6c 6d 61 73 6b  e3TriggerColmask
9a50: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9a60: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
9a70: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
9a80: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
9a90: 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  ,   /* List of t
9aa0: 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65  riggers on table
9ab0: 20 70 54 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c   pTab */.  ExprL
9ac0: 69 73 74 20 2a 70 43 68 61 6e 67 65 73 2c 20 20  ist *pChanges,  
9ad0: 2f 2a 20 43 68 61 6e 67 65 73 20 6c 69 73 74 20  /* Changes list 
9ae0: 66 6f 72 20 61 6e 79 20 55 50 44 41 54 45 20 4f  for any UPDATE O
9af0: 46 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20  F triggers */.  
9b00: 69 6e 74 20 69 73 4e 65 77 2c 20 20 20 20 20 20  int isNew,      
9b10: 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 6e 65       /* 1 for ne
9b20: 77 2e 2a 20 72 65 66 20 6d 61 73 6b 2c 20 30 20  w.* ref mask, 0 
9b30: 66 6f 72 20 6f 6c 64 2e 2a 20 72 65 66 20 6d 61  for old.* ref ma
9b40: 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 74 72 5f 74  sk */.  int tr_t
9b50: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m,           /* 
9b60: 4d 61 73 6b 20 6f 66 20 54 52 49 47 47 45 52 5f  Mask of TRIGGER_
9b70: 42 45 46 4f 52 45 7c 54 52 49 47 47 45 52 5f 41  BEFORE|TRIGGER_A
9b80: 46 54 45 52 20 2a 2f 0a 20 20 54 61 62 6c 65 20  FTER */.  Table 
9b90: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  *pTab,         /
9ba0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 63  * The table to c
9bb0: 6f 64 65 20 74 72 69 67 67 65 72 73 20 66 72 6f  ode triggers fro
9bc0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 63 6f 6e  m */.  int orcon
9bd0: 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  f           /* D
9be0: 65 66 61 75 6c 74 20 4f 4e 20 43 4f 4e 46 4c 49  efault ON CONFLI
9bf0: 43 54 20 70 6f 6c 69 63 79 20 66 6f 72 20 74 72  CT policy for tr
9c00: 69 67 67 65 72 20 73 74 65 70 73 20 2a 2f 0a 29  igger steps */.)
9c10: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f 70  {.  const int op
9c20: 20 3d 20 70 43 68 61 6e 67 65 73 20 3f 20 54 4b   = pChanges ? TK
9c30: 5f 55 50 44 41 54 45 20 3a 20 54 4b 5f 44 45 4c  _UPDATE : TK_DEL
9c40: 45 54 45 3b 0a 20 20 75 33 32 20 6d 61 73 6b 20  ETE;.  u32 mask 
9c50: 3d 20 30 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  = 0;.  Trigger *
9c60: 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  p;..  assert( is
9c70: 4e 65 77 3d 3d 31 20 7c 7c 20 69 73 4e 65 77 3d  New==1 || isNew=
9c80: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 54  =0 );.  for(p=pT
9c90: 72 69 67 67 65 72 3b 20 70 3b 20 70 3d 70 2d 3e  rigger; p; p=p->
9ca0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
9cb0: 70 2d 3e 6f 70 3d 3d 6f 70 20 26 26 20 28 74 72  p->op==op && (tr
9cc0: 5f 74 6d 26 70 2d 3e 74 72 5f 74 6d 29 0a 20 20  _tm&p->tr_tm).  
9cd0: 20 20 20 26 26 20 63 68 65 63 6b 43 6f 6c 75 6d     && checkColum
9ce0: 6e 4f 76 65 72 6c 61 70 28 70 2d 3e 70 43 6f 6c  nOverlap(p->pCol
9cf0: 75 6d 6e 73 2c 70 43 68 61 6e 67 65 73 29 0a 20  umns,pChanges). 
9d00: 20 20 20 29 7b 0a 20 20 20 20 20 20 54 72 69 67     ){.      Trig
9d10: 67 65 72 50 72 67 20 2a 70 50 72 67 3b 0a 20 20  gerPrg *pPrg;.  
9d20: 20 20 20 20 70 50 72 67 20 3d 20 67 65 74 52 6f      pPrg = getRo
9d30: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
9d40: 20 70 2c 20 70 54 61 62 2c 20 6f 72 63 6f 6e 66   p, pTab, orconf
9d50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
9d60: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73  g ){.        mas
9d70: 6b 20 7c 3d 20 70 50 72 67 2d 3e 61 43 6f 6c 6d  k |= pPrg->aColm
9d80: 61 73 6b 5b 69 73 4e 65 77 5d 3b 0a 20 20 20 20  ask[isNew];.    
9d90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
9da0: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
9db0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
9dc0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9dd0: 54 52 49 47 47 45 52 29 20 2a 2f 0a              TRIGGER) */.